78179

Разработка программ обработки строк, множеств и записей

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

Информатика, кибернетика и программирование

Количество символов в строке длина строки может динамически изменяться от 0 до 255. Для определения данных строкового типа используется идентификатор String за которым следует заключенное в квадратные скобки значение максимально допустимой длины строки данного типа. Если это значение не указывается то по умолчанию длина строки равна 255 байт. Формат описания строкового типа Type имя типа...

Русский

2015-02-07

192 KB

0 чел.

Тема: Разработка программ обработки строк, множеств и записей.

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

Время выполнения: 2 часа

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

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

  1.  Изучить теоретические  сведения.
  2.  Выполнить программу DemoString, Change_Letter, Demo_Val_Str, Perev_Word, Katalog, Katalog_Library, Input_Mno и Glasn_Sogl.
  3.  Получить индивидуальное задание  у преподавателя и разработать программу в соответствии с поставленной задачей.
  4.  Отлаженную, работающую программу сдать преподавателю. Работу программы показать с помощью самостоятельно разработанных тестов.

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

Строка — это последовательность символов кодовой таблицы персонального компьютера. При использовании в выражениях строка заключается в апострофы. Количество символов в строке (длина строки) может динамически изменяться от 0 до 255. Для определения данных строкового типа используется идентификатор String, за которым следует заключенное в квадратные скобки значение максимально допустимой длины строки данного типа. Если это значение не указывается, то по умолчанию длина строки равна 255 байт.

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

Недопустимо применение строковых переменных в качестве селектора в операторе Case.

Формат описания строкового типа

Type <имя типа> =String [максимальная длина строки];

Var <идентификатор, . . . > : <имя типа>;

Переменную типа String можно задать и без описания типа:

Var <идентификатор, . . . > : String [максимальная длина строки];

Фрагмент описания строковых данных

Const

Address = 'Партизанский пр., 2'; {Строковая константа}

Type

Flot = string[125];

Var

Fstr : Flot;              {Описание с заданием типа)

St1 : String;            {По умолчанию длина строки St1= 255}

St2, St3 : string[50] ;

Nazv    : string[280];    (Ошибка, длина строки Nazv превышает 255}

Строка в языке Турбо Паскаль трактуется как цепочка символов. (Для строки из N символов отводится N+1 байт; N байт-для хранения символов строки, а один байт — для значения текущей длины строки).

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

0

1

2

3

N+1

N

  текущая длина строки

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

Например, для размещения в памяти переменных Fstr, St1, St2 требуется соответственно 126, 35 и 51 байт (см. приведенный выше пример).

Рассмотрим структуру размещения строки в памяти на следующем примере. Пусть М — максимальная длина строки, L — текущая длина, А — ячейка памяти.

Тогда:

А   — содержит величину текущей длины;

А+1 — первый символ строки;

A+L — последний значащий символ;

A+L+1

…     — незанятые ячейки памяти

А+М

Пример программы работы со стандартными строковыми процедурами и функциями

Program DemoString;

Uses Crt;

Var Stroka:String[80];

Str1,Str2,Str3:String[20];

Search_Str:String[20];

Poz:byte;

Begin

Stroka:='ПРИВЕТ';

Writeln(Stroka);

Str1:=Copy(Stroka,2,3);

Writeln(Str1);

Writeln('Слово ПРИВЕТ состоит из',Length(Stroka):3,' букв');

Delete(Stroka,2,3);

Writeln(Stroka);

writeln;

Str2:='Строка  - ';

Stroka:='Это текст!';

Writeln('Новая строка: ', Stroka);

Insert(Str2,Stroka,1);

Writeln(Stroka);

Repeat Until KeyPressed;

End.

Выражения, в которых операндами служат строковые данные, называются строковыми выражениями. Они состоят из строковых констант, переменных, указателей функций и знаков операций. Над строковыми данными допустимы операция сцепления и операции отношения.

Операция сцепления (+) применяется для сцепления нескольких строк в одну результирующую строку.

Например:

Выражение
'А'+'Т'+'  '+ '386'
'Турбо '+'Паскаль '+ '7.0'

Результат
AT 386
Турбо Паскаль 7.0

Следует учитывать, что в операциях сцепления длина результирующей строки не должна превышать 255.

