Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Lab_7_Informatika

.pdf
Скачиваний:
5
Добавлен:
29.03.2015
Размер:
255.47 Кб
Скачать

Министерство образования и науки Российской Федерации Пермский национальный исследовательский политехнический университет

Кафедра ИТАС

Альмухаметов В.Ф., Лясин В.Н., Полевщиков И.С.

Информатика

Методическое пособие к выполнению лабораторной работы №7 по теме «Типы данных, определяемые программистом. Массивы»

(для студентов 1 курса электротехнического факультета)

Пермь, 2013 год

2

Цель работы

Научиться использовать массивы в программах на языке Турбо-

Паскаль.

Краткие теоретические сведения [1-4]

Типы данных, определяемые программистом

Информация, которую требуется обрабатывать в программе, имеет различную структуру. Для ее адекватного представления используются типы данных, которые программист определяет сам в разделе описания типов type. Типу дается произвольное имя, которое можно затем использовать для описания программных объектов точно так же, как и стандартные имена типов:

type имя_типа = описание_типа

...

var имя_переменной : имя_типа

Можно задать тип и непосредственно при описании переменных:

var имя_переменной : описание_типа

Перечисляемый тип данных

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

type имя_типа = (список имен констант)

Константы в списке перечисляются через запятую, например:

type Menu = (READ, WRITE, EDIT, QUIT)

Переменным перечисляемого типа можно присвоить либо значение одной из перечисленных констант, либо значение другой переменной того же типа, например:

3

var m, n : Menu;

m:=READ; n:=m;

Перечисляемый тип относится к порядковым типам данных.

Константы в списке нумеруются с нуля. Например, Ord(READ) даст в результате 0, Succ(EDIT) QUIT. Попытка получения значения,

следующего за последним, приведет к ошибке.

Использовать перечисляемый тип в операциях ввода-вывода нельзя.

Имена констант в пределах области их описания (программы или подпрограммы) должны быть уникальными.

Интервальный тип данных

С помощью интервального типа задается диапазон значений какого-

либо типа.

type имя_типа = константа_1 .. константа_2

Константы должны быть одного и того же порядкового типа. Тип, на котором строится интервал, называется базовым. Константа_1 должна быть меньше или равна константе_2. Примеры описания интервальных типов:

type Hour = 0 .. 23; Range = –100 .. 100; Letters = 'a' .. 'z';

Actions = READ .. EDIT;

Как и для других типов, определяемых программистом, интервальный тип можно задать прямо при описании переменной, например:

var r : –100 .. 100;

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

'Constant out of range'.

4

Интервальный тип используется в программах как самостоятельно, так и внутри определения массива.

Массивы

При использовании простых переменных каждой области памяти,

предназначенной для хранения какого-либо значения, соответствует свое имя. Если с группой величин одинакового типа требуется выполнять однообразные действия, им дают одно имя, а различают по порядковому номеру (индексу). Это позволяет компактно записывать множество операций с помощью циклов.

Конечная именованная последовательность однотипных величин называется массивом. Чтобы описать массив, надо определить, какого типа его элементы и каким образом они пронумерованы (какого типа его индекс).

type имя_типа = array [тип_индекса] of тип_элемента

Здесь array и of — ключевые слова, тип индекса задается в

квадратных скобках. Примеры описания типа:

type mas=array [1 .. 10] of real;

Color=array [byte] of mas;

Active=array [Menu] of boolean;

В первом операторе описан тип массива из вещественных элементов,

которые нумеруются от 1 до 10. Во втором операторе элементами массива являются массивы типа mas, а нумеруются они в пределах, допустимых для типа byte, то есть от 0 до 255. В третьей строке в качестве индекса использовано имя типа из раздела «Перечисляемый тип данных», а сами элементы могут принимать значения true или false.

Тип элементов массива может быть любым, кроме файлового, тип индексов — интервальным, перечисляемым или byte. Чаще всего для описания индекса используется интервальный тип данных.

5

Массивы с одним индексом называют одномерными, а с двумя —

двумерными. Одномерный массив нестрого соответствует вектору в математике, двумерный — матрице.

Размещение массива в памяти происходит до выполнения программы,

поэтому при описании индекса можно применять только константы или константные выражения.

Зачастую при описании массива верхняя граница его индекса задается в виде именованной константы, например:

const n = 6;

type intmas = array [1 .. n] of integer;

После задания типа массива переменные этого типа описываются обычным образом:

var a, b : intmas;

С массивами в целом можно выполнять только одну операцию:

присваивание. При этом массивы должны быть одного типа:

b := a;

Все остальные действия выполняются с отдельными элементами массива. Для обращения к элементу массива после имени массива указывается номер элемента в квадратных скобках, например:

a[4]

b[i]

С элементом массива можно делать все, что допустимо для переменных того же типа.

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

предшествующее обращениям к элементу, ключ компиляции {$R+} или установить соответствующий режим в оболочке.

Также рассмотрим особенности инициализации массивов. Элементам массива можно присвоить значения до начала выполнения программы. Это

