По теме: ”Обработка матриц. Отладка программ» 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

По теме: ”Обработка матриц. Отладка программ»



Кафедра

“Компьютерные информационные технологии”

 

 

Лабораторная работа №9

По теме: ”Обработка матриц. Отладка программ»

с дисциплины ”Технологии программирования “

 

 

Выполнил: студент 916 группы

Петрук Татьяна

Проверил: Нечай А.В.

Днепропетровск

 

Лабораторная работа №9

 

 

Тема: обработка матриц. Отладка программ.

Цель.

Приобретение навыков работы с типом данных матрицы. Усовершенствование навыков разработки алгоритмов и отладки программ.

 

Задание.

Определить количество строк матрицы в которых элементы расположены в порядке возрастания.

Теоретические сведения.

Файлы

Введение файлового типа в язык Паскаль вызвано необходимостью обеспечить возможность работы с периферийными (внешними) устройствами ЭВМ, предназначенными для ввода, вывода и хранения данных.

Файловый тип данных или файл определяет упорядоченную совокупность произвольного числа однотипных компонент.

Понятие файла достаточно широко. Это может быть обычный файл на диске, коммуникационный порт ЭВМ, устройство печати, клавиатура или другие устройства.

При работе с файлами выполняются операции ввода - вывода. Операция ввода означает перепись данных с внешнего устройства (из входного файла) в основную память ЭВМ, операция вывода - это пересылка данных из основной памяти на внешнее устройство (в выходной файл).

Файлы на внешних устройствах часто называют физическими файлами. Их имена определяются операционной системой. В программах на языке Паскаль имена файлов задаются с помощью строк. Например, имя файла на диске может иметь вид:

'LAB1.DAT'

'c:\ABC150\pr.txt'

'my_files'

Типы файлов Турбо Паскаль

Турбо Паскаль поддерживает три файловых типа:

текстовые файлы;

типизированные файлы;

нетипизированные файлы.

Доступ к файлу в программе происходит с помощью переменных файлового типа. Переменную файлового типа описывают одним из трех способов:

file of тип - типизированный файл (указан тип компоненты);

text - текстовый файл;

file - нетипизированный файл.

Примеры описания файловых переменных:

var

f1: file of char;

f2: file of integer;

f3: file;

t: text;

 

Стандартные процедуры и функции

Любые дисковые файлы становятся доступными программе после связывания их с файловой переменной, объявленной в программе. Все операции в программе производятся только с помощью связанной с ним файловой переменной.

Assign(f, FileName)

связывает файловую переменную f с физическим файлом, полное имя которого задано в строке FileName. Установленная связь будет действовать до конца работы программы, или до тех пор, пока не будет сделано переназначение.

После связи файловой переменной с дисковым именем файла в программе нужно указать направление передачи данных (открыть файл). В зависимости от этого направления говорят о чтении из файла или записи в файл.

Reset(f)

открывает для чтения файл, с которым связана файловая переменная f. После успешного выполнения процедуры Reset файл готов к чтению из него первого элемента. Процедура завершается с сообщением об ошибке, если указанный файл не найден.

Если f - типизированный файл, то процедурой reset он открывается для чтения и записи одновременно.

Rewrite(f)

открывает для записи файл, с которым связана файловая переменная f. После успешного выполнения этой процедуры файл готов к записи в него первого элемента. Если указанный файл уже существовал, то все данные из него уничтожаются.

Close(f)

закрывает открытый до этого файл с файловой переменной f. Вызов процедуры Close необходим при завершении работы с файлом. Если по какой-то причине процедура Close не будет выполнена, файл все-же будет создан на внешнем устройстве, но содержимое последнего буфера в него не будет перенесено.

EOF(f): boolean

возвращает значение TRUE, когда при чтении достигнут конец файла. Это означает, что уже прочитан последний элемент в файле или файл после открытия оказался пуст.

Rename(f, NewName)

позволяет переименовать физический файл на диске, связанный с файловой переменной f. Переименование возможно после закрытия файла.

Erase(f)

уничтожает физический файл на диске, который был связан с файловой переменной f. Файл к моменту вызова процедуры Erase должен быть закрыт.

IOResult

возвращает целое число, соответствующее коду последней ошибки ввода - вывода. При нормальном завершении операции функция вернет значение 0. Значение функции IOResult необходимо присваивать какой-либо переменной, так как при каждом вызове функция обнуляет свое значение. Функция IOResult работает только при выключенном режиме проверок ошибок ввода - вывода или с ключом компиляции {$I-}.

 