Операции отношения (=, <>, >, <, >=, <=) проводят сравнение двух строковых операндов и имеют приоритет более низкий, чем операция сцепления, т. е. вначале всегда выполняются все операции сцепления, если они присутствуют, и лишь потом реализуются операции отношения. Сравнение строк производится слева направо до первого несовпадающего символа, и та строка считается больше, в которой первый несовпадающий символ имеет больший номер в стандартной таблице обмена информацией. Результат выполнения операций отношения над строковыми операндами всегда имеет булевский тип и принимает значение True, если выражение истинно, и False, если выражение ложно. Например:

Выражение
'MS-DOS'<'MS-Dos'
'programm' >'programm'

Результат
True

True

Если строки имеют различную длину, но в общей части символы совпадают, считается, что более короткая строка меньше, чем более длинная. Строки считаются равными, если они полностью совпадают по длине и содержат одни и те же символы.

Для присваивания строковой переменной результата строкового выражения используется оператор присваивания «:=».

Пример1.

Strl := 'Группа, учащихся';

Str2 := Strl + ' школы-лицея ' ;

Fio := 'Бочаров А.А.';

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

Например:

Описание А          Выражение          Значение А

 A: String[6]      А := 'ГРУППА 1';      ГРУППА

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

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

Например, выражения Str2[1+2] и Str2[6] обеспечат доступ к третьему('у') и шестому ('а') символам последнего значения переменной Str2 в приведенном выше примере (см. пример 1).

Запись Str2[0] дает доступ к нулевому байту, содержащему значение текущей длины строки. Значение нулевого байта не должно превышать 255, но нарушение этого правила не вызывает программного прерывания, так как директива компилятора R по умолчанию находится в пассивном состоянии {$R-}. Для обеспечения строгого контроля за диапазоном допустимых значений индекса следует перевести директиву R в активное состояние {$R+}. В этом случае компилятор активизирует дополнительные команды для проверки правильности диапазона. Обычно активный режим R устанавливается на стадии отладки программ.

Примеры программ работы со строковыми переменными

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

В реализации данной программы разработаем процедуру ChangeChar, в которой будем просматривать строку с целью поиска позиции буквы "а". Это можно организовать с помощью цикла, используя while и стандартную функцию Pos('a', S). Как только функция Pos обнаруживает первое появление в строке S подстроки "а", она возвращает результат — номер позиции буквы "а". Счетчик найденных букв "а" увеличивается на единицу, а в эту позицию вписывается буква "б" и т. д., пока в строке есть буквы "а".

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

program Change_Letter; {Подсчет и замена букв "а" на "б"} 

Var S: String;

procedure ChangeChar(var S: string); {Процедура замены буквы "а" на "б"}

Var N : byte;

begin

N:=0;    {Обнуление числа букв "а"} 

While PoS('a', S) > 0 do {Если найдена буква "а", то}

begin

N:=N+1;    {Увеличить счетчик букв "а" на 1} 

S[Pos('a', S)] := 'б'; {Записать в позицию буквы "а" букву "б"}

end;

Writeln ('В слове было  ',N, ' букв "а" ');

end ;

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

Write('Введите исходную строку: ');

Readin (S);

ChangeChar(S);   {Вызов процедуры замены "а" на "б"} 

Writeln('Получилась строка ', S);

end.

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

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

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

Для передачи данных между процедурой и основной программой введем формальные параметры-переменные S типа String и Х типа Integer. Для преобразования введенной строки в число применим стандартную функцию Val, а для анализа операции преобразования строки в число введем локальную переменную Cod целого типа. После преобразования строки в число проверим значение переменной Cod, если оно не равно 0, то в строке не все символы являются цифрами. Значение Cod укажет позицию первого символа в строке, не являющегося цифрой. В этом случае напечатаем на экране сообщение об ошибке и. укажем позицию неверно введенного символа в строке, после чего прервем работу программы, используя стандартную процедуру Halt.

Получим следующий текст программы:

program Demo_Val_Str;

Var       Sl, S2 : String;

X1, X2 : Integer;

(Процедура ввода строки цифр и преобразования строки в число}

procedure Inp_Str (var S: string; var X:integer);

Var     Cod: Integer; {Результат преобразования строки в число} 

begin

Write('Введите строку цифр');

Readln(S) ;

Val(S, X, Cod) ;{Преобразование строки S в целое число X}

