Процедуры работы с множествами
Incude(множество, элемент) – включает новый элемент во множество.
Exclude(множество, элемент) – исключает элемент из множества.
Замечание: добавлять элементы во множество можно и без использования процедуры Include следующим образом:
Program DemoInc;
Var
S:set of Char;
ch:Char;
Begin
S:=[]; {определили пустое множество}
ReadLn (ch); {ввели значение}
S:=S+[ch]; {добавили во множество}
End.
Пример. Дана строка. Сформировать и распечатать множество гласных букв английского алфавита, содержащихся в строке.
Program DemoSet;
Const
Engl_Gl:set of Char=[’a’,’e’,’u’,’i’,’о’,’y’];
Var
St :String;
Gl :set of char;
i :Integer;
ch :Char;
Begin
WriteLn(’Введите строку:’);
ReadLn(St);
{Формируем множество}
Gl:=[];
For i:=1 to Length(St) do
If St[i] In Engl_Gl then Include(Gl,St[i]);
{Вывод элементов множества}
WriteLn (’Множество гласных букв, содержащихся в
строке:’);
For ch:=’a’ then ’z’ do
If ch In Gl then Write (ch:2);
End.
ЗАПИСИ
Фиксированные записи
Запись – это структурированный тип данных, состоящий из фиксированного числа компонент разного типа.
Определение типа записи начинается идентификатором record и заканчивается зарезервированным словом end. Между ними заключен список компонентов, называемых полями, с указанием идентификаторов полей и типа каждого поля.
Формат описания записи:
Type
имя_типа=record
идентификатор_поля: тип_компоненты;
…
идентификатор_поля: тип_компоненты
end;
Var
идентификатор: имя_типа;
Пример:
Type
Sved=record
Fam :String[20];
God :Integer;
Nom_gr :String[10];
Adres :String[50]
end;
Var
Ank,S:Sved;
Обращение к полям записи осуществляется с помощью идентификатора переменной и идентификатора поля, разделенных точкой. Такая комбинация называется составным именем.
Ank.Fam
Все действия производятся над полями записи, только операцию присваивания можно выполнить над всей записью.
S:=Ank;
Массив записей описывается следующим образом:
Var
Mas:array[1..10] of Sved;
Для более простого обращения к полям записей используется оператор присоединения with:
With переменная_типа_запись do
оператор;
Один раз указав переменную типа запись в операторе with, можно работать с именами полей, как с обычными переменными, т.е. без указания перед идентификатором поля имени переменной, определяющей запись:
Использование переменной типа запись With Ank do begin Write(Fam); ... end; | Использование массива записей For i:=1 to N do With Mas[i] do begin Write(Fam); ... end; |
Сравните, без использования оператора with:
Использование переменной типа запись Write(Ank.Fam); ... | Использование массива записей For i:=1 to N do begin Write(Mas[i].Fam); ... end; |
Паскаль допускает вложение записей друг в друга (т.е. поле записи может быть в свою очередь тоже записью), соответственно оператор with может быть вложенным. Уровень вложения не должен превышать 9.
With rv1 do
With rv2 do
…
With rvn do оператор;
Вместо последней записи можно использовать более короткую:
With rv1,rv2,…,rvn do оператор;
Здесь rv1,rv2,…,rvn переменные типа запись.
Пример вложенных записей:
Type
Tfio=record
Fam :String;
Name :String;
Otch :String
end;
Tdata=record
Month :1..12;
Year :1900..2005;
Day :1..31;
end;
Sved=record
Fio:Tfio;
Data:Tdata;
Adr:String
end;
Записи можно описывать с помощью типизированных констант следующим образом:
Const
идентификатор:тип=(список_значений_полей);
Список значений полей представляет собой список из последовательностей вида:
имя_поля: константа
Элементы списка отделяются друг от друга двоеточиями.
Пример:
Type
point=record
x,y:real
end;
vect=array[0..1] of point;
month=(Jan, Feb, Mar, Apr, May, Jun, Jly, Aug,
Sep, Oct, Nov, Dec);
date=record
d:1..31;
m:month;
y:1900..2005
end;
Const
Origon:point=(x:0; y:-1);
Line:vector=((x:-3.1; y:1.5),
(x:5.9; y:3.0));
SomeDay:date=(d:16; m:Mar; y:2005);
Пример. Описать массив записей, содержащих сведения о сдаче студентами сессии. Структура записи: фамилии студента, номер группы, результаты сдачи трех экзаменов. Распечатать список студентов, получающих стипендию. Условие получения стипендии – средний балл больше 5.
Program Zapisi;
Uses Crt;
Type Sved=record
Fio:String[50]; {Фамилия}
Nom:String[10]; {Номер группы}
b1,b2,b3:0..10; {Результаты сдачи экзаменов}
sb:Real; {Средний балл}
end;
Var
Mas:array[1..10] of Sved;
i,N:Byte;
{формирование массива записей}
Procedure Vvod;
Begin
Write ('Введите количество записей N=');
ReadLn (N);
For i:=1 to N do
With Mas[i] do
Begin
Clrscr;
Write ('ФИО -->');
ReadLn(Fio);
Write ('Группа -->');
ReadLn(Nom);
Write ('Оценки -->');
ReadLn(b1,b2,b3);
sb:=(b1+b2+b3)/3;
End
end;
{вывод исходного массива записей}
Procedure Vivod;
Begin
clrscr;
WriteLn ('Сведения о студентах:');
WriteLn ('Фамилия Группа Оценки Средний балл');
For i:=1 to N do
With Mas[i] do
WriteLn (Fio:10,Nom:10,b1:2,b2:2,b3:2,sb:5:1);
Repeat Until KeyPressed;
end;
{вывод списка студентов, получающих стипендию}
Procedure Obr;
Begin
Clrscr;
WriteLn ('Студенты, получающие стипендию');
WriteLn ('Фамилия Группа Оценки Средний балл');
For i:=1 to N do
With Mas[i] do
If sb>5 then
WriteLn (Fio:10,Nom:10,b1:2,b2:2,b3:2,sb:5:1);
Repeat Until KeyPressed;
end;
Begin
Vvod;
Vivod;
Obr;
End.
Записи с вариантами
Рассмотренные выше записи имеют строки определенную структуру. В языке Pascal имеется возможность задать тип записи, содержащий произвольное число вариантов структуры. Такие записи называются записями с вариантами. Записи с вариантами обеспечивают средства объединения записей, которые похожи, но не идентичны по форме. Они состоят из необязательной фиксированной и вариантной частей. Использование фиксированной части не отличается от описанного выше. Вариантная часть формируется с помощью оператора case. Он задает особое поле записи – поле признака, которое определяет, какой из вариантов в данный момент будет активизирован. Значением признака в каждый текущий момент выполнения программы должна быть одна из расположенных далее констант. Константа, служащая признаком, задает вариант записи и называется константой выбора.
Формат описания записи с вариантами:
Type
имя_типа=record
{фиксированная часть}
идентификатор_поля: тип_компоненты;
…
идентификатор_поля: тип_компоненты;
{вариантная часть}
Case поле_признака: имя_типа of
константа_выбора_1: (поле,…:тип);
…
константа_выбора_n: (поле,…:тип)
end;
У части case нет отдельного end. Одно слово end заканчивает всю конструкцию записи с вариантами.
Пример:
Type
tzap=record
{фиксированная часть}
Nomer :Byte;
Article :String;
{вариантная часть}
Case flag: Boolean of
True: (cena1:Integer);
False: (cena2:Integer);
end;
Var
zap:tzap;
При использовании записей с вариантами следует придерживаться следующих правил:
· все имена полей должны отличаться друг от друга по крайней мере одним символом, даже если они встречаются в разных вариантах;
· запись может иметь только одну вариантную часть, причем, она должна размещаться в конце записи;
· если поле, соответствующее какой-либо метке, является пустым, то оно записывается следующим образом:
метка: ();
Записи с вариантами также можно задавать с помощью типизированных констант. При задании такой записи указываются только один из возможных вариантов констант:
Type
Forma=record
Case Boolean of
True :(BirthPlace:String[40]);
False:(Country:String[20];
EntryPort:String[20];
EntryDate:array[1..3] of Word;
Count:Word)
end;
Const
Person1:forma=(Country:’Норвегия’;
EntryPort:’Мурманск’;
EntryDate:(16, 3, 89);
Count: 12);
Person2:(BirthPlace:’Москва’);
Пример записей с вариантами. Ученики некоторого класса подразделяются на 3 группы:
· занимающиеся в спортивном кружке,
· занимающиеся в кружке туризма,
· нигде не занимающиеся.
В информации о школьниках первой группы нужно указать:
· вид спорта (легкая атлетика, футбол, волейбол, баскетбол),
· спортивный разряд (первый, второй, третий, кандидат в мастера спорта, мастер спорта);
второй группы:
· вид туризма (водный, пеший, горный),
· категорию самого сложного похода (1-6);
третьей группы:
· причину неучастия (болен, не успевает).
Описать массив записей с вариантами, имеющий указанную структуру. Организовать ввод и вывод массива.
Program Sсhool;
Uses Crt;
Type
Tzan=(Sport,Turizm,Bez); {вид занятий}
Tvid=(L_a,Fut,Vol,Bas); {вид спорта}
Trazr=(r1,r2,r3,kms,ms); {разряд}
Tvidt=(Pe,Vo,Go); {вид туризма}
Tbez=(Bol,Neus); {причина безделия}
Data=record{дата рождения}
D:1..31; {день}
M:1..12; {месяц}
Y:1900..2100 {год}
end;
Sc=record
Fam:String[20]; {фамилия}
Voz:Data; {возраст}
Class:1..12; {класс}
Case Zan:Tzan of
Sport:(Vid:Tvid;Rasr:Trazr);
Turizm:(Vidt:Tvidt;Kat:1..6);
Bez:(Pr:Tbez)
end;
Var
Mas:array[1..10] of Sc;
i,p,k,N:Byte;
{Ввод массива записей с вариантами}
Procedure Vvod;
Begin
Write ('Количество учеников N=');
ReadLn (N);
For i:=1 to N do
With Mas[i] do
Begin
Clrscr;
Write ('Фамилия -->');
ReadLn (Fam);
Write ('Дата рождения -->');
ReadLn (Voz.D,Voz.M,Voz.Y);
Write ('Класс -->');
ReadLn (Class);
WriteLn ('Вид занятий:');
WriteLn ('1 - спорт');
WriteLn ('2 - туризм');
WriteLn ('3 - бездельник');
Readln (k);
Case k of
1: begin
Zan:=Sport;
Writeln ('Вид спорта:');
WriteLn ('1 - легкая атлетика');
WriteLn ('2 - футбол');
WriteLn ('3 - волейбол');
WriteLn ('4 - баскетбол');
Readln (p);
Case p of
1:Vid:=L_a;
2:Vid:=Fut;
3:Vid:=Vol;
4:Vid:=Bas
end;
Writeln ('Разряд:');
Writeln ('1 - первый');
Writeln ('2 - второй');
Writeln ('3 - третий');
Writeln ('4 - кмс');
Writeln ('5 - мс');
ReadLn (p);
Case p of
1:Rasr:=r1;
2:Rasr:=r2;
3:Rasr:=r3;
4:Rasr:=kms;
5:Rasr:=ms
end;
end;
2: begin
Zan:=Turizm;
Writeln ('Вид туризма:');
WriteLn ('1 - пеший');
WriteLn ('2 - водный');
WriteLn ('3 - горный');
Readln (p);
Case p of
1:Vidt:=Pe;
2:Vidt:=Vo;
3:Vidt:=Go
end;
Write ('Категория 1..6 ->');
Readln (Kat);
end;
3: begin
Zan:=Bez;
WriteLn ('Причина неучастия:');
WriteLn ('1 - болеет');
WriteLn ('2 - неуспевает');
Readln (p);
Case p of
1:Pr:=Bol;
2:Pr:=Neus
end;
end;
end;
End
end;
{Вывод массива записей с вариантами}
Procedure Vivod;
Begin
Clrscr;
WriteLn ('Сведения о учениках:');
WriteLn ('Фамилия Дата рождения Класс Вид занятий');
For i:=1 to N do
With Mas[i] do
Begin
Write (Fam:10);
Write (Voz.D:3,Voz.M:4,Voz.Y:5);
Write (Class:6);
Case Zan of
Sport: begin
Write (' спорт :');
Case Vid of
L_a:Write (' легкая атлетика ');
Fut:Write (' футбол ');
Vol:Write (' волейбол ');
Bas:Write (' баскетбол ')
end;
Write (' Разряд:');
Case Rasr of
r1:Write (' первый');
r2:Write (' второй');
r3:Write (' третий');
kms:Write (' кмс');
ms:Write (' мс')
end;
end;
Turizm: begin
Write (' Туризм: ');
Case Vidt of
Pe: Write (' пеший');
Vo: Write (' водный');
Go: Write (' горный')
end;
Write (' Категория ',Kat);
end;
Bez: begin
Write (' Бездельник:');
Case Pr of
Bol: Write (' болеет');
Neus: Write (' неуспевает')
end;
end;
end;
Writeln;
end;
end;
{Основная программа}
Begin
Clrscr;
Vvod;
Vivod;
Repeat Until KeyPressed;
End.
ФАЙЛЫ
Под файлом понимается либо поименованная область внешней памяти персонального компьютера (жесткого диска, гибкой дискеты), либо логическое устройство – потенциальный источник или приемник информации.
Любой файл имеет три характерные особенности:
1. У файла есть имя, что дает возможность программе работать одновременно с несколькими файлами.
2. Файл содержит компоненты одного типа. Типом компонент может быть любой тип, кроме файлов.
3. Длина вновь создаваемого файла никак не оговаривается при его объявлении и ограничивается только емкостью устройств внешней памяти.
Файловый тип или переменную файлового типа можно задать одним из трех способов:
имя_файлового_типа=File of тип_компонент;
имя_файлового_типа =Text;
имя_файлового_типа =File;
которым соответствуют три вида файлов:
· типизированный файл,
· текстовый файл,
· нетипизированный файл.
Дата добавления: 2015-04-15; просмотров: 771;