Написание программы на языке Паскаль с использованием записей 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Написание программы на языке Паскаль с использованием записей



Цель работы: формирование знаний и умений по работе с записями. Приобретение навыков работы с записями.

Краткие теоретические сведения

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

Иногда для решения задач, в которых возникает необходимость хранить и обрабатывать совокупности данных различного типа, используются записи.

Запись представляет собой наиболее общий и гибкий структурированный тип данных, так как она может быть образована из не однотипных компонентов и в ней явным образом выражена связь между элементами данных, характеризующими реальный объект.

Запись -это структурированный тип данных, состоящий из фиксированного числа компонентов, называемых полями записи. Определение типа записи начинается идентификатором Record и заканчивается зарезервированным словом end. Между ними заключен список компонентов, называемых полями, с указанием имен полей и типа каждого поля.

Структура объявления типа записи такова:

Type

<имя типа> = Record

<имя поля>: <тип компонентов>;

<имя поля>: <тип компонентов>;

End;

VAR

<имя переменной>: <имя типа>;

Пример описания записи:

Type

Car= Record

Number:Integer;

Marka:String[20];

FIO:String[40];

Address:String[60];

End;

Var

Mashina: Car;

В данном примере была объявлена запись с именем Car, у которой имеется 4 поля: номер, название марки машины, ФИО владельца и его адрес.

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

Например, доступ к полям записи Car осуществляется как: Mashina.Marka, Mashina.FIO, Mashina.Number. Составное имя можно использовать везде, где допустимо применение типа поля. Для присваивания полям значений используется оператор присваивания.

Пример присваивания полям записи Mashina:

Mashina. Number:=164536l;

Mashina.Marka:=’ГАЗ-24’;

Mashina.FIO:=’Иванов И.И’;

Mashina. Address:=’ул.Пушкина 12-30’;

Составные имена можно использовать в операторах ввода-вывода:

Read (Mashina. Number, Mashina. FIO, Mashina. Address);

Write(Mashina. Number:4, Mashina. FIO:12, Mashina. Address:25);

Допускается применение оператора присваивания и к записям в целом, если они имеют один и тот же тип. Например,

Mash:=Mashina;

После выполнения этого оператора значения полей записи Mash станут равны значениям соответствующих полей записи Mashina.

В ряде задач удобно пользоваться массивами из записей. Их можно описать следующим образом:

Type

Car=Record

Number:Integer;

Marka:String[20];

FIO:String[40];

Address:String[60];

End;

Var

Mashins: array [1..20] of Car;

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

With <переменная типа запись> do <оператор>;

Один раз, указав переменную типа запись в операторе With, можно работать с именами полей как с обычными переменными.

Пример присвоения значения полям записи Car с помощью оператора With.

With Mashina do

Begin

Number:=164536l;

Marka:=’ГАЗ-24’;

FIO:=’Иванов И.И’;

Address:=’ул.Пушкина 12-30’;

End;

Пример программы работы с записями

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

Для описания сведений о компьютерных программах в разделе типов введем тип Prog_Type –запись следующей структуры:

 

Prog_Type=Record

Title:String[50];

Author:String[50];

Entry:Integer;

Firma:String[40];

End;

где Title - поле для записи названия программы, Author -поле для записи фамилии автора, Entry - поле для записи года разработки, Firma -поле для записи фирмы-разработчика.

В разделе описания переменных введем массив Prog_Katalog из 10 записей типа Prog_Type. Переменную Num_Array, принимающую значения от 1до 10 введем для указания на порядковый номер записи в массиве Prog_Katalog. Для критерия поиска введем переменную Author строкового типа. Результат поиска записывается в переменную логического типа Yes_Prog.

В целом текст программы может выглядеть так:

Program Katalog;

Type

Prog_Type=record

Title:string[50];

 

Author:String[50];

Entry:Integer;

Firma:String[40];

end;

Var

Prog_Katalog:Array[1..10] of Prog_Type;

Num_Array:1..10;

Author:String[50];

Yes_Prog:Boolean;

Procedure Input_Data;

Begin

Writeln('Введите данные о ',Num_Array,'-й программе:');

With Prog_Katalog[Num_Array] do

begin

Write('Название программы: ');

Readln(Title);

