- •Введение
- •1. Вычисление функций
- •Пояснения к программе
- •Пояснения к программе
- •2. Одномерные массивы
- •3. Матрицы
- •Пояснения к программе
- •4. Обработка текстов
- •Пояснения к программе
- •Пояснения к программе
- •5. Процедуры и функции
- •Пояснения к программе
- •Пояснения к программе
- •Пояснения к программе
- •6. Перечисляемый и диапазонный типы
- •Пояснения к программе
- •7. Записи
- •8. Множества
- •9. Файлы
- •10. Списки
- •Пояснения к программе
- •Пояснения к программе
- •Литература
- •Приложение 1 Комбинации клавиш управления в среде Turbo Pascal
- •Приложение 2 Сообщения об ошибках периода компиляции
- •1. Вычисление функций 5
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Ь."
