На вооружении флота 100 подводных лодок. Адмиралу часто приходится решать задачи такого типа: 1)перечислить названия лодок, имеющих скорость, превышающую скорость вражеской подводной лодки Шредер; 2)подсчитать, сколько лодок имеют на вооружении больше 10 торпед; и т.д. Чтобы ускорить решение таких задач, адмирал приказал занести в компьютер сведения обо всех лодках, включая вражеские лодки Шредер и Рокстеди, а именно: их названия, скорость и число торпед, находящихся на вооружении.
Отвести место в оперативной памяти под указанную информацию о 102 лодках можно двумя способами: 1)с помощью массивов, 2)с помощью записей.
Рассмотрим программу, использующую первый способ. В каждом массиве будет 102 элемента, причем элементы 101 и 102 отведены под лодки противника.
VAR nazvanie :array[1..102] of String; {Место
под 102 названия}
skorost :array[1..102] of Real; {Место под 102
скорости}
torped :array[1..102] of Byte; {Место под 102
количества торпед}
i :Integer;
BEGIN
{Здесь каким-нибудь способом заносим в отведенное место всю информацию,
например, присвоением - nazvanie[1]:='Щука'.... или загрузкой из файла}
{А теперь решим первую из двух задач:}
for i:=1 to 100 do if skorost[i] >
skorost [101] then WriteLn(nazvanie[i])
END.
В памяти компьютера информация размещается в том порядке, в котором она встречается в описаниях:
ЯЧЕЙКИ ДЛЯ ИНФОРМАЦИИ |
ИНФОРМАЦИЯ |
nazvanie[1] |
Щука |
nazvanie[2] |
Дельфин |
........... |
........ |
nazvanie[101] |
Шредер |
nazvanie[102] |
Рокстеди |
skorost[1] |
26 |
skorost[2] |
24 |
........... |
........ |
skorost[101] |
20 |
skorost[102] |
18 |
torped[1] |
6 |
torped[2] |
10 |
........... |
........ |
torped[101] |
15 |
torped[102] |
22 |
i |
? |
Вы видите, что данные об одной лодке разбросаны по памяти.
Рассмотрим второй способ. Иногда бывает удобно, чтобы данные, касающиеся одной лодки, хранились в памяти рядом, вот так:
ЯЧЕЙКИ ДЛЯ ИНФОРМАЦИИ |
ИНФОРМАЦИЯ |
lodka[1].nazvanie |
Щука |
lodka[1].skorost |
26 |
lodka[1].torped |
6 |
lodka[2].nazvanie |
Дельфин |
lodka[2].skorost |
14 |
lodka[2].torped |
10 |
. . . . . . . . . . . . . . |
. . . . . . . . . |
vr .nazvanie |
Шредер |
vr .skorost |
20 |
vr .torped |
15 |
prot .nazvanie |
Рокстеди |
prot .skorost |
18 |
prot .torped |
22 |
Выстроенную подобным образом информацию в памяти компьютера часто называют базой данных.
Сами по себе массивы не позволяют хранить информацию в таком порядке, для этого нужно использовать записи. Запись - это набор данных (полей) различных типов, касающийся одного объекта. Например, запись, касающаяся нашей первой лодки, это набор трех полей: название - Щука (тип String), скорость - 26 (тип Real), количество торпед - 6 (тип Byte). Точка отделяет имя поля от обозначения записи, содержащей это поле.
Напомним, что в массиве разрешается хранить данные только одного типа.
Прежде чем отводить место в памяти под всю информацию, объясним Паскалю, из чего состоит одна запись, то есть опишем ее, задав специальный тип записи record и придумав ему имя, скажем, podlodka:
TYPE podlodka = record
nazvanie :String;
skorost :Real;
torped :Byte;
end;
..........
Тип определен, но место в памяти пока не отведено. Здесь нам, хочешь-не хочешь, придется воспользоваться массивом. При помощи VAR отведем место под массив из 100 записей для наших подлодок и отдельное место под две записи для вражеских. Массиву придумаем имя lodka.
VAR lodka :array[1..100]
of podlodka;
vr,prot :podlodka; {Записи для двух
вражеских лодок}
i :Integer;
..........................
Как видите, элементами массива могут быть не только отдельные числа, символы или строки, но и такие сложные образования, как записи.
Вот программа целиком:
TYPE podlodka
= record
nazvanie :String;
skorost :Real;
torped :Byte;
end;
VAR lodka :array[1..100] of podlodka;
vr,prot :podlodka;
i :Integer;
BEGIN {Здесь задаем значения полям всех записей. Конечно,
удобнее это делать
при помощи типизированных констант (см.следующую программу) или
файлов данных, но я использую простое присвоение:}
lodka[1].nazvanie :='Щука';
lodka[1].skorost :=26;
. . . . . . . .
prot.torped :=22;
{А теперь решаем первую задачу:}
for i:=1 to 100 do if lodka[i].skorost >
vr.skorost then WriteLn (lodka[i].nazvanie)
END.
Согласитесь, что при использовании записей текст программы гораздо понятнее.
Теперь запишем нашу программу с использованием типизированных констант, для краткости ограничив наш флот тремя подводными лодками:
TYPE podlodka
= record
nazvanie :String;
skorost :Real;
torped :Byte;
end;
CONST lodka : array[1..3] of podlodka =
((nazvanie:'Щука';
skorost:26; torped: 6),
(nazvanie:'Дельфин'; skorost:14; torped:10),
(nazvanie:'Леонардо'; skorost:28; torped:11));
vr : podlodka =
(nazvanie:'Шредер'; skorost:20; torped:15);
prot : podlodka =
(nazvanie:'Рокстеди'; skorost:18; torped:22);
VAR i : Integer;
BEGIN
for i:=1 to 3 do if lodka[i].skorost >
vr.skorost then WriteLn(lodka[i].nazvanie);
END.
Здесь вы видите, как правильно придавать начальные значения типизированным константам типа record.
Задание 116: Создайте базу данных о своих родственниках. О каждом родственнике должно быть известно:
· Имя
· Год рождения
· Цвет глаз
Массивы не используйте. Программа должна:
1) Распечатать ваш возраст и цвет глаз
2) Ответить на вопрос – правда ли, что ваш дядя старше тети.
Задание 117: Создайте базу данных о своих однокашниках. О каждом однокашнике должно быть известно:
· Фамилия
· Имя
· Пол
· Год рождения
Обязательно используйте массив не меньше, чем из 10 записей. Программа должна:
1) Вычислить средний возраст ваших однокашников
2) Определить, кого среди них больше – дам или кавалеров
3) Ответить на вопрос – есть ли в вашей базе тезки (это нелегко).
Скачано с www.znanio.ru
Материалы на данной страницы взяты из открытых источников либо размещены пользователем в соответствии с договором-офертой сайта. Вы можете сообщить о нарушении.