Write('Автор:');

Readln(Author);

Write('Год разработки:');

Readln(Entry);

Write('Фирма:');

Readln(Firma);

 

Writeln;

end;

end;

Procedure Write_Data(Num:Integer);

begin

Writeln('Программа № ',Num);

With Prog_Katalog[Num_Array] do

begin

Writeln('Название:',Title);

Writeln('Фамилия автора:',Author);

Writeln('Год разработки:',Entry);

Writeln('Фирма:',Firma);

end;

end;

{Основная программа}

Begin

{У пользователя запрашивается 3 раза ввод данных о программах}

for Num_Array:=1 to 3 do

Input_Data;

Writeln;

Writeln('Поиск информации(программы) по фамилии автора: ');

Writeln;

Write('Введите фамилия автора: ');

Readln(Author);

Yes_Prog:=False;

for Num_array:=1 to 10 do

if Prog_Katalog[Num_Array].Author=Author then

begin

Write_Data(Num_Array);

Yes_Prog:=True;

end;

if not Yes_Prog then Write('Нет программ данного автора ',Author);

end.

Порядок выполнения работы

1. Изучить теоретические сведения по теме “Работа с записями”.

2. Получить у преподавателя индивидуальное задание.

3. Разработать программу для работы с записями согласно полученному заданию.

4. Показать работающую программу преподавателю.

5. Ответить на контрольные вопросы.

Контрольные вопросы

1. Понятие записи. Структура объявления типа записи.

2. Обращение к значению поля. Составные имена.

3. Присвоение полям записи значений. Массивы записей.

4. Пример программы с использованием записей.

 

Лабораторная работа № 26

Написание программы на языке Паскаль с использованием записей с вариантами

Цель работы: формирование знаний и умений по работе с записями с вариантами. Приобретение навыков работы с вариантными полями.

Краткие теоретические сведения

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

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

Формат:

Type

<имя типа> = Record

Case <поле признака>: <имя типа> of

<константа выбора 1>: (поле, …: тип);

<константа выбора n>: (поле, …: тип);

End;

Компоненты каждого варианта (идентификаторы полей и их типы) заключаются в круглые скобки. У части Case нет отдельного end. Одно слово end заканчивает всю конструкцию записи с вариантами. Количество полей каждого из вариантов не ограничено. Объем памяти, необходимый для записи с вариантами, складывается из объемов полей фиксированной части и максимального по объему поля переменной части.

Пример:

Type

Rec= Record

Number:Byte;

Code:Integer;

Case Flag:Boolean of

True:(Proce1:Integer);

False:(Price2:Real);

End;

Var

PRec: Rec;

В данном примере была объявлена запись с именем Rec, у которой поля Number и Code расположены в фиксированной части записи, они доступны в программе в любой текущий момент независимо от значения поля признака. Поле Price 1 может использоваться только в том случае, если значение поля признака Flag равно True. Поле Price 2 доступно в противоположном случае, т.е. если значение Flag равно False.

При использовании записей с вариантами необходимо придерживаться следующих правил:

3 все имена полей должны отличаться друг от друга, по крайней мере, одним символом, даже если они встречаются в разных вариантах

3 запись может иметь только одну вариантную часть, причем вариантная часть должна размещаться в конце записи

3 если поле, соответствующее какой-либо метке, является пустым, то оно записывается следующим образом: < метка>: ();

Пример программы работы с записями

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

Литературу в библиотеке можно разделить на три типа изданий: книги, журналы, газеты. Для описания сведений о типе изданий в разделе типов введем перечисляемый тип:

Type_Publ=(Book,Journal,Newspaper);

Для описания сведений о литературе в разделе типов ведем тип Liter. Для разного типа изданий в каталоге требуется хранить разную информацию, например: если для поиска книги нужно знать год издания, то для журнала помимо года издания, нужно знать его номер, а для газеты не только год, номер, но и день выпуска. В связи с необходимостью хранения разной информации в структуре записи Liter наряду с неизменной частью - полями Title и Author, в которых отображается название публикации и фамилия автора будет вариантная часть, отражающая дату издания по-разному в зависимости от типа издания. Запись Liter будет иметь следующую структуру:

Liter=Record

Title:String[50];

Author:String[50];

Case V: Type_Publ of

