- •6. Алгоритмы и программы
- •6.1. Алгоритм и алгоритмический процесс
- •6.1.1. Основные свойства алгоритмов:
- •6.1.2. Способы записи алгоритма
- •6.1.3. Схемы алгоритмов и программ
- •6.2. Переменная и постоянная величина Выражения
- •6.3. Присваивание
- •6.4. Основные этапы решения задач на эвм
- •6. 5. Алгоритмизация. Базовые алгоритмические структуры
- •6.5.1. Реализация базовых структур в языке Pascal
- •6.5.2. Реализация базовых структур в языке qBasic
- •Операторы тела цикла
- •6.6. Ввод - вывод
- •6.6.1.Ввод-вывод данных на языке Pascal
- •Var X, y: integer; {Описание переменных X, y целочисленного типа}
- •6.6.2. Ввод-вывод данных на языке qBasic
- •6.7. Алгоритмы линейной и разветвляющейся структуры
- •Решение задачи 6.3. На языке Turbo Pascal:
- •6.8. Циклические алгоритмы
- •Input "Введите натуральное м : " , m
- •Print : print "о т в е т : Сумма этих чисел равна "; s
- •6.9. Итерационные циклы
- •6.10. Массивы
- •6.11. Вложенные циклы
- •6.12. Подпрограммы
- •6.12.1. Параметры подпрограмм
- •6.12.2. Подпрограммы в языке Pascal
- •Операторы функции, один из которых
- •6.12.3. Подпрограммы в языке Basic
- •6.13. Рекурсия
- •6.14. Логические операции с числами
- •6.15. Работа с символьной информацией
- •6.15.1. Работа с символьной информацией в языке Basic
- •6.15.2. Работа с символьной информацией в языке Pascal
6.10. Массивы
Массив - это упорядоченная последовательность однотипных элементов, которым присвоено одно имя. Число элементов в массиве ограничено и фиксировано. Положение элемента в массиве определяется его индексами. Индекс один, в случае одномерного массива, или несколько, если массив многомерный. Для обращения к элементу массива указывается имя массива и индексы элемента в скобках.
Например, в языке Pascal описание одномерного массива (вектора) X из 100 целых чисел,
X : Array [1..100] of Integer;
обращение к элементу с номером 5 - X[5], а к текущему элементу с номером I – X[I]. Описание аналогичного массива на языке Basic:
DIM X(100)
а обращение к тем же элементам X(5), X(I).
Описание двумерного массива (матрицы) Z вещественных чисел, состоящего из 10 строк и 20 столбцов, т.е. из 200 элементов,
Z : Array [1..10, 1..20] of Real;
обращение к элементу с номером строки 5, столбца 4 - Z[5, 4], а к текущему элементу с номером строки I, столбца J – Z[I, J].
Элементы матрицы Z размещаются в памяти по строкам (строка за строкой) в следующем порядке:
Z[1][1], Z[1][2], ... , Z[1][20],
. . .
Z[10][1], Z[10][2], ... , Z[10][20].
Описание аналогичного массива на языке Basic:
DIM Z(10,20)
а обращение к тем же элементам Z(5, 4), Z(I, J). Первый индекс означает номер строки, а второй – номер столбца.
Массивы необходимо использовать в тех задачах, где требуется хранить всю входную последовательность данных. Например, если данные просматриваются и обрабатываются более одного раза, обрабатываются не в том порядке, в котором вводятся и т.д.
Задача 6.12. Даны целые числа a1, a2, …, a31 - значения температуры в течение месяца.
а) найти среднюю температуру за месяц;
б) найти среднюю температуру за месяц и дни, когда температура была ниже средней.
В задаче 6.12а не требуется массив. Можно последовательно вводить значение ai (i от 1 до 31) в одну и ту же переменную, например t, и вычислить суммарную, а затем и среднюю температуру за месяц.
Фрагмент программы на языке Pascal:
ReadLn(N); {количество дней в месяце}
S:=0; {начальное значение суммарной температуры}
For I:=1 to N do begin {цикл на N шагов}
ReadLn (t);{ввод температуры очередного дня}
S:= S+ t; {добавление температуры очередного дня к сумме}
End;
S:= S/N; {вычисление средней температуры за N дней}
Тест. Вход: N=4
21 18 23 15
Выход: Средняя температура 19.25
В задаче 6.12б требуется массив для хранения всех значений температуры за месяц. После вычисления суммарной и средней температур за месяц, массив со значениями температуры просматривается еще раз и определяются дни с температурой ниже средней.
Тест. Вход: N=4
21 18 23 15
Выход: Средняя температура 19.25
Дни, c температурой ниже средней :
4
Решение задачи 6.12б. на языке Turbo Pascal:
Program Sred_temp;
Var S : Real; {суммарная (затем средняя) температура }
N, {количество дней в месяце}
i : Integer; {номер текущего дня}
{массив для хранения значений температуры}
T : Array [1..31] of Integer;
BEGIN
S:=0;
Write(’Введите количество дней : ’); ReadLn(N);
Write(’Введите значения температуры: ’);
For I:=1 to N do begin
ReadLn(T[I]); { ввод температуры очередного I- ого дня }
S:=S + T[I]; {вычисление суммарной температуры}
End;
S:= S/N; {вычисление средней температуры }
WriteLn(’Средняя температура = ’, S:4:1);
WriteLn(’Дни, c температурой ниже средней : ’);
For I:=1 to N do
if T[I] < S {сравнение текущей температуры со средней}
then Write (I:3); {вывод номера дня с температурой ниже средней}
ReadLn
END.
Пояснения к программе даны в виде комментариев.
Задача 6.13. Дана последовательность из N чисел. Составить программы решения следующих задач.
а) определить количество чисел, равных первому числу последовательности;
б) определить количество чисел, равных последнему числу последовательности.
Для решения задачи 6.13а не нужен массив, а для решения задачи 6.13б необходим массив для хранения всех чисел.
Тест задачи 6.13а. Вход: N=5
5 2 5 5 4
Выход: Количество чисел равных первому – 2
Тест задачи 6.13б. Вход: N=5
5 4 5 5 4
Выход: Количество чисел равных последнему – 1
Решение задачи 6.13а на языке Pascal:
Program Kol_a;
Var P, {первое число }
A: Real; {текущее число }
N, {количество чисел}
K, {количество чисел, равных первому числу}
i : Integer; {номер текущего числа}
BEGIN
K:=0;
WriteLn (’Введите количество чисел : ’); ReadLn(N);
WriteLn (’Введите первое число : ’); ReadLn(P);
WriteLn(’Введите числа : ’);
For I:=2 to N do begin
ReadLn(A);
if A = P then K:=K+1;
end;
WriteLn (’Количество чисел, равных первому - ’, K);
ReadLn
END.
Решение задачи 6.13б на языке Pascal:
Program Kol_b;
Var N, {количество чисел}
K, {количество чисел, равных первому числу}
i : Integer; {номер текущего числа}
A : Array [1..100] of Real; {массив для хранения 100 чисел}
BEGIN
WriteLn (’Введите количество чисел : ’); ReadLn(N);
WriteLn(’Введите числа : ’);
For I:=1 to N do
ReadLn(A[I]);
For I:=1 to N-1do
if A[I] = A[N] then K:=K+1;
WriteLn (’Количество чисел, равных последнему - ’, K);
ReadLn
END.
Упражнения.
1. Дан массив X, содержащий N элементов. Получить новый массив Y такой, что в нем сначала идут положительные числа, затем нулевые, и затем отрицательные из X. Составить программу решения задачи.
2. Элементы заданного массива A, содержащего N элементов, переписать в новый массив B в обратном порядке. Составить программу решения задачи.
3. В заданном массиве Х, содержащем N элементов, заменить нулями все отрицательные элементы, непосредственно предшествующие его максимальному элементу (если несколько элементов имеют максимальное значение, то первому из них). Составить программу решения задачи.
4. Задан массив А, содержащий N элементов. Образуйте массив B, состоящий из положительных элементов массива A, больших пяти. Выведите на печать образованный массив и количество его элементов. Составить программу решения задачи.
5. Дана последовательность из N различных чисел (N>0). Найти сумму чисел, расположенных между максимальным и минимальным числами. Составить программу решения задачи.
6. Заданы два упорядоченных по возрастанию массива чисел X[1:n] и Y[1:m]. Составить программу, объединяющую их в один упорядоченный по возрастанию массив Z[1..n+m].
