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

10. Списки

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

Пояснения к программе

Это обычная задача поиска максимума, и при анализе слов очередное текущее слово с большей длиной необходимо присвоить результирующему слову. Но в этом случае RezSlovo := TekSlovo приведет к пересылке одного массива символов на место другого. Если длины последовательно нарастают, то придется пересылать большое количество слов. Если же использовать указатели на динамические массивы, то RezSlovo := TekSlovo не требует пересылки массивов, а вызывает только присваивание указателю RezSlovo ссылки на тот массив, в котором размещается найденное слово максимальной длины. Поменяв указатели предпишем вводить очередное слово в тот массив, на который сначала ссылался указатель RezSlovo.

Type

Massiv = Array [ 1 .. 100 ] of char;

Ukaz = ^ Massiv;

Var

RezSlovo : Ukaz;{указатель на слово максимальной длины}

TekSlovo : Ukaz; {указатель на текущее слово}

R : Ukaz; {указатель на промежуточное слово}

Max, i, K : Integer; {счетчики букв}

Smv : Char;

Begin

Max := -1; i := 0; {i - счетчик букв в слове}

New( TekSlovo ); New( RezSlovo );

{ ввод текста и определение длины каждого слова }

WriteLn('Введите слова через запятую, в конце - точка');

Repeat

Read( Smv );

if ( Smv <> ',' ) And ( Smv <> '.' ) then

begin

i := i + 1; TekSlovo^[i] := Smv

end

else {сравнение длины текущего слова с максимальной}

begin

if i > Max then

begin

Max := i;{сохранили максимальную длину слова}

R := RezSlovo;

RezSlovo := TekSlovo;

TekSlovo := R

end;

i := 0

end

until Smv = '.';

WriteLn;

WriteLn( 'Введите букву, частоту появления которой ',

'необходимо определить');

ReadLn;

Read( Smv ); { чтение заданной буквы }

K := 0; { подсчет числа вхождений заданной буквы в самое длинное слово}

for i := 1 to Max do

if Smv = RezSlovo^[i] then

K := K + 1;

WriteLn ('В 1-ое по порядку слово наибольшей длины:');

for i := 1 to Max do

Write( RezSlovo^[i] );

WriteLn;

WriteLn ('Число появлений буквы "', Smv, '" равно', K:3);

{уничтожаем динамические объекты}

Dispose( TekSlovo );

Dispose( RezSlovo )

End.

В упражнениях 10.2 — 10.14 использовать (линейные) однонаправленные списки при следующем их описании:

Type

Spisok = ^Zveno;

Zveno = record

Elem : TypeElem;

Next : Spisok

end;

При этом параметры L, LI и L2 обозначают списки, а параметры Е, El и Е2—данные типа TypeElem, к которым применимы операции присваивания и проверки на равенство. TypeElem — тип элементов списка, уточняемый, если надо, в упражнениях.

10.2 Описать функцию или процедуру, которая:

а) определяет, является ли список L пустым;

б) находит среднее арифметическое элементов непустого списка L (TypeElem — real);

в) заменяет в списке L все вхождения E1 на Е2;

г) меняет местами первый и последний элементы не­пустого списка L;

д) проверяет, упорядочены ли элементы списка L по алфавиту (TypeElem = 'a'.. 'z');

е) находит сумму последнего и предпоследнего элемен­тов списка L, содержащего не менее двух элементов (TypeElem = integer).

10.3 Пусть в программе введено описание типа:

Type

слово = array [1..10] of char;

TypeElem = слово;

Описать функцию, подсчитывающую количество слов спис­ка L, которые;

а) начинаются и оканчиваются одной и той же литерой;

б) начинаются с той же литеры, что и следующее слово;

в) совпадают с последним словом.

10.4 Описать процедуру, которая по списку L строит два новых списка: L1 — из положительных элементов и L2 — из остальных элементов списка L (TypeElem = Rеаl).

10.5 Описать процедуру, которая вставляет:

а) в начало списка L новый элемент Е;

б) в конец списка L новый элемент E;

в) новый элемент Е после первого элемента непустого списка L;

г) в список L новый элемент E1 за каждым вхождением элемента Е;

д) в список L новый элемент Е1 перед первым вхож­дением элемента Е, если Е входит в L;

е) в непустой список L пару новых элементов Е1 и Е2 перед его последним элементом;

ж) в непустой список L, элементы которого упорядо­чены по неубыванию, новый элемент Е так, чтобы сохра­нилась упорядоченность (TypeElem = Real).

10.6 Описать процедуру, которая удаляет:

а) из непустого списка L первый элемент;

б) из списка L второй элемент, если такой есть;

в) из списка L за каждым вхождением элемента Е один элемент, если такой есть и он отличен от Е;

г) из непустого списка L последний элемент;

д) из списка L первый отрицательный элемент, если такой есть (TypeElem = Integer);

е) из списка L все отрицательные элементы (TypeElem = Real).

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

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

10.9 Дано целое n > 1, за которым сле­дует п вещественных чисел. Напечатать эти числа в порядке их неубывания.

10.10 Описать процедуру или функцию, которая:

а) проверяет на равенство списки L1 и L2;

б) определяет, входит ли список L1 в список L2;

в) проверяет, есть ли в списке L хотя бы два одина­ковых элемента;

г) переносит в конец непустого списка L его первый элемент;

д) переносит в начало непустого списка L его послед­ний элемент;

е) добавляет в конец списка L1 все элементы списка L2;

ж) вставляет в список L за первым вхождением эле­мента Е все элементы списка L1, если Е входит в L;

з) переворачивает список L, т. е. изменяет ссылки в этом списке так, чтобы его элементы оказались распо­ложенными в обратном порядке;

и) в списке L из каждой группы подряд идущих рав­ных элементов оставляет только один;

к) оставляет в списке L только первые вхождения оди­наковых элементов.

10.11 Описать рекурсивную функцию или процедуру, которая;

а) определяет, входит ли элемент Е в список L;

б) подсчитывает число вхождений элемента Е в список L;

в) находит максимальный элемент непустого списка L (TypeElem = Real);

г) печатает в обратном порядке элементы списка L (TypeElem = Char);

д) заменяет в списке L все вхождения E1 на E2;

е) удаляет из списка L первое вхождение элемента E, если такое есть;

ж) удаляет из списка L все вхождения элемента Е;

з) строит L1 — копию списка L;

и) удваивает каждое вхождение элемента Е в список L;

к) находит среднее арифметическое всех элементов непустого списка L (TypeElem = Real).

10.12 Описать процедуру, которая формирует список L, включив в него по одному разу элементы, которые:

а) входят хотя бы в один из списков L1 и L2;

б) входят одновременно в оба списка L1 и L2;

в) входят в список L1, но не входят в список L2;

г) входят в один из списков L1 и L2, но в то же время не входят в другой из них.

10.13 Описать процедуру, которая объединяет два упорядоченных по неубыванию списка L1 и L2 (TypeElem = Real) в один упорядоченный по неубыванию список:

а) построив новый список L;

б) меняя соответствующим образом ссылки в L1 и L2 и присвоив полученный список параметру L1.

10.14 Дан текст, оканчивающийся точкой, причем подряд следует не более 9 одинаковых символов. Требуется перед каждой группой одинаковых символов вставить цифру, равную числу символов в группе, удалив повторные вхождения букв.

Например: из строки "ППАААССССККАЛЛЛЛЛЬЬЬЬ."

получим строку "2П3А4С2К1А5Л4Ь."

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