Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Egorova1

.pdf
Скачиваний:
36
Добавлен:
14.02.2015
Размер:
1.67 Mб
Скачать

N3.

Дан текст. Определить, является ли он "перевертышем".

Пример текста-перевертыша: "А роза упала на лапу Азора". Различие строчных и прописных букв во внимание не принимать.

N4.

Дан текст. Выделить из текста все слова-"перевертыши". Различие строчных и прописных букв во внимание не принимать.

Например: "top apple pot". Top — pot - слова "перевертыши".

N5.

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

Пример. Текст: "Няня Нину мылом мыла". Слова: "мыла".

N6.

Дан текст. Найти в нем все симметричные слова. Различие строчных и прописных букв во внимание не принимать.

Примеры симметричных слов: Anna, anpna.

N7.

Дан текст. Найти в нем слова, в которых некоторый заданный символ встречается наибольшее число раз.

Пример. Текст: "Anna and Dasha want to take this apple". Символ: "a".

Результат: слова "Anna", "Dasha" содержат символ "a" 2 раза.

N8.

Дан текст. Найти все слова, в которые заданный символ входит не менее 2 раз.

N9.

Дан текст (английский). Найти все слова, содержащие наибольшее количество гласных латинских букв (a,e,i,o,u).

Пример. Anna , Table .

123 123

2 2

N10.

Дан текст. Найти все слова, которые содержат символ «t» и встречаются в тексте не менее 2 раз.

Пример. Текст: "to be or not to be". Слова: "to".

N11.

Дан текст. Найти такие слова, которые начинаются и кончаются одним символом.

N12.

Дан текст. Найти номер первого по порядку слова, которое начинается с заданного символа.

N13.

Дан текст. Найти все слова, которые оканчиваются тем же символом, что и первое

слово.

N14.

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

111

N15.

Дан текст. Определить в нем все слова, содержащие сочетание "ab", и заменить его на "ba".

N16.

Дан текст. Заменить все вхождения подстроки "del" на "Insert". Пример. Исходный текст: "Нажмите клавишу del"

Полученный текст: "Нажмите клавишу Insert".

N17.

Дан текст. В тех словах, которые оканчиваются сочетанием букв "ing", заменить это окончание на "ed".

N18.

Дан текст. Во всех словах заменить буквосочетание "abc" на "def".

N19.

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

N20.

Дан текст. Напечатать все различные слова. Различие строчных и прописных букв во внимание не принимать.

N21.

Дан текст, состоящий из слов, разделенных пробелами. Слова - английские. Напечатать все слова в алфавитном порядке. Одинаковые слова печатать один раз.

N22.

Дан текст. Удвоить каждое вхождение определенного символа ch. Предусмотреть повторение этой процедуры несколько раз для разных значений ch.

Пример. Исходная строка: "Талин - красивый город". Результат: ch= "л" Таллин - красивый город;

ch= "н" Таллинн -красивый город.

N23.

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

N24.

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

Пример. Исходный текст: "Bell is my friend". Слова: Bell, is, my.

N25.

Дан текст. Найти в нем самое короткое и самое длинное слово.

N26.

Дан текст. Напечатать все слова, которые не содержат определенных символов c1 ,c2 ,Kcn . Символы вводятся с клавиатуры.

112

Пример. Исходный текст: "Карфаген должен быть разрушен". Символы: "о", "б". Получим слова: Карфаген, разрушен.

N27.

Дан текст. После каждого символа ch вставить строку str. Значение ch и str вводятся с клавиатуры.

N28.

Дан текст. Для каждого слова, длина которого - нечетное число, удалить среднюю

букву.

Пример. Исходный текст: "Наша кошка пьет молоко". Полученный текст: "Наша кока пьет молоко".

N29.

Дан текст. Каждое слово преобразовать следующим образом: оставить в слове только первые вхождения каждой буквы. Различие строчных и прописных букв во внимание не принимать.

Пример. Исходная строка: "Никто не обнимет необъятного". Полученная строка: "Никто не обнимет необъятг".

