Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Turbo-Pascal.7.0.doc
Скачиваний:
26
Добавлен:
08.11.2018
Размер:
4 Мб
Скачать
☆
      1. Массивы

Для того, чтобы понять массивы, нужно обладать некоторой культурой математического мышления. Если этот материал покажется вам трудным, не поддавайтесь искушению пропустить его. Настоящего программирования без массивов не бывает, да и большая часть дальнейшего материала без массивов не будет понятна.

        1. Переменные с индексами

В математике широко применяются так называемые индексированные переменные. На бумаге они записываются так:

x1 x2 b8 yi yi-6 zij zi+1j

а читаются так: икс первое, икс второе, бэ восьмое, игрек итое, игрек и минус шестое, зет итое житое, зет и плюс первое житое. Поскольку в алфавите Паскаля нет подстрочных букв и цифр, то те же индексированные переменные на Паскале приходится обозначать так:

X[1] X[2] B[8] Y[i] Y[i-6] Z[i,j] Z[i+1,j]

Зачем нужны индексированные переменные? Их удобно применять хотя бы при операциях над числовыми рядами. Числовой ряд – это просто несколько чисел, выстроенных по порядку одно за другим. Чисел в ряду может быть много и даже бесконечно много.

Возьмем, например, бесконечный ряд чисел Фибоначчи: 1 1 2 3 5 8 13 21 34..... Попробуйте догадаться, по какому закону образуются эти числа. Если вы сами не догадались, то я подскажу: каждое из чисел, начиная с третьего, является суммой двух предыдущих. А теперь попробуем записать это утверждение с помощью языка математики. Для этого обозначим каждое из чисел Фибоначчи индексированной переменной таким образом:

Первое число Фибоначчи обозначим так: f[1],

Второе число Фибоначчи обозначим так: f[2] и т.д.

Тогда можно записать, что f[1]=1 f[2]=1 f[3]=2 f[4]=3 f[5]=5 f[6]=8 ......

Очевидно, что f[3]=f[1]+f[2],

f[4]=f[2]+f[3],

f[5]=f[3]+f[4] и т.д.

Как математически одной формулой записать тот факт, что каждое из чисел является суммой двух предыдущих? Математики в индексном виде это записывают так:

f[i]=f[i-2]+f[i-1].

Для иллюстрации подставим вместо i любое число, например, 6. Тогда получится:

f[6]=f[6-2]+f[6-1] или

f[6]=f[4]+f[5].

Задание 102: Запишите в индексном виде, как получается из предыдущего числа ряда последующее:

  1. 14 18 22 26 .....

  2. 6 12 24 48 ....

  3. 3 5 9 17 33 65 ....

Вот еще примеры, когда математики предпочитают использовать индексы. Пусть мы на протяжении года каждый день раз в сутки измеряли температуру за окном Тогда вполне естественно обозначить через t[1] температуру первого дня года, t[2] - второго,....., t[365] - последнего. Пусть 35 спортсменов прыгали в высоту. Тогда через h[1] можно обозначить высоту, взятую первым прыгуном, h[2] - вторым и т.д.

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

Одна из типичных задач программирования формулируется примерно так. Имеется большое количество данных, например, тех же температур или высот. С этими данными компьютер должен что-нибудь сделать, например, вычислить среднегодовую температуру, количество морозных дней, максимальную взятую высоту и т.п. Раньше мы вычисляли подобные вещи, и данные вводили в компьютер с клавиатуры одно за другим в одну и ту же ячейку памяти (см. 3.7). Однако, программистская практика показывает, что удобно, а часто и необходимо иметь данные в оперативной памяти сразу все, а не по очереди. Тогда для задачи про температуру нам понадобится 365 ячеек. Эти 365 ячеек мы и назовем массивом. Итак, массивом можно назвать ряд ячеек памяти, отведенных для хранения значений индексированной переменной. Вопрос о том, как большое количество значений оказывается в памяти, отложим на будущее (4.1).

Рассмотрим на простом примере, как Паскаль управляется с массивами. Предположим, в зоопарке живут три удава. Известна длина каждого удава в сантиметрах (500, 400 и 600). Какая длина получится у трех удавов, вытянутых в линию?

Обозначим длину первого удава - dlina[1], второго - dlina[2], третьего - dlina[3]. Прикажем Паскалю отвести под эту индексированную переменную массив:

VAR dlina : array [1..3] of Integer

Здесь array означает массив или ряд, 1 - первое значение индекса, 3 - последнее. Две точки обозначают диапазон от 1 до 3 (см. 1.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:. Вычислить и распечатать первые тридцать чисел Фибоначчи.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]