КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Переменные с индексамиВ математике широко применяются так называемые индексированные переменные. На бумаге они записываются так: 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] - вторым и т.д. 8.3.2. Одномерные массивы Одна из типичных задач программирования формулируется примерно так. Имеется большое количество данных, например, тех же температур или высот. С этими данными компьютер должен что-нибудь сделать, например, вычислить среднегодовую температуру, количество морозных дней, максимальную взятую высоту и т.п. Раньше мы вычисляли подобные вещи, и данные вводили в компьютер с клавиатуры одно за другим в одну и ту же ячейку памяти (см. 7.7). Однако, программистская практика показывает, что удобно, а часто и необходимо иметь данные в оперативной памяти сразу все, а не по очереди. Тогда для задачи про температуру нам понадобится 365 ячеек. Эти 365 ячеек мы и назовем массивом. Итак, массивомможно назвать ряд ячеек памяти, отведенных для хранения значений индексированной переменной. Вопрос о том, как большое количество значений оказывается в памяти, отложим на будущее (15.1). Рассмотрим на простом примере, как Паскаль управляется с массивами. Предположим, в зоопарке живут три удава. Известна длина каждого удава в сантиметрах (500, 400 и 600). Какая длина получится у трех удавов, вытянутых в линию? Обозначим длину первого удава - dlina[1], второго - dlina[2], третьего - dlina[3]. Прикажем Паскалю отвести под эту индексированную переменную массив: VAR dlina : array [1..3] ofInteger Здесь 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:. Вычислить и распечатать первые тридцать чисел Фибоначчи. 8.3.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] ofInteger; 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: Вычислить разницу между максимальной и минимальной температурой во всей таблице.
|