Задачи на записи в паскале

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

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

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

Пример программы c записью Паскаля

var student: anketa;

writeln (‘введите сведения о студенте’);

writeln (‘введите фамилию, имя и отчество’);

writeln (‘введите дату рождения’);

writeln (‘введите адрес’);

writeln (‘введите курс’);

writeln (‘введите группу’);

writeln (‘ввод закончен’);

writeln (‘фамилия студента: ’, student . fio );

writeln(‘ дата рождения : ’, student.dat_r);

writeln(‘ адрес : ’, student.adres);

writeln(‘ курс : ’, student.curs);

writeln(‘ группа : ’, student.grupp);

Усложним задачу. Пусть нам необходимо иметь сведения о многих студентах, например, нашего факультета. Следовательно, необходимо организовать массив записей Паскаля. А затем из общего списка вывести фамилии студентов 2-го курса.

Пример программы c записью Паскаля

program primer 2 ;

var student: array [1..100] of anketa;

for I:=1 to 100 do

writeln (‘введите сведения о’, I , ‘-м студенте’);

writeln (‘введите фамилию, имя и отчество’);

writeln (‘введите дату рождения’);

writeln (‘введите адрес’);

writeln (‘введите курс’);

writeln (‘введите группу’);

writeln (‘ввод закончен’);

for I:=1 to 100 do

if student[I].curs=2 then

writeln(‘ фамилия студента : ’, student[I].fio);

Оператор присоединения или как избавиться от префикса

Префикс – обязательная предшествующая часть составного идентификатора для имен полей в структуре типа запись Паскаля. Очень часто у программиста возникает желание не указывать префикс в имени полей, например, когда идет постоянное использование одних и тех же записей. В языке Паскаль предусмотрена такая возможность, реализуемая при помощи оператора присоединения, который в общем виде выглядит так:

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

Например, фрагмент из предыдущей программы с использованием оператора присоединения будет выглядеть так:

Читайте также:  Лучший автокликер для игр

Пример фрагмента программы c записью и префиксом Паскаля

for I:=1 to 100 do

with student[I] do

writeln (‘введите сведения о’, I , ‘-м студенте’);

writeln (‘введите фамилию, имя и отчество’);

лабораторные работы и задачи по программированию и информатике, егэ по информатике

Записи в Паскале

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

Описание записи в Паскале

Общий вид описания типа record в Паскаль:

var = record : ; : ; . end;

Рассмотрим примеры объявления и создания записи в Паскале.

type mydate = record month: 1..12; day: 1..31; year: integer end; var d: mydate;

В примере переменная mydate — запись, состоящая из трех полей: month , day и year . Каждое поле содержит соответственно данные: целое число в пределах от 1 до 12 — номер месяца (интервальный тип), целое число от 1 до 31 — число месяца (интервальный тип), целое число — год.

Обращение к полям записи

type mydate = record month: 1..12; day: 1..31; year: integer end; var d: mydate; begin d.day:=1; d.month:=12; readln(d.year); writeln(d.day,’/’,d.month,’/’,d.year); end.

Записи в виде двумерной таблицы

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

Рассмотрим пример использования записи-таблицы:

1 2 3
Day 2 14 14
Month 1 2 12
Year 1985 1987 1989

Задать данные таблицы в виде записи. Объявить массив дней рождения и вывести дату первого дня рождения.

type zap1= record day:1..31; month: 1..12; year: 1900..2100; end; var birthdays:array[1..100] of zap1; begin birthdays[1].day:=2; birthdays[2].day:=14; birthdays[3].day:=14; birthdays[1].month:=1; birthdays[2].month:=2; birthdays[3].month:=12; birthdays[1].year:=1985; birthdays[2].year:=1987; birthdays[3].year:=1989; writeln(birthdays[1].day); end.

Использование конструкции with при работе с записями

При работе с записями есть возможность избавиться от постоянного префикса в виде обращения к названию переменной. Сравним два примера:

type zap1= record day:1..31; month: 1..12; year: 1900..2100; end; var my_birthday: zap1; begin my_birthday.day:=17; my_birthday.month:=4; my_birthday.year:=1993; . end.

type zap1= record day:1..31; month: 1..12; year: 1900..2100; end; var my_birthday: zap1; begin with my_birthday do begin day:= 17; month:= 3; year:= 2004; end; . end.

Во втором примере значительно проще обращаться к полям записи, избавившись от префикса, благодаря with

Записи при работе с файлами

type t_subscriber = record surname: string[20]; tel: LongInt; end; var subscriber: t_subscriber; f: file of t_subscriber; i: Integer; begin Assign(f,’notebook.dat’); Rewrite(f); for i:=1 to 5 do begin with subscriber do begin Write(‘Surname: ‘); ReadLn(surname); Write(‘Phone: ‘); ReadLn(tel); end; Write(f, subscriber); end; Close(f); end.

Читайте также:  Pdm trojan win32 bazon a

Рассмотрим пример последовательного доступа к типизированному файлу с использованием записей:

