- •Часть II
- •Содержание
- •Общие указания к выполнению лабораторных работ
- •Лабораторная работа № 1 «Строки, записи, множества»
- •Общие сведения.
- •Задания
- •Контрольные вопросы
- •Лабораторная работа № 2 «Процедуры и функции»
- •Общие сведения
- •Задания
- •Контрольные вопросы
- •Лабораторная работа № 3 «Файлы»
- •Общие сведения
- •Задания
- •Контрольные вопросы
- •Лабораторная работа № 4 «Динамические структуры данных»
- •Общие сведения
- •Задания
- •Контрольные вопросы
- •Список рекомендуемой литературы
- •Приложение
- •3.3. Спецификация подпрограмм:
- •Вывод элементов массива в начальном расположении
- •Отсутствуют
- •Процедура
- •Текст программы:
- •Контрольный пример:
Лабораторная работа № 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. Дан текст, слова в котором разделены пробелами. Требуется напечатать все слова с удвоенной буквой "н".
Этапы решения задачи:
В задаче требуется сначала разбить строку на слова: то есть организовать поиск всех пробелов строки и выделение текста между ними. Затем в каждом найденном слове проверить наличие удвоенной «н». Если она встречается в слове, то выдать его на экран.
Программа
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 счетчик повторений искомого слова. Затем выделяется второе слово и все повторяется и т.д.
Программа
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 мин.
Этапы решения задачи
Прежде всего, необходимо создать тип, описывающий заданную предметную область (в нашем примере – это кинофильмы). Затем описать массив из элементов созданного типа. После этого организовать ввод данных в массив, учитывая, что доступ к полям записи осуществляется через точку (например, Films[i].Title – поле Title i-го элемента массива Films). Далее запустить цикл по всем элементам массива, сравнить значение полей элементов с заданными условиями и в случае совпадений – вывести на экран.
Программа
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. Дан текст из слов, разделенных пробелом. Вывести все гласные буквы в алфавитном порядке, входящие в каждое нечетное слово.
Для решения данной задачи можно использовать как строковые процедуры и функции, так и множества. Рассмотрим применение множеств для решения.
Этапы решения задачи
Начальные действия: выделить все слова текста и записать их в массив. Затем описать множество всех гласных букв. После чего запустить цикл по всем буквам и для каждой гласной буквы проверить входит ли она в каждое нечетное слово (то есть слово с нечетным порядковым номером). Если да, то выводить букву на экран. Примечание, в данной задаче требуется ввести переменную-признак, определяющую, что буква входит в каждое нечетное слово фразы и проверять отсутствие буквы в указанных словах.
Программа
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.
