- •Содержание:
- •Порядок выполнения лабораторных работ
- •Оператор присваивания
- •Операторы ввода-вывода
- •Условный оператор
- •Задание к лабораторной работе
- •Программирование разветвляющегося
- •Оператор цикла for
- •Нестандартные типы данных
- •Ограниченные типы данных
- •Оператор выбора варианта
- •Задание к лабораторной работе
- •Лабораторная работа 3 регулярные типы данных. Селективная обработка массивов
- •Регулярные типы данных
- •Сортировка массивов
- •Примеры выполнения задания лабораторной работы
- •Задание к лабораторной работе
- •Лабораторная работа 4 вложенные циклы. Обработка двумерных массивов
- •Общие указания
- •Задания к лабораторной работе
- •Лабораторная работа 5 процедуры и функции
- •Процедуры
- •Функции
- •Задание к лабораторной работе
- •Лабораторная работа 6 обработка символьных данных
- •Символьный тип данных
- •Строковый тип данных
- •Процедуры
- •Функции
- •'Abcdef' copy(s,2,3) 'bcd'
- •'System' length(s) 6;
- •Задание к лабораторной работе
- •Лабораторная работа 7 комбинированные типы данных
- •Задание к лабораторной работе
- •Лабораторная работа 8 файлы и файловые типы данных
- •Файловый тип данных
- •Процедуры обработки файлов
- •Файлы с типом
- •Процедуры для работы с файлами с типом
- •Функции для обработки файлов с типом
- •Задание к лабораторной работе
- •Список рекомендованной литературы
Лабораторная работа 4 вложенные циклы. Обработка двумерных массивов
Цель работы: выработать практические навыки в составлении алгоритмов, написании и отладке программ на селективную обработку двумерных массивов.
Общие указания
В Паскале многомерные массивы могут определяться последовательно: сначала объявляется один массив, затем второй, элементами которого являются объявленные ранее массивы, и т.д. Один массив вкладывается в другой, и степень такого вложения не ограничена.
Например:
type str=array[1..10] of real;
tabl=array[1..5] of str;
Приведенное описание двумерного массива можно заменить эквивалентным описанием
type tabl=array[1..5,1..10] of real;
При обработке двумерных массивов обычно применяются вложенные циклы. Цикл, охватывающий другие циклы, называется внешним, остальные циклы - внутренними.
Пример выполнения задания 1 лабораторной работы
Пример 21. В матрицы a(4,5) найти произведение положительных элементов.
Блок-схема
Порядок работы:
Шаг 1. Вводим матрицу a(4,5).
Шаг 2. Задаем начальное значение произведения p=1.
Шаг 3. Организовываем цикл, который перебирает строки матрицы (то есть индекс i), начиная с 1-й и заканчивая 4-й.
Шаг 4. Организуем цикл, который перебирает столбцы матрицы (то есть индекс j), начиная с 1-го и заканчивая 5-м.
Шаг 5. Если aij > 0, тогда присваиваем p = p aij.
Шаг 6. Если цикл по j не закончился, идем на начало цикла, то есть на шаг 4.
Шаг 7. Если цикл по i не закончился, идем на начало цикла, то есть на шаг 3.
Шаг 8. Печатаем p.
Шаг 9. Останов.
Пример 22. Найти сумму четных элементов третьей строки матрицы a(4,5).
Порядок работы:
Шаг 1. Вводим матрицу a(4,5).
Шаг 2. Устанавливаем начальное значение суммы s = 0.
Шаг 3. Задаем номер обрабатываемой строки и = 3.
Шаг 4. Организовываем цикл, который перебирает столбцы матрицы (то есть индекс j), начиная с 1-го и кончая 5-м.
Шаг 5. Если aij четное, тогда присваиваем s = s + aij.
Шаг 6. Если цикл по j не закончился, идем на начало цикла, то есть на шаг 4.
Шаг 7. Печатаем s.
Шаг 8. Останов.
Пример 23. Вычислить средние геометрические положительных элементов каждой строки матрицы X(5,8). Определить минимальное значение этих средних и номер соответствующей строки.
Программа имеет вид:
program pr23;
uses crt;
const m=5; n=8;
type stroka = Array[1..n] of real;
matr = array[1..m] of stroka;
stolb = array[1..m] of real;
var x:matr; b:stroka; sr:stolb; p,min:real;
i,j,k,nmin:integer; z:char;
begin clrscr;
for i:=1 to m do begin
WRITELN('ВВЕДИ ',N,' ЧИСЕЛ ',I,'-Й СТРОКИ');
FOR J:=1 TO N DO READ(X[I,J]); END;
WRITELN(' ':10,'ИСХОДНАЯ МАТРИЦА ');
FOR I:=1 TO M DO BEGIN
FOR J:=1 TO N DO WRITE(X[I,J]:7:1);
WRITELN;END;
{ВЫЧИСЛЕНИЕ СРЕДНИХ ГЕОМЕТРИЧЕСКИХ}
for i:=1 to m do
begin
b:=x[i]; p:=1; k:=0;
for j:= 1 to n do
if b[j]>0 then
begin p:=p*b[j];k:=k+1; end;
IF K>0 THEN SR[I]:=EXP(LN(P)/K) ELSE SR[I]:=-1;
END; {FOR}
{ПОИСК МИНИМАЛЬНОГО ЭЛЕМЕНТА}
min:=1E20;
for i:= 1 to m do
if( sr[i]<min) and (sr[i]>0) then
BEGIN MIN:=SR[I];NMIN:=I; END;
WRITELN;WRITELN(' ':5,' РЕЗУЛЬТАТЫ РАСЧЕТА');
FOR I:=1 TO M DO
WRITELN('СР.ГЕОМ .',I,'-Й СТРОКИ=',SR[I]:7:2);
FOR I:= 1 TO 34 DO WRITE(' = ');
WRITELN;
WRITELN('МИНИМАЛЬНОЕ СРЕДНЕЕ = ',MIN:7:2);
WRITELN('НОМЕР СТРОКИ = ',NMIN:2);
z:=readkey
end.
Примеры выполнения задания 2 лабораторной работы
Пример 24. Найти сумму четных элементов главной диагонали матрицы a(5,5).
Порядок работы:
Шаг 1. Вводим матрицу a(5,5).
Шаг 2. Устанавливаем начальное значение суммы s=0.
Шаг 3. Организовываем цикл, который перебирает строки матрицы (то есть индекс i), начиная с 1-й и заканчивая 5-й.
Шаг 4. Организовываем цикл, который перебирает столбцы матрицы (то есть индекс j), начиная с 1-го и заканчивая 5-м.
Шаг 5. Если aij четное и i = j, присваиваем s = s + aij.
Шаг 6. Если цикл по j не закончился, идем на начало цикла, то есть на шаг 4.
Шаг 7. Если цикл по i не закончился, идем на начало цикла, то есть на шаг 3.
Шаг 8. Печатаем s.
Шаг 9. Останов.
Пример 25. Вычислить произведение от умножения суммы положительных элементов главной диагонали на сумму нечетных элементов побочной диагонали матрицы А(6,6).
Программа имеет вид
program pr25;
uses crt;
const n=6;
type raz=1..n;
matr=array[raz,raz] of integer;
var a:matr; p,s1,s2,i,j:integer; z:char;
BEGIN CLRSCR;
FOR I:=1 TO N DO BEGIN
WRITELN('ВВЕДИ ',N,' ЧИСЕЛ ',I,'-Й СТРОКИ');
FOR J:=1 TO N DO READ(A[I,J]); END;
CLRSCR;
WRITELN(' ':10, 'ИСХОДНАЯ МАТРИЦА ');
for i:=1 to n do begin
for j:=1 to n do
write(a[i,j]:5); WRITELN;END;
{ВЫЧИСЛЕНИЕ СУММЫ ДИАГОНАЛЕЙ}
s1:=0; s2:=0;
for i:=1 to n do
begin j:= n+1-i;
if a[i,i] > 0 then s1:=s1+a[i,i];
if a[i,j] MOD 2 <> 0 then s2:=s2+a[i,j];
END;
{ВЫЧИСЛЕНИЕ ПРОИЗВЕДЕНИЯ}
P:=S1*S2;
WRITELN;WRITELN(' ':10,'РЕЗУЛЬТАТЫ РАСЧЕТА ');
WRITELN('СУММА ПОЛ. ЭЛ. ГЛ. ДИАГОНАЛИ=',S1:4);
WRITELN('СУММА ОТР. ЭЛ. ПОБ. ДИАГОНАЛИ=',S2:4);
WRITELN(' ИХ ПРОИЗВЕДЕНИЕ = ',P:4);
z:=readkey
end.
Пример 26. Найти максимальный элемент побочной диагонали матрицы X(5,5) и вывести на печать весь столбец, в котором он находится.
Программа имеет вид:
program pr26;
uses crt;
const n=5;
type raz=1..n;
matr=array[raz,raz] of real;
var x:matr; max:real; i,j,jmax:raz; z:char;
BEGIN CLRSCR;
FOR I:=1 TO N DO BEGIN
WRITELN('ВВЕДИ',N,'ЧИСЕЛ ',I,'-Й СТРОКИ');
FOR J:= 1 TO N DO READ(X[I,J]);
END;
CLRSCR;
WRITELN(' ':5, 'ИСХОДНАЯ МАТРИЦА ');
for i:=1 to n do begin
for j:=1 to n do
write(x[i,j]:5:1);
WRITELN; END;
{ПОИСК МАКСИМАЛЬНОГО ЭЛЕМЕНТА}
max:=-1e20;
for i:=1 to n do
begin j:=n+1-i;
if x[i,j]>max then
begin max:=x[i,j];jmax:=j; end;
END;
{ВЫВОД НАЙДЕННОГО СТОЛБЦА}
WRITELN; WRITELN(' МАКС. ЭЛЕМЕНТ=',MAX:5:1);
WRITELN('СТОЛБЕЦ С МАКС. ЭЛ. ',jmax:2);
for i:=1 to n do
writeln(' ':10,x[i,jmax]:5:1);
z:=readkey
end.
Пример 27. В матрице a(4,5) найти количество четных элементов в строке, в которой второй элемент положительный (если таких строк несколько, результат распечатать в отдельности для каждой).
Порядок работы:
Шаг 1. Вводим матрицу a(4,5).
Шаг 2. Организовываем цикл, который перебирает строки матрицы (то есть индекс i), начиная с 1-й и заканчивая 4-й.
Шаг 3. Если ai2 > 0, то идем на шаг 4, иначе берем другую строку, то есть идем на шаг 9.
Шаг 4. Устанавливаем начальное значение количества k=0.
Шаг 5. Организовываем цикл, который перебирает столбцы матрицы (то есть индекс j), начиная с 1-го и заканчивая 5-м.
Шаг 6. Если aij четное, тогда присваиваем k = k + 1.
Шаг 7. Если цикл по j не закончился, идем на начало цикла, то есть на шаг 5.
Шаг 8. Печатаем k.
Шаг 9. Если цикл по i не закончился, идем на начало цикла, то есть на шаг 2.
Шаг 10. Останов.
Пример 28. В матрицы a(4,5) найти количество четных элементов в строке, у которой сумма элементов положительная (если таких строк несколько, результат распечатать в отдельности для каждой).
Порядок работы:
Шаг 1. Вводим матрицу a(4,5).
Шаг 2. Организовываем цикл, который перебирает строки матрицы (то есть индекс i), начиная с 1-й и заканчивая 4-й.
Шаг 3. Устанавливаем начальное значение суммы s = 0.
Шаг 4. Организовываем цикл, который перебирает столбцы матрицы (то есть индекс j), начиная с 1-го и заканчивая 5-м.
Шаг 5. Присваиваем s = s + aij.
Шаг 6. Если цикл по j не закончился, идем на начало цикла, то есть на шаг 4.
Шаг 7. Если s > 0, то идем на шаг 8, иначе - берем другую строку, то есть идем на шаг 13.
Шаг 8. Устанавливаем начальное значение количества k=0.
Шаг 9. Организовываем цикл, который перебирает столбцы матрицы (то есть индекс j), начиная с 1-го и кончая 5-м.
Шаг 10. Если aij четное, тогда присваиваем k = k + 1.
Шаг 11. Если цикл по j не закончился, идем на начало цикла, то есть на шаг 9.
Шаг 12. Печатаем k.
Шаг 13. Если цикл по i не закончился, идем на начало цикла, то есть на шаг 2.
Шаг 14. Останов.