N30.

Дан текст. Каждое слово преобразовать следующим образом: удалить из слова все предыдущие вхождения последней буквы. Различие строчных и прописных букв во внимание не принимать.

Пример. Исходный текст: "На седьмом небе". Полученный текст: "На седьом нбе".

N31.

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

N32.

Дан текст. Проверить, имеется ли в нем баланс операторных скобок "begin ...end".

N33.

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

N34.

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

Пример. Исходный текст: "Рассмотрим выражение ab+0.1973-1.1". Преобразованный текст: "Рассмотрим выражение ab+0.19-1.1".

N35.

Дан текст. Найти сумму всех чисел текста.

Пример. Исходный текст: " Если к 12 прибавить 2, то получится 14". Результат: 28.

Пояснение: 12+2+14=28.

N36.

Дан текст. Подсчитать сумму всех цифр, входящих в текст.

Пример. Исходный текст: "Если к 12 прибавить 2, то получим 14". Результат: 10.

113

Пояснение: 1+2+2+1+4=10.

N37.

Дан текст, состоящий из нескольких предложений. Предложения оканчиваются точкой, восклицательным или вопросительным знаками. Сколько раз в каждом предложении встречается какой-то заданный символ?

N38.

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

длина предложения нечетна, и два средних символа, если длина предложения четна.

N39.

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

N40.

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

N41.

Дан текст (английский). Заменить на прописную ("маленькую") первую букву первого слова каждого предложения.

5.5КОНТРОЛЬНЫЕ ВОПРОСЫ И ЗАДАНИЯ ПО МОДУЛЮ 5

5.5.1Два способа представления текста в Паскале.

5.5.2Массив символов: ввод, вывод и операция присваивания для него. Примеры.

5.5.3Тип данных string: описание переменных типа string, атрибут длины; ввод, вывод

иоперация присваивания. Примеры.

5.5.4Сравнение строк.

5.5.5Стандартные подпрограммы для обработки строк. Примеры.

5.5.6Запись управляющих символов в строке.

114

6 СТРУКТУРИРОВАННЫЕ ТИПЫ ДАННЫХ: ЗАПИСИ И МНОЖЕСТВА

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

6.1ТИП ЗАПИСЬ (ТИП RECORD)

6.1.1Запись. Поле записи

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

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

Объявление переменной типа запись (в виде СД) в разделе Var:

 

 

Имя переменной

 

:

 

 

Имя поля

:

 

 

 

Var

 

 

Record

Тип

 

End

 

 

 

 

 

 

 

 

 

,

 

 

 

 

Пример 1. Комплексные числа a +i b

 

;

 

 

 

 

можно описать переменной типа record:

 

var comp:record

 

 

 

 

 

 

 

 

 

 

 

rl:real;

(* Вещественная часть a *)

 

 

 

 

 

 

im:real

(* Мнимая часть b

 

*)

 

 

 

 

 

 

end;

 

 

 

 

 

 

 

 

 

 

 

Это описание можно представить короче:

 

 

 

 

 

 

var comp:record

 

 

 

 

 

 

 

 

 

 

 

rl,im:real

 

 

 

 

 

 

 

 

 

 

 

end;

 

 

 

 

 

 

 

 

 

 

 

Здесь comp - имя переменной типа записи. Переменная состоит из двух полей: rl

и im, -

имеющих один и тот же тип real.

 

 

 

 

 

 

 

 

Пример 2. Даты каких-либо событий можно описать следующим образом:

 

var dat:record

 

 

 

 

 

 

 

 

 

 

 

 

day:1..31;

(* Число *)

 

 

 

 

 

 

 

 

month:1..12;

(* Месяц *)

 

 

 

 

 

 

 

 

year:integer

(* Год

*)

 

 

 

 

 

 

 

end;

Переменная dat описана как запись, состоящая из 3 полей: day, month, year. Каждое поле содержит, соответственно, данные: целое число в пределах от 1 до 31, целое число в пределах от 1 до 12, целое число.

Пример 3. Анкета одного студента: фамилия, имя, отчество, пол, год рождения, - может

быть описана следующим образом:

 

 

var anketa:record

 

 

fam:array[1..18] of char;

(* Фамилия

*)

im:array[1..10] of char;

(* Имя

*)

ot:array[1..12] of char;

(* Отчество

*)

pol:char;

(* Пол

*)

god:integer

(* Год рождения *)

end;

 

 

115

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

в виде:

 

 

<имя переменной-записи>.<имя поля>.

 

Например:

 

 

anketa.god:=1990;

(* Обращение к полю god записи anketa

*)

anketa.im[i]:='a';

(* Обращение к i-ой позиции поля im записи anketa *)

Каждое поле записи можно рассматривать как обычную переменную, которую можно напечатать или использовать в расчетах. Вместе с тем, запись можно рассматривать как единое целое.

Пример 4. Пусть имеем следующее описание переменных b1 и b2 типа записи date: type date=record

day:1..31; month:1..12; year:integer end;

var b1,b2:date;

Можно проводить операции над отдельными полями записей b1,b2, можно выполнять операции над всей записью:

b1:=b2;

Этот оператор эквивалентен следующей последовательности операторов: b1.day:=b2.day;

b1.month:=b2.month;

b1.year:=b2.year;

Пример 5. Описание массива, компонентами которого являются записи (см. пример 4 выше):

var Birthdays:array[1..person] of date; (* Даты рождения группы людей *)

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

Например, печать содержимого поля year записи Birthdays[3]: WriteLn(Birthdays[3].year);

6.1.2 Оператор With

Этот оператор используется для удобства работы с переменными типа record. Общий вид оператора:

With A do St;

где A - имя переменной типа rеcord,

St - оператор (простой или составной),

With, do - ключевые слова (With - "с", do - "выполнять").

Выполнение оператора With: в операторе St при ссылках на компонент записи A имя записи A можно опускать.

Пример 1. Занесение даты рождения первого человека (см. описание Birthdays в примере 5 из предыдущего п.6.1.1) без и с оператором With:

(* Без With *)

(* С With *)

Birthdays[1].day:=5;

With Birthdays[1] do

Birthdays[1].month:=10;

begin

Birthdays[1].year:=1973;

day:=5;

 

month:=10;

 

year:=1973

 

end;

6.1.3 Примеры использования переменной типа record

116

Пример 1. Задание

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

Программа

 

 

program pr1;

 

 

 

const m=25;

(* Количество студентов *)

 

type stud=record (* Тип записи "студент" *)

 

fam:string[15];

(* Фамилия студента

*)

b1,b2,b3,b4:2..5; (* Оценки студента

*)

sb:real

 

(* Средний балл студента *)

end;

 

 

 

var grup:array[1..m] of stud; (* Массив - группа студентов *)

i:integer;

(* Индекс *)

begin

 

(* Ввод исходных данных: фамилий и оценок *) for i:=1 to m do

with grup[i] do begin

writeln('Введите фамилию и <ВК>, затем 4 оценки через пробел:'); readln(fam);

readln(b1,b2,b3,b4);

end;

(* Определение среднего балла каждого студента *) for i:=1 to m do

with grup[i] do sb:=(b1+b2+b3+b4)/4;

(* Вывод результатов в виде: фамилия, оценки в скобках, тире, средний балл *) for i:=1 to m do

with grup[i] do

writeln(fam,' (',b1:2,b2:2,b3:2,b4:2,' ) - средний балл: ',sb);

end.

Пример 2. Задание

Дана экзаменационная ведомость вида:

Группа

ПОВТ 01

Дисциплина

Информатика

ФИО преп.

Егорова Е.В.

Кол-во студентов

25

Массив оценок

5 4 3 2 1 . . .

Количество студентов - не более 30. Количество оценок равно количеству студентов, то есть это оценки всех студентов группы по указанной дисциплине. Коды оценок могут быть следующими: '5' - отлично, '4' - хорошо, '3' - удовлетворительно, '2' - неудовлетворительно, '1' - не явка, '0' - не допущен.

Необходимо ввести эту ведомость в виде записи Ved и обработать: подсчитать количество оценок каждого кода. Результат оформить как поле Rez записи Ved и распечатать.

Обозначения

Ved - ведомость : record; kg - группа : string[7];

dis - дисциплина : string[30];

fio - ФИО преподавателя : string[20]; kst - кол-во студентов : 1..30;

117

oz - массив оценок : array[1..30] of char;

rez - массив результатов : array['0'..'5'] of 1..30; k - индекс массива oz :integer;

l - индекс массива rez :char; Пояснение

Массив результатов представляет собой следующее: rez['0'] - количество оценок с кодом '0',

rez['1'] - количество оценок с кодом '1',

. . .

rez['5'] - количество оценок с кодом '5'.

Структурная схема

вход

Ввод KG,DIS,FIO,KST

Обнуление REZ

k=1

F

k KST

T

Ввод OZ[k]

REZ[OZ[k]]=REZ[OZ[k]]+1

k=k+1

Печать REZ

выход

Программа

Program vedom; var Ved :record

kg :string[7]; dis :string[30]; fio :string[20]; kst :1..30;

oz :array[1..30] of char; rez :array['0'..'5'] of 0..30

end;

k:integer;

l:char; Begin

With ved do begin

Writeln('Введите код группы');Readln(kg); Writeln('Введите назв. предмета');Readln(dis); Writeln('Введите фио');Readln(fio); Writeln('Введите кол-во студентов');

Readln(kst);

for l:='0' to '5' do rez[l]:=0;

Writeln('Введите подряд все оценки и <ВК> в конце:');

for k:=1 to kst do begin read(oz[k]);

rez[oz[k]]:=rez[oz[k]]+1;

end; Writeln('Результаты:');

for l:='0' to '5' do writeln('''',l,''' ',rez[l]); end;

End.

Замечание .

При вводе оценок, имеющих в программе тип char, следует быть внимательными, так как:

1)если в программе ввод оценок запрограммирован как "read(oz[k]);", то вводить оценки надо все подряд и в конце один раз нажать <ВК>, например:

012345.....5221325<ВК>

2)если в программе ввод оценок запрограммирован как "readln(oz[k]);", то после ввода каждой оценки следует нажимать <ВК>, например:

1<вк>2<вк>5<вк>0<вк>.....3<вк>2<вк>4<вк>1<вк>

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

118

6.1.4 Запись с вариантами (вариантная запись)

Обычная запись всегда содержит все определенные для нее поля. Для вариантной записи можно определить несколько альтернативных полей. Запись с вариантами состоит из двух частей: фиксированной и вариантной. Фиксированная часть - это обычная совокупность полей, она остается постоянной для всех значений данной записи. Структура же вариантной части не постоянна, а изменяется в зависимости от значения специальной переменной - переключателя.

Пример 1. Пусть необходимо собрать следующие сведения о сотрудниках института:

фамилия, дата рождения

и, если

есть семья, то фамилию и дату рождения супруга

(супруги), а если разведен, то год развода. Введем следующие описания:

type date = record { Дата события}

 

day : 1..31 ;

{ День

}

mon : 1..12 ;

{ Месяц }

year: integer

{ Год

}

end;

 

 

king = (gen,raz,no); { Три значения перечисляемого типа king: gen - женат, raz - разведен, no - в браке не состоял}

person = record {Информация о сотруднике}

name : string;

{ ФИО сотрудника}

bird : date;

{Дата рождения сотрудника}

case yesno:king of

{ yesno - переключатель типа king}

gen:(name1:string;

bird1:date);

raz:(yearraz:integer);

no:();

end;

var spisok:array[1..20] of person;

Переключатель yesno может принимать одно из трех значений: gen, raz, no. Если gen, то присутствуют два поля: name1, bird1; если raz, то одно поле yearraz;. если no, то пустое поле.

