Записи

  • docx
  • 06.05.2020
Публикация на сайте для учителей

Публикация педагогических разработок

Бесплатное участие. Свидетельство автора сразу.
Мгновенные 10 документов в портфолио.

0.1. Записи
Иконка файла материала 80.docx

0.1. Записи

На вооружении флота 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