if Cod <> 0 then {Если не все символы в строке являются цифрами}

begin

WriteLn('Ошибка! В позиции ',Cod,' введенной строки не цифра');

Halt(1);   {Прерывание программы} 

end ;

end;

Begin            {Начало основной программы}

Inp_Str(Sl,Xl); {Вызов процедуры ввода строки с фактическими параметрами-переменными S1,X1}

Inp_Str(S2,X2); {Вызов процедуры ввода строки с фактическими параметрами-переменными S2,X2}

Writeln('Результат склеивания строк -> ', Concat(Sl,S2));

Writeln('Сумма введенных чисел =  ',Х1+Х2) ;

end.

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

Как видно из определения, для выяснения, является ли слово перевертышем, необходимо сравнивать 1-й и последний символ в строке, 2-й и предпоследний, и т. д. до середины слова. Если в процессе сравнения будет установлено отличие сравниваемых символов, значит это слово не является перевертышем. Если в процессе сравнения не будет выявлено отличие сравниваемых символов, значит это слово — перевертыш.

Введем следующие переменные: для хранения слов — Words типа String с максимальным размером слов 30 символов и переменную I целого типа, указывающую номер позиции сравниваемого символа от начала строки.

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

program Perev_Word; {Является ли введенное слово перевертышем?}

Var

I : byte;

Words : string[30];

Begin

Write('Введите слово ');

Readln(Words) ;

{Проверяем символы поочередно от начала до середины слова}

for I:=1 to Trunc (Length (Words)/ 2) do

begin

{Если соответствующие символы не одинаковы}

if Words[I]<>Words[Length(Words)-I+1] then

begin

Writein (' Неперевертыш') ;

exit   {Выход из цикла и завершение программы, дальше не имеет смысла сравнивать }

end;

end;

Writeln ('  Перевертыш');

end.

Пример 4. Составить программу, которая обращает введенное слово, т. е. переставляет символы в слове в обратном порядке, например, Петя — ятеП, мама — амам, программа — аммаргорп.

Алгоритм обращения слова можно представить в виде следующей циклической процедуры обмена соответствующих символов: значение первого символа слова запоминается в некоторой переменной символьного типа Ch, затем на место первого символа записывается значение последнего символа, а на его место записывается значение первого символа, хранимое в переменной Ch, после этого аналогично выполняется обмен второго и предпоследнего символа, третьего и предпредпоследнего и т. д., пока не дойдем до середины слова. Далее обмен продолжать не нужно, иначе символы опять займут прежние места.

Введем следующие переменные: для хранения слова Word типа String с максимальным размером слов 30 символов и переменную I целого типа, указывающую номер позиции сравниваемого символа от начала строки, а также символьную переменную Ch для временного хранения значения символа при обмене.

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

program Obr_Word;

Var

I : byte;

Ch : char;

Word : String[30] ;

Begin

Write(' Введите слово ');

Readln(Word);

{Перебирая символы поочередно от начала до середины слова}

for I:=l to Trunc(Length (Word)/2) do

begin   {Обмениваем соответствующие символы} 

Ch:=Word[I];

Word[I]:=Word[Length(Word)-I+1] ;

Word[Length(Word)-I+1]:=Ch ;

end ;

 Write('Получилось слово  ',Word) ;

end.

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

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

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

Запись – это структурированный тип данных, состоящий из фиксированного числа компонентов, называемых полями записи. Определение типа записи начинается идентификатором 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:=1645361;

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:=1645361;

Marka:=’BMW-6’;

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

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

End;

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

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

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.

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

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

Вариантная часть формируется с помощью оператора 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.

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

  •  все имена полей должны отличаться друг от друга, по крайней мере, одним символом, даже если они встречаются в разных вариантах
  •  запись может иметь только одну вариантную часть, причем вариантная часть должна размещаться в конце записи
  •  если поле, соответствующее какой-либо метке, является пустым, то оно записывается следующим образом: <метка>: ();

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

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

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

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..2100);

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], [‘a’,’b’,’c’], [‘a’..’z’]. Если множество не имеет элементов, оно называется пустым и обозначается, как [ ]. Количество элементов множества называется его мощностью.

Формат записи множественных типов:

Type  <имя типа> = set of <элемент 1,…., элементN>;

