Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
часть2.doc
Скачиваний:
7
Добавлен:
26.11.2019
Размер:
383 Кб
Скачать

Лабораторная работа № 1 «Строки, записи, множества»

Цель работы:

  • познакомить с понятиями: "строка", "множество", "запись".

  • выработать навыки работы с указанными типами в языке программирования Object Pascal: научиться правильно описывать типы; уметь инициализировать переменные этих типов и выводить их на экран;

  • научиться использовать эти типы при решении задач.

Общие сведения.

Переменные типа String аналогичны массивам типа Char. Их отличием является то, что число символов (длина строки) может динамически меняться в интервале от единицы до заданного верхнего значения.

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

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

Перед выполнением работы необходимо ознакомится с правилами описания и использования переменных типа множество, типизированных констант типа множество, переменных, заданных перечислением, изучить допустимые операции над переменными этих типов [1–7].

Под записью понимается структура данных, объединяющая под одним именем данные различных типов. Записи состоят из фиксированного числа элементов, называемых полями. Поле - это переменная определенного типа. Различные поля могут иметь (в отличие от элементов массива) различный тип. Обращение к элементу записи выполняется с помощью составного имени. Первая часть составного имени - это имя записи, вторая часть - имя поля. Между именем записи и именем поля ставится точка: ZAP.IMP, где ZAP - имя записи, IMP- имя поля.

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

Типовые операции и действия над строками и символами

1: Операция Конкатенация. При выполнении данной операции вторая строка/символ добавляется в конец первой. Например

x := ‘Object’;

y := ‘Pascal’;

z := x + ‘ ’ + y; // z= ‘Object Pascal’

z := y + ‘ ’ + x; // z= ‘Pascal Object’

2. Операция Сравнение. Строки сравниваются посимвольно слева направо с учетом их следования в типе Char. Например,

'abcd' > 'abcD' { 'd' > 'D' }

'abcd' > 'abc' { 'd' > '' }

'abc' < 'axxc' { 'b' < 'x' }

'abcd' = 'abcd'

3. Поиск подстроки в строке. Функция Pos. Например, требуется найти позицию первой буквы 'A' в слове X

N = pos(‘A’, x);

4. Выделение части строки между двумя символами. Функция Copy.

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

N1 := pos(‘ ’, S); //Позиция первого пробела

S[N1] := ‘*’; //заменяем первый пробел на *

N2 := pos(‘ ’, S); // Позиция второго пробела

S1 := copy(S, N1+1,N2–N1-1); //Часть текста между пробелами

5. Вставка текста в строку. Процедура Insert

Например, требуется в строку S вставить после первой точки слово “Истина”

N := pos(‘.’, S); //Позиция первой точки

Insert(‘Истина’, S, N+1); // Вставка в указанную позицию

6. Удаление части строки. Процедура Delete.

Требуется удалить в строке все вхождения слова «Старт»

N := pos(‘Старт’, S); //Позиция первого слова ‘Старт’

While N>0 do

begin

Delete(S, N, Length(‘Старт’)); //Удаление слова

N := pos(‘Старт’, S); //Позиция след. слова ‘Старт’

End;

7. Выделение слов в тексте.

Требуется вывести каждое второе слово текста S в столбик. Слова разделены пробелами.

Read(s); //Ввод исходной строки

S := S + ‘ ’; //Добавление пробела в конец строки, для выделения последнего слова

L := length(S); //Определение длины исходного текста

K := 1; //Позиция первой буквы первого слова

P := 0; //Счетчик количества слов

For i:=1 to L do //Цикл по всем символом текста S

If s[i]= ‘ ’ then //Если найден пробел (позиция I)

Begin

Slovo := copy(S,k,i-k); //выделяем слово с первой буквы слова K до пробела I

Inc(P); //Увеличиваем количество найденных слов

If not Odd(P) then Writeln(Slovo); //если слово четное по порядку, выводим его на экран

K := I + 1;// определяем позицию первой буквы следующего слова (т.е. после пробела)

End;

8. Запись слов текста в массив

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

var S, Slovo, temp: string;

a : array[1..20] of string;

j,i,imin,k,p,l:integer;

begin