type t_subscriber = record surname: string[20]; tel: integer; end; var subscriber: t_subscriber; f: file of t_subscriber; s: string; begin Assign(f,’z:pascal.dat’); rewrite(f); subscriber.surname:=’ivanov’; subscriber.tel:=36233357; write(f,subscriber); subscriber.surname:=’petrov’; subscriber.tel:=236244475; write(f,subscriber); close(f); Reset(f); while not Eof(f) do begin Read(f, subscriber); with subscriber do begin Str(tel,s); if Copy(s,1,3) = ‘362’ then tel := tel+2000000; end; Seek(f,FilePos(f)-1); // возврат указателя назад Write(f,subscriber); Writeln(subscriber.surname, ‘ ‘,subscriber.tel); end; Close(f); end.

Множества в Паскале

Множества в Паскале — это некоторое собрание элементов, одно и того же базового типа.

В качестве базового типа может выступать любой простой порядковый тип. Базовым типом не могут быть вещественные числа (real не порядковый тип) и строки (не простой и не порядковый тип).

Размер множества в Turbo Pascal всегда ограничен некоторым предельно допустимым количеством элементов. Во множествах допускаются только такие элементы, порядковые значения которых не выходят за границы 0..255. В Turbo Pascal в целочисленных множествах могут присутствовать только числа от 0 до 255.
Отрицательные элементы множеств в Turbo Pascal не допускаются. Поэтому базовыми типами не могут быть типы shortint, integer, longint.

Таким образом, если необходимо множество целочисленных объектов, то базовый тип для Turbo Pascal должен быть объявлен как диапазон типа byte . Для множеств, содержащих символы, базовым типом должен быть тип char .

type week_days = (Mon, Tue, Wed, Thu, Fri, Sat, Sun); var work_days: set of week_days; begin work_days:=[Mon, Wed, Thu]; end.

Из примера видно, что множества (тип set ) задаются путем перечисления значений, разделенных запятыми и заключенных в квадратные скобки.

Синтаксис:
name_set:=[expr1, expr2, … exprn];

type letters = set of char; var ch1,ch2:letters; .

Переменные ch1 и ch2 из примера также не могут быть выведены на экран и их значения не могут быть запрошены при помощи оператора read .

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

Чтобы ответить на данный вопрос, сначала рассмотрим операции, выполняемые над множествами.

Действия над множествами

Объединение двух множеств A и B ( A + B ) – это новое множество, состоящее из элементов, принадлежащих множеству A или B либо тому и другому одновременно

Пример:

Пересечение двух множеств A и B ( A * B ) – это множество, состоящее из элементов, одновременно принадлежащих множествам A и B .

Пример:

Читайте также:  Размеры вентиляторов для компьютера

var ch1, ch2, ch3: set of char; begin ch1:=[‘a’, ‘b’, ‘d’]; ch2:=[‘m’, ‘d’, ‘e’]; ch3:=ch1 * ch2; <Результат: ch3 = [‘d’] >end.

Разность двух множеств A и B ( A – B ) – это новое множество, состоящее из элементов множества A , не вошедших в множество B .

Пример:

var ch1, ch2, ch3: set of char; begin ch1 := [‘a’, ‘e’, ‘t’]; ch2 := ch1 – [‘e’]; < [‘a’, ‘t’] >ch3 := [‘m’, ‘n’, ‘t’] – ch2; < [‘m’, ‘n’] >end.

Множества и операция IN в Паскале

Операция in необходима для поиска определенного элемента в величине типа set , т.е. в множестве.

Так, если x есть элемент множества a , то ( x in a ) дает true .

type week_days=(Mon, Tue, Wed, Thu, Fri); var work_days: set of week_days; begin work_days:=[Mon, Wed]; if Mon in work_days then writeln (‘понедельник — рабочий день’) else writeln (‘понедельник — не рабочий день’) end.

var work_days,days_off: set of byte; begin work_days:=[1, 2]; days_off:=[6, 7]; if 1 in work_days then writeln (‘понедельник — рабочий день’) else writeln (‘понедельник — не рабочий день’); if 6 in days_off then writeln (‘суббота — выходной день’) else writeln (‘суббота — не выходной день’); end.

  • 1 — на ветке 1 ворона
  • 2 — на ветке 2 вороны
  • 10 — на ветке 10 ворон
  • var voron, vorona, voroni: set of byte; number:integer; begin voron:=[5,6,7,8,9,10]; vorona:=[1]; voroni:=[2,3,4]; writeln (‘введите количество ворон’); readln(number); if number in voron then writeln (‘на ветке ‘, number,’ ворон’); if number in vorona then writeln (‘на ветке ‘, number,’ ворона’); if number in voroni then writeln (‘на ветке ‘, number,’ вороны’) end.

    var m : set of char; s : string; i : byte; begin write(‘строка: ‘); readln(s); m :=[]; i := 1; while i Поделитесь уроком с коллегами и друзьями:

    <Для любого количества ворон:>
    var
    vorona, voroni: set of byte;
    number: integer;
    x: string;

    begin
    vorona := [1];
    voroni := [2, 3, 4];
    x := »;
    writeln(‘введите количество ворон’);
    readln(number);
    if (number mod 100 14) then
    if number mod 10 in vorona then
    x := ‘а’
    else if number mod 10 in voroni then
    x := ‘ы’;
    writeln(‘на ветке ‘, number, ‘ ворон’ + x)
    end.