Var <идентификатор, ….> :  <имя типа>;

Можно задать множественный тип и без предварительного описания:

Var <идентификатор, …> :  set of <элемент1, …>;

Пример:

Type    Simply  = set of  ‘a’ ..’h’;

Number = set of  1..31;

Var   Pr : Simply;

N : Number;

Letter : set of char; {определение множества без предварительного описания в разделе типов}

В данном примере  переменная Pr может принимать значения символов латинского алфавита от ‘a’  до  ‘h’; N – любое значение в диапазоне 1..31; Letter – любой символ. Попытка присвоить другие значения вызовет программное прерывание.

Количество элементов множества не должно превышать 256, соответственно номера значений базового типа должны находиться в диапазоне 0..255. Контроль диапазонов осуществляется включением директивы {$R+}. Объем памяти, занимаемый одним элементом множества, составляет 1 бит.

Объем памяти для переменной типа множество вычисляется по формуле:

Объем памяти = (Max DIV 8) – (Min DIV 8) + 1,

где Max и Min – верхняя и нижняя границы базового типа.

Операции над множествами

При работе с множествами допускается использование операций отношения “=”, “<>”,  “>=”,  “<=”, объединения, пересечения, разности множеств и операции in. Результатом выражения с применением этих операций является значение True или False.

Операция “равно” (=). Два множества А и В считаются равными, если состоят из одних и тех же элементов. Порядок следования элементов в сравниваемых множествах значения не имеет.

Значение А

Значение В

Выражение

Результат

[1,2,3,4]

[‘a’, ’b’, ’c’]

[‘a’..’z’]

[1,2,3,4]

[‘c’, ‘a’]

[‘z’..’a’]

A=B

A=B

A=B

True

False

True

Операция “не равно” (<>). Два множества А и В считаются не равными, если они отличаются по мощности или по значению хотя бы одного элемента.

 

Значение А

Значение В

Выражение

Результат

[1,2,3]

[‘a’..’z’]

[‘c’..’t’]

[3,1,2,4]

[‘b’.. ‘z’]

[‘t’..’c’]

A<>B

A<>B

A<>B

True

True

False

 Операция “больше или равно” (>=). Операция “больше или равно” (>=) используется для определения принадлежности множеств. Результат операции А >=В равен True, если все элементы множества В содержаться в множестве А. В противном случае результат равен False.

Значение А

Значение В

Выражение

Результат

[1,2,3,4]

[‘a’..’z’]

[‘z’,’x’,’c’]

[2,3,4]

[‘b’.. ‘t’]

[‘c’,’x’]

A>=B

A>=B

A>=B

True

True

True

Операция “меньше или равно” (<=). Эта операция используется аналогично предыдущей операции, но результат выражения А<=В равен True, если все элементы множества А содержаться во множестве В. В противном случае результат равен False.

Значение А

Значение В

Выражение

Результат

[1,2,3]

[‘d’..’h’]

[‘a’,’v’]

[1,2,3,4]

[‘z’.. ‘a’]

[‘a’,’n’,’v’]

A<=B

A<=B

A<=B

True

True

True

Операция in. Операция in используется для проверки принадлежности какого-либо значения указанному множеству. Обычно применяется в условных операторах.

Значение А

Значение В

Результат

2

v

X1

if A in [1,2,3] then..

if A in [‘a’..’n’] then..

if A in [X0,X1,X2,X3] then..

True

True

True

При использовании операции in проверяемое на принадлежность значение  и множество в квадратных скобках не обязательно предварительно описывать в разделе описаний. Операция in позволяет эффективно и наглядно производить сложные проверки условий, заменяя иногда десятки других операций. Например, выражение if (a=1) or (a=2) or (a=3) or (a=4) or (a=5) or (a=6) then…можно заменить более коротким выражением if a in [1..6] then… .

Часто операцию in пытаются записать с отрицанием: X NOT in M. Такая запись является ошибочной, так как две операции следуют подряд; правильная инструкция имеет вид:  
NOT (X in M). 

Объединение множеств (+). Объединением двух множеств является третье множество, содержащее элементы обоих множеств.

Значение А

Значение В

Выражение

Результат

[1,2,3]

[‘A’..’D’]

[]

[1,4,5]

[‘E’.. ‘Z’]

[]

A+B

A+B

A+B

