Предисловие дорогие друзья !

Вид материалаДокументы

Содержание


Глава 5 одномерные массивы
Var a: array [1..6] of integer
Type mas = Array[1..30] Of Integer; Напомним, что раздел типов начинается со служебного слова Type
30.3. Заполнение и вывод массива.
Const n=30.
Var i: Integer; {Параметр цикла} Begin
End; Второй способ
End; Рассмотрим теперь не­сколько способов заполнения массивов. Первый способ
Const dd=51.
Var i: Integer; Begin
End; Пример 83.
Program Ex83; Const
Var i: Integer; Begin
End; Procedure
End; Begin
End. Третий способ
Var i:Integer; F: text; Begin
End; Пример 84.
Type mas = Array[l..n] Of Integer; Var
End; Procedure
...
Полное содержание
Подобный материал:
1   ...   12   13   14   15   16   17   18   19   ...   29

ГЛАВА 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.

Вопросы и задания.
  1. Что такое массив?
  2. Что называется элементом массива?
  3. Сколько элементов может содержать массив?
  4. элементы какого типа может содержать массив?
  5. Значением целочисленного массива а является четвёрка чисел (3, 1, -2, 4). Чему равно:
  1. a[1]; b) a[3]; c) a[5]; d) a[a[1]]?
  1. Значением целочисленного массива а является четвёрка чисел (3, 1, -2, 4). Определите значения элементов после выполнения серии команд:
  1. a[1]:=a[4]; a[1]:=a[1]+a[2]; б) i:=3; a[1]:=a[i]*a[i+1].
  1. Заполнить массив из восьми элементов следующими значениями: первый элемент массива равен 37, второй — 0,третий — 50, четвёртый — 46, пятый — 34, шестой — 36, седьмой — 5, восьмой — 13.
  2. Заполнить массив из десяти элементов значениями, вводимыми с клавиатуры в ходе выполнения программы.
  3. Массив предназначен для хранения значений ростов двенадцати человек. С помощью датчика случайных чисел заполнить массив целыми значениями, лежащими в диапазоне от 163 до 190 включительно.
  4. Составить программу вывода на экран любого элемента массива по запросу.
  5. Вывести элементы массива на экран в обратном порядке.