Главная страница
Навигация по странице:

  • Описание типа запись

  • программирование на паскале2. Учебное пособие по курсу Высокоуровневые методы информатики и программирования для студентов Гуманитарноприкладного института


    Скачать 0.89 Mb.
    НазваниеУчебное пособие по курсу Высокоуровневые методы информатики и программирования для студентов Гуманитарноприкладного института
    Анкорпрограммирование на паскале2.doc
    Дата25.05.2018
    Размер0.89 Mb.
    Формат файлаdoc
    Имя файлапрограммирование на паскале2.doc
    ТипУчебное пособие
    #19648
    страница6 из 10
    1   2   3   4   5   6   7   8   9   10

    3.2. Тип запись


    Пока мы рассматривали одну сложную структуру (сложный тип) - массив; одним из основных свойств массива является однотипность его компонент. Многие информационно-логические задачи связаны с обработкой документов, содержащих в себе информация разного типа (числовую, символьную и т. д.) Примеры таких документов: пла­тежные ведомости (фамилии и имена - символьная информация, де­нежные суммы - числовая), карточки больных в поликлинике, библио­течная информация. Как обрабатывать такие данные с помощью строковых типов, показано в §3.1.3; при этом приходится выделять подстроки и переводить некоторые из них в число. Для упрощения программирования алгоритмов обработки такой информации необходимо иметь сложный тип, объединяющий разнотипные компоненты. Таким типом в Паскале является запись.

    Запись - это переменная, состоящая из фиксированного числа компонент, вообще говоря, разного типа, причем каждая компонента имеет свое имя. Компоненты записи также называются полями записи. Сравним два типа - массив и запись. Компоненты массива имеют одинаковый тип; компоненты записи могут иметь разный тип (хотя могут быть и однотипны). Для обращения к элементу массива надо указать его номер (индекс), при обращении к полю записи указывается его имя.

    Описание типа запись:

    TYPE имя_типа = RECORD

    список_1_имен_полей: тип_1;

    список_2_имен_полей : тип_2;

    . . .

    список_N_имен_полей: тип_N;

    END;
    Например:

    TYPE COMPLEX=RECORD{значения переменныx этого типа -
    комплексные числа}

    Re,Im:REAL {действительная и мнимая части}

    END;

    DATE = RECORD {для описания дат (число, месяц, год)}

    Day : 1..31; {число}

    Month = (January, February, March, April, May, June, July, August, September, October, November, December); {месяц}

    Year : Integer; {год}

    END;

    BOOK = RECORD {для описания книг в каталоге библиотеки}

    Author,Title,Publisher:String;

    {автор, название, издательство}

    Year,Volume,Pages:Integer;

    {год издания,том,количество страниц}

    END;

    Память, занимаемая записью, равна сумме объемов памяти полей (если исключить из рассмотрения особенности, связанные с выравниванием). В любом случае для определения размера памяти записи можно использовать функцию sizeof(переменная_или_тип).

    Для обращения к полю записи надо указать имя записи, а затем, через точку, имя поля. Например:

    VAR C:COMPLEX; D,D1:DATE; B:BOOK;

    BEGIN . . . C.Re:=5; D.Month:=January; B.Author:='Smith';

    {*} D1.Day:=6; D1.Month:=June; D1.Year:=1799;{*} . . .

    Чтобы не писать многократно имя записи при работе с ее полями, используется оператор

    WITH Имя_записи DO оператор

    Три оператора, ограниченные {*}, эквивалентны оператору:

    WITH D1 DO

    BEGIN Day:=6; Month:=June; Year:=1799

    END;

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

    Program Toys;

    TYPE SVED=RECORD {тип "запись", описывающий игрушку}

    name:String; {название игрушки}

    MinAge, MaxAge,Rub:Real;

    {возрастные границы и стоимость}

    END;

    VAR N:Integer; {число наименований игрушек}

    Toy:SVED; {переменная, описывающая игрушку}

    max:Real; {максимальная стоимость конструктора для детей до 7 лет}

    namemax:String; {название искомого конструктора}

    i:Integer; {счетчик наименований игрушек}

    BEGIN

    Writeln(' Введите число наименований игpушек');

    ReadLn(N);

    max:=0;

    For i:=1 to N Do

    With Toy Do {работаем с полями записи Toy}

    BEGIN

    Writeln('Введите название игpушки с номером', i:2);

    Readln(name);

    Writeln('Введите мин. и макс. возраст и стоимость');

    Readln(Minage,Maxage,Rub); {вводим запись по полям}

    If ((Pos('констpуктоp',name)>0) or {содержит ли название}

    (Pos('Констpуктоp',name)>0)) and {слово "конструктор" }

    (MaxAge<=7) Then

    If Rub>max Then

    BEGIN

    max:=Rub;

    namemax:=name

    END;

    END;

    If max=0 Then

    WriteLn(' Констpуктоpов для детей до семи лет нет')

    Else

    BEGIN

    WriteLn('Cамый доpогой констpуктоp для детей до семи лет');

    WriteLn(namemax);

    WriteLn('стоит ', max:6:0, ' pублей')

    END;

    END.

    Замечания:

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

    2. Недостатки программы, отмеченные в §3.1.3, имеют место и для этой программы. Они устраняются использованием файлов.
    1   2   3   4   5   6   7   8   9   10


    написать администратору сайта