[1,2,3,4,5]

[‘A’..’Z’]

[]

Пересечение множеств (*). Пересечением  двух множеств является третье множество, которое содержит элементы, входящие одновременно в оба множества.

Значение А

Значение В

Выражение

Результат

[1,2,3]

[‘A’..’Z’]

[]

[1,4,2,5]

[‘B’.. ‘R’]

[]

A*B

A*B

A*B

[1,2]

[‘B’..’R’]

[]

Разность множеств (-). Разностью двух множеств является третье множество, которое содержит элементы первого множества, не входящие во второе множество.

Например:

Значение А

Значение В

Выражение

Результат

[1,2,3,4]

[‘A’..’Z’]

[X1,X2,X3,X4]]

[3,4,1]

[‘D’.. ‘Z’]

[X4,X1]

A-B

A-B

A-B

[2]

[‘A’..’C’]

[X2,X3]

Результат операций рад двумя множествами можно наглядно представить с помощью закрашенных частей двух кружочков:

   Объединение                             Пересечение                            Разность

Использование в программе данных типа set дает ряд преимуществ: значительно упрощаются сложные операторы if , увеличивается степень наглядности программы и понимания алгоритма решения задачи, экономится память, время компиляции и выполнения.

Program Dem_Mno;   {демонстрация операций над множествами}

Type

    Digits=set of 0..9;

Var

    D1, D2, D3, D:Digits;

Begin

D1:=[2,4,6,8];       {заполнение множеств}

D2:=[0..3,5];

D3:=[1,3,5,7,9];

D:=D1+D2;      {объединение множеств D1 и D2}

D:=D+D3;          {объединение множеств D и D3 }

D:=D-D2;           {разность множеств D и D2 }

D:=D*D1;          {пересечение множеств D и D1}

end.

Как видно из текста программы, сначала описан тип Digits=set of 0..9, затем описаны переменные D1,D2,D3,D этого типа.

Пример 2. Описать множество М (1..50) и сделать его пустым. Вводя целые числа с клавиатуры, заполнить множество 10 элементами.

Program Input_Mno;

Var  M:set of 1..50;

X,I:integer;

Begin

M:= [ ];         {М – пустое множество}

for I:=1 to 10 do

begin

write(‘введите ‘, I, ‘ –й элемент множества: ‘);

readln (X);

if (X in M) then    {если введенное число входит в множество М}

begin

writeln(X,’ помещен в множество 1..50’);

M:=M+[X];

end;

end;

writeln;

end.

В разделе описания переменных описано множество целых чисел от 1 до 50, переменная Х целого типа, которая используется для считывания числа-кандидата в множество, и целая переменная I, используемая для подсчета количества введенных чисел. В начале программы применена операция инициализации множества М, так как оно не имеет элементов и является пустым: M:= [ ];

Заполнение множества элементами производится с использованием оператора повтора for, параметр которого I будет указывать порядковый номер вводимого элемента. Операция заполнения множества записывается оператором присваивания M:=M+[X];

Контроль заполнения множества записан операцией проверки принадлежности in. Если условие X in M выполняется, выводится сообщение о том, что число Х помещено во множество.

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

Зададим тип Letters –множество букв русского языка, затем опишем переменные этого типа: Glasn - множество гласных букв, Sogl - множество согласных букв. Вводимое с клавиатуры предложение опишем переменной Text типа String. Для указания символа в строке Text применим переменную I типа Byte.Для подсчета количества гласных и согласных букв опишем переменные G и S. Проверку принадлежности символов, составляющих предложение множествам гласных или согласных букв русского языка, запишем с использованием цикла for , параметр I которого, изменяясь от 1 до значения длины предложения, будет указывать порядковый номер символа в предложении. Принадлежность очередного символа предложения множеству гласных или согласных букв запишем операцией in. Если символ является гласной буквой (Text[I] in Glasn), то счетчик гласных букв G увеличивается на 1. Аналогично с согласными буквами. Текст программы может выглядеть так:

Program Glasn_Sogl;

Type Letters=set of ‘A’..’я’;

Var   Glasn, Sogl:Letters;

Text:String;

I:Byte;

G,S:Byte;

Begin

Glasn:=[‘A’,’a’, ‘Е’,’е’,’И’,’и’,’О’,’о’,’У’,’у’,’Э’,’Ю’,’ю’, ‘Я’,’я’];