writeln('Данная программа упорядочивает текст по возрастанию количества символов в словах');

writeln('Введите строку (не более 20 слов): '); Read(s);

S := S + ' '; //Добавление пробела в конец строки, для выделения последнего слова

L := length(S); //Определение длины исходного текста

K := 1; //Позиция первой буквы первого слова

P := 0; //Счетчик количества слов

For i:=1 to L do //Цикл по всем символом текста S

If s[i]= ' ' then //Если найден пробел (позиция I)

Begin

Slovo := copy(S,k,i-k); //выделяем слово с первой буквы слова K до пробела I

Inc(P); //Увеличиваем количество найденных слов

a[p] :=Slovo; //Запись слова в массив на место p

K := I + 1;// определяем позицию первой буквы следующего слова (т.е. после пробела)

End;

//сортировка массива

for i:=1 to p-1 do // p - количество слов в тексте

begin

imin :=i;

for j:=i+1 to p do

if length(a[j])<length(a[imin]) then imin :=j;

temp := a[i];

a[i]:=a[imin];

a[imin]:=temp;

end;

writeln;

writeln('Отсортированный текст: ');

writeln;

for i:=1 to p do write(a[i],' ');

writeln;

writeln('Press ENTER to Continue!');

readln;

end.

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

Этапы решения задачи:

  1. В задаче требуется сначала разбить строку на слова: то есть организовать поиск всех пробелов строки и выделение текста между ними. Затем в каждом найденном слове проверить наличие удвоенной «н». Если она встречается в слове, то выдать его на экран.

  2. Программа

program example1;

var st, slovo:string;

i,k,p,L: integer;

flag: boolean;

begin

writeln('Введите текст'); readln(st);//исходная строка

St := St + ‘ ’;

Flag := 0;//признак того, есть ли в тексте слова с «нн»

L := length(St);

K := 1;

For i:=1 to L do

If st[i]= ‘ ’ then

Begin

Slovo := copy(St,k,i-k); //выделяем слово

If pos(‘нн’,Slovo)<>0 then //проверка есть ли в слове «нн»

Begin

Writeln(Slovo);

Flag := 1;

End;

K := I + 1;// определяем позицию первой буквы следующего слова (т.е. после пробела)

End;

If Flag = 0 then Write(‘Таких слов нет’);

readln;

end.

Пример 2. Проверить сколько раз каждое слово встречается в тексте.

Этапы решения задачи

  1. Алгоритм поиска числа повторений каждого слова фразы строится следующим образом: вначале выделяется первое слово фразы, затем запускается новый цикл по тексту, в котором поочередно выделяются все слова и сравниваются с первым словом. В случае совпадения увеличивается на 1 счетчик повторений искомого слова. Затем выделяется второе слово и все повторяется и т.д.

  2. Программа

program example1;

var st, slovo, slovo2:string;

I,j,k,k1,L,p: integer;

begin

writeln('Введите текст'); readln(st);//исходная строка

St := St + ‘ ’;

Flag := 0;//признак того, есть ли в тексте слова с «нн»

L := length(St);

K := 1;

For i:=1 to L do

If st[i]= ‘ ’ then

Begin

Slovo := copy(St,k,i-k); //выделяем слово

P:=0; //Число повторений слова Slovo

K1 := 1;

For j:=1 to length(st) do

If st[j] = ‘ ’ then

Begin

Slovo2 := copy(St, k1 ,j-k1);

If Slovo = Slovo2 then inc(p);

K1:=j+1;

End;

Writeln(‘Слово - ’, Slovo, ‘встретилось ’,p, ‘ раз’);

K := I + 1;// определяем позицию первой буквы следующего слова (т.е. после пробела)

End;

Write(‘Нажмите Enter для выхода из программы!’);

readln;

end.

Тип-запись и тип-множество

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

Все это справедливо для всех структурированных типов. Но при этом каждый из них имеет ряд особенностей. Рассмотрим их на примерах.

Пример 3. В структуре запись имеется информация о видеофильмах: название, режиссер, исполнитель главной роли, жанр, продолжительность. Требуется составить сводку по фильмам Спилберга, продолжительностью 100 мин.

