ТУРБО ПАСКАЛ

Комбиниран тип данни (записи)

Анализ чрез пример

При работа с масиви основното ограничение е, че всеки елемент трябва да бъде от един и същи тип. Но при решаването на много проблеми става необходимо да се съхраняват и обработват колекции от данни от различен тип.

Пример

За всеки от 25-те ученици в класа са известни фамилията и оценката (в точки) по пет дисциплини. Необходимо е да се изчисли средната оценка на всеки ученик и да се избере човекът с максимална средна оценка.

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

Записът е структуриран тип, който съдържа колекция от обекти от различен тип. Обектите, които съставят запис, се наричат ​​полета. В записа всяко поле има свое име. За да опишете запис, трябва да посочите неговото име, имената на обектите, които съставят записа и техните типове. Общият изглед е следният:

Тип
"име на записа" = Запис
"поле 1": "тип 1";
"поле 2": "тип 2";
.
"поле n": "тип n"
Край;

Данните за решаване на разглеждания проблем могат да бъдат описани като запис, както следва:

Тип
ученик = Запис
fam: String [15];
b1, b2, b3, b4, b5: 2.5;
sb: Реално
Край;;

Readln klass

Променлива от тип пупъл ще осмисли структура, съдържаща информация, която характеризира един ученик. Организацията на тази структура е показана на фиг. 1.

За да съхранявате информация за всички 25 ученици в клас в компютърна памет, трябва да въведете масив клас, представляващ масив от записи:

Var klass: Array [1.25] На ученик;

Бележки

  1. Имената на полетата, които съставят записа, не трябва да се повтарят.
  2. Всяко поле на запис може да бъде от всякакъв тип (с изключение на файл), по-специално, това може да бъде запис отново.

Достъп до полета за запис

Може да се направи по два начина.

    Чрез посочване на името на променливата и името на полето. Например klass [2] .fam, klass [3] .sb, klass [1] .b4. Следователно, въвеждането на фамилиите и оценките на учениците, т.е.елементи от масива на klass, може да бъде зададено, както следва:

За i: = 1 до 25 Do
Започнете
Readln (klass [i] .fam);
Readln (klass [i] .b1);
Readln (klass [i] .b2);
Readln (klass [i] .b3);
Readln (klass [i] .b4);
Readln (klass [i] .b5);
Край;

Като използвате оператора за добавяне, който ви позволява да получите достъп до полетата на записа, сякаш са прости променливи. Общият му изглед:

С Do .

В рамките на изявление до компонентите на записа може да се получи достъп само с името на съответното поле.

Пример

За i: = 1 до 25 Do
С клас [i] Do
Започнете
Readln (fam);
ReadLn (b1, b2, b3, b4, b5);
Край;

Програмата за решаване на разглеждания проблем може да бъде написана в следната форма:

Пример за програма_54;
Тип
ученик = Запис
fam: String [15];
b1, b2, b3, b4, b5: 2.5;
sb: Реално;
Край;
Var klass: Array [1.25] на ученик;
р: ученик;
i, m: Цяло число;
sbmax: Реално;
Започнете

За i: = 1 до 25 Do
С клас [i] Do
Започнете
Writeln („Въведете вашето фамилно име и пет оценки“);
Readln (fam);
ReadLn (b1, b2, b3, b4, b5);
Край;
За i: = 1 To m Do
С клас [i] Направете sb: = (b1 + b2 + b3 + b4 + b5)/5;
sbmax: = 0;
За i: = 1 To m Do
Ако klass [i] .sb> = sbmax Тогава sbmax: = klass [i] .sb;
За i: = 1 До m Направете
Ако klass [i] .sb = sbmax Тогава
С klass [i] Do Writeln (fam: 20, '-', sb: 6: 3);
Readln;
Край.

Пример

Определете датата утре.

Нека датата се въведе, както следва:

1 2 1997 г.

Първата цифра е числото, втората е месецът, а третата е годината. След това можете да опишете записа на датата така:

Функция Месец (mm: месец; yy: година): ден;
Започнете
Корпус мм О
1, 3, 5, 7, 10, 12: Месец: = 31;
4, 6, 9, 11: Месец: = 30;
Ако скок (yy) Тогава Dmonth: = 29
Else Dmonth: = 28;
Край;
Край;

Започнете
Writeln („Въведете днешния ден, месец и година“);
Readln (dat.d, dat.m, dat.y);
Утре (dat, следващ);
Writeln ('Утре ще бъде');
Writeln (next.d, '.', Next.m, '.', Next.y);
Readln;
Край.

  1. Напишете програма, която определя:
    1. дата на следващия (предходния) ден;
    2. датата, която ще дойде в m дни;
    3. дата, която е била m дни преди днес;
    4. броят на дните, изминали от датата t1 до t2;
    5. ден от седмицата, попадащ на датата t1, ако е известно, че първият ден от нашата ера е бил понеделник.
  2. Даденото време е описано по следния начин:

    Тип време = Запис
    h: 0.23;
    m, s: 0.59
    Край;

    1. логическа функция за проверка дали времето t1 предшества времето t2 (в рамките на един ден);
    2. процедура, която присвоява на параметъра t1 време, което е с 1 секунда по-дълго от времето t (вземете предвид промяната на деня).

    Конст п = 300;
    Тип MyRecord = Запис
    Ключ: Цяло число;
    Име: низ;
    Край;
    Var Таблица = масив [1.n] на MyRecord;

    Ако приемем, че записите в таблицата имат различни ключове, опишете:

    1. процедура, която сортира записите в таблицата в низходящ ред на стойностите на полето Key;
    2. търсенето на логическа функция (T, K, H), което определя дали в таблицата T (всички записи от които вече са подредени във възходящ ред на стойностите на полето Key) има запис със стойността на полето Key, равна на до K и, ако има такива, присвояване на номера му на параметъра H.
  3. Даден масив, съдържащ информация за учениците от определено училище.
    1. Попълнете втория масив с данни за ученици само от девети клас;
    2. Разберете колко повече хора са в осми клас, отколкото в девети клас.
  4. Пътническият багаж се характеризира с броя на предметите и общото тегло на предметите. Даден е масив, съдържащ информация за багажа на няколко пътника. Информацията за багажа на всеки пътник е запис с две полета: едното е цяло число (брой елементи), а другото е валидно (тегло в килограми).
    1. Намерете багаж, средното тегло на един предмет, в който се различава с не повече от 0,3 кг от общото средно тегло на един предмет;
    2. Намерете броя на пътниците с повече от два елемента и броя на пътниците с повече елементи от средния брой елементи;
    3. Разберете дали има пътник, чийто багаж се състои от един предмет с тегло под 30 кг