Sogl:=[‘Б’..’Д’,’б’..’д’,’Ж’,’ж’,’З’,’з’,’К’..’Н’,’к’..’н’,’П’..’Т’,’п’..’т’,’Ф’..’Щ’,’ ‘ф’..’щ’,’Ъ’,’ъ’,’Ь’,’ь’];

Write(‘Введите предложение ’);

Readln(Text);

G:=0;

S:=0;

For I:=1 to Length(Text) do

Begin

If Text[I] in Glasn then G:=G+1;

If Text[I] in Sogl then S:=S+1;

End;

Writeln(‘В предложении  ’,Text,’ ‘,G,’ гласных и ‘,S,’согласных букв’);

End.

Индивидуальные задания:

При составлении программы использовать стандартные процедуры и строки

1.  Дана строка. Подсчитать количество содержащихся в ней цифр, прописных букв и строчных букв.

2.  Дана строка. Преобразовать все строчные буквы в прописные и наоборот.

3.  Дана строка. Если она представляет собой запись целого числа, то вывести 1; если вещественного (с дробной частью), то вывести 2; если строку нельзя преобразовать в число, то вывести 0.

4.  Дано целое число. Создать массив символов, содержащий цифры этого числа в обратном порядке.

5.  Дана строка S, изображающая вещественное число в формате с плавающей точкой, и целое число N (> 0). Вывести набор символов, изображающих первые N цифр дробной части этого вещественного числа (без округления).

6.  Дана строка, изображающая двоичную запись целого числа. Вывести строку, изображающую десятичную запись этого же числа.

7.  Дана строка, изображающая целое число. Вывести сумму цифр этого числа.

8.  Дана строка S и число N. Преобразовать строку S в строку длины N следующим образом: если длина строки S больше N, то отбросить первые символы, если длина строки S меньше N, то в ее начало добавить символы "." (точка).

9.  Даны два числа: N1 и N2, и две строки: S1 и S2. Получить из этих строк новую строку, объединив N1 первых символов строки S1 и N2 последних символов строки S2.

10.  Даны две строки: S1 и S2. Проверить, содержится ли строка S2 в строке S1. Если да, то вывести номер позиции, начиная с которой S2 содержится в S1, если нет, то вывести 0.

11.  Даны две строки: S1 и S2. Определить количество вхождений строки S2 в строку S1.

12.  Дана строка S и символ C. Удвоить каждое вхождение символа C в строку S.

13.  Даны строки S1, S2 и символ C. После каждого вхождения символа C в строку S1 вставить строку S2.

14.  Даны две строки: S1 и S2. Удалить из строки S1 все подстроки, совпадающие с S2. Если таких подстрок нет, то вывести S1 без изменений.

15.  Даны три строки: S1, S2, S3. Заменить в строке S1 все вхождения строки S2 на S3.

16.  Дана строка. Вывести подстроку, расположенную между первой и второй точками исходной строки. Если в строке менее двух точек, то вывести всю исходную строку.

17.  Дана строка, состоящая из латинских слов, разделенных пробелами. Определить количество слов в строке.

18.  Дана строка, состоящая из латинских слов, разделенных пробелами. Определить количество слов, которые начинаются и заканчиваются одной и той же буквой (содержат хотя бы одну букву "w").

19.  Дана строка, состоящая из латинских слов, разделенных пробелами. Определить количество слов, которые содержат ровно три буквы "о".

20.  Дана строка, состоящая из латинских слов, разделенных пробелами. Определить длину самого короткого слова.

21.  Дана строка, состоящая из латинских слов, разделенных пробелами. Вывести строку, содержащую эти же слова, но разделенные одним символом "." (точка). В конце точку не ставить.

22.  Дана строка, состоящая из латинских слов, разделенных пробелами. Вывести строку, содержащую эти же слова, разделенные одним пробелом, но расположенные в обратном порядке.

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