Этапы решения задачи

  1. Прежде всего, необходимо создать тип, описывающий заданную предметную область (в нашем примере – это кинофильмы). Затем описать массив из элементов созданного типа. После этого организовать ввод данных в массив, учитывая, что доступ к полям записи осуществляется через точку (например, Films[i].Title – поле Title i-го элемента массива Films). Далее запустить цикл по всем элементам массива, сравнить значение полей элементов с заданными условиями и в случае совпадений – вывести на экран.

  2. Программа

Program Examlpe3;

type

TFilms = record

Title : string; // Название картины

Director : string; // Режиссер

Artist : string; // Исп. гл. роли

Genre : string; // Жанр

Duration : word; // Продолжительность

end;

var Films: array[1..20] of TFilms;

i,n:integer;

flag : boolean;

begin

write('Введите кол-во фильмов n,n<20: '); Readln(n);

//Ввод данных фильмотеки

for i:=1 to n do

begin

writeln('Film ',i);

write('Название : '); readln(Films[i].Title);

write('Режиссер : '); readln(Films[i].Director);

write('Исп.гл.роли : '); readln(Films[i].Artist);

write('Жанр : '); readln(Films[i].Genre);

write('Продолжительность : '); readln(Films[i].Duration);

writeln;

end;

Flag :=False;

//Поиск по заданным критериям

for i:=1 to n do

with Films[i] do //альтернативный доступ к полям записи

begin

if (Director = 'Spilberg') and (Duration = 100)

then begin

writeln(Title,' ',Artist, ' ', Genre);

Flag :=True;

end;

end;

if not Flag then writeln('Нет таких фильмов!');

writeln;

writeln('Press ENTER to Continue!');

readln;

end.

Пример 4. Дан текст из слов, разделенных пробелом. Вывести все гласные буквы в алфавитном порядке, входящие в каждое нечетное слово.

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

Этапы решения задачи

  1. Начальные действия: выделить все слова текста и записать их в массив. Затем описать множество всех гласных букв. После чего запустить цикл по всем буквам и для каждой гласной буквы проверить входит ли она в каждое нечетное слово (то есть слово с нечетным порядковым номером). Если да, то выводить букву на экран. Примечание, в данной задаче требуется ввести переменную-признак, определяющую, что буква входит в каждое нечетное слово фразы и проверять отсутствие буквы в указанных словах.

  2. Программа

Program Example4;

var S, Slovo: string;//исходная строка и слово фразы

a : array[1..20] of string;//массив из слов текста

k : integer; //позиция первой буквы слова

L : integer; //длина исходного текста

P : integer; //количество слов в тексте

i : integer; //вспомогательная переменная

glas : set of char; //множество всех символов

c : char;

Flag : boolean; //признак: TRUE – если гласная входит в каждое нечетное слово

begin

writeln('Данная программа выводит все гласные, входящие в каждое нечетное слово фразы');

writeln('Введите строку (не более 20 слов): '); Read(s);

S := S + ' '; //Добавление пробела в конец строки, для выделения последнего слова

L := length(S); //Определение длины исходного текста

K := 1; //Позиция первой буквы первого слова

P := 0; //Счетчик количества слов

//======Выделение слов и запись их в массив=========

For i:=1 to L do //Цикл по всем символом текста S

If s[i]= ' ' then //Если найден пробел (позиция I)

Begin

Slovo := copy(S,k,i-k); //выделяем слово с первой буквы слова K до пробела I

Inc(P); //Увеличиваем количество найденных слов

a[p] :=Slovo; //Запись слова в массив на место p

K := I + 1;// определяем позицию первой буквы следующего слова (т.е. после пробела)

End;

//===Определение гласных, входящих в каждое нечетное слово==

gl := ['a','e','u','i','o','A','O','E','U','I'];

for c:='A' to 'z' do //цикл по всем символам

if c in gl then //если текущий символ - гласная буква

begin

Flag := True;

for i:=1 to p do //цикл по всем словам текста

//условие: если позиция i нечетная и

// символ c не входит в слово a[i]

if odd(i) and not (c in a[i]) then Flag :=False;

if Flag then writeln(c);

end;

writeln; writeln('Press ENTER to Continue!');

readln;

end.