
- •Часть 2
- •Это связано с правилом соответствия типов: два структурированных элемента принадлежат одному типу (идентичному), если они принадлежат ранее описанному типу либо описаны одной командой.
- •Лабораторная работа №2. Использование подпрограмм при обработке массивов
- •Лабораторная работа №3. Программирование процессов обработки символьной и строковой информации
- •Список литературы
- •Приложение 1. Варианты заданий для самостоятельного решения Задачи на обработку одномерных массивов
- •Нахождение экстремумов в одномерных массивах
- •Задачи на обработку двумерных массивов
- •Задачи на формирование массивов
- •Вычисления с диагональными элементами в квадратных матрицах
- •Задачи на обработку двумерных массивов
- •Приложение2. Варианты заданий для самостоятельного решения
Это связано с правилом соответствия типов: два структурированных элемента принадлежат одному типу (идентичному), если они принадлежат ранее описанному типу либо описаны одной командой.
Для двух массивов M1 и M2 идентичного типа допустима операция M1 = M2. Доступ к отдельным элементам массива осуществляется по индексам. Например, 3-й элемент одномерного массива Vector определяется как Vector [3]; выражение вида Matrix [2,4] определяет элемент двумерного массива (матрицы) Matrix, находящийся на пересечении 2-й строки и 4-го столбца.
Операции над массивами
Инициализация – присваивание всем элементам массива исходных значений:
а) for I := 1 to N do Vector [ I ] := I * 10.0 ;
б) for I := 1 to N do
for J := 1 to M do Matrix [ I, J] := 0;
Ввод значений элементов массива:
а) for I := 1 to N do
begin
Write ( ' Введите ' , I, '-й элемент вектора ' );
Readln ( Vector [ I] )
end;
б) for I := 1 to N do
for J := 1 to M do
begin
Write ( ' Введите [', I, J, ']-й элемент матрицы ' );
ReadLn ( Matrix [ I, J] )
end;
Вывод значений элементов массива:
а) for I := 1 to N do Write ( Vector [I] ) ;
б) for I := 1 to N do
for J := 1 to M do Write ( Matrix [ I, J] );
Программы обработки одномерных массивов
Задача 1.1. Дан одномерный массив A:состоящий из n элементов(i=1n), где n – целое число, не больше 20. Вывести все элементы массива с нечетным индексом.
На рис.1.1 представлена блок-схема. На языке Паскаль программа будет иметь следующий вид:
program p1; uses crt; type mass=array[1..20] of real; var a:mass; n,i:integer; begin Clrscr; {ввод одномерного массива} writeln('введите количество элементов n'); readln(n); writeln('введите элементы массива A'); for i:=1 to n do read(A[i]); {обработка массива} for i:=1 to n do if odd(i) then writeln('A[',i:2,']=', A[i]:4:2); end. |
|
|
Рис.1.1. Блок-схема алгоритма задачи 1.1 |
Результаты выполнения программы:
введите количество элементов n
5
введите элементы массива А
1.2 3.0 5.6 2.7 0.3
А[ 1]=1.20
a[ 3]=5.60
a[ 5]=0.30
Примечание: Для определения четности номера элемента используем функцию odd(x). Функция odd(x) дает результат ИСТИНА, если аргумент функции х – величина нечетная. И результат ЛОЖЬ, если х – четная.
Условие четности номера индекса элемента массива будет записано следующим выражением: odd(i).
Cортировка одномерных массивов
Одной из самых распространенных задач при работе с одномерными массивами является их сортировка (упорядочивание), т.е. расположение элементов массива в определенном порядке, например по возрастанию.
Массив А, состоящий из n элементов, отсортирован по убыванию, когда каждый следующий элемент массива меньше или равен предыдущему:
А[1]>=A[2]>=A[3]>=….. >=A[n]
Массив А, состоящий из n элементов, отсортирован по возрастанию, когда каждый следующий элемент массива больше или равен предыдущему:
А[1]<=A[2]<=A[3]<=….. <=A[n]
Существует множество различных методов сортировок одномерного массива. Одним из самых простых алгоритмов сортировки обычно называют «метод обмена» (пузырька).
Задача 1.2. Дан одномерный массив A: i=1n, где n – целое число, не больше 15. Отсортировать массив в порядке возрастания его элементов.
Идея сортировки «методом обмена» заключается в многократных попарных сравнениях рядом стоящих элементов и перестановке их в заданном порядке.
Для организации сортировки используется два цикла с параметром (for-to-do). Внешний цикл (по индексу i) определяет количество просмотров элементов массива. Их число равно (n-1). Внутренний цикл (по индексу j) обеспечивает сравнение соседних элементов массива, а именно определяет номера индексов элементов массива (a[j] и a[j+1]), которые сравниваются между собой в условном блоке, а также осуществляет перестановку элементов массива в случае если их расположение не соответствует требуемому порядку. Для перестановки используется промежуточная переменная tmp.
На рис. 1.2 представлена блок-схема программы. На языке Паскаль программа поиска максимального элемента будет иметь вид:
program p2; uses crt; type mass=array[1..15] of integer; var a:mass; tmp,n,i,j:integer; begin Clrscr; write('введите размерность массива n='); readln(n); writeln('введите исходный массив'); for i:=1 to n do read(a[i]); {Сортировка массива} for i:=1 to n-1 do for j:=1 to n-i do if a[j]>a[j+1] then begin {Перестановка двух соседних элементов местами} tmp:=a[j]; a[j]:=a[j+1]; a[j+1]:=tmp; end; writeln(' массив по возрастанию '); for i:=1 to n do write(a[i]:3) end.
|
|
Примечание: Чтобы отсортировать одномерный массив по убыванию методом обмена, необходимо изменить условие: a[j]<a[j+1].
Результаты контрольного просчета:
|
Результаты работы программы:
|
||||
I |
j |
A[j] |
A[j+1] |
A |
введите размерность массива n=4 введите исходный массив 3 9 5 1 массив по возрастанию 1 3 5 9
|
1 |
1 |
3 |
9 |
3 9 5 1 |
|
|
2 |
9 |
5 |
3 5 9 1 |
|
|
3 |
9 |
1 |
3 5 1 9 |
|
2 |
1 |
3 |
5 |
3 5 1 9 |
|
|
2 |
5 |
1 |
3 1 5 9 |
|
3 |
1 |
3 |
1 |
1 3 5 9 |
Нахождение экстремумов в массивах
К алгоритмам поиска экстремумов относятся алгоритмы поиска максимального и минимального элементов в массиве.
Задача 1.3. Дан одномерный массив А: i=1,n, n – целое число, n<=10. Найти в одномерном массиве наибольший элемент (max) и его порядковый номер (номер индекса).
Определяется начальное условие поиска, например за mах принимается первый из рассматриваемых элементов массива (max=A[1]), а его порядковый номер равен единице (nmax=1). Далее для просмотра оставшихся элементов организовываем цикл, в котором mах элемент сравнивается с текущим и если текущий больше максимального A[i]> mах, тогда максимальный принимает значение текущего элемента массива mах:=A[i]. На рис.1.3 представлена блок-схема программы. На языке Паскаль программа поиска максимального элемента будет иметь вид:
Рис.1.3. Блок-схема алгоритма задачи 1.3. |
program p3; uses crt; type mass=array[1..10]of integer; var a:mass; n,i,nmax, max: integer; begin Clrscr; write('введите n='); readln(n); writeln ('введите массив a'); for i:=1 to n do read (a[i]); max:=a[1]; nmax:=1; for i:=2 to n do if a[i]>max then begin max:=a[i]; nmax:=i; end; writeln('max=',max:2,' nmax=', max:2); end.
|
|
|
Результаты выполнения программы: введите n=5 введите массив a 2 56 32 5 1 max=56 nmax= 2 |
|
Формирование массива
К задачам, связанным с обработкой матриц, относиться формирование нового массива по заданному условию.
Задача 1.4. Дана вещественная матрица А: i:=1n, j:=1n (n – количество строк и столбцов матрицы) где n<=10. Сформировать одномерный массив (вектор) B из элементов исходного, кратных 3 и стоящих в четных столбцах.
Рис.1.4. Блок-схема алгоритма Задачи 1.4 |
Общий алгоритм решения этой задачи следующий: Первоначально в формируемом массиве нет ни одного элемента. Значит, формируемый вектор пуст, а его длина равна нулю (K=0). Далее перебираем элементы исходного массива А. Если элемент А[i,j] удовлетворяет условию поиска (кратен 3 и имеет четный номер столбца), то его необходимо добавить в формируемый вектор B. Таким образом, если до добавления в векторе было K элементов, то после добавления количество элементов станет (K+1) и такой же номер получит новый элемент. На рис.1.4 представлена блок-схема. На языке Паскаль программа формирования вектора четных элементов матрицы будет иметь вид:
|
program p4;
uses Crt;
type
mass1=array[1..50]of integer;
mass=array[1..10,1..10]of integer;
var a:mass;b:mass1;
i,j,n,m,k:integer;
begin
Clrscr;
writeln('введите n,m');
read(n,m);
writeln('введите массив a');
for i:=1 to n do
for j:=1 to m do read(a[i,j]);
k:=0;
for i:=1 to n do
for j:=1 to m do
if (not odd(j))and((a[i,j] mod 3)=0) then
begin
inc(k);
b[k]:=a[i,j];
end;
writeln('вывод массива b');
for i:=1 to k do write(b[i]:2);
end.
Результаты работы программы:
введите n,m
3 4
введите массив a
2 3 5 6
5 9 1 2
5 7 2 8
вывод массива b
3 6 9
Примечание: Для определения четности номера элемента используем функцию odd(x). Условие четности номера индекса столбца j будет записано следующим выражением: not odd (j). Логическая операция not (логическое отрицание) – меняет результат ИСТИНА на ЛОЖЬ, и наоборот.
Второе условие – элемент массива кратен трем, если при его делении на три остаток равен нулю. Для определения кратности элемента целочисленного массива используем операцию целочисленного деления МОD, результатом которой является остаток от целочисленного деления. Условие кратности будет записано следующим образом: (a[i,j] mod 3)=0. Поскольку оба условия выполняются одновременно, то они связаны бинарной логической операцией and (логическое умножение), которая имеет результат ИСТИНА, если оба операнда истинны.
Задача 1.5 Дана вещественная матрица Z: i:=1n j:=1m, где n,m<=10. Сформировать одномерный массив (вектор) B из сумм элементов столбцов исходного.
На рис.1.5 представлена блок-схема. На языке Паскаль программа будет иметь следующий вид:
program p5; uses Crt; type mass= array[1..10,1..10] of real; mass1= array[1..10] of real; var Z:mass; B:mass1; i,j,n,m: integer; S:real; begin Clrscr; randomize; writeln(' введите n,m'); read(n,m); writeln(' массив Z'); for i:=1 to n do begin for j:=1 to m do begin Z[i,j]:=random*10-5;{действительные числа от -5 до 5 } write(Z[i,j]:5:2,' '); end; writeln; end; {формирование массива} for j:=1 to m do begin S:=0; for i:=1 to n do S:=S+Z[i,j]; B[j]:=S; end; {вывод полученного массива} writeln('массив B:'); for i:=1 to m do writeln('B[',i:2,']=',' ',B[i]:5:2); end. |
Рис.1.5. Блок-схема алгоритма задачи 1.5 |
Примечание: В задаче 1.5 число элементов в формируемом массиве известно, оно равно числу столбцов исходного массива. Поэтому не требуется ввода переменной, подсчитывающей число элементов в формируемом массиве (переменная К – задача 1.4.). Поскольку вычисляется сумма элементов столбца, то обработка массива идет по столбцу и внешним является цикл по индексу j, а внутренним – по индексу строки i.
Результаты выполнения программы:
введите n,m
2 3
массив Z:
-2.55 -1.11 -0.69
-4.47 0.50 2.64
массив B:
b[ 1]= -7.02
b[ 2]= -0.61
b[ 3]= 1.95
Обработка квадратных матриц
Матрица считается квадратной, если количество строк этой матрицы равно количеству столбцов. В таких матрицах существует две диагонали: главная и побочная (рис.1.6).
Рис. 1.6. Условия принадлежности главной(а) и побочной(б) диагоналям
Элемент массива принадлежит главной диагонали, если значения индекса столбца и строки элементов массива равны (i = j). Для побочной диагонали – сумма обоих индексов элемента равна (n+1), где n – число строк и столбцов в матрице.
Задача 1.6. Задана вещественная квадратная матрица А: i,j:=1n, где n<=10. Вычислить среднее арифметическое элементов главной диагонали и произведение элементов побочной диагонали.
Условия принадлежности элементов матрицы треугольникам над главной и побочной диагоналями, также под ними представлены на рис. 1.6. На рис. 1.7 представлена блок-схема алгоритма решения задачи. На языке Паскаль программа будет иметь следующий вид:
program p6; uses Crt; type mass=array[1..10,1..10]of real; var a:mass; i,j,n:integer; S,SA,P:real; begin Clrscr; write(‘введите n ’); readln(n); writeln(‘введите массив’); for i:=1 to n do for j:=1 to n do read(a[i,j]); S:=0; P:=1; for i:=1 to n do begin S:=S+a[i,i]; P:=P*a[i, n-i+1]; end; SA:=S/n; writeln('SA=', SA:5:2, 'P=', P:5:2); readln end. |
Рис. 1.7. Блок-схема алгоритма задачи 1.6 |
Результаты выполнения программы:
введите n 3
введите массив
3 4 5
1 2 3
1 1 1
SA= 2.00 P=10.00
Примечание:
В данной задаче индекс столбца матрицы может быть выражен через значение индекса строки, поэтому возможно использование одной индексной переменной.