24.  Дана строка, состоящая из латинских слов, разделенных пробелами. Вывести строку, содержащую эти же слова,(разделенные одним пробелом, но расположенные в алфавитном порядке.

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

26.  Дана строка-предложение на латинском языке. Подсчитать количество содержащихся в строке знаков препинания.

27.  Дана строка-предложение на латинском языке. Вывести самое короткое слово в предложении. Если таких слов несколько, то вывести первое из них.

28.  Дана строка-предложение, содержащая избыточные пробелы. Преобразовать ее так, чтобы между словами был ровно один пробел.

29.  Дана строка, содержащая полное имя файла, то есть имя диска, список каталогов (путь), собственно имя и расширение. Выделить из этой строки имя и расширение файла.

30.  Дана строка, содержащая полное имя файла. Выделить из строки название последнего каталога (без символов "\"). Если файл содержится в корневом каталоге, то вывести символ "\" вместо названия каталога.

7


 

А также другие работы, которые могут Вас заинтересовать

69003. P-n перехід у стані рівноваги. Утворення електронно-діркового переходу 342.5 KB
  Розглянемо напівпровідник н п який має дві прилеглих області: одна з провідністю nтипу друга – pтипу. Оскільки концентрація дірок у дірковій області pp напівпровідника вище ніж в електронній pn а концентрація електронів у електронній області nn вище ніж у дірковій np між областями буде існувати...
69004. ФІЗИЧНІ ПРОЦЕСИ В р-n ПЕРЕХОДІ ПРИ ДІЇ ЗОВНІШНЬОЇ ЕЛЕКТРИЧНОЇ НАПРУГИ 105.5 KB
  Оскільки концентрація рухомих носіїв заряду в рп переході менша ніж в областях п та р напівпровідника опір рп переходу буде більший ніж опір області п та р тому можна вважати що вся напруга прикладається до рп переходу При дії зовнішньої напруги порушується рівновага між дифузійним і дрейфовим струмами в рп переході...
69005. Фізичні процеси в біполярних транзисторах з декількома p-n переходами 308 KB
  Для забезпечення інжекції вприскування дірок з емітера в базу необхідна пряма емітерна напруга. Це відбувається тому що товщина бази W значно менше дифузійної довжини вільного пробігу дірок LP. Колекторна напруга вибирається зворотною UК тому виникає екстракція втягування дірок із бази...
69006. БУДОВА, ПРИНЦИП РОБОТИ ТА СТАТИЧНІ ХАРАКТЕРИСТИКИ ПОЛЬОВОГО ТРАНЗИСТОРА З ІНДУКОВАНИМ КАНАЛОМ 141.5 KB
  При відсутності напруги UЗВ і за наявності напруги UСВ опір між стоком і витоком що визначається двома підключеними назустріч рn переходами великий а струм ІС дуже малий 109. З подачею напруги UЗВ 0 в напівпровіднику виникає електричне поле яке вилучає електрони поверхневого шару підложки...
69007. Параметри біполярного транзистора 364.5 KB
  Для оцінки можливостей застосування транзисторів використовують їх параметри. Параметри транзисторів це числа. Числені значення параметри можуть бути виміряні знайдені за статичними характеристиками або розраховані.
69008. Електронні структури з p-n одним переходом 297 KB
  Для отримання великої площі р n переходу використовують сплавну дифузійну і планарну технологію для малої площі точкову. Ємності р n переходу. Варікапи Поняття ємності переходу пов’язане з нагромадженням об’ємних зарядів. S площа переходу Рис.
69009. Відомості про електронні прилади апаратури телекомунікацій. Класифікація електронних приладів 113 KB
  До елементів РЕА які найчастіше зустрічаються відносять радіодеталі. Розглянемо основні показники якості електронних елементів. Параметри це величини які характеризують електричні властивості елементів та їх здатність протистояти дії середовища.
69010. Біполярні напівпровідникові структури з одним п/н переходом 211.5 KB
  Сили притягання протонів ядра атома та електронів орбіти урівноважуються силами їх відштовхування. Отже для існування ковалентного зв’язку необхідна пара валентних електронів спільних для двох сусідніх атомів. Однак енергетичні зовнішні впливи на н п призводять до відриву деяких валентних...
69011. Организация строительства жилого дома со встроенными помещениями на Московском проспекте 1.54 MB
  Разработка технологических карт на сложные виды работ, а именно монолитные работы и работы по устройству вентилируемого фасада здания; разработка календарного плана строительства дома на основе расчета нескольких вариантов организации строительства, их сравнения и выбора наилучшего; проектирование строительного генерального плана объекта; разработка комплекса мероприятий по безопасному производству работ...