Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Одномерные массивы






Одна из типичных задач программирования формулируется примерно так. Имеется большое количество данных, например, тех же температур или высот. С этими данными компьютер должен что-нибудь сделать, например, вычислить среднегодовую температуру, количество морозных дней, максимальную взятую высоту и т.п. Раньше мы вычисляли подобные вещи, и данные вводили в компьютер с клавиатуры одно за другим в одну и ту же ячейку памяти (см. 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: Вычислить разницу между максимальной и минимальной температурой во всей таблице.


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.009 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал