Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Часть2. Структурное программирование.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
2.4 Mб
Скачать

Это связано с правилом соответствия типов: два структурированных элемента принадлежат одному типу (идентичному), если они принадлежат ранее описанному типу либо описаны одной командой.

Для двух массивов 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=1n), где 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=1n, где 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.

Рис.1.2. Блок-схема алгоритма задачи 1.2

Примечание: Чтобы отсортировать одномерный массив по убыванию методом обмена, необходимо изменить условие: 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:=1n, j:=1n (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:=1n j:=1m, где 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:=1n, где 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

Примечание:

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