Работа с типизированными файлами

Типизированный файл - это последовательность компонент любого заданного типа (кроме типа "файл"). Доступ к компонентам файла осуществляется по их порядковым номерам. Компоненты нумеруются, начиная с 0. После открытия файла указатель (номер текущей компоненты) стоит в его начале на нулевом компоненте. После каждого чтения или записи указатель сдвигается к следующему компоненту.

Запись в файл:

Write(f, список переменных);

Процедура записывает в файл f всю информацию из списка переменных.

Чтение из файла:

Read(f, список переменных);

Процедура читает из файла f компоненты в указанные переменные. Тип файловых компонент и переменных должны совпадать. Если будет сделана попытка чтения несуществующих компонент, то произойдет ошибочное завершение программы. Необходимо либо точно рассчитывать количество компонент, либо перед каждым чтением данных делать проверку их существования (функция eof, см. выше)

Смещение указателя файла:

Seek(f, n);

Процедура смещает указатель файла f на n-ную позицию. Нумерация в файле начинается с 0.

Определение количества компонент:

FileSize(f): longint;

Функция возвращает количество компонент в файле f.

Определение позиции указателя:

FilePos(f): longint;

Функция возвращает порядковый номер текущего компонента файла f.

Отсечение последних компонент файла:

Truncate(f);

Процедура отсекает конец файла, начиная с текущей позиции включительно.

 

Работа с текстовыми файлами

Текстовый файл - это совокупность строк, разделенных метками конца строки. Сам файл заканчивается меткой конца файла. Доступ к каждой строке возможен лишь последовательно, начиная с первой. Одновременная запись и чтение запрещены.

Чтение из текстового файла:

Read(f, список переменных);

ReadLn(f, список переменных);

Процедуры читают информацию из файла f в переменные. Способ чтения зависит от типа переменных, стоящих в списке. В переменную char помещаются символы из файла. В числовую переменную: пропускаются символы-разделители, начальные пробелы и считывается значение числа до появления следующего разделителя. В переменную типа string помещается количество символов, равное длине строки, но только в том случае, если раньше не встретились символы конца строки или конца файла. Отличие ReadLn от Read в том, что в нем после прочтения данных пропускаются все оставшиеся символы в данной строке, включая метку конца строки. Если список переменных отсутствует, то процедура ReadLn(f) пропускает строку при чтении текстового файла.

Запись в текстовый файл:

Write(f, список переменных);

WriteLn(f, список переменных);

Процедуры записывают информацию в текстовый файл. Способ записи зависит от типа переменных в списке (как и при выводе на экран). Учитывается формат вывода. WriteLn от Write отличается тем, что после записи всех значений из переменных записывает еще и метку конца строки (формируется законченная строка файла).

Добавление информации к концу файла:

Append(f)

Процедура открывает текстовый файл для добавления информации к его концу. Используйте эту процедуру вместо Rewrite.

 

 

Пример описания двумерного массива Паскаля

Type
Vector = array [1..5] of <тип_элементов>;
Matrix= array [1..10] of vector;
Var m: matrix;

Мы объявили двумерный массив Паскаля m, состоящий из 10 строк, в каждой из которых 5 столбцов. При этом к каждой i -й строке можно обращаться m [ i ], а каждому j -му элементу внутри i -й строки – m [ i, j ].

Определение типов для двумерных массивов Паскаля можно задавать и в одной строке:

Type
Matrix= array [1..5] of array [1..10] of < тип элементов >;
или еще проще:
type
matrix = array [1..5, 1..10] of <тип элементов>;

Обращение к элементам двумерного массива имеет вид: M [ i, j ]. Это означает, что мы хотим получить элемент, расположенный в i -й строке и j -м столбце. Тут главное не перепутать строки со столбцами, а то мы можем снова получить обращение к несуществующему элементу. Например, обращение к элементу M [10, 5] имеет правильную форму записи, но может вызвать ошибку в работе программы.

Пример программы ввода двумерного массива Паскаля с клавиатуры

type
matrix= array [1..5, 1..10] of integer;
var
a,: matrix;
i, j: integer; { индексы массива }
begin
for i:=1 to 5 do {цикл для перебора всех строк}
for j:=1 to 10 do {перебор всех элементов строки по столбцам}
readln (a [ i, j ]); {ввод с клавиатуры элемента, стоящего в i -й строке и j -м столбце}

Двумерный массив Паскаля можно заполнить случайным образом, т.е. использовать функцию random (N), а также присвоить каждому элементу матрицы значение некоторого выражения. Способ заполнения двумерного массива Паскаля выбирается в зависимости от поставленной задачи, но в любом случае должен быть определен каждый элемент в каждой строке и каждом столбце.

Пример программы вывода двумерного массива Паскаля

for i:=1 to 5 do {цикл для перебора всех строк}
begin
for j:=1 to 10 do {перебор всех элементов строки по столбцам}
write (a [ i, j ]:4); {печать элементов, стоящих в i -й строке матрицы в одной экранной строке, при этом для вывода каждого элемента отводится 4 позиции}
writeln; {прежде, чем сменить номер строки в матрице, нужно перевести курсор на начало новой экранной строки}
end;

Замечание ( это важно! ): очень часто в программах студентов встречается ошибка, когда ввод с клавиатуры или вывод на экран массива пытаются осуществить следующим образом: readln (a), writeln (a), где а – это переменная типа массив. При этом их удивляет сообщение компилятора, что переменную этого типа невозможно считать или напечатать. Может быть, вы поймете, почему этого сделать нельзя, если представите N кружек, стоящих в ряд, а у вас в руках, например, чайник с водой. Можете вы по команде «налей воду» наполнить сразу все кружки? Как бы вы ни старались, но в каждую кружку придется наливать отдельно. Заполнение и вывод на экран элементов массива также должно осуществляться последовательно и поэлементно, т.к. в памяти ЭВМ элементы массива располагаются в последовательных ячейках.

Примеры решения задач с двумерными массивами Паскаля

Задача: Найти произведение ненулевых элементов матрицы.

Решение:

· Для решения данной задачи нам потребуются переменные: матрица, состоящая, например, из целочисленных элементов; P – произведение элементов, отличных от 0; I, J – индексы массива; N, M – количество строк и столбцов в матрице.

· Входными данными являются N, M – их значения введем с клавиатуры; матрица – ввод матрицы оформим в виде процедуры, заполнение матрицы осуществим случайным образом, т.е. с помощью функции random ().

· Выходными данными будет являться значение переменной P (произведение).

· Чтобы проверить правильность выполнения программы, необходимо вывести матрицу на экран, для этого оформим процедуру вывода матрицы.

· Ход решения задачи:

обсудим сначала выполнение основной программы, реализацию процедур обговорим чуть позже:

· введем значения N и M;

· Введем двумерный массив Паскаля, для этого обращаемся к процедуре vvod (a), где а – матрица;

· Напечатаем полученную матрицу, для этого обращаемся к процедуре print (a);

· Присвоим начальное значение переменной P =1;

· Будем последовательно перебирать все строки I от 1-й до N -й, в каждой строке будем перебирать все столбцы J от 1-го до M -го, для каждого элемента матрицы будем проверять условие: если a ij? 0, то произведение P будем домножать на элемент a ij (P = P * a ij);

· Выведем на экран значение произведения ненулевых элементов матрицы – P;

А теперь поговорим о процедурах.

Замечание (это важно!) Параметром процедуры может быть любая переменная предопределенного типа, это означает, что для передачи в процедуру массива в качестве параметра, тип его должен быть описан заранее. Например:

Type
Matrix=array [1..10, 1..10] of integer;
..............................
procedure primer (a: matrix);
..............................

Вернемся теперь к нашим процедурам.

Процедура ввода матрицы называется vvod, параметром процедуры является матрица, причем она должна быть, как результат, передана в основную программу, следовательно, параметр должен передаваться по ссылке. Тогда заголовок нашей процедуры будет выглядеть так:

Procedure vvod (var m: matrix);

Для реализации вложенных циклов в процедуре нам потребуются локальные переменные-счетчики, например, k и h. Алгоритм заполнения матрицы уже обсуждался, поэтому не будем его повторять.

Процедура вывода матрицы на экран называется print, параметром процедуры является матрица, но в этом случае она является входным параметром, следовательно, передается по значению. Заголовок этой процедуры будет выглядеть следующим образом:

Procedure print (m: matrix);

И вновь для реализации вложенных циклов внутри процедуры нам потребуются счетчики, пусть они называются так же – k и h. Алгоритм вывода матрицы на экран был описан выше, воспользуемся этим описанием.

План отладки