6

делается так же, как и для простых переменных, — в разделе описания констант, например:

const a : intmas = (0, 5, –7, 100, 15, 1);

Количество констант должно точно соответствовать числу элементов массива. Массивы, описанные в разделе var главной программы,

обнуляются автоматически.

Пример №1. Ввод и вывод элементов массива

Рассмотрим простейший пример программы, предназначенной для работы с массивом. Изначально пользователь вводит значения всех элементов одномерного массива, состоящего из 5 элементов. Затем на экран выводятся значения этих элементов.

Текст программы, написанной в системе Турбо-Паскаль, показан на рис. 1. Как видно из данного примера, для работы с массивами удобно использовать цикл for.

Рис. 1. Простейшая программа для работы с одномерным массивом

Результат работы программы представлен на рис. 2.

7

Рис. 2. Простейшая программа для работы с одномерным массивом

Обратите внимание, что для очистки экрана в программе использована процедура clrscr из модуля crt.

Пример №2. Задача поиска максимального элемента в массиве

Рассмотрим задачу поиска максимального элемента массива.

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

Сформулируем алгоритм поиска максимума словесно:

1)Принять за максимальный первый элемент массива.

2)Просмотреть массив, начиная со второго элемента.

3)Если очередной элемент оказывается больше максимального,

принять его за максимальный.

Текст программы:

program max_elem;

const n = 20;

var a : array [1 .. n] of real;

8

i

: integer;

 

max

: real;

 

begin

 

 

writeln('Введите ', n, ' элементов массива');

for

i := 1 to n do

 

 

read(a[i]);

 

max

:= a[1];

{принять за максимальный первый элемент массива}

for

i := 2 to n do

{просмотреть массив, начиная со второго элемента}

 

if a[i]>max then

 

max:=a[i]; {при необходимости обновить максимум} writeln('Максимальный элемент: ', max:6:2)

end.

Пример №3. Вычисление суммы элементов массива и количества отрицательных элементов в массиве

Рассмотрим еще один достаточно простой пример работы с массивом

– программу, вычисляющую сумму элементов в массиве и количество отрицательных элементов в массиве:

program

sum_num;

 

const

n

= 10;

 

 

var a

:

array

[1

.. n] of integer;

i, sum, num : integer; begin

writeln('Введите ', n, ' элементов массива'); for i := 1 to n do

read(a[i]); sum := 0;

num := 0;

for i := 1 to n do begin

sum := sum + a[i]; if a[i] < 0 then

i:=i+1;

end;

writeln('Сумма элементов: ', sum); writeln('Отрицательных элементов: ', num);

end.

Двумерные массивы

Элемент массива может быть любого типа, кроме файлового,

следовательно, он может быть и массивом, например:

9

const n=4; m=3;

type mas=array[1 .. n] of integer;

mas2=array[1 .. m] of mas;

Более компактно это можно записать так:

type mas2=array[1 .. m, 1 .. n] of integer;

Здесь описан тип массива, состоящего из m массивов, каждый из которых содержит n целых чисел. Иными словами, это матрица из m строк и n столбцов (рис. 3). Обе размерности массива должны быть константами или константными выражениями.

Рис. 3. Матрица из m строк и n столбцов

Имя типа указывается при описании переменных, например:

var a, b : mas2;

В памяти двумерный массив располагается по строкам.

a11

a12

a13

a14

a21

a22

a23

a24

a31

a32

a33

a34

|

– 1–я

строка –

|

– 2–я

строка –

| –

3–я строка – |

Строки массива ничем не отделены одна от другой, то есть прямоугольной матрицей двумерный массив является только в нашем воображении. При просмотре массива от начала в первую очередь изменяется правый индекс (номер столбца).

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

a[1,4]

b[i,j]

b[j,i]

10

Следует иметь в виду, что компилятор воспринимает как номер строки первый индекс, как бы он ни был обозначен в программе.

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

const a:mas2 = ((2,3,1,0),

(1,9,1,3),

(3,5,7,0));

С двумерными массивами в целом определена только одна операция – присваивание массивов одного типа (например, b:=a). Все остальные действия выполняются с отдельными элементами. Например, чтобы ввести с клавиатуры двумерный массив, необходимо организовать вложенные циклы:

for i:=1 to m do

for j:=1 to n do

read(a[i,j]);

В соответствии с приведенным здесь порядком следования циклов элементы массива должны вводиться по строкам.

Пример №4. Работа с двумерным массивом

Рассмотрим программу, которая для целочисленной матрицы 3x4

определяет среднее арифметическое ее элементов и количество положительных элементов в каждой строке.

Для нахождения среднего арифметического порядок перебора элементов массива (по строкам или по столбцам) роли не играет.

Нахождение количества положительных элементов каждой строки требует просмотра матрицы по строкам.

Текст программы:

program sred_n; const m = 3; n = 4;

var a : array [1 .. m, 1 .. n] of integer; i, j, n_pos_el : integer;

sred : real;

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