Book: (YearB:Integer);

Journal: (Num:1..12;

YearJ:1900..2001);

Newspaper: (Day:1..31;

Month:1..12;

YearN:Integer);

End;

где V - признак выбора вариантов, который может принимать значение Book, Journal, Newspaper. Для типа Book предусмотрено хранение года издания (поле YearB), для издания типа Journal- номера(Num) и год издания (поле YearJ), для издания типа Newspaper –дня (поле Day), месяца (поле Month) и года выпуска (поле YearN).

В разделе описания констант зададим значение максимального числа записей в каталоге Count=10.

Текст программы:

Program Kat_Library;

Type

Type_Publ=(Book,Journal,Newspaper);

Liter=Record

Title:string[50];

Author:String[50];

case V:Type_Publ of

Book:(YearB:Integer);

Journal:(Num:1..12;

YearJ:1900..2000);

Newspaper:(Day:1..31;

Month:1..12;

YearN:Integer);

end;

Const Count=10;

Var

Katalog:Array[1..Count] of Liter;

Num_Array:1..Count;

Yes_Liter:Boolean;

Vybor:Byte;

Edition:Type_Publ;

Count_Find:Integer;

Procedure Input_Data;

Begin

Writeln('Введите данные о литературе ',Num_Array,':');

Write('Введите число, указывающее вид издания:');

Write('1-книга, 2-журнал, 3-газета: ');

Readln(Vybor);

Case Vybor of

1:Katalog[Num_Array].V:=Book;

2:Katalog[Num_Array].V:=Journal;

3:Katalog[Num_Array].V:=Newspaper;

end;

With Katalog[Num_Array] do

begin

Write('Фамилия автора: ');

Readln(Author);

Write('Название:');

Readln(Title);

Case V of

Book:begin

Write('Год издания: ');

Readln(YearB);

end;

Journal:begin

Write('Номер: ');

Readln(Num);

Write('Год издания: ');

Readln(YearJ);

end;

Newspaper:begin

Write('Дата издания: День ');

Readln(Day);

Write('Месяц: ');

Readln(Month);

Write('Год: ');

Readln(YearN);

end;

end;

end;

end;

Procedure Write_Data;

begin

Writeln;

Writeln('Литература № ',Num_Array);

With Katalog[Num_Array] do

begin

Writeln('Название:',Title);

Writeln('Фамилия автора:',Author);

Case V of

Book:begin

Writeln('Год издания:',YearB);

end;

Journal:begin

Write('Номер: ',Num);

Writeln('Год издания: ',YearJ);

end;

Newspaper:begin

Writeln('Дата издания: День:',Day,'Месяц:',Month,'Год:',YearN);

end;

end;

end;

end;

procedure Find_Liter;

begin

Writeln('Поиск литературы по типу издания: ');

Writeln;

Write('Введите число, указывающее вид издания: ');

Write('1-книга, 2-журнал, 3-газета');

Readln(Vybor);

case Vybor of

1:Edition:=Book;

2:Edition:=Journal;

3:Edition:=Newspaper;

end;

Yes_Liter:=False;

Count_Find:=0;

for Num_Array:=1 to Count do

If Katalog[Num_Array].V=Edition then

begin

Count_Find:=Count_Find+1;

Write_Data;

Yes_Liter:=True;

end;

if not Yes_Liter then

Writeln('В библиотеке нет такой литературы ')

else

Writeln('Всего в библиотеке',Count_Find,' таких изданий');

end;

begin

for Num_Array:=1 to Count do

Input_Data;

Writeln;

Find_Liter;

end.

Порядок выполнения работы

1. Изучить теоретические сведения по теме “Работа с вариантными записями”.

2. Получить у преподавателя индивидуальное задание.

3. Разработать программу для работы с записями с вариантами согласно полученному заданию.

4. Показать работающую программу преподавателю.

5. Ответить на контрольные вопросы.

Контрольные вопросы

1. Понятие записи с вариантами. Структура объявления.

2. Правила использования записей с вариантами.

3. Пример программы с использованием записей с вариантами.

 

Лабораторная работа № 27



Поделиться:


Последнее изменение этой страницы: 2016-08-12; просмотров: 461; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 44.200.95.157 (0.091 с.)