
Занятие 3 Алгоритмы обработки массивов
Цель занятия - изучение основ построения алгоритмов и программ обработки массивов данных
1 Общие сведения
Массив – это упорядоченная последовательность величин, обозначенных одним именем и индексом, который указывает положение элемента в массиве.
Массивы,
объединяющие переменные с одной индексной
величиной, называются одномерными.
Например, элементы Z[1],
Z[2],
Z[3],
Z[4]
образуют одномерный массив {Zi},
.
Элементы одномерного обозначаются
именем массива и следующим за ним в
квадратных скобках индексом. Индекс
может быть выражением, значение которого
должно быть в диапазоне, определяемом
типом индекса.
При решении практических задач часто приходится иметь дело с различными таблицами данных, математическим эквивалентом которых служат матрицы. Такой способ организации данных, при котором каждый элемент определяется номером строки и номером столбца, на пересечении которых он расположен, называется двумерным массивом или таблицей.
Например, данные о планетах Солнечной системы представлены следующей таблицей (таблица 1):
Таблица 1 Планеты солнечной системы
Планета |
Расст. до Солнца |
Относ. обьем |
Относ. масса |
Меркурий |
57.9 |
0.06 |
0.05 |
Венера |
108.2 |
0.92 |
0.81 |
Земля |
149.6 |
1.00 |
1.00 |
Марс |
227.9 |
0.15 |
0.11 |
Юпитер |
978.3 |
1345.00 |
318.40 |
Сатурн |
1429.3 |
767.00 |
95.20 |
Их можно занести в память компьютера, используя понятие двумерного массива. Положение элемента в массиве определяется двумя индексами. Они показывают номер строки и номер столбца. Индексы разделяются запятой. Например: A[7, 6], D[56, 47].
Заполняется двумерный массив аналогично одномерному: с клавиатуры, с помощью оператора присваивания. Например, в результате выполнения программы:
Program Vvod2;
Var I, J : Integer;
A : Array [1..20, 1..20] Of Integer;
Begin
FOR I := 1 TO 3 DO
FOR J := 1 TO 2 DO A[I, J] := 456 + I
End.
элементы массива примут значения A[1, 1] = 457; A[1, 2] = 457; A[2, 1] = 458; A[2, 2] = 458; A[3, 1] = 459; A[3, 2] = 459.
При описании массива задается требуемый объем памяти под двумерный массив, указываются имя массива и в квадратных скобках диапазоны изменения индексов.
При выполнении инженерных и математических расчетов часто используются переменные более чем с двумя индексами. При решении задач на ЭВМ такие переменные представляются как компоненты соответственно трех-, четырехмерных массивов и т.д.
Однако описание массива в виде многомерной структуры делается лишь из соображений удобства программирования как результат стремления наиболее точно воспроизвести в программе объективно существующие связи между элементами данных решаемой задачи. Что же касается образа массива в памяти ЭВМ, то как одномерные, так и многомерные массивы хранятся в виде линейной последовательности своих компонент, и принципиальной разницы между одномерными и многомерными массивами в памяти ЭВМ нет. Однако порядок, в котором запоминаются элементы многомерных массивов, важно себе представлять. В большинстве алгоритмических языков реализуется общее правило, устанавливающее порядок хранения в памяти элементов массивов: элементы многомерных массивов хранятся в памяти в последовательности, соответствующей более частому изменению младших индексов.
Рассмотрим пример работы с двухмерными массивами. Обозначим массивом оценки учеников класса по нескольким предметам. Каждая оценка является значением элемента массива оценок А и имеет порядковый номер (два индекса). Поставим в соответствие первому индексу номер фамилии в списке учеников, а второму – номер предмета, по которому получена оценка. Тогда двумерный массив оценок можно представить в виде таблицы: каждый элемент a[i,j] находится на пересечении i-ой строки и j-го столбца.
Исходные данные могут быть представлены в виде таблицы оценок (таблица2).
Таблица 2 Годовые оценки по предметам
Фамилия |
Предмет |
|||||
Физика |
Химия |
Математика |
Информатика |
История |
Биология |
|
Иванов |
4 |
5 |
3 |
4 |
5 |
5 |
Петров |
4 |
5 |
4 |
3 |
4 |
4 |
Сидоров |
5 |
|
5 |
3 |
4 |
5 |
… |
… |
… |
… |
… |
… |
… |
Якупов |
4 |
3 |
4 |
5 |
4 |
5 |
Можно создать одномерные массивы фамилий S студентов и наименований предметов Р. Значением элемента массива Р будет наименование предмета, а индексом – порядковый номер предмета, например: 1 – физика, 2 – химия, 3 – математика, 4 – информатика, 5 – история, 6 – биология.
Представленная выше таблица может быть представлена в виде (таблица 3) набора элементов (число строк - n, число столбцов- m).
Таблица 3 Набор элементов
Массив S |
Массив Р |
|||||
P[1] |
P[2] |
P[3] |
P[4] |
P[5] |
P[6] |
|
S[1] |
a[1,1] |
a[1,2] |
a[1,3] |
a[1,4] |
a[1,5] |
a[1,6] |
S[2] |
a[2,1] |
a[2,2] |
a[2,3] |
a[2,4] |
a[2,5] |
a[2,6] |
S[3] |
a[3,1] |
a[3,2] |
a[3,3] |
a[3,4] |
a[3,5] |
a[3,6] |
… |
… |
… |
… |
… |
… |
… |
S[n] |
a[n,1] |
a[n,2] |
a[n,3] |
a[n,4] |
a[n,5] |
a[n,6] |
Массив оценок можно задать с использованием функции Random, например:
For i:=1 to n do for j:=1 to m do a[i,j]:=Random(4)+2;
Для вывода элементов массива А на экран удобно использовать вложенный цикл:
For i:=1 to n do begin writeln; write(S[I]:19,’ ½’);
For j:=1 to m do write(A[i,j]:7,’ ½’) end;
Объединение отдельных переменных в массивы позволяет упорядочить элементы массива в памяти ЭВМ и тем самым облегчить их массовую обработку, а также упрощает идентификацию элементов массивов, так как для ссылки на нужный элемент массива достаточно указать его индексы.
Пример 1. Задан одномерный массив X1, X2, …,XN . Фрагмент алгоритма определяет произведение отрицательных элементов с четными номерами.
Рис 9 Пример фрагмента блоксхемы
Пример 2. Вычислить сумму элементов числового массива A = (a1 , a2 , ... , aN ).
Для решения задачи используем циклический алгоритм. Подготовка цикла заключается в задании начального значения суммы, равного нулю. В качестве параметра цикла берем номер члена последовательности. Начальное значение параметра цикла равно 1, конечное значение – числу членов последовательности, шаг цикла +1. В теле цикла выполняется последовательное суммирование. Окончание цикла будет при значении параметра цикла, превышающего количество членов последовательности.
I
S
0
1
0
+ a1
=
0+3 = 5
2
a1
+
a2
=
3+5 = 8
3
a1+a2+a3
=
8-2 = 6
4
a1+a2+a3+a4
=
6+6 = 12
5
a1+a2+a3+a4+a5
=
12+3=15
|
|
|
||||||||||||||||
Turbo Pascal Program Summa; Uses Crt; Type Mas = Array [1..20] of Real; Var A : Mas; i, N : Integer; S : Real; BEGIN ClrScr; {очистка экрана } Write('Введите N = '); ReadLn(N); {ввод значения N} For i := 1 to N dо {цикл по элементам массива} begin Write('A [ ', i , ' ] = '); ReadLn(A[i]) {ввод элементов массива} end; S := 0; {присваивание начального значения} For i := 1 to N do S := S+A[i]; {суммирование} WriteLn; WriteLn('Сумма равна ', S : 5 : 1); ReadLn END.
Блок-схема
|
|
|
Пример 3. Найти наибольший элемент числового массива A = (a1, a2 , ..., aN ) и его номер.
Turbo Pascal Program MaxElem; Uses Crt; Type Mas = Array [1..20] of Real; Var A : Mas; i, N : Integer; k : Integer; Amax : Real; BEGIN СlrScr; Write('Введите N = '); ReadLn(N); For i := 1 to N do {Ввод значений элементов массива А} begin Write('A [ ', i, ' ] = '); ReadLn(A[i]) end; Amax := A[1]; k:=1; {Поиск максимального элемента} For i := 2 to N do If A[i] > Amax then begin Amax := A[i]; k := i end; WriteLn; WriteLn('Наибольший элемент' , k , '-й'); WriteLn('Его значение ', Amax : 5 : 1); ReadLn END.
|
|
|
||||||||||
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
Пример 4. В баскетбольную команду могут быть приняты студенты, рост которых превышает 170 см. Составьте список кандидатов в команду изстудентов класса.
Исполнение алгоритма
N теста |
I |
Рост[i] > 170 |
K |
Кандидаты в команду |
1 |
1 2 3 |
+ - + |
0 1 2 |
Кулов Уваров |
2 |
1 2 |
- - |
0 |
- |
TurboPascal
Program BascetBall;
Uses Crt;
Var
SurName : Array [1..30] of String; { фамилии студентов }
Height : Array [1..30] of Real; { рост студентов }
Cand : Array [1..30] of String; { фамилии кандидатов }
NPupil, i, K : Integer; { NPupil - число студентов,
K - количество зачисленных}
BEGIN ClrScr;
Write('В КОМАНДУ ЗАЧИСЛЯЮТСЯ студенты, ');
WriteLn('РОСТ КОТОРЫХ ПРЕВЫШАЕТ 170 СМ.'); WriteLn;
Write('Сколько всего студентов ? ');
ReadLn(NPupil);
WriteLn('Введите фамилии и рост студентов :');
For i := 1 to NPupil do
begin Write(i, '. Фамилия - '); ReadLn(SurName[i]);
Write(' Рост - '); ReadLn(Height[i]);
end; WriteLn;
K:=0; { Составление списка команды }
For i := 1 to NPupil do
If Height[i]>170 then
begin K:=K+1; Cand[K] := SurName[i] end;
If K=0 then WriteLn('В ГРУППЕ НЕТ КАНДИДАТОВ В КОМАНДУ.')
else
begin WriteLn('КАНДИДАТЫ В БАСКЕТБОЛЬНУЮ КОМАНДУ :');
For i := 1 to K do WriteLn( i, '. ' , Cand[i]);
end;
ReadLn
END.
Пример 5. Дан массив X(N). Получить новый массив Y(N) такой, что в нем сначала идут положительные числа, затем нулевые, и затем отрицательные из X.
Тест
-
Данные
Результат
N=7
X=(-1, 2, 0, 4, -3,-2,0)
Y=(2, 4, 0, 0, -1, -3, -2)
.
Turbo Pascal
Program NewOrder;
Uses Crt;
Var N, i, k : Integer;
X, Y : Array [1..20] of Real;
BEGIN
ClrScr;
Write('Введите N = '); ReadLn(N);
For i := 1 to N do
begin
Write('X[ ', i, ' ] = '); ReadLn(X[i])
end;
k:=0;
For i := 1 to N do
If X[i]>0 then
begin k:=k+1; Y[k]:=X[i]
end;
For i := 1 to N do
If X[i]=0 then
begin k:=k+1; Y[k]:=X[i]
end;
For i := 1 to N do
If X[i]<0 then
begin k:=k+1; Y[k]:=X[i]
end;
Write('О т в е т : полученный массив');
For i := 1 to N do Write(Y[i] : 5 : 1);
WriteLn; ReadLn
END
Блок-схема
Пример 6 Заполнить матрицу порядка n по следующему образцу:
1 |
2 |
3 |
... |
n-2 |
n-1 |
n |
2 |
1 |
2 |
... |
n-3 |
n-2 |
n-1 |
3 |
2 |
1 |
... |
n-4 |
n-3 |
n-2 |
... |
... |
... |
... |
... |
... |
... |
n-1 |
n-2 |
n-3 |
... |
2 |
1 |
2 |
n |
n-1 |
n-2 |
... |
3 |
2 |
1 |
Turbo Pascal
Program Massiv12;
Var I, J, K, N : Integer; A : Array [1..10, 1..10] Of Integer;
Begin
Write('Введите порядок матрицы: '); ReadLn(N);
For I := 1 To N Do
For J := I To N Do
Begin
A[I, J] := J - I + 1; A[J, I] := A[I, J];
End;
For I := 1 To N Do
Begin
WriteLn;
For J := 1 To N Do Write(A[I, J]:4);
End
End.
Задача 7. Дана целочисленная квадратная матрица. Найти в каждой строке наибольший элемент и поменять его местами с элементом главной диагонали.
Program Obmen;
Var N, I, J, Max,Ind, Vsp : Integer;A : Array [1..15, 1..15] Of Integer;
Begin
WRITE('Введите количество элементов в массиве: '); READLN(N);
FOR I := 1 TO N DO
FOR J := 1 TO N DO
Begin
WRITE('A[', I, ',', J, '] '); READLN(A[I, J])
End;
FOR I := 1 TO N DO
Begin
Max := A[I, 1]; Ind := 1;
FOR J := 2 TO N DO
IF A[I, J] > Max THEN
Begin
Max := A[I, J]; Ind := J
End;
Vsp := A[I, I]; A[I, I] := A[I, Ind]; A[I, Ind] := Vsp
End;
FOR I := 1 TO N DO
Begin
WriteLn;
FOR J := 1 TO N Do Write(A[I, J] : 3);
End; WriteLn
End.
БИБЛИОГРАФИЧЕСКИЙ СПИСОК
Акулов, О. А. Информатика: базовый курс [Текст]: учебник/ О.А. Акулов, Н. В. Медведев. - 6-е изд. - М.: Омега-Л, 2009. - 574 с.
Каймин, В. А. Информатика [Текст]: учебник / В. А. Каймин. - М.: ИНФРА-М, 2010. - 284 с.
Лабораторный практикум. Основы программирования на языке PASCAL: методические указания [Текст] / [Сост. Э.С.Саитова, Т.М. Шамсутдинова]; Башкирский государственный аграрный университет. – Уфа: БГАУ, 2012. – 92 с.
Шамсутдинова Т.М. Программирование на языке PASCAL. Методические указания для самостоятельной работы /Башкирский государственный аграрный университет: Уфа, 2012. –12 с.
ПРИЛОЖЕНИЕ А
Основные функциональные элементы блок-схем алгоритмов в соответствии с ГОСТ 19002-89 ЕСПД (Единая система программной документации)
Название символа |
Обозначение и пример заполнения |
Пояснение |
Процесс |
|
Вычислительное действие или последовательность действий |
Решение |
|
Проверка условий |
Модификация |
|
Начало цикла |
Предопределенный процесс |
|
Вычисления по подпрограмме, стандартной подпрограмме |
Ввод-вывод |
|
Ввод-вывод в общем виде |
Пуск-останов |
|
Начало, конец алгоритма, вход и выход в подпрограмму |
Документ |
|
Вывод результатов на печать |
Блок процесс применяется для обозначения действия или последовательности действий, изменяющих значение, форму представления или размещения данных. Для улучшения наглядности схемы несколько отдельных блоков обработки можно объединять в один блок. Представление отдельных операций достаточно свободно.
Блок решение используется для обозначения переходов управления по условию. В каждом блоке "решение" должны быть указаны вопрос, условие или сравнение, которые он определяет.
Блок модификация используется для организации циклических конструкций. (Слово модификация означает видоизменение, преобразование). Внутри блока записывается параметр цикла, для которого указываются его начальное значение, граничное условие и шаг изменения значения параметра для каждого повторения.
Блок предопределенный процесс используется для указания обращений к вспомогательным алгоритмам, существующим автономно в виде некоторых самостоятельных модулей, и для обращений к библиотечным подпрограммам
ПРИЛОЖЕНИЕ Б
Задачи для самостоятельного решения по теме «Алгоритмы линейной и разветвляющейся структуры»
1. Вычислить длину окружности, площадь круга и объём шара одного и того же заданного радиуса.
2. Вычислить периметр и площадь прямоугольного треугольника по длинам двух его катетов.
3. По координатам трёх вершин некоторого треугольника найти его площадь и периметр.
4. Вычислить дробную часть среднего геометрического трёх заданных вещественных чисел.
5. Определить, является ли заданное целое число А нечётным двузначным числом.
6. Определить, имеется ли среди заданных целых чисел A, B, C хотя бы одно чётное.
7. Даны три числа. Выбрать те из них, которые принадлежат заданному отрезку [ e, f ].
8. Определить число, полученное выписыванием в обратном порядке цифр заданного целого трёхзначного числа.
9 Вычислить площадь кольца, ширина которого равна Н, а отношение радиуса большей окружности к радиусу меньшей окружности равно D.
10 Определить, есть ли среди цифр заданного целого трёхзначного числа одинаковые.
11 Заданы площади круга и квадрата. Определить, поместится ли квадрат в круге.
12 Для задачи 6.12 определить, поместится ли круг в квадрате.
13 Заданы координаты двух точек. Определить, лежат ли они на одной окружности с центром в начале координат.
14 Определить, лежит ли заданная точка на одной из сторон треугольника, заданного координатами своих вершин.
15 Проверить, можно ли построить треугольник из отрезков с длинами x, y, z и, если можно, то какой – остроугольный, прямоугольный или тупоугольный.
16 Проверить, можно ли построить параллелограмм из отрезков с длинами x, y, v, w.
17 Даны координаты (как целые от 1 до 8) двух полей шахматной доски. Определить, может ли конь за один ход перейти с одного из этих полей на другое.
18 Треугольник задан величинами своих углов (град.) и радиусом описанной окружности. Вычислить стороны треугольника.
19 Смешали v1 литров воды с температурой t1 градусов Цельсия с v2 литрами воды с температурой t2 градусов Цельсия. Вычислить объём и температуру образовавшейся смеси.
20 Выбрать наибольшее из трёх заданных чисел.
21 Два прямоугольника заданы длинами сторон. Определить, можно ли первый прямоугольник целиком разместить во втором.
22 Значения заданных переменных a, b и c перераспределить таким образом, что a, b, c станут, соответственно, наименьшим, средним и наибольшим значениями.
24 Решить линейное уравнение ax = b.
24 Решить биквадратное уравнение ax4 + bx2 + c = 0.
25 Определить номер квадранта, в котором находится точка с заданными координатами (x, y).
26 Записать заданное смешанное число в виде неправильной дроби.
27 Определить, пройдет ли кирпич с рёбрами a, b, c в прямоугольное отверстие со сторонами x и y. Просовывать кирпич в отверстие разрешается только так, чтобы каждое из его рёбер было параллельно или перпендикулярно каждой из сторон отверстия.
28 Идет k-ая секунда суток. Определить, сколько полных часов и полных минут прошло к этому моменту.
29 Найти центр и радиус окружности, проходящей через три заданные точки на плоскости.
30 Даны четыре точки на плоскости. Определить, можно ли построить треугольник с вершинами в этих точках такой, что оставшаяся точка окажется внутри треугольника.
31 Составить программу случайного выбора трех дисциплин, по которым придется сдавать экзамены, из предлагаемых на выбор четырех (всего возможно 4 варианта выбора);
32 Составить программу случайного выбора летнего отдыха из семи предлагаемых туристическим агенством курортов, причем с вероятностью 3/10 придется отдыхать в деревне.
33 Составить программу выбора дежурного в группе из списка 10 студентов с вероятностью 1/15, в остальных случаях дежурит староста.
34 Вывести на экран сообщение в зависимости от полученного значения оценки (по десятибальной системе), например: 1..2: плохо; 3..5: удовлетворительно и т.д., иначе – неправильный ввод данных.
35 Вывести на экран сообщение в зависимости от значения температуры воздуха на улице (от –50 до +50оС), например: -50..-20: очень холодно; -19..-10 : холодно и т.д., иначе – неправильный ввод данных.