Читайте также: |
|
Одна из типичных задач программирования формулируется примерно так. Имеется большое количество данных, например, тех же температур или высот. С этими данными компьютер должен что-нибудь сделать, например, вычислить среднегодовую температуру, количество морозных дней, максимальную взятую высоту и т.п. Раньше мы вычисляли подобные вещи, и данные вводили в компьютер с клавиатуры одно за другим в одну и ту же ячейку памяти (см. 7.7). Однако, программистская практика показывает, что удобно, а часто и необходимо иметь данные в оперативной памяти сразу все, а не по очереди. Тогда для задачи про температуру нам понадобится 365 ячеек. Эти 365 ячеек мы и назовем массивом. Итак, массивом можно назвать ряд ячеек памяти, отведенных для хранения значений индексированной переменной. Вопрос о том, как большое количество значений оказывается в памяти, отложим на будущее (15.1).
Рассмотрим на простом примере, как Паскаль управляется с массивами. Предположим, в зоопарке живут три удава. Известна длина каждого удава в сантиметрах (500, 400 и 600). Какая длина получится у трех удавов, вытянутых в линию?
Обозначим длину первого удава - dlina[1], второго - dlina[2], третьего - dlina[3]. Прикажем Паскалю отвести под эту индексированную переменную массив:
VAR dlina: array [1..3] of Integer
Здесь array означает массив или ряд, 1 - первое значение индекса, 3 - последнее. Две точки обозначают диапазон от 1 до 3 (см. 5.7) В целом эту строку можно перевести так: Отвести в памяти под переменную dlina ряд ячеек типа Integer, пронумерованных от 1 до 3.
Вот программа полностью:
VAR dlina: array [1..3] of Integer;
summa:Integer;
BEGIN
dlina[1]:=500;
dlina[2]:=400;
dlina[3]:=600;
{В этот момент в трех ячейках памяти уже находятся числа
и с ними можно выполнять арифметические действия}
summa:= dlina[1]+dlina[2]+dlina[3];
WriteLn(summa)
END.
Если смысл написанного выше вам неясен, запустите отладочный пошаговый режим выполнения программы, заставив Паскаль показывать вам текущие значения dlina[1], dlina[2], dlina[3], summa.
Теперь запишем ту же программу в предположении, что длины удавов заранее неизвестны и мы их вводим при помощи ReadLn:
VAR dlina: array [1..3] of Integer;
summa:Integer;
BEGIN
ReadLn (dlina[1],dlina[2],dlina[3]);
summa:= dlina[1]+dlina[2]+dlina[3];
WriteLn(summa)
END.
Теперь решим ту же задачу в предположении, что удавов не три, а тысяча:
VAR dlina: array [1..1000] of Integer;
summa, i:Integer;
BEGIN
{Вводим длины тысячи удавов, хоть это и утомительно:}
for i:=1 to 1000 do ReadLn (dlina[i]);
{Здесь на первом выполнении цикла i=1 и поэтому компьютер выполняет ReadLn(dlina[1]),
на втором – i=2 и поэтому компьютер выполняет ReadLn(dlina[2]) и т.д.}
{Определяем суммарную длину тысячи удавов:}
summa:= 0;
for i:=1 to 1000 do summa:=summa+dlina[i]);
WriteLn(summa)
END.
Решим еще одну задачу. Дан ряд из 10 произвольных чисел: a[1], a[2],..., a[10]. Подсчитать и напечатать суммы троек стоящих рядом чисел: a[1]+a[2]+a[3], a[2]+a[3]+a[4], a[3]+a[4]+a[5],......, a[8]+a[9]+a[10].
VAR a: array [1..10] of Integer;
i:Integer;
BEGIN
for i:=1 to 10 do ReadLn (a[i]);
for i:=1 to 8 do WriteLn (a[i]+ a[i+1]+ a[i+2])
END.
Задание 103:. Напишите программу вычисления среднегодовой температуры (Для проверки в компьютере годом можно считать неделю).
Задание 104:. Подсчитайте количество морозных дней (когда температура ниже -20 град.).
Задание 105:. Каким по порядку идет самый морозный день?
Задание 106:. Вычислить и распечатать первые тридцать чисел Фибоначчи.
12.3.3. Двумерные массивы
Поясним суть двумерных массивов на простом примере. Пусть на целом ряде метеостанций, расположенных в разных точках земного шара, в течение многих дней измеряли температуру воздуха. Показания термометров свели в таблицу. Ограничимся для экономии места тремя станциями и четырьмя днями.
1-й день | 2-й день | 3-й день | 4-й день | |
Метеостанция 1 | -8 | -14 | -19 | -18 |
Метеостанция 2 | ||||
Метеостанция 3 |
Требуется:
1) Распечатать показания термометров всех метеостанций за 2-й день
2) Определить среднюю температуру на третьей метеостанции
3) Распечатать всю таблицу
4) Распечатать, в какие дни и на каких метеостанциях температура была в диапазоне 24-26 градусов тепла
Для этого обозначим показания термометров индексированной переменной с двумя индексами по следующей схеме:
t[1,1] t[1,2] t[1,3] t[1,4]
t[2,1] t[2,2] t[2,3] t[2,4]
t[3,1] t[3,2] t[3,3] t[3,4]
Обратите внимание, что первый индекс в скобках обозначает номер строки (метеостанции), второй - номер столбца (дня) прямоугольной таблицы.
Программа:
{В памяти отводим массив из 3*4=12 ячеек под значения типа Integer индексированной переменной t. Будем называть его двумерным массивом: }
VAR t:array [1..3, 1..4] of Integer;
s,i,j:Integer;
BEGIN {Зададим значения элементов массива примитивным присваиванием:}
t[1,1]:=-8; t[1,2]:=-14; t[1,3]:=-19; t[1,4]:=-18;
t[2,1]:=25; t[2,2]:= 28; t[2,3]:= 26; t[2,4]:= 20;
t[3,1]:=11; t[3,2]:= 18; t[3,3]:= 20; t[3,4]:= 25;
{А теперь распечатаем второй столбец массива:}
for i:=1 to 3 do WriteLn(t[i,2]);
{Определим среднее значение элементов третьей строки:}
i:=3;
s:=0;
for j:=1 to 4 do s:=s+t[i,j];
WriteLn(s/4:10:3);
{Распечатаем всю таблицу:}
for i:=1 to 3 do for j:=1 to 4 do WriteLn (t[i,j]);
{Распечатаем станции и дни с температурой 24-26 градусов:}
for i:=1 to 3 do for j:=1 to 4 do
if (t[i,j]>=24) AND (t[i,j]<=26) then WriteLn ('Станция ',i,' день ',j)
END.
Задание 107: Вычислить разницу между максимальной и минимальной температурой во всей таблице.
Дата добавления: 2015-11-14; просмотров: 41 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Использование пробела | | | Какие бывают массивы |