Предисловие дорогие друзья !
Вид материала | Документы |
- К. Бальмонт Дорогие друзья, сегодня мы в гостях у замечательного русского поэта Константина, 164.76kb.
- Медникова Надежда Александровна учитель начальных классов моу «Уинская сош» Пермский, 91.48kb.
- И в шутку и всерьез Ведущий Добрый день, дорогие друзья! Вот и пришла весна, вот, 339.91kb.
- Играют 2 команды. Вопросы викторины, 53.15kb.
- Летние каникулы в праге, 322.16kb.
- Мои дорогие литературные друзья, 136.81kb.
- Ведущий: Дорогие, друзья! Разрешите поздравить вас с большим и дорогим для всех праздником, 124.29kb.
- Отчет о конференции 17-18 апреля дорогие друзья!, 182.44kb.
- Дорогие друзья и единомышленники, 134.05kb.
- Сценарий для 7-8 классов «Старая сказка на новый лад», 52.44kb.
ГЛАВА 5 ОДНОМЕРНЫЕ МАССИВЫ
§30. Массив как структурированный тип данных. Одномерные массивы.
Äàííûå õîðîøè òîãäà,
êîãäà îíè õîðîøî îðãàíèçîâàíû.
(А.Г. Гейн)
30.1. Ïîíÿòèå òàáëè÷íîé âåëè÷èíû. Áåç ïðåóâåëè÷åíèÿ ìîæíî ñêàçàòü, ÷òî ñ òàáëèöàìè âû ñòàëêèâàåòåñü åæåäíåâíî. Òàáëèöà èòîãîâ øàõìàòíîãî òóðíèðà è êëàññíûé æóðíàë, òàáëèöà óìíîæåíèÿ íà îáëîæêå òåòðàäè è ïëàí êèíîçàëà - âñå ýòî ïðèìåðû òàáëè÷íîé îðãàíèçàöèè äàííûõ.
Äîïóñòèì, ÷òî 17 äåêàáðÿ 2004 ãîäà 9 "À" êëàññ ïèñàë ñî÷èíåíèå ïî ðóññêîé ëèòåðàòóðå, è íàì íóæíî óçíàòü, êàêóþ îöåíêó ïîëó÷èë ó÷åíèê ýòîãî êëàññà Ïåòðîâ À. Áåðåì êëàññíûé æóðíàë 9 "À" êëàññà, îòêðûâàåì åãî íà ñòðàíèöå Ðóññêàÿ ëèòåðàòóðà, íàõîäèì ñòðî÷êó ñ îöåíêàìè Ïåòðîâà À., ñòîëáåö çà 17 äåêàáðÿ. Íà èõ ïåðåñå÷åíèè è çàïèñàíà èñêîìàÿ îöåíêà.
Ïîñëå óðîêîâ âû ïðèøëè â êèíîòåàòð. Êàê çàíÿòü ìåñòî â çàëå ñîãëàñíî êóïëåííîìó áèëåòó? Ñíà÷àëà, äâèãàÿñü ïî ïðîõîäó, èùåì ñâîé ðÿä, à çàòåì èäåì âäîëü íåãî äî íóæíîãî ìåñòà.
Íåòðóäíî çàìåòèòü ñõîäñòâî ýòèõ ïðèìåðîâ. Õîòÿ øêîëüíûå îöåíêè íà ñòðàíèöå êëàññíîãî æóðíàëà è ìåñòà â çðèòåëüíîì çàëå èìåþò ìàëî îáùåãî, ðàñïîëîæåíû îíè â ïðèíöèïå îäèíàêîâî: â íåñêîëüêî ðÿäîâ (ñòðîê) îäèíàêîâîé äëèíû. Òàêîé ñïîñîá ðàñïîëîæåíèÿ äàííûõ è íàçûâàþò òàáëè÷íûì. Ìîæåò ñëó÷èòüñÿ è òàê, ÷òî â òàáëèöå âñåãî îäíà ñòðîêà. Òàêóþ òàáëèöó íàçûâàþò ëèíåéíîé. Òàáëèöó, ñîñòîÿùóþ èç íåñêîëüêèõ ñòðîê, íàçûâàþò ïðÿìîóãîëüíîé.
В языке Паскаль табличные величины принято называть массивами.
30.2. Ëèíåéíûå (îäíîìåðíûå) массивы. Ëèíåéíîé òàáëè÷íîé âåëè÷èíîé (ìàññèâîì) íàçûâàþò íàáîð ýëåìåíòîâ îäèíàêîâîãî òèïà, ñëåäóþùèõ äðóã çà äðóãîì и объединённых одним именем. Такая организация данных называется структурной. Поэтому массив называют структурированным типом данных. Ëèíåéíый массив èìååò èìÿ, òèï è äèàïàçîí íîìåðîâ ýëåìåíòîâ.
Например, введем 30 целых чисел от 25 до 54 и объединим их общим именем А.
Индексы элементов | 1 | 2 | 3 | … | 29 | 30 |
Значения элементов | 25 | 26 | 27 | … | 53 | 54 |
Имя А — общее для всех элементов. Элементы массива — целые числа, их 30. номера элементов изменяются от 1 до 30.
Если в программе используется массив, то он должен быть описан либо в разделе переменных VAR, либо в разделе типов TYPE. Рассмотрим сначала описание массива в разделе переменных VAR. Форма описания имеет вид
VAR имя_массива: ARRAY [1..N] OF базовый тип;
Здесь: ARRAY (массив) и OF (из) — служебные слова; в квадратных скобках описан диапазон номеров индексов (диапазон необязательно должен начинаться с 1 и быть числовым, например: [-5..20], [‘a’..’z’] и др.); базовый тип определяет тип элементов массива. Значение переменной N должно быть предварительно задано в разделе описания констант, или задано явно.
Элементы массива отдельных имён не имеют. ×òîáû îáðàòèòüñÿ ê ýëåìåíòó массива, íåîáõîäèìî óêàçàòü èìÿ массива è ïîðÿäêîâûé íîìåð ýëåìåíòà. Íàïðèìåð:
à[1] — первый элемент,
à[3] — третий элемент,
à[5] — пятый элемент,
à[i] — ýëåìåíò ñ èíäåêñîì i.
В отличие от переменных простейших типов массивы не могут обрабатываться целиком (за исключением случаев копирования массивов одинаковой структуры). Но можно получить доступ к каждому элементу массива и присвоить ему значение с помощью команды присваивания. Например,
A[1]:=15; A[7]:=-6; A[1]:=А[7]+10 и т.д.
Рассмотрим более подробно порядок работы с элементами массива. Опишем массив, состоящий из шести элементов, значения которых целые числа:
VAR A: ARRAY [1..6] OF INTEGER;
Пусть значения элементов массива следующие:
Индексы элементов | 1 | 2 | 3 | 4 | 5 | 6 |
Значения элементов | 9 | 4 | -2 | 14 | -8 | 25 |
Рассмотрим, как будут изменяться значения элементов массива при выполнении следующих команд присваивания:
1. a[3]:=a[2]+a[4] При выполнении этой команды компьютер подставит вместо a[2] и a[4] значения 2-го и 4-го элементов таблицы А, т.е. числа 4 и 14, сложит их и присвоит полученное значение 3-ему элементу.
Индексы элементов | 1 | 2 | 3 | 4 | 5 | 6 |
Значения элементов | 9 | 4 | 18 | 14 | -8 | 25 |
2. a[a[2]+1]:=a[6]-10 При выполнении этой команды компьютер вычислит выражение a[2]+1 = 4 + 1 = 5, затем вычислит выражение a[6]-10 = 25 - 10 = 15 и присвоит полученное значение 5-му элементу.
Индексы элементов | 1 | 2 | 3 | 4 | 5 | 6 |
Значения элементов | 9 | 4 | 18 | 14 | 15 | 25 |
Рассмотрим теперь описание массива в разделе типов TYPE.
Опишем одномерный массив, состоящий из 30 целых чисел.
Type mas = Array[1..30] Of Integer;
Напомним, что раздел типов начинается со служебного слова Type, после него идут имя нового типа и его описание. Между именем типа и его описанием ставится знак "равно" (в разделе описания переменных между именем переменной и ее описанием ставится двоеточие). Тогда:
mas — это имя нового типа;
Array — служебное слово (в переводе с английского означает "массив", "набор");
[1..30] — в квадратных скобках указывается номер первого элемента, затем, после двух точек, номер последнего элемента массива; в этом примере первый элемент имеет номер 1, а последний — номер 30;
Of — служебное слово (в переводе с английского означает «из»);
Integer — тип всех элементов массива.
30.3. Заполнение и вывод массива. При решении задач часто приходится заполнять массивы (присваивать значения элементам). Заметим, что заполнение и вывод массива можно осуществить только поэлементно, то есть можно сначала присвоить значение первому элементу, затем второму и так далее. Аналогично обстоит дело и с выводом массива на экран — мы станем выводить первый элемент, второй, третий и так до последнего.
Рассмотрим сначала вывод элементов массива. Объявим тип массива:
Type mas= Array[1..10] Of Integer.
А количество элементов массива объявим как константу N:
CONST N=30.
Первый способ — это вывод элементов массива на экран компьютера. Опишем процедуру Print1.
Procedure Print1(m: mas);{Заголовок процедуры, m — массив, который нужно распечатать}
Var i: Integer; {Параметр цикла}
Begin
For i:=l To n Do {Перебираем все значения индексов массива, n — последний индекс}
Write(m[i]: 4) ; {Вывод i-ro элемента, под каждое число отводится 4 позиции}
Writeln; {перевод курсора на следующую строку}
End;
Второй способ — это вывод элементов массива в текстовый файл. Опишем процедуру Print2.
Procedure Print2 (m: mas);
Var i: Integer; {параметр цикла}
F: text; {файловая переменная}
Begin
Assign(F, 'Output.txt'); {Связываем файловую переменную с файлом на диске}
Rewrite(F) ; {Открываем файл для записи}
For i:=l To n Do Write(f, m[i]:4); {Запись в файл элементов массива, от 1 до n-го}
Close(f); {закрываем файл}
End;
Рассмотрим теперь несколько способов заполнения массивов.
Первый способ заполнения одномерного массива — это заполнение с клавиатуры. Опишем процедуру Init1, выполняющую эту операцию.
Procedure Init1(Var m: mas);
Var i: Integer; {Переменная для работы с элементами массива}
Begin
Writeln('Введите ',n, ' чисел'); {n — количество элементов массива}
For i:=l To n Do {Ввод массива с клавиатуры }
Read(m[i] ) ; {Чтение i-го элемента}
End;
Вводить числа следует одно за другим в строку через пробел или заканчивая набор каждого числа нажатием клавиши ENTER.
Приведём несколько модифицированный вариант процедуры ввода. Отличие заключается в том, что перед вводом очередного элемента появляется подсказка о том, какой элемент нужно вводить.
Procedure Init1a(Var m: mas);
Var i: Integer; {Переменная для работы с элементами массива}
Begin
For i:=l To n Do {Ввод массива с клавиатуры }
Begin
Write(‘введите m[‘,i,’]=’) {коментарий ввода}
Read(m[i] ) ; {Чтение i-го элемента}
End
End;
Как и в первом варианте вводить числа следует одно за другим и набор каждого числа заканчивать нажатием клавиши ENTER. .
Второй способ — это заполнение с помощью генератора случайных чисел. Этот способ более удобен, когда в массиве много элементов, а их точные значения не слишком важны.
Дополнительно опишем константу DD, которая будет определять диапазон выбора случайного числа.
CONST DD=51.
Для того чтобы при очередном запуске программы числа генерировались случайным образом, необходимо включить генератор командой RANDOMIZE без параметров. Будем перебирать все элементы массива, присваивая им значение с использованием функции RANDOM(DD). Функция Random(DD) выбирает случайное число из отрезка от 0 до dd-1. переменная dd описана в разделе констант. Очередному элементу массива будет присвоена сумма выбранного случайного числа и -25, таким образом, массив будет заполняться случайными числами от -25 до -25+(dd-l), то есть до -26+dd
Составим процедуру Init2 заполнения одномерного массива с помощью генератора случайных чисел.
Procedure Init2(Var m:mas); {Процедура заполнения (инициализации) массива случайными числами}
Var i: Integer;
Begin
Randomize; {Инициализация генератора случайных чисел}
For i:=l To n Do {Перебираем все элементы массива}
m[i] :=-25+Random(dd); {Присваивание очередного значения элементу массива }
End;
Пример 83. Составим программу заполнения одномерного массива с помощью генератора случайных чисел и вывода значений его элементов. Процедура вывода уже составлена ранее.
Program Ex83;
Const n=30; dd=51; {n - количество элементов массива, dd используется в генераторе случайных чисел}
Type mas = Array[l..n] Of Integer;
Var A: mas;
Procedure Init2(Var m: mas); {Процедура заполнения (инициализации) массива случайными числами}
Var i: Integer;
Begin
Randomize; {Инициализация генератора случайных чисел}
For i:=l To n Do {Перебираем все элементы массива}
m[i] :=-25+Random(dd); {Присваивание очередного значения элементу массива }
End;
Procedure Print1 (m: mas); {процедура вывода (распечатки) массива на экран дисплея.}
Var i: Integer;
Begin
For i:=l To n Do {Вывод массива }
Write(m[i]: 4) ; {Вывод i-ro элемента, под каждое число отводится 4 позиции}
Writeln; {перевод курсора на следующую строку}
End;
Begin
Init2 (А) ; {Обращение к процедуре заполнения массива}
Print1 (A); {Обращение к процедуре вывода массива}
Readln; {задержка вывода}
End.
Третий способ заполнения массива — чтение значений элементов из файла. Мы воспользуемся текстовым файлом, так как его создавать намного удобнее. Пусть в файл записано 30 целых чисел. Составим процедуру Init3 заполнения одномерного массива из файла.
Procedure Init3( Var m: mas); {Процедура заполнения (инициализации) массива}
Var i:Integer;
F: text;
Begin
Assign(F, 'Input.txt'); {Связываем файловую переменную с файлом на диске}
Reset(F) ; {Открываем файл для чтения}
For i:=l To n Do Read(f, m[i]) {Чтение из файла очередного числа}
Close(f); {закрываем файл}
End;
Пример 84. Программа чтения данных для формирования массива и вывод его на экран может быть такой:
Program Ex84;
Const n=30; {Количество элементов массива}
Type mas = Array[l..n] Of Integer;
Var A: mas;
Procedure Init3 (Var m: mas);
Var i:Integer; F: text;
Begin
Assign(F, 'Input.txt'); {Связываем файловую переменную с файлом на диске}
Reset(F) ; {Открываем файл для чтения}
For i:=l To n Do Read(f, m[i]) {Чтение из файла очередного числа}
Close(f); {закрываем файл}
End;
Procedure Print1 (m: mas); {процедура вывода (распечатки) массива}
Var i: Integer;
Begin
For i:=l To n Do {Вывод массива }
Write(m[i]: 3) ; {Вывод i-ro элемента, под каждое число отводится 3 позиции}
Writeln; {перевод курсора на следующую строку}
End;
Begin
Init3(А) ; {Обращение к процедуре заполнения массива}
Print1(А) ; {Обращение к процедуре вывода }
Readln;
End.
Вопросы и задания.
- Что такое массив?
- Что называется элементом массива?
- Сколько элементов может содержать массив?
- элементы какого типа может содержать массив?
- Значением целочисленного массива а является четвёрка чисел (3, 1, -2, 4). Чему равно:
- a[1]; b) a[3]; c) a[5]; d) a[a[1]]?
- Значением целочисленного массива а является четвёрка чисел (3, 1, -2, 4). Определите значения элементов после выполнения серии команд:
- a[1]:=a[4]; a[1]:=a[1]+a[2]; б) i:=3; a[1]:=a[i]*a[i+1].
- Заполнить массив из восьми элементов следующими значениями: первый элемент массива равен 37, второй — 0,третий — 50, четвёртый — 46, пятый — 34, шестой — 36, седьмой — 5, восьмой — 13.
- Заполнить массив из десяти элементов значениями, вводимыми с клавиатуры в ходе выполнения программы.
- Массив предназначен для хранения значений ростов двенадцати человек. С помощью датчика случайных чисел заполнить массив целыми значениями, лежащими в диапазоне от 163 до 190 включительно.
- Составить программу вывода на экран любого элемента массива по запросу.
- Вывести элементы массива на экран в обратном порядке.