Проверяется Исходные данные Ожидаемый результат Действительный результат Ориентировочные причины ошибки
  Ввод размерносты матрицы   2;4.5 Ошибка из-за несовместимости типа данных Ошибка из-за несовместимости типа данных Попытка присвоить типу «byte» значение типа «real».
    10;-15 Ошибка из-за несовместимости типа данных Ошибка из-за несовместимости типа данных Выход за границы диапазона типа byte при вводе.
12;12 12;12 12;12 Ошибка отсутствует.
  Ввод матрицы 1 2 3 4 5 6 7 8 9.2 Ошибка из-за несовместимости типа данных Ошибка из-за несовместимости типа данных Попытка присвоить типу «byte» значение типа «real».
-2 8 -10 54 87 -132 54 48 14у Ошибка из-за несовместимости типа данных Ошибка из-за несовместимости типа данных Попытка присвоить типу «byte» значение типа «string».
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16   Ошибка отсутствует.
  Нахождение строк матрицы в которых элементы расположены в порядке возрастания 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Ошибка отсутствует.
1 3 5 1 1 5 7 8 1 1 1 0 2 4 8 9 1 5 7 8 2 4 8 9 1 5 7 8 2 4 8 9 Ошибка отсутствует.
-1 -2 -3 -4 -5 -6 -7 -8 15 -5 -9 -9 -9 -9 -9 -9   -   - Ошибка отсутствует.
  Количество строк матрицы в которых элементы расположены в порядке возрастания 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16     Ошибка отсутствует.
1 -2 1 1 1 -1 1 1 1 -1 1 0 2 -5 1 1     Ошибка отсутствует.
-1 -2 -3 -4 -5 -6 -7 -8 15 -5 -9 -9 -9 -9 -9 -9     Ошибка отсутствует.

Код модуля

Unit Massiv;

interface

uses crt;

const q=30; w=30;

type Dv_Mas=array [1..Q,1..W] of integer;

type Massive=array [1..Q] of byte;

procedure OutputMas (var Mas:Dv_Mas; var mas2:massive; var n,m,k,l,http:byte);

procedure InputMas (var Mas:Dv_Mas; var n,m:byte);

procedure SizeOfMas(var n,m:byte);

procedure ReadFromATextFile(var Mas:dv_mas; var n,m:byte);

procedure WriteToATextFile(var Mas:dv_mas; Mas2:massive; var n,m,k,l,http:byte);

procedure ReadFromATypedFile(var Mas:dv_mas; var n,m:byte);

procedure WriteATypedFile(var Mas:dv_mas; Mas2:massive; var n,m,k,l,http:byte);

procedure ChoiceTypeOfInputMassiv(var Mas:dv_mas; var n,m:byte; var p:boolean);

procedure ChoiceTypeOfOutputMassiv(var Mas:dv_mas; var Mas2:Massive; var n,m,k,l,http:byte);

procedure FindStringWithOlolo(var mas:Dv_mas; var Mas2:massive; var n,m,http:byte);

implementation

procedure ReadFromATextFile(var Mas:dv_mas; var n,m:byte);

var f:text; i,j:byte;

begin

assign(f,'InputMassiv.txt');

reset(f);

read(f,n,m);

for i:=1 to n do

begin

for j:=1 to m do

read(f,Mas[i,j]);

readln(f);

end;

close(f);

end;

procedure WriteToATextFile(var Mas:dv_mas; Mas2:massive; var n,m,k,l,http:byte);

var f:text; i,j:byte;

begin

assign(f,'OutputMassiv.txt');

rewrite(f);

for i:=1 to n do

begin

for j:=1 to m do

write(f,Mas[i,j]:3);

writeln(f);

end;

writeln(f,'Строки, в которых элементы расположены по возрастанию:');

for i:=1 to http do

writeln(f,Mas2[i]:3);

close(f);

end;

procedure ReadFromATypedFile(var Mas:dv_mas; var n,m:byte);

var i,j:byte; f:file of integer; nn,mm:integer;

begin

assign(f,'InputMassiv');

reset(f);

read(f,nn,mm);

n:=abs(nn);

m:=abs(mm);

for i:=1 to n do

for j:=1 to m do

read(f,Mas[i,j]);

close(f);

end;

procedure WriteATypedFile(var Mas:dv_mas; Mas2:massive; var n,m,k,l,http:byte);

var i,j:byte; f:file of integer; nn,mm:integer;

begin

assign(f,'OutputMassiv');

rewrite(f);

nn:=k;

mm:=l;

write(f,nn,mm);

for i:=1 to http do

write(f,Mas2[http]);

close(f);

end;

procedure SizeOfMas(var n,m:byte);

begin

repeat

clrscr;

write(' Input Number Of String <30: '); readln(n);

until (n<=30) and (n>0);

repeat

clrscr;

write(' Input Number Of String <30: ',n); writeln;

write(' Input Number Of Column <30: '); readln(m);

until (m<=30) and (m>0);

end;

procedure InputMas (var Mas:Dv_Mas; var n,m:byte);

var i,j:byte;

begin

writeln(' Input Mas:');

for i:=1 to N do

for j:= 1 to M do

read(Mas[i,j]);

end;

procedure OutputMas (var Mas:Dv_Mas; var Mas2:massive; var n,m,k,l,http:byte);

var i,j:byte;

begin

writeln(' Massiv:');

for i:=1 to N do

begin

for j:= 1 to M do

write(Mas[i,j]:3);

writeln;

end;

writeln;

writeln('Строки, в которых элементы расположены по возрастанию:');

for i:=1 to http do

write(Mas2[i],' ');

writeln;

writeln;

end;

procedure ChoiceTypeOfInputMassiv(var Mas:dv_mas; var n,m:byte; var p:boolean);

var q:byte;

begin

p:=false;

repeat

writeln('1 - InputFromTheKeyboard');

writeln('2 - InputFromATextFile');

writeln('3 - InputFromATypedFile');

writeln('4 - Exit');

write('ChoiceTypeOfInputMassiv:');

readln(q);

until (q=3)or(q=2) or (q=1) or (q=4) or (q=5);

case q of

1: begin SizeOfMas(n,m); InputMas(Mas,n,m); end;

2:ReadFromATextFile(Mas,n,m);

3:ReadFromATypedFile(Mas,n,m);

4:p:=true;

end;

end;

procedure ChoiceTypeOfOutputMassiv(var Mas:dv_mas; var Mas2:massive; var n,m,k,l,http:byte);

var q:byte;

begin

writeln('1 - OutputOnTheDisplay');

writeln('2 - OutputInTheTextFile');

writeln('3 - BringInATypedFile');

write('ChoiceTypeOfInputMassiv:');

readln(q);

case q of

1:Outputmas(Mas,Mas2,n,m,k,l,http);

2:WriteToATextFile(Mas,Mas2,n,m,k,l,http);

3:WriteATypedFile(Mas,Mas2,n,m,k,l,http);

end;

end;

procedure FindStringWithOlolo(var mas:Dv_mas; var Mas2:massive; var n,m,http:byte);

var j,i:byte; bool:boolean; ad:integer;

begin

clrscr;

http:=0;

for i:=1 to n do

begin

j:=1;

Ad:=Mas[i,1];

Bool:=true;

while (bool) and (j<m) do

begin

if ad<mas[i,j+1] then

begin

ad:=mas[i,j+1];

end;

else bool:=false;

j:=j+1;

end;

if bool then begin http:=http+1; Mas2[http]:=i; end;

end;

writeln;

end;

end.

 

Код програми

uses crt,massiv;

var Mas:dv_mas; n,m,k,l:byte; p:boolean; Mas2:massive; http:byte;

begin

repeat

ChoiceTypeOfInputMassiv(Mas,n,m,p);

if not(p) then

begin

FindStringWithOlolo(Mas,Mas2,n,m,http);

ChoiceTypeOfOutputMassiv(Mas,Mas2,n,m,k,l,http);

end;

until p;

end.

 

 

Вывод: на данной лабораторной работе приобретались навыки работы с типом данных матрицы и усовершенствовались навыки разработки алгоритмов и отладки программ на примере решения задания, которое определяет количество строк матрицы в которых элементы расположены в порядке возрастания. Также был создан план отладки, где возникали такие ошибки как несовместимость типов, выход за границы диапазона и т.д.

 

Кафедра

“Компьютерные информационные технологии”

 

 

Лабораторная работа №9

по теме: ”Обработка матриц. Отладка программ»

с дисциплины ”Технологии программирования “

 

 

Выполнил: студент 916 группы

Петрук Татьяна

Проверил: Нечай А.В.

Днепропетровск

 

Лабораторная работа №9

 

 



Поделиться:


Последнее изменение этой страницы: 2016-04-26; просмотров: 230; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.117.196.217 (0.166 с.)