Пример 6. Программа обработки двумерного массива с вводом элементов матрицы из текстового файла
Задание 6. В двумерном массиве (матрице) определить номер строки, в которой находится максимальное количество положительных элементов. Если положительных элементов нет в массиве, вывести сообщение об этом.
Исходные данные ввести из текстового файла, сохраняемого на диске.
Постановка задачи.
Исходные данные.
q Имя текстового файла на диске
q Текстовый файл на диске с указанным именем, содержащий следующую информацию:
o число строк в матрице n<=10;
o число столбцов в матрице m<=10;
o двумерный массив (матрица) размером n x m , содержащий положительные и отрицательные значения.
Выходные данные: номер строки, в которой находится максимальное количество положительных элементов.
Аномалии:
· отсутствие файла с исходными данными на диске;
· отсутствие положительных элементов в массиве.
Реакция на аномальную ситуацию – выдача сообщения.
Алгоритм. Подсчет числа положительных элементов в строках матрицы.
Исходные данные:
СТРОКА fn – имя входного файла на диске;
ФАЙЛ F1 – входной, текстовый файл (файловая переменная);
СКАЛЯР n<=10 - целое число;
СКАЛЯР m<=10 - целое число;
МАССИВ A[n x m] целого типа.
Выходные данные:
СКАЛЯР imax – целое число.
Промежуточные данные:
МАССИВ K[n] целого типа /* массив счетчиков количества положительных элементов в строках матрицы */
СКАЛЯР kmax – целое число /* максимальное количество положительных элементов */
СКАЛЯР i – целое число /* параметр цикла */
СКАЛЯР j – целое число /* параметр цикла */
Начало
Вывод(‘input filename’)
Ввод(fn)
Связывание файловой переменной F1 c файлом, имя которого fn
Отключение проверки завершения операции ввода-вывода
Открытие файла F1 в режиме чтения
Включение проверки завершения операции ввода-вывода
Если IOResult<>0 то
Вывод(‘File not found!’)
Принудительное завершение программы
КОНЕЦ_ЕСЛИ
Ввод_из_файла(n)
Ввод_из_файла (m)
ЦИКЛОТ i:=1 ДО n
ЦИКЛОТ j:=1 ДО m
Ввод_из_файла (A[i,j])
КОНЕЦ_ЦИКЛА
КОНЕЦ_ЦИКЛА
ЦИКЛ ОТ i:=1 ДО n
K[i]=0;
ЦИКЛ ОТ j:=1 ДО m
ЕСЛИ (A[i,j]>0) ТО
K[i]= K[i]+1
КОНЕЦ_ЕСЛИ
КОНЕЦ_ЦИКЛА
КОНЕЦ_ЦИКЛА
Kmax=K[1]
imax=1
ЦИКЛ ОТ i:=1 ДО n
ЕСЛИ (K[i]>Kmax) ТО
Kmax=K[i]
imax=i
КОНЕЦ_ЕСЛИ
КОНЕЦ_ЦИКЛА
ЕСЛИ (Kmax=0) ТО
Вывод(‘Not A[i,j]>0!’)
ИНАЧЕ
Вывод(‘imax= ‘,imax)
КОНЕЦ_ЕСЛИ
Закрытие файла
Конец
Блок-схема данного алгоритма, описанного на псевдокоде, представлена на рис. 8.9.
Блок-схема алгоритма.
Программа на языке Паскаль.
Program Nomer_Row;
Var
F1: text;
A: array[1..10,1..10] of integer;
K: array[1..10] of integer;
i, j, n, m, kmax, imax: integer;
fn: string;
begin
write('input filename '); readln(fn);
assign(F1,fn);
{$I-} Reset(F1); {$I+}
if IOResult<>0 then
begin
write('File ', fn, ' not found!'); readln; Halt;
End;
read(F1,n); read(F1,m);
for i:=1 to n do begin
for j:=1 to n do begin
read(F1,A[i,j]);
write(A[i,j],' ');
end;
writeln;
end;
for i:=1 to n do begin
K[i]:=0;
for j:=1 to m do
if (A[i,j]>0) then
K[i]:= K[i]+1;
end;
kmax:=K[1]; imax:=1;
for i:=1 to n do
if (K[i]>kmax) then begin
kmax:=K[i]; imax:=i;
end;
if kmax=0 then writeln('Not A[i][j]>0 !')
else writeln('imax= ',imax);
close(F1);
write('PRESS ANY KEY!');
readln;
end.
Результаты тестирования.
1. Исходные данные:
Текстовый файл matrix.txt, содержащий следующую информацию
<n - число строк > <m - число столбцов>
<матрица n x m, элементы разделяются пробелами, каждая строка матрицы записывается в отдельной строке файла>
a) Тестовый пример 1:
Файл matrix.txt
4 4
1 2 -3 -6
-3 -9 0 5
-6 -3 7 8
11 6 23 -1
Результат: imax=4.
a) Тестовый пример 2:
Файл matr.txt
4 4
-1 -2 -3 -6
-3 -9 0 -5
-6 -3 -7 -8
-11 -6 -23 -1
Результат: сообщение - Not A[i][j]>0 !
Результаты, выданные программой.
1. Тестовый пример1
input filename c:\matrix.txt
1 2 -3 -6
-3 -9 0 5
-6 -3 7 8
11 6 23 -1
imax= 4
PRESS ANY KEY!
2. Тестовый пример 2
input filename c:\matr.txt
-1 -2 -3 -6
-3 -9 0 -5
-6 -3 -7 -8
-11 -6 -23 -1
Not A[i][j]>0 !
PRESS ANY KEY!
Разработка программ сложной структуры
Процедуры и функции
При создании программы решения сложной задачи выполняется декомпозиция (разделение) задачи на подзадачи, а подзадачи – на еще меньшие подзадачи. Каждая подзадача имеет точно определенное функциональное назначение и интерфейс, т.е. описание входных и выходных данных. Представление алгоритма решения задачи ив виде совокупности связанных между собой подзадач обусловливает структуру сложной программы в виде множества взаимосвязанных подпрограмм.
Подпрограмма – это отдельно запрограммированный алгоритм, который могут использовать другие алгоритмы. Подпрограмма является самостоятельной частью программы, имеет свое имя и оформляется в соответствии с правилами синтаксиса языка программирования высокого уровня.
В языке Паскаль существуют два вида подпрограмм: процедуры и функции. Каждая процедура или функция должна быть описана один раз, но может использоваться внутри программы многократно. Описания процедур и функций размещаются в программе после раздела объявления переменных.
Использование подпрограмм позволяет избежать повторений одной и той же последовательности операторов в программе, упростить разработку и отладку больших программ.
Описание процедуры или функции имеет такую же структуру, как и программа на Паскале, и может включать в себя разделы Label, Const, Type, Var, Procedure, Function и раздел операторов. Любой из разделов, кроме раздела операторов, может отсутствовать. Процедуры и функции могут включать в себя другие, внутренние процедуры и функции.
Описание процедуры имеет следующий вид:
Procedure <имя> (<список формальных параметров>);
Label
Const разделы описаний меток, констант, типов,
Type переменных
Var
Procedure разделы описаний внутренних
Function процедур и функций
Begin
<операторы>
end;
Описание функции имеет следующий вид:
Function <имя> (<список формальных параметров>): <тип результата>;
Label
Const разделы описаний меток, констант, типов,
Type переменных
Var
Procedure разделы описаний внутренних
Function процедур и функций
Begin
<операторы>
end;
Описание процедуры или функции завершается точкой с запятой.
В разделе операторов функции должен быть хотя бы один оператор, который присваивает имени функции значение результата следующего вида:
<имя функции>:=<выражение>;
Тип значения выражения должен быть совместим с типом результата функции.
Предложение Procedure (Function) называется заголовком процедуры (функции). В заголовке в круглых скобках указывается список формальных параметров, с помощью которого осуществляется обмен данными между вызывающей программой или подпрограммой и вызываемой процедурой или функцией. Обмен данными между программами и подпрограммами осуществляется тремя способами:
o с помощью глобальных переменных;
o с помощью списка формальных параметров;
o с помощью возвращаемых значений в случае функции.
Рассмотрим подробно все три способа.
|