В каждом конкретном экземпляре записи person в ее вариантной части содержится лишь один из возможных наборов полей.

Замечания.

1.Любая запись record может иметь лишь одну вариантную часть case.

2.Фиксированная часть обязательно предшествует вариантной.

3.Переменная yesno называется переключателем (тагом, тэгом, ярлыком, признаком, дискриминантом) - от английского слова TAG (ярлык ,этикетка ,бирка). Тип king - это тип переключателя. Этому же типу должны принадлежать метки gen, raz, no. Каждой метке соответствует набор полей. Эти поля называются компонентами варианта. Все метки должны быть различны.

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

5.Вся вариантная часть не завершается словом end, парным case (как это делается в операторе case). Это сделано потому, что вариантная часть, если она есть, всегда размещается в конце записи, и единственное end одновременно завершает и всю запись, и

еевариантную часть.

6.Часто переменную-переключатель и ее тип называют полем тега . Так в примере выше 'yesno:king' - это поле тега . Метки называются значениями тега.

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

119

стандартном Паскале нельзя описать переключатель с типом integer. В Турбо-Паскале иначе: некоторый вариант записи достаточно связать только с теми значениями переключателя, которые действительно могут иметь место.

Пример (недоступен в стандартном Паскале).

Case n:integer of

 

1,12:(c1:integer);

{ Переключатель n и три варианта, причем n может }

13,100:(c2:integer);

{ получить лишь одно из пяти явно указанных }

32000:(c3:integer;

{ значений: 1, 12, 13, 100, 32000. }

d:string);

8. Пример обращения в программе к переменной компоненте записи person. With spisok[2] do

Begin

yesno:=raz; { Оператор 1 } yearraz:=1994; { Оператор 2}

End;

В операторе 1 присваивается соответствующее значение переключателю. Помимо фиксированных полей name и bird, переменная spisok[2] теперь содержит поля, которые соответствуют метке raz, то есть поле yearraz. В операторе 2 выполняются операции с компонентами варианта, соответствующего заданной метки.

Таким образом, переключатель, или тэг - это всего лишь «этикетка», которую сам программист «навешивает» на запись при ее заполнении данными с тем, чтобы впоследствии вспомнить, по какому варианту она заполнялась.

9.Размещая вариантную запись в памяти, компилятор всегда резервирует пространство, достаточное для самого "длинного" из возможных вариантов. Таким образом, запись все время занимает максимально необходимую область, даже если в какой-то момент времени она используется частично.

10.Многие Паскаль-компиляторы проверяют, существует ли данное вариантное поле в текущей версии записи. В Турбо-Паскале такой автоматический контроль не обеспечивается , то есть программист сам должен следить, чтобы программа по ошибке не назначила переключателю недопустимое значение и не пыталась получить доступ к полю, не существующему в текущем варианте записи.

6.2ТИП МНОЖЕСТВО (ТИП SET)

6.2.1 Множество. Базовый тип

Множество - это набор однотипных логически связанных друг с другом объектов, или элементов. Характер связей между объектами лишь подразумевается программистом и никак не контролируется Турбо-Паскалем. Элементы множества должны принадлежать одному скалярному типу, который называется базовым типом множества. Область значений переменной типа множество - это набор всевозможных подмножеств, составленных из элементов базового типа. В отличие от массивов и записей, количество элементов типа множество может меняться в процессе выполнения программы.

Пример 1. Пусть имеем в качестве базового типа ограничений тип 1..3. По сути, имеем множество из трёх чисел: 1, 2, 3. Тогда возможны следующие подмножества (их число

равно 2 3 =8): [1], [2], [3], [1,2], [1,3], [2,3], [1,2,3], [ ].

Здесь [ ] - это пустое множество. Эти подмножества будут принадлежать некоторому множеству, тип которого назовём S. В Паскале этот тип S можно описать следующим образом: type S=set of 1..3

Описание переменной типа множества в Паскале: 1) полное описание:

type <имя типа множества>=set of <базовый тип>

120

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]