Задания по ЯИСП для 1-ого курса.

Сборник задач по программированию
Тюкачев Н.А., Михайлова Е.Е.
2007-2008
Оглавление:
1. Линейные алгоритмы 4
1.1. Пример 4
1.2. Задания 4
2. Логическое выражение 9
2.1. Пример 9
2.2. Задания 9
3. Условный оператор 10
3.1. Пример 10
2.2. Задания 11
3. Циклы 16
3.1. Примеры 16
3.2. Задания 18
5. Строки 21
5.1. Примеры 21
5.2. Задания 23
6. Одномерные массивы 32
6.1. Примеры 32
6.1.1. Пример 1: умножение матрицы на строку 32
6.1.2. Пример 2. Неповторяющиеся элементы массива 34
6.2. Задания 36
7. Матрицы 43
7.1. Пример 43
7.2. Задания 43
8. Процедуры и функции 49
8.1. Пример 49
8.2. Задания 49
9. Множества 53
9.1. Пример 53
9.2. Задания 55
10. Структуры 56
10.1. Примеры 56
10.1.1. Пример. Поиск ближайшей точки 56
10.1.2. Пример. Интерполяционный многочлен Лагранжа 57
10.2. Задания 61
11. Файлы 63
11.1. Примеры 63
11.2. Задания 68
11.2.1. Текстовые файлы 68
11.2.2. Типизированные и нетипизированные файлы 76
12. Сортировки 83
12.1. Примеры 83
12.2. Задания 83
13. Списки, стеки, очереди 88
13.1. Примеры 88
13.2. Задания 88
14. Рекурсия 96
14.1. Примеры 96
14.2. Задания 99
15. Разбор выражений 102
15.1. Пример 102
15.2. Задания 102
16. Деревья 104
16.1. Пример 104
16.2. Задания 104
17. Графы 106
17.1. Примеры 106
17.2. Задания 106

1. Линейные алгоритмы
1.1. Пример
Вычислить Y=x*x
Листинг 1. Вычислить Y=x*x
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;
var
x,y: real;
begin
Write('x='); Readln(x);
y:=x*x;
Write('y=',y:6:2);
Readln;
end.
1.2. Задания
1. Составить программу для решения системы двух линейных уравнений с двумя неизвестными.
Указание
Значение неизвестных x, y системы уравнений

находятся по формулам .
Считать, что .
2. Подсчитать, сколько очков набрала команда в первом круге чемпионата по хоккею, если известно, что m встреч она выиграла, n встреч проиграла, k встреч закончились ничьими.
Указание
За выигрыш команда получает два очка, за ничью - 1 очко, за проигрыш - 0 очков.
3. Известны длины сторон a, b, c треугольника. Вычислить высоты этого треугольника.
Указание
Высоты треугольника вычисляются по формулам:

где .
4. Составить программу для вычисления времени t встречи автомобилей, движущихся равноускоренно навстречу друг другу, если известны их скорости V1 и V2, ускорения а1 и а2 и начальное расстояние S между ними.
Указание.
Расстояние S1, пройденное первым автомобилем, вычисляется по формуле ; расстояние, пройденное вторым автомобилем, вычисляется по формуле . Время t встречи автомобилей определяется из уравнения ,
откуда .
5. Найти x из пропорции .
6. Сколько процентов от А+В-С приходится на А? На В? На С?
7. Составить программу вычисления идеального веса человека по его росту, при условии, что идеальный_вескг = ростсм - 100.
8. Вы положили деньги в сбербанк на срочный депозит на квартал из расчета 24% годовых. Составить программу, которая вычислит причитающуюся вам сумму через 4 месяца.
9. Розничная цена мужского костюма составляет R рублей. Наценка магазина составляет T% от оптовой цены. Составить программу определения оптовой цены костюма.
10. Зарплата сотрудника частной фирмы r рублей в месяц. Сколько денег он получит за полгода после вычета налогов в размере t% ежемесячно и s% за полгода?
11. Даны координаты вершин некоторого треугольника. Вычислить его периметр.
12. Смешано V1 литров воды температуры t1 с V2 литрами воды температуры t2. Составить программу вычисления объема и температуры образованной смеси.
13. Определить стоимость набора, в который входят следующие конфеты:
Название Вес Стоимость 1кг
Петровские 200г K руб.
Воронежские 300г P руб.
Чародейка 250г R руб.
Факел 150г B руб.
Ласточка 200г L руб.
Стоимость упаковки — U руб.
14. Сколько времени в минутах затратит школьник на дорогу от школы до стадиона, если известна длина этого расстояния S км и средняя скорость движения школьника V км/ч.
15. В квадрат вписана окружность (рис. 1.3). Определить площадь заштрихованной части фигуры, если известна длина стороны квадрата.
16. В квадрат вписана окружность (рис. 1.3). Определить площадь заштрихованной части фигуры, если известен радиус окружности.
17. В квадрат вписана окружность (рис. 1.4). Определить площадь заштрихованной части фигуры, если известна длина стороны квадрата.
Рис. 1.3 Рис. 1.4 Рис. 1.5
18. В квадрат вписана окружность (рис. 1.5). Определить площадь заштрихованной части фигуры, если известна длина стороны квадрата.
19. Даны два ненулевых числа. Найти их сумму, разность, произведение и частное.
20. Даны два числа. Найти среднее арифметическое их квадратов и среднее арифметическое их модулей.
21. Скорость лодки в стоячей воде V км/ч, скорость течения реки U км/ч (U 22. Скорость первого автомобиля V1 км/ч, второго — V2 км/ч, расстояние между ними S км. Определить расстояние между ними через T часов, если автомобили удаляются друг от друга.
23. Скорость первого автомобиля V1 км/ч, второго — V2 км/ч, расстояние между ними S км. Определить расстояние между ними через T часов, если автомобили первоначально движутся навстречу друг другу.
24. Найти периметр и площадь прямоугольного треугольника, если даны длины его катетов a и b.
Вычислить выражения:
25.
26.
27.
28.
29.
30.
31.
32.

33.
34.

2. Логическое выражение
2.1. Пример
Проверить истинность высказывания: "Квадратное уравнение A•x2 + B•x + C = 0 с данными коэффициентами A, B, C имеет вещественные корни".
var
Ok: boolean;
begin
Ok:=A*A-4*B*C>=0;
end.
2.2. Задания
Во всех заданиях данного пункта требуется вывести логическое значение True, если приведенное высказывание для предложенных исходных данных является истинным, и значение False в противном случае. Все числа, для которых указано количество цифр (двузначное число, трехзначное число и т.д.), считаются целыми.
1. Проверить истинность высказывания: "Данные числа x, y являются координатами точки, лежащей во второй координатной четверти".
2. Проверить истинность высказывания: "Данные числа x, y являются координатами точки, лежащей в первой или третьей координатной четверти".
3. Проверить истинность высказывания: "Точка с координатами (x, y) лежит внутри прямоугольника, левая верхняя вершина которого имеет координаты (x1, y1), правая нижняя — (x2, y2), а стороны параллельны координатным осям".
4. Проверить истинность высказывания: "Данное целое число является четным двузначным числом".
5. Проверить истинность высказывания: "Данное целое число является нечетным трехзначным числом".
6. Проверить истинность высказывания: "Среди трех данных целых чисел есть хотя бы одна пара совпадающих".
7. Проверить истинность высказывания: "Среди трех данных целых чисел есть хотя бы одна пара взаимно противоположных".
8. Проверить истинность высказывания: "Сумма цифр данного трехзначного числа является четным числом".
9. Проверить истинность высказывания: "Сумма двух первых цифр данного четырехзначного числа равна сумме двух его последних цифр".
10. Проверить истинность высказывания: "Данное четырехзначное число читается одинаково слева направо и справа налево".
11. Проверить истинность высказывания: "Все цифры данного трехзначного числа различны".
12. Проверить истинность высказывания: "Цифры данного трехзначного числа образуют возрастающую последовательность".
13. Проверить истинность высказывания: "Цифры данного трехзначного числа образуют возрастающую или убывающую последовательность".
14. Проверить истинность высказывания: "Цифры данного трехзначного числа образуют арифметическую прогрессию".
15. Проверить истинность высказывания: "Цифры данного трехзначного числа образуют геометрическую прогрессию".
16. Даны координаты (как целые от 1 до 8) двух различных полей шахматной доски. Если ладья1? король2? слон3? ферзь4? конь5 за один ход может перейти с одного поля на другое, вывести логическое значение True, в противном случае вывести значение False.
3. Условный оператор
3.1. Пример
Пример 1. Решение квадратного уравнения Ax2+Bx+C=0.
Листинг 2. Решение квадратного уравнения
program PrSqr;
{$APPTYPE CONSOLE}
var
A,B,C,D: real;
begin
Write(‘A=’); Readln(A); Write(‘B=’); Readln(B);
Write(‘C=’); Readln(C);
if A = 0 then
if B = 0 then
if C = 0 then Writeln(‘X - любое’)
else Writeln(‘нет корней’)
else Writeln(‘X = ’,-C/B:8:2)
else begin
D := B*B-4*A*C;
if D else begin
D:=Sqrt(D);
Writeln(‘X1=’,(-B+ D)/(2*A),‘X2=’,(-B-D)/(2*A));
end
end;
end.
Пример 2. Даны длины трех отрезков. Если они могут образовать треугольник, то вычислить его площадь.
Листинг 3. Площадь треугольника
program Pr8;
{$APPTYPE CONSOLE}
var
a,b,c,p,S : real;
begin
Write(‘a=’); Readln(a); Write(‘b=’); Readln(b);
Write(‘c=’); Readln(c);
If (a+b>c) and (a+c>b) and (b+c>a) then
begin
P:=(a+b+c)/2; S:=Sqrt(p*(p-a)*(p-b)*(p-c));
Writeln(‘S=’,S:8:2);
end
else Writeln(‘Не треугольник’);
Readln;
end.
2.2. Задания
1. Ввести три числа. Если они могут быть длинами сторон прямоугольного треугольника, вывести их в порядке возрастания, вычислить площадь полученного треугольника.
2. Ввести три числа. Если они могут быть длинами сторон остроугольного треугольника, вывести их в порядке убывания, вычислить площадь полученного треугольника.
3. Ввести три числа. Если они могут быть длинами сторон тупоугольного треугольника, вывести их в порядке убывания, вычислить площадь полученного треугольника.
4. Ввести три числа. Если они могут быть сторонами равностороннего треугольника, вычислить его площадь и длину высоты. Вывести стороны, площадь и длину высоты в порядке возрастания.
5. Ввести три числа. Если они могут быть длинами сторон равнобедренного треугольника, вычислить длины его высот. Вывести длину основания и длины высот в порядке возрастания.
6. Ввести три числа. Если они могут быть длинами сторон разностороннего тупоугольного треугольника, вывести их в порядке возрастания, вычислить площадь полученного треугольника.
7. Ввести три числа. Если они могут быть длинами сторон равнобедренного тупоугольного треугольника, вычислить его площадь. Вывести длины сторон и площадь в порядке возрастания.
8. Ввести три числа. Если они могут быть длинами сторон равнобедренного остроугольного треугольника, вычислить его площадь. Вывести длины сторон и площадь в порядке возрастания.
9. Ввести три числа. Если они могут быть длинами сторон разностороннего остроугольного треугольника, вывести их в порядке возрастания, вычислить площадь полученного треугольника.
10. Даны координаты трех точек на плоскости. Если они могут быть вершинами остроугольного треугольника, вывести их в порядке убывания, вычислить площадь полученного треугольника.
11. Даны три числа. Если они могут быть длинами сторон треугольника, определить его вид (прямоугольный, тупоугольный, остроугольный). Вычислить длины его высот и напечатать их в порядке убывания.
12. Составить программу, которая определяла бы вид треугольника (равносторонний, равнобедренный, разносторонний, прямоугольный, тупоугольный, остроугольный), если по данным трём отрезкам его можно построить.
13. Даны координаты трех точек на плоскости. Составить программу, которая определяла бы вид треугольника (равносторонний, равнобедренный, разносторонний, прямоугольный, тупоугольный, остроугольный), если данные координаты вершин позволяют его построить.
14. Даны координаты трех вершин прямоугольника. Определить координаты четвертой вершины.
15. Даны три целых числа. Возвести в квадрат отрицательные числа и в третью степень — положительные (число 0 не изменять).
16. Из трех данных чисел выбрать наименьшее.
17. Из трех данных чисел выбрать наибольшее.
18. Из трех данных чисел выбрать наименьшее и наибольшее.
19. Перераспределить значения переменных X и Y так, чтобы в X оказалось меньшее из этих значений, а в Y — большее.
20. Значения переменных X, Y, Z поменять местами так, чтобы они оказались упорядоченными по возрастанию.
21. Значения переменных X, Y, Z поменять местами так, чтобы они оказались упорядоченными по убыванию.
22. Даны две переменные целого типа: A и B. Если их значения не равны, то присвоить каждой переменной сумму этих значений, а если равны, то присвоить переменным нулевые значения.
23. Даны две переменные целого типа: A и B. Если их значения не равны, то присвоить каждой переменной максимальное из этих значений, а если равны, то присвоить переменным нулевые значения.
24. Даны три переменные: X, Y, Z. Если их значения упорядочены по убыванию, то удвоить их; в противном случае заменить значение каждой переменной на противоположное.
25. Даны три переменные: X, Y, Z. Если их значения упорядочены по возрастанию или убыванию, то удвоить их; в противном случае заменить значение каждой переменной на противоположное.
26. Даны целочисленные координаты точки на плоскости. Если точка не лежит на координатных осях, то вывести 0. Если точка совпадает с началом координат, то вывести 1. Если точка не совпадает с началом координат, но лежит на оси OX или OY, то вывести соответственно 2 или 3.
27. Даны вещественные координаты точки, не лежащей на координатных осях OX и OY. Вывести номер координатной четверти, в которой находится данная точка.
28. На числовой оси расположены три точки: A, B, C. Определить, какая из двух последних точек (B или C) расположена ближе к A, и вывести эту точку и ее расстояние от точки A.
29. Даны четыре целых числа, одно из которых отлично от трех других, равных между собой. Вывести порядковый номер этого числа.
30. Дан номер некоторого года (положительное целое число). Вывести соответствующий ему номер столетия, учитывая, что, к примеру, началом 20 столетия был 1901 год.
31. Дан номер некоторого года (положительное целое число). Вывести число дней в этом году, учитывая, что обычный год насчитывает 365 дней, а високосный — 366 дней. Високосным считается год, делящийся на 4, за исключением тех годов, которые делятся на 100 и не делятся на 400 (например, годы 300, 1300 и 1900 не являются високосными, а 1200 и 2000 — являются).
32. Ввести три числа. Если они могут быть длинами сторон прямоугольного треугольника, вывести их в порядке возрастания, вычислить площадь полученного треугольника.
33. Ввести три числа. Если они могут быть длинами сторон остроугольного треугольника, вывести их в порядке убывания, вычислить площадь полученного треугольника.
34. Ввести три числа. Если они могут быть длинами сторон тупоугольного треугольника, вывести их в порядке убывания, вычислить площадь полученного треугольника.
35. Ввести три числа. Если они могут быть сторонами равностороннего треугольника, вычислить его площадь и длину высоты. Вывести стороны, площадь и длину высоты в порядке возрастания.
36. Ввести три числа. Если они могут быть длинами сторон равнобедренного треугольника, вычислить длины его высот. Вывести длину основания и длины высот в порядке возрастания.
37. Ввести три числа. Если они могут быть длинами сторон разностороннего тупоугольного треугольника, вывести их в порядке возрастания, вычислить площадь полученного треугольника.
38. Ввести три числа. Если они могут быть длинами сторон равнобедренного тупоугольного треугольника, вычислить его площадь. Вывести длины сторон и площадь в порядке возрастания.
39. Ввести три числа. Если они могут быть длинами сторон равнобедренного остроугольного треугольника, вычислить его площадь. Вывести длины сторон и площадь в порядке возрастания.
40. Ввести три числа. Если они могут быть длинами сторон разностороннего остроугольного треугольника, вывести их в порядке возрастания, вычислить площадь полученного треугольника.
41. Даны координаты трех точек на плоскости. Если они могут быть вершинами остроугольного треугольника, вывести их в порядке убывания, вычислить площадь полученного треугольника.
42. Даны три числа. Если они могут быть длинами сторон треугольника, определить его вид (прямоугольный, тупоугольный, остроугольный). Вычислить длины его высот и напечатать их в порядке убывания.
43. Даны координаты трех точек на плоскости. Составить программу, которая определяла бы вид треугольника (равносторонний, равнобедренный, разносторонний, прямоугольный, тупоугольный, остроугольный), если данные координаты вершин позволяют его построить.
44. Даны координаты трех вершин прямоугольника. Определить координаты четвертой вершины.
45. Даны действительные положительные числа a, b, c, x, y. Выяснить, пройдет ли кирпич с ребрами a, b, c в прямоугольное отверстие со сторонами x и y. Просовывать кирпич в отверстие разрешается только так, чтобы каждое из его ребер было параллельно или перпендикулярно каждой из сторон отверстия

3. Циклы
3.1. Примеры
Пример 1. Вычислить сумму
Листинг 9. Сумма ряда
program Pr9;
{$APPTYPE CONSOLE}
const
n=20;
var
S,x,a : real;
i,Sign : integer;
begin
x:=0.2; Sign:=-1; a:=1; S:=a;
for i:=1 to n do begin // составной оператор
Sign:=-Sign; a:=Sign*a*x/i;
S:=S+a;
end;
Writeln(‘S = ’, S:8:2);
Readln;
end.
Пример 2. Вычислить сумму
Листинг 1. Сумма ряда
program Pr11;
{$APPTYPE CONSOLE}
const
n=20; Eps=1.0e-6;
var
S,x,a : real;
i,Sign : integer;
begin
x:=0.2; Sign:=-1; a:=1; S:=a; i:=0;
while Abs(a) > Eps do
begin
i:=i+1; Sign:=-Sign; a:=Sign*a*x/i;
S:=S+a;
end;
Writeln(‘S = ’, S:8:2);
Readln;
end.
Пример 3. Методом деления отрезка пополам с точностью Eps=10-6 решить уравнение ex-2=0.
Листинг 2. Метод деления пополам
program Pr13;
{$APPTYPE CONSOLE}
const
Eps=1.0e-6;
var
x,a,b : real;

function F(x: real): real;
begin
Result:=Exp(x)-2;
end;

begin
a:=0; b:=10;
repeat
x:=(a+b)/2; y:=F(x);
if F(a)*F(x) until Abs(b-a) Writeln(‘x = ’, (a+b)/2:8:2);
Readln;
end.
Пример 3. Вычислить сумму цифр числа.
Листинг 4. Сумма цифр числа
var
n,Sum: integer;
Begin
Write(‘N=’); Readln(N);
Sum:=0;
repeat
Sum := Sum + N mod 10;
N := N div 10;
until N=0;
Writeln(‘Sum = ’, Sum);
Readln;
End.
3.2. Задания
1. Составить программу вычисления суммы вида:

2. Составить программу вычисления при заданных x и a значения функции y вида:
;
.
3. Вычислить: ;
4. Написать программу вычисления при заданном x величины y по формуле
.
5. Вычислить .
6. Составить программу для нахождения и печати всех пифагоровых чисел, не превышающих 20.
7. Дано натуральное n. Вычислить значение выражения
8. Даны натуральное число n и действительное число x. Вычислить:

9. Дано натуральное k. Напечатать k-ую цифру последовательности 12345678910111213…, в которой выписаны подряд все натуральные числа.
10. Последовательность x1, x2, … образована по закону:
;
x1 = 1; x2 = 0.3; xi = (i+1) xi – 2 , i = 3, 4, … .
11. Дано вещественное число x и натуральное число n. Вычислить .
12. Даны вещественные числа a, h, натуральное число n.
Вычислить , где
13. Дано натуральное число n. Вычислить 1?2+2?3?4+…+n? …?2n.

14. При некоторых заданных x, N и E, определяемых вводом, вычислить:
a. сумму N слагаемых заданного вида;
b. сумму тех слагаемых, которые по абсолютной величине больше Е.
Для случая b выполнить суммирование для двух значений Е, отличающихся на порядок, и при этом определить количество слагаемых, включенных в сумму. Сравнить результаты с точным значением функции, для которой данная сумма определяет приближенное значение при x, лежащем в интервале (-R, R).
14.1. (R=?).
14.2. (R=?).
14.3. (R=1)
14.4. (R=1).
14.5. (R=1).
14.6. (R=1).
14.7. (R=1).
14.8. (R=1).
14.9. (R=1)
14.10. (R=1).
14.11. (R=1).
14.12. (R=1).
14.13. (R=1).
14.14. (R=1).
14.15. (R=?).
14.16. (R=?).

5. Строки
5.1. Примеры
Пример 1. Реализовать функцию MyPos, которая ищет подстроку в строке.
Листинг 1. Поиск подстроки
function MyPos (s1: string; s: string): byte;
begin
i:=-1; Ok:=false;
while (i Inc(i); Ok:=s1=Copy(s,i,Length(s1));
end;
if Ok then Result:=i else Result:=0;
end;
Пример 2. Дана строка символов. Вывести символы между первым и вторым «-».
Листинг 2. Строка символов между первым и вторым «-»
var
i: integer;
s_Old,s_New: string;
Ok: boolean;
begin
Write('S='); Readln(s_Old);
i:=0; Ok:=false;
while (i Inc(i); Ok:=s_Old[i]='-';
end;
s_New:=''; Ok:=false;
while (i Inc(i); Ok:=s_Old[i]='-';
if not Ok then s_New:=s_New+s_Old[i];
end;
Write(s_New);
Readln;
end.
Пример 3. Проверить упорядочены ли символы в строке.
Листинг 3. Упорядоченность символов
var
i : integer;
s : string;
Ok: boolean;
begin
Write('S='); Readln(s);
i:=1; Ok:=true;
while (i Inc(i); Ok:=s[i-1] end;
if Ok then Write('TRUE') else Write('FALSE');
Readln;
end.
Пример 3. Вычислить число символов “a” и “o” в строке.
Листинг 4. Число символов в строке
const
SetCh=['a','o'];
var
i,Count : integer;
s : string;
begin
Write('S='); Readln(s);
Count:=0;
for i:=1 to Length(s) do
if s[i] in SetCh then Inc(Count);
Write('Count=',Count);
Readln;
end.
5.2. Задания
1. Дана строка. Напечатать слова в нее входящие, но в обратном порядке (сначала последнее, потом предпоследнее и т.д.).
2. Дана строка. Напечатать те слова этой строки, которые отличны от последнего слова и выполняется условие: в слове гласные буквы а, е, и, о, у чередуются с согласными.
3. Для большинства существительных, оканчивающихся на -онок и -енок, множественное число образуется от другой основы. Как правило, это происходит по образцу: цыпленок – цыплята, мышонок – мышата и т.д. (в новой основе перед последней буквой т пишется а или я, в зависимости от предыдущей буквы: если это шипящая, то а, иначе – я). Имеются слова-исключения, из которых укажем следующие: ребенок (дети), бесенок (бесенята), опенок (опята), звонок (звонки), позвонок (позвонки), подонок (подонки), колонок (колонки), жаворонок (жаворонки), бочонок (бочонки). Есть еще ряд малоупотребительных слов-исключений, которые мы не рассматриваем.
4. Дан текст, среди символов которого имеется пробел. Группа символов, предшествующая первому пробелу, представляет собой русское слово, оканчивающееся на -онок или -енок. Получить это слово во множественном числе.
5. Дан русский текст, слова которого разделены пробелами, запятой или точкой. Все слова, оканчивающееся на -онок или -енок, представить во множественном числе.
6. Вводится строка. Если она является записью римского числа, то преобразовать ее в целое число.
7. Вводится 10 произвольных имен. Необходимо распечатать их в алфавитном порядке.
Замечание
Попытайтесь решить задачу, не сортируя сами имена. Поскольку требуется просто распечатать их в алфавитном порядке, заведите массив, содержащий порядковые номера имен. При необходимости перестановки, переставляйте не сами имена, а их порядковые номера. Такой подход особенно удобен, когда приходится сортировать сложные и "громоздкие" объекты.
8. Напишите функцию RightPosition(str1,str2: string), которая получает два параметра str1 и str2 типа string и возвращает позицию начала последнего появления str2 в str1. Например, RightPosition( 'Миссисипи', 'си' ) вернет значение 6.
9. Напишите функцию CountStr(str1,str2: string) которая получает два параметра str1 и str2 типа string и возвращает число, указывающее, сколько раз str2 встречается в str1. Функция не должна изменять свои параметры. Кроме того, любая литера в str1 может учитываться не более чем в одном вхождении str2. Например, CountStr( 'балалайка', 'ала' ) должна возвращать 1, а не 2.
10. Напишите функцию NonAlpha(str: string), которая получает параметр str типа string и возвращает позицию его первой литеры, не являющейся буквой (как латинского, так и русского алфавитов) строчной или прописной. Например, NonAlpha( 'stev7n' ) дает 5.
11. Напишите функцию Splite(name: string; var first, last : string ), которая из параметра name, хранящего имя и фамилию человека, извлекает их в first (имя) и last (фамилия). Имя и фамилия разделены некоторым числом пробелов. Например, после обращения Splite('Вася Иванов', str1,str2) в str1 должно оказаться 'Вася', а в str2 — 'Иванов'. Необходимо также предусмотреть обнаружение и обработку некорректных данных. В частности, если в name вообще не окажется ни одного пробела, процедура должна установить в обоих выходных параметрах специальное значение 'error' (ошибка). Какие еще ошибочные ситуации следует учесть?
12. Пусть даны две строки str1 и str2. Необходимо выяснить, можно ли из str1 путём перестановки литер получить строку str2. Напишите подпрограмму, которая решала бы указанную задачу.
13. Напишите процедуру SortMid, которая сортировала бы ряд из n строк в алфавитном порядке, основываясь на k–ой литере каждой строки, где k является параметром, передаваемым процедуре SortMid. Например, если k=3, то элементы ряда должны быть отсортированы по возрастанию значения в третьей литере каждой строки. Если длина строки меньше k, то будем предполагать, что его k–ой литерой, реально не существующей, служит пробел.
14. Напишите процедуру сортировки строк в обратном алфавитном порядке.
15. Напишите подпрограммы Encode (зашифровать) и Decode (расшифровать), которые получают два параметра str и alpha типа string. В первом параметре задается слово, подлежащее шифрованию (расшифровке), второй представляет собой некоторую перестановку 26 латинских букв алфавита. Принцип преобразования для шифрации состоит в следующем. Если некоторая буква в str является k–ой буквой в обычном алфавите, то вместо нее должна быть взята буква из k–ой позиции "нового" алфавита alpha. Для подпрограммы дешифровки используется обратный принцип.
16. Расширим предыдущую задачу. Напишите программу для тестирования Encode и Decode. Она должна начинаться с ввода ключа для шифрования и дешифрации — 26–буквенной строки. Затем вводится серия строк, подлежащих обработке. Над каждой строкой применяется сначала операция шифрования, а затем дешифрации. При этом необходимо контролировать некоторые ошибочные ситуации. Например, каждая содержащаяся в ключе буква должна быть представлена только один раз.
17. Написать программу, которая будет вводить значения типа string и определять, является ли каждое из них правильным идентификатором, удовлетворяющем требованиям Паскаля. Напомним, вкратце правила построения имен. Всякое имя может содержать от 1 до 127 литер; первой литерой должна быть буква (строчная или прописная); любая другая литера (начиная со второй) может быть буквой, цифрой (от 0 до 9) или знаком подчеркивания. Если обнаружена ошибка, необходимо выдать сообщение, квалифицирующее ее.
18. Усовершенствуйте программу из предыдущей задачи, чтобы она умела распознавать служебные слова Паскаля и отвергать попытки их предъявления. Для простоты ограничьте набор служебных слов, взяв за основу только некоторые из них.
19. Усовершенствуйте программу из задачи 18, сделав возможным автоматическое преобразование неправильных идентификаторов в синтаксически допустимые. Если исходная строка имеет слишком большую длину, укоротите её до допустимого размера путем отбрасывания избыточных литер; если она пуста, добавьте букву 'x'. Если первая литера не является буквой, то вставьте перед ней 'x'. Если в строке присутствуют какие-то "незаконные" литеры, удалите их.
20. Задано десять русских имен. В тексте проверить, все ли эти имена написаны с большой буквы, если нет, то исправить.
21. Дана строка. Определить, стоят ли в данной строке подряд символы ?а? и ?б?.
22. Дана строка. Определить, есть ли в этой строке символы ?А? и ?Е?, а также количество каждого из этих символов.
23. Дана строка. Определить, сколько в ней знаков '+', и заменить их на '–'.
24. Дана строка. Определить, есть ли в ней все буквы, входящие в слово ?шина?.
25. Дана строка. Определить, какие символы и сколько раз встречаются в данной строке.
26. В заданной строке установить пробелы вместо символов, номера позиций которых при делении на 4 дают в остатке 3.
27. Дана строка. Найти слова, которые имеют четную длину и начинаются с заданного символа.
28. Вывести строку длины N (N — четное), которая состоит из чередующихся символов C1 и C2, начиная с C1.
29. Дана строка. Вывести строку, содержащую те же символы, но расположенные в обратном порядке.
30. Дана строка. Вывести коды ее первого и последнего символа.
31. Дана строка. Подсчитать количество содержащихся в ней цифр1|[прописных букв]2|[строчных букв]3.
32. Дана строка. Преобразовать все строчные1|прописные2 латинские3|русские4 буквы в прописные1|строчные2.
33. Дана строка. Если она представляет собой запись целого числа, то вывести 1; если вещественного (с дробной частью), то вывести 2; если строку нельзя преобразовать в число, то вывести 0.
34. Дано целое число. Вывести набор символов, содержащий цифры этого числа в исходном1|обратном2 порядке.
35. Дана строка S, изображающая вещественное число в формате с плавающей точкой, и целое число N (N> 0). Вывести набор символов, изображающих первые N цифр дробной части этого вещественного числа (без округления).
36. Дана строка, изображающая целое число. Вывести сумму цифр этого числа.
37. Дана строка S и число N. Преобразовать строку S в строку длины N следующим образом: если длина строки S больше N, то отбросить первые символы, если длина строки S меньше N, то в ее начало добавить символы ?.? (точка).
38. Даны два числа: N1 и N2, и две строки: S1 и S2. Получить из этих строк новую строку, объединив N1 первых символов строки S1 и N2 последних символов строки S2.
39. Даны две строки: S1 и S2. Проверить, содержится ли строка S2 в строке S1. Если да, то вывести номер позиции, начиная с которой S2 содержится в S1, если нет, то вывести 0.
40. Даны две строки: S1 и S2. Определить количество вхождений строки S2 в строку S1.
41. Дана строка S и символ C. Удвоить каждое вхождение символа C в строку S.
42. Даны строки S1, S2 и символ C. Перед1|после2 каждого вхождения символа C в строку S1 вставить строку S2.
43. Даны две строки: S1и S2. Удалить из строки S1первую1|последнюю2|все3 подстроки, совпадающие с S2. Если таких подстрок нет, то вывести S1без изменений.
44. Даны три строки: S1, S2, S3. Заменить в строке S1 первое1|последнее2|все3 вхождения строки S2 на S3.
45. Дана строка. Вывести подстроку, расположенную между первой и второй1|последней2 точками исходной строки. Если в строке менее двух точек, то вывести всю исходную строку.
46. Дана строка, состоящая из русских слов, разделенных пробелами (одним или несколькими). Определить количество слов в строке.
47. Дана строка, состоящая из русских слов, разделенных пробелами (одним или несколькими). Определить количество слов, которые [начинаются и заканчиваются одной и той же буквой]1|[содержат хотя бы одну букву ?А?]2.
48. Дана строка, состоящая из русских слов, разделенных пробелами (одним или несколькими). Определить количество слов, которые содержат ровно три буквы ?А? .
49. Дана строка, состоящая из русских слов, разделенных пробелами (одним или несколькими). Определить длину самого короткого1|длинного2 слова.
50. Дана строка, состоящая из русских слов, разделенных пробелами (одним или несколькими). Вывести строку, содержащую эти же слова, но разделенные одним символом ?.? (точка). В конце точку не ставить.
51. Дана строка, состоящая из русских слов, разделенных пробелами (одним или несколькими). Вывести строку, содержащую эти же слова (разделенные одним пробелом), но расположенные в обратном порядке.
52. Дана строка, состоящая из русских слов, разделенных пробелами (одним или несколькими). Преобразовать каждое слово в строке, удалив из него все последующие1|предыдущие2 вхождения первой1|последней2 буквы этого слова (количество пробелов между словами не изменять).
53. Дана строка, состоящая из русских слов, разделенных пробелами (одним или несколькими). Вывести строку, содержащую эти же слова (разделенные одним пробелом), но расположенные в алфавитном порядке.
54. Дана строка-предложение на русском языке. Преобразовать строку так, чтобы каждое слово начиналось с заглавной буквы.
55. Дана строка-предложение на русском языке. Подсчитать количество содержащихся в строке [знаков препинания]1|[гласных букв]2.
56. Дана строка-предложение на русском языке. Вывести самое короткое1|длинное2 слово в предложении (если таких слов несколько, то вывести первое3|последнее4 из них).
57. Дана строка-предложение, содержащая избыточные пробелы. Преобразовать ее так, чтобы между словами был ровно один пробел.
58. Дана строка, содержащая полное имя файла, то есть имя диска, список каталогов (путь), собственно имя и расширение. Выделить из этой строки имя1|расширение2 файла.
59. Дана строка, содержащая полное имя файла. Выделить из строки название последнего каталога (без символов ?\? ). Если файл содержится в корневом каталоге, то вывести символ ?\?.
60. Дана строка-предложение на русском языке. Зашифровать ее, выполняя циклическую замену каждой буквы на следующую за ней в алфавите и сохраняя при этом регистр букв (?А? перейдет в ?Б? , ?а? — в ?б? , ?Б? — в ?В? , ?я? — в ?а? и т.д.). Букву ?ё? в алфавите не учитывать (?е? должна переходить в ?ж? ). Знаки препинания и пробелы не изменять.
61. Дана строка-предложение на русском языке и число k (0 62. Дано зашифрованное предложение на русском языке (способ шифрования описан в задании 41) и кодовое смещение k (0 63. Дано зашифрованное предложение на русском языке (способ шифрования описан в задании 41) и его расшифрованный первый символ C. Определить кодовое смещение k и расшифровать предложение.
64. Дана строка-предложение. Зашифровать ее, поместив вначале все символы, расположенные на четных местах, а затем, в обратном порядке, все символы, расположенные на нечетных местах (например, строка ?Программа? превратится в ?ргамамроП? ).
65. Дано предложение, зашифрованное по правилу, описанному в предыдущем задании. Расшифровать это предложение.
66. Дана строка, содержащая несколько круглых скобок. Если скобки расставлены правильно (то есть каждой открывающей соответствует одна закрывающая), то вывести число 0. В противном случае вывести или номер позиции, в которой расположена первая ошибочная закрывающая скобка, или, если закрывающих скобок не хватает, число –1.
67. Дана строка, содержащая комментарии типа {...}. Создать другую строку, содержащую тот же текст, но без комментариев.
68. Дана строка, состоящая из русских слов, разделенных пробелами (одним или несколькими). Определить, сколько слов в строке являются перевертышами, и вывести эти слова.
69. Дана строка, содержащая некоторый текст. Определить, является ли данный текст палиндромом, т.е. читается ли он слева направо так же, как и справа налево (например, ?А роза упала на лапу Азора?).
70. Дана строка, состоящая из латинских букв, в которой слова разделены пробелами (одним или несколькими). Напечатать те слова строки, которые отличны от последнего слова и удовлетворяют следующему свойству:
a) слово симметрично;
b) первая буква слова входит в него еще раз;
c) слово совпадает с начальным отрезком латинского алфавита (?a?, ?ab?, ?abc? и т.д.);
d) слово совпадает с конечным отрезком латинского алфавита (?z?, ?yz?, ?xyz? и т.д.);
e) длина слова максимальна;
f) в слове нет повторяющихся букв;
g) каждая буква входит в слово не менее двух раз;
h) в слове гласные буквы (?a?, ?e?, ?i?, ?o?, ?u?) чередуются с согласными.
Входные строковые параметры, если они не изменяются в теле процедуры/функции, для экономии памяти рекомендуется описывать как параметры-константы.
71. Описать функцию IsIdent(S) целого типа, проверяющую, является ли строка S допустимым идентификатором Паскаля. При утвердительном ответе возвращается 0. Если S является пустой строкой, то возвращается –1, если строка начинается с цифры, то возвращается –2. Если S содержит недопустимые символы, то возвращается номер первого недопустимого символа.
72. Описать функцию FillStr(S, Len) строкового типа, возвращающую строку длины Len, заполненную повторяющимися копиями строки-шаблона S (последняя копия строки-шаблона может входить в результирующую строку частично).
73. Описать процедуру UpCase(S)1|LowCase(S)2, преобразующую все строчные1|прописные2 буквы строки S в прописные1|строчные2 (остальные символы строки S не изменяются).
74. Описать процедуру TrimL(S)1|TrimR(S)2|Trim(S)3, удаляющую в строке S начальные1|конечные2|[начальные и конечные]3 пробелы.
75. Описать функцию PosLast(subS, S) целого типа, возвращающую номер позиции, с которой в строке S содержится последнее вхождение подстроки subS. Если в строке S отсутствуют подстроки subS, то функция возвращает 0.
76. Описать функцию PosK(subS, S, k) целого типа, возвращающую номер позиции, с которой в строке S содержится k-е вхождение подстроки subS (k > 0). Если количество вхождений subS в строке S меньше k, то функция возвращает 0.
77. Описать функцию WordN(S, k) строкового типа, возвращающую k-е слово строки S (под словом понимается набор символов, не содержащий пробелов и ограниченный пробелами или началом/концом строки). Если количество слов в строке меньше k, то функция возвращает пустую строку. Используя эту функцию, выделить из данной строки S слова с номерами k1, k3, k3.
78. Описать процедуру SplitStr(S, W, N), которая формирует по данной строке S набор слов W, входящих в S (W — выходной строковый массив; N — его размер; предполагается, что N не будет превышать 10). Под словом понимается набор символов, не содержащий пробелов и ограниченный пробелами или началом/концом строки. Используя эту функцию, вывести количество слов N, содержащихся в данной строке S, и сами эти слова.
6. Одномерные массивы
6.1. Примеры
6.1.1. Пример 1: умножение матрицы на строку
Рассмотрим задачу умножения матрицы 3*3, состоящую из целых чисел, на столбец с использованием компонентов TStringGrid.
Создадим новый проект и на форму выставим три компонента TStringGrid и кнопку Button1. В первых двух таблицах данные будут вводиться, а в третьей будет выводится столбец результата умножения.
В Инспекторе Объектов изменим свойства компонентов:
StringGrid1
ColCount 3 Число столбцов
RowCount 3 Число строк
DefaultColWidth 60 Ширина колонок
DefaultRowHeight 20 Высота строк
FixedCols 0 Нет фиксированных столбцов
FixedRows 0 Нет фиксированных строк
Options […,goEditing] Ячейки можно редактировать
StringGrid2
ColCount 1 Число столбцов
RowCount 3 Число строк
DefaultColWidth 60 Ширина колонок
DefaultRowHeight 20 Высота строк
FixedCols 0 Нет фиксированных столбцов
FixedRows 0 Нет фиксированных строк
Options […,goEditing] Ячейки можно редактировать
StringGrid3
ColCount 1 Число столбцов
RowCount 3 Число строк
DefaultColWidth 60 Ширина колонок
DefaultRowHeight 20 Высота строк
FixedCols 0 Нет фиксированных столбцов
FixedRows 0 Нет фиксированных строк
Button1
Caption Exit

В результате форма должна принять вид как на рис. 6.4.
Мы будем разрешать ввод только целых чисел и, поэтому, на событие onGetEditMask компонента StringGrid1 создадим обработчик события, задающий маску редактора строки:
procedure TForm1.StringGrid1GetEditMask(Sender:
TObject; ACol,ARow: Integer; var Value: String);
begin
Value :='00000;1; ';
end;
Точно такой же обработчик события создадим для компонента StringGrid2.
Для первоначального заполнения таблиц в момент активизации формы заполним нулями ячейки таблиц StringGrid1 и StringGrid2:
procedure Tform1.FormActivate(Sender: Tobject);
var i,j: byte;
begin
with StringGrid1 do
for i:=0 to ColCount-1 do
for j:=0 to RowCount-1 do Cells[i,j]:='0';
with StringGrid2 do
for i:=0 to RowCount-1 do Cells[0,i]:='0';
end;
Основное событие таблицы StringGrid1 (заполнение ячеек третьей таблицы) назначим на событие onSetEditText, возникающее при изменении содержимого ячейки:
procedure Tform1.StringGrid1SetEditText(Sender:
Tobject; Acol,Arow: Integer; const Value: String);
var i,j,Sum: integer;
begin
for j:=0 to StringGrid1.ColCount-1 do begin
Sum:=0;
for i:=0 to StringGrid1.ColCount-1 do begin
Sum:=Sum+MyStrToInt(StringGrid1.Cells[i,j])*
MyStrToInt(StringGrid2.Cells[0,i]);
end;
StringGrid3.Cells[0,j]:=IntToStr(Sum);
end;
end;
Такое же событие для компонента StringGrid2 в Инспекторе Объектов направим на событие StringGrid1SetEditText.
Преобразование содержимого ячеек реализует целочисленная функция MyStrToInt:
function TForm1.MyStrToInt(s: string): integer;
var k,Code: integer;
begin
while (s'') and (s[Length(s)]=' ') do
Delete(s,Length(s),1);
if s'' then begin
Val(s,k,Code);
if Code=0
then MyStrToInt:=k
else MyStrToInt:=0;
end
else MyStrToInt:=0;
end;
которая очищает строку от пробелов и проверяет возможность преобразования строки в число.
6.1.2. Пример 2. Неповторяющиеся элементы массива
Даны целые числа, среди которых могут быть повторяющиеся. Составить новый массив из неповторяющихся чисел.
Создадим новый проект и запишем его в отдельную папку. На форму выставим следующие компоненты: таблицу StringGridFirst для ввода элементов массива; таблицу StringGridLast для вывода искомого массива; кнопку BitBtnAdd для добавления новых строк; кнопку BitBtnDelete для удаления строк; кнопку BitBtnArray для создания искомого массива (рис. 2).

Для кнопки BitBtnAdd создадим обработчик события onClick:
procedure TFormMain.BitBtnAddClick( Sender: TObject);
begin
with StringGridFirst do
RowCount:=RowCount+1;
end;
Для кнопки BitBtnDelete создадим обработчик события onClick:
procedure TFormMain.BitBtnDeleteClick(Sender: TObject);
var i,j: integer;
begin
with StringGridFirst do begin
for i:=Row+1 to RowCount-1 do
for j:=0 to ColCount-1 do Cells[j,i-1]:=Cells[j,i];
RowCount:=RowCount-1;
end;
end;
И, наконец, для кнопки BitBtnArray создадим обработчик:
procedure TFormMain.BitBtnArrayClick(Sender: TObject);
var
Ar : array of integer; // динамический массив
i,L,Code: integer;
x : integer;
Err : boolean;

function Test(x: integer): boolean;
// проверка: х не входит в массив
var i: integer;
begin
i:=-1; Result:=false;
while (i Inc(i); Result := x=Ar[i];
end;
end;

begin
Err:=false;
with StringGridFirst do begin
L:=0;
for i:=1 to RowCount-1 do begin
Val(Cells[1,i],x,Code); // преобразуем: строка в число
if Code0 then begin // превращение не удалось
ShowMessage('Ошибка в строке '+IntToStr(i));
Err:=true; Break; // выходим из цикла
end;
// проверяем: число не входит в Ar
if not Test(x) then begin // добавляем в массив
Inc(L); SetLength(Ar,L);
Ar[L-1]:=x;
end;
end;
end;
if not Err then // если нет ошибки, формируем таблицу
with StringGridLast do begin
RowCount:=L+1;
for i:=0 to L-1 do Cells[1,i+1]:=IntToStr(Ar[i]);
end;
end;
6.2. Задания
1. Даны действительные числа x1, x2, ... , xn, y1, y2, ... , yn, r1, r2, ... , rn. Выяснить, есть ли на плоскости точка, принадлежащая всем кругам с1, с2, ... , сn, где ci имеет центр с координатами xi, yi и радиус ri.
2. Даны действительные числа a1, a2, ... , a2n. Эти точки определяют n интервалов числовой оси (a1, a2), (a3, a4), ..., (a2n-1, a2n). Является ли интервалом объединение этих интервалов? Если да, то указать концы этого интервала.
3. Даны действительные числа a1, a2, ..., a2n. Эти точки определяют n интервалов числовой оси (a1, a2), (a3, a4), ..., (a2n-1, a2n). Имеются ли точки числовой оси, принадлежащие по крайней мере трем каким-нибудь из данных интервалов. Если да, то указать какую-нибудь из этих точек.
4. Даны целые числа a1, a2, ..., an. Пусть M — наибольшее, m — наименьшее из них. Получить в порядке возрастания все целые числа из интервала (m, M), которые не входят в последовательность a1, a2, ..., an.
5. Даны координаты центров n окружностей и их радиусы. Определить число пересекающихся окружностей.
6. Все отрицательные элементы массива X перенести в его начало, а все остальные – в конец, сохраняя исходное взаимное расположение как среди отрицательных, так и среди остальных элементов. Дополнительный массив не заводить.
7. Переменной t присвоить значение true, если в массиве нет нулевых элементов и при этом положительные элементы чередуются с отрицательными и значение false в противном случае.
8. Имеются десять гирь весом a1, a2, ..., a10. Обозначим через ck – число способов, которыми можно составить вес k, то есть ck – это число решений уравнения a1x1 + a2x2 +...+ a10x10 = k, где xi может принимать значения 0 или 1 (i=1,..., 10). Получить с0, с1, ..., с10.
9. Прямая на плоскости может быть задана уравнением ax + by = c, где a, b одновременно не равны нулю, a, b, c – целые. Пусть даны коэффициенты нескольких прямых a1, b1, c1, a2, b2, c2, ..., an, bn, cn. Определить, имеются ли среди этих прямых совпадающие или параллельные.
10. Прямая на плоскости может быть задана уравнением ax + by = c, где a, b одновременно не равны нулю, a, b, c – целые. Пусть даны коэффициенты нескольких прямых a1, b1, c1, a2, b2, c2, ..., an, bn, cn. Определить, имеются ли среди этих прямых три прямые, пересекающиеся в одной точке.
11. Даны две последовательности по n чисел в каждой. Найти наименьшее среди тех чисел первой последовательности, которые не входят во вторую (считать, что хотя бы одно такое число есть).
12. Даны натуральное число n, целые числа a, x1, x2, ..., xn. Если в последовательности x1, x2, ..., xn есть хотя бы один член, равный a, то получить сумму всех членов, следующих за первым таким членом, иначе найти минимальный среди нечетных чисел последовательности x1, x2, ..., xn.
13. Даны целые числа a1, a2, ..., an, среди которых могут быть повторяющиеся. Составить новый массив из чисел, которые входят в последовательность по одному разу.
14. Даны целые числа a1, a2, ..., an, среди которых могут быть повторяющиеся. Составить новый массив из чисел, взятых по одному из каждой группы равных членов данной последовательности.
15. Даны натуральные числа k, n, действительные числа a1, a2, ..., akn. Получить последовательность min(a1, a2, ..., ak), min(ak+1, ak+2, ..., a2k), ..., min(ak(n-1)+1, ..., akn).
16. Даны натуральные числа k, n, действительные числа a1, a2, ..., akn. Получить последовательность max(a1, a2, ..., ak), max(ak+1, ak+2, ..., a2k), ..., max(ak(n-1)+1, ..., akn).
17. Даны натуральные числа k, n, действительные числа a1, a2, ..., akn. Получить min(a1 + a2 + ... + ak, ak+1 + ak+2 + ... + a2k, ..., ak(n-1)+1 + ... + akn).
18. Сформировать одномерный массив размера N по следующему принципу: четные элементы равны квадрату индекса, а нечетные его обратной величине.
19. Заполнить одномерный массив размера N так, чтобы каждый элемент с четным индексом был равен половине своего номера, а каждый элемент с нечетным индексом – 0.
20. Даны два массива А(N) и В(N).Сформировать С(N) такой, что С[i]=А[i]/B[i], если i нечетное, и C[i]=A[i]*B[i], если i четное.
21. Дан массив размера N. Вывести его элементы в обратном порядке.
22. Подсчитать сумму элементов одномерного массива.
23. Подсчитать сумму элементов двухмерного массива.
24. Найти максимальный элемент в массиве. Найти индекс максимального элемента.
25. Найти минимальный элемент в массиве. Найти индекс минимального элемента.
26. Поменять местами минимальный и максимальный элементы массива.
27. Найти среднее арифметическое элементов массива.
28. Вывести всех элементов массива из интервала C..D.
29. Массив размера N заполнен случайными числами от –15 до 15.Определить количество отрицательных элементов и их индексы.
30. Дан массив размера N. Осуществить циклический сдвиг элементов массива влево (вправо) на одну позицию.
31. Дан массив размера N и число k (0 32. Вывести наиболее часто встречающийся элемент массива.
33. Проверить, все ли элементы массива различны.
34. Проверить, имеется ли в массиве размера N. хотя бы одна пара чисел, совпадающих по величине.
35. Дан массив размера N. Определить индексы всех равных элементов.
36. Дан массив размера N. Вывести вначале его элементы с четными (нечетными) индексами, а затем — с нечетными (четными).
37. Дан целочисленный массив A размера N. Вывести номер первого (последнего) из тех его элементов A[i], которые удовлетворяют двойному неравенству: A[1] 38. Дан целочисленный массив A размера N и два числа x и y (x 39. Дан целочисленный массив размера N. Преобразовать его, прибавив к четным (нечетным) числам первый (последний) элемент. Первый и последний элементы массива не изменять.
40. Дан целочисленный массив размера N. Вывести вначале все его четные (нечетные) элементы, а затем — нечетные (четные).
41. Дан целочисленный массив размера N. Изменить знак всех элементов с четными индексами на противоположный.
42. Дан целочисленный массив размера N. Заменить нулевые элементы квадратами их индексов.
43. Дан целочисленный массив размера N. Поменять местами соседние четные и нечетные по номеру элементы. Указание: дополнительные массивы не использовать.
44. Заменить все положительные (отрицательные) элементы целочисленного массива на значение минимального (|максимального).
45. Дан массив размера N. Переставить в обратном порядке элементы массива, расположенные между его минимальным и максимальным элементами.
46. Проверить, образуют ли элементы целочисленного массива размера N арифметическую прогрессию. Если да, то вывести разность прогрессии, если нет — вывести 0.
47. Проверить, образуют ли элементы целочисленного массива размера N геометрическую прогрессию. Если да, то вывести знаменатель прогрессии, если нет — вывести 0.
48. Дан массив ненулевых целых чисел размера N. Проверить, чередуются ли в нем четные и нечетные числа. Если чередуются, то вывести 0, если нет, то вывести номер первого элемента, нарушающего закономерность.
49. Дан массив ненулевых целых чисел размера N. Проверить, чередуются ли в нем положительные и отрицательные числа. Если чередуются, то вывести 0, если нет, то вывести номер первого элемента, нарушающего закономерность.
50. Дан массив ненулевых целых чисел размера N. Определить число соседств из двух чисел разного знака.
51. Дан массив размера N. Вычислить сумму произведений всех пар соседних чисел.
52. Дан массив размера N. Вычислить сумму произведений всех троек соседних чисел.
53. Дан массив размера N. Определить количество пар соседних чисел, являющихся противоположными.
54. Дан массив размера N. Определить произведение нечетных элементов, имеющих четные индексы.
55. Дан массив размера N. Найти количество его локальных минимумов.
56. Дан массив размера N. Найти количество его локальных максимумов.
57. Дан массив размера N. Найти максимальный из его локальных минимумов.
58. Дан массив размера N. Найти минимальный из его локальных максимумов.
59. Дан массив размера N. Определить количество участков, на которых его элементы монотонно возрастают.
60. Дан массив размера N. Определить количество участков, на которых его элементы монотонно убывают.
61. Дан массив размера N. Определить количество его промежутков монотонности (то есть участков, на которых его элементы возрастают или убывают).
62. Дано вещественное число R и массив размера N. Найти элемент массива, который наиболее близок к данному числу.
63. Дано вещественное число R и массив размера N. Найти элемент массива, который наименее близок к данному числу.
64. Дано вещественное число R и массив размера N. Найти два элемента массива, сумма которых наиболее близка к данному числу.
65. Дано вещественное число R и массив размера N. Найти два элемента массива, сумма которых наименее близка к данному числу.
66. Дан массив размера N. Найти номера двух ближайших чисел из этого массива.
67. Дан целочисленный массив размера N. Определить максимальное количество его одинаковых элементов.
68. Дан целочисленный массив размера N. Удалить из массива все элементы, встречающиеся менее двух раз.
69. Дан целочисленный массив размера N. Удалить из массива все элементы, встречающиеся более двух раз.
70. Дан целочисленный массив размера N. Удалить из массива все элементы, встречающиеся ровно два раза.
71. Дан целочисленный массив размера N. Удалить из массива все элементы, встречающиеся ровно три раза.
72. Дан целочисленный массив размера N, содержащий большое количество нулевых элементов. Заменить все группы подряд встречающихся нулей на один нуль.
73. Дан целочисленный массив размера N, содержащий большое количество нулевых элементов. Заменить группы элементов, состоящие из нечетного количества нулей, на один нулевой элемент, а из четного – на два.
74. Дан целочисленный массив размера N, содержащий большое количество нулевых элементов. Заменить все группы подряд встречающихся нулей на элемент, состоящий из двух цифр, где первая цифра – 0, а вторая – количество нулей в группе.
75. Дан целочисленный массив размера N. Если он является перестановкой, то есть содержит все числа от 1 до N, то вывести 0, в противном случае вывести номер первого недопустимого элемента.
76. Дан массив размера N. Преобразовать его, вставив перед1|после2 каждого положительного3|отрицательного4 элемента нулевой элемент.
77. Дан целочисленный массив размера N. Назовем серией группу подряд идущих одинаковых элементов, а длиной серии — количество этих элементов (длина серии может быть равна 1). Вывести массив, содержащий длины всех серий исходного массива.
78. Дан целочисленный массив размера N. Преобразовать массив, увеличив1|уменьшив2 каждую его серию на один элемент.
79. Дан целочисленный массив размера N. Преобразовать массив, увеличив первую1|последнюю2|все3 серии наибольшей длины на один элемент.
80. Дан целочисленный массив размера N. Вставить перед1|после2 каждой серии нулевой элемент.
81. Дано число k и целочисленный массив размера N. Поменять местами первую1|последнюю2 и k-ю серии массива. Если серий в массиве меньше k, то вывести массив без изменений.
82. Дано число k и целочисленный массив размера N. Удалить из массива все серии, длина которых меньше1|равна2|больше3 k.
83. Дано число k и целочисленный массив размера N. Заменить каждую серию, длина которой меньше1|равна2|больше3 k, на один нулевой элемент.
84. Даны два массива A и B размера 5, элементы которых упорядочены по возрастанию1|убыванию2. Объединить эти массивы так, чтобы результирующий массив остался упорядоченным.
85. Дан массив размера N. Вывести индексы массива в том порядке, в котором соответствующие им элементы образуют возрастающую1|убывающую2 последовательность.
86. Дана точка A и множество (массив) B из N точек. Найти номер точки из множества (массива)B, наиболее близкой1|удаленной2 от точки A.
87. Дано множество A из N точек. Среди всех точек этого множества, лежащих в первой1|второй2|третьей3|четвертой4 четверти, найти точку, наиболее близкую5|удаленную6 от начала координат. Если таких точек нет, то вывести точку с нулевыми координатами.
88. Дано множество A из N точек. Найти пару различных точек этого множества с минимальным1|максимальным2 расстоянием между ними и само это расстояние (точки выводятся в том же порядке, в котором они перечислены при задании множества A).
89. Дано множество A из N точек. Найти такую точку из данного множества, сумма расстояний от которой до остальных его точек минимальна1|максимальна2, и саму эту сумму.
90. Даны множества A и B, состоящие соответственно из N1 и N2 точек. Найти минимальное1|максимальное2 расстояние между точками этих множеств и сами точки, расположенные на этом расстоянии.
91. Дано множество A из N точек. Найти наименьший1|наибольший2 периметр треугольника, вершины которого принадлежат различным точкам множества A, и сами эти точки (точки выводятся в том же порядке, в котором они перечислены при задании множества A).

7. Матрицы
7.1. Пример

7.2. Задания

1. Дано натуральное число n. Получить вещественную матрицу A, для которой
;

2. Дана вещественная матрица A. Получить матрицу A?=B?C, где

3. Получить вещественную матрицу A размерности 7?7, первая строка которой задается формулой (j = 1, ..., 7), вторая строка задается формулой (j = 1, ..., 7), а каждая следующая строка есть сумма двух предыдущих.
4. Дано натуральное число n и вещественная матрица размера n?9. Найти среднее арифметическое:
4.1. каждого из столбцов;
4.2. каждого из столбцов, имеющих четные номера.
5. Дано натуральное число n. Выяснить, сколько положительных элементов содержит матрица A размерности n?n, если

6. Дана действительная матрица размера n?m, в которой не все элементы равны нулю. Получить новую матрицу путем деления всех элементов данной матрицы на ее наибольший по модулю элемент.
7. Даны натуральное число m, числа и целочисленная квадратная матрица порядка m. Строку с номером i назовем отмеченной, если , и неотмеченной в противном случае.
8. Нужно все элементы, расположенные в отмеченных строках матрицы, преобразовать по правилу: отрицательные элементы заменить на -1, положительные — на 1, а нулевые оставить без изменения.
9. Подсчитать число отрицательных элементов матрицы, расположенных в отмеченных строках.
10. Дана вещественная квадратная матрица порядка 12. Заменить нулями все ее элементы, расположенные на главной диагонали и выше нее.
11. Даны вещественные числа . Получить квадратную матрицу порядка 8, образованную по правилу:

12. Будем называть соседями элемента с индексами i, j некоторой матрицы такие элементы этой, соответствующие индексы которых отличатся от i, j не более чем на единицу. Для данной целочисленной матрицы А ( ) размерности m?m найти матрицу В, состоящую из нулей и единиц, элемент которой равен единице, когда среди соседей есть не менее двух совпадающих с .
13. Элемент матрицы назовем седловой точкой, если он является наименьшим в своей строке и одновременно наибольшим в своем столбце или, наоборот, является наибольшим в своей строке и наименьшим в своем столбце. Для заданной целой матрицы размером 10 ? 15 напечатать индексы всех ее седловых точек.
14. Выполнить следующие задания, используя процедуры и функции.
15. Для заданной вещественной матрицы определить, образуют ли ее элементы упорядоченную последовательность следующего вида:

16. В квадратной матрице определить количество строк
16.1. упорядоченных по возрастанию;
16.2. упорядоченных по убыванию;
16.3. состоящих из равных элементов;
16.4. неупорядоченных.
17. Использовать функцию, определяющую тип каждой строки.
18. Задано конечное множество имен жителей некоторого города, причем для каждого из жителей перечислены имена его детей. Жители А и Б называются родственниками, если:
18.1. либо А — ребенок Б
18.2. либо Б — ребенок А
18.3. либо существует некий В такой, что А является родственником В, а В является родственником Б.
19. Перечислить все пары жителей города, которые являются родственниками.
20. Проверить свойство АТТ=(АТ)Т=А, где А — исходная матрица (n?n), знак Т означает транспонирование. Использовать процедуру транспонирования.
21. В матрице А(n?n) определить количество строк, элементы которой образуют арифметическую прогрессию. Использовать подпрограмму проверки строки.
22. В заданной матрице А(n?n) найти максимум из всех минимальных элементов матрицы по столбцам.
23. В заданной матрице А(n?n) найти минимум всех сумм абсолютных величин элементов матрицы по столбцам. Для нахождения суммы абсолютных величин столбца использовать функцию.
24. Подсчитать количество строк матрицы А(n?n), элементы которых образуют монотонную последовательность. Для определения монотонности использовать процедуру.
25. Уплотнить матрицу А(n?n) влево и вверх. Для выявления нулевых строк и столбцов и столбцов использовать подпрограмму.
26. Матрица А(n?n) просматривается сверху вниз про строкам. Найти скалярное произведение строки и столбца, соответствующих строке с первым найденным отрицательным элементом и последним нулевым.
27. Упорядочить строки матрицы по возрастанию их евклидовых норм.
28. Проверить, есть ли в матрице А(n?n) строки не содержащие более двух отрицательных элементов.
29. Дана матрица А(n?n). Построить вектор, каждый элемент которого содержит наименьший по абсолютной величине элемент строки.
30. Составить программу поиска минимального элемента, расположенного под главной диагональю, и максимального элемента, расположенного над главной диагональю заданной вещественной матрицы А(n?n).
31. Заполнить квадратную матрицу N?N следующим образом: элементы, расположенные на главной диагонали, принять равными 1; выше главной диагонали – сумме индексов; ниже – их разности.
32. Заполнить квадратную матрицу N?N единицами и нулями в шахматном порядке, начиная с верхнего левого угла.
33. Дана матрица N?M. Определить сумму элементов, кратных 3, и количество отрицательных элементов.
34. Задана квадратная матрица N?N. Определить, где больше четных элементов: выше или ниже главной диагонали.
35. Дана квадратная целочисленная матрица N?N. Найти суммы элементов строк, имеющих четные элементы на главной диагонали.
36. Даны две квадратных матрицы A(N?N) и B(M ?M). Определить сумму элементов, расположенных на главных диагоналях.
37. Дана матрица N?M. Определить четные элементы, имеющие нечетную сумму индексов. Показать индексы этих элементов.
38. Задана квадратная матрица N?N. Найти суммы элементов тех строк, у которых элементы, расположенные на главной диагонали, равны нулю.
39. Дана действительная квадратная матрица N?N. Найти максимальный элемент на главной диагонали и вывести строку, в которой он находится.
40. Задана квадратная матрица N?N. Найти номер столбца К и строки L с максимальным произведением. Сформировать вектор В (2n), нечетные элементы которого равны сумме, а четные – разности элементов К-го столбца и L-й строки матрицы.
41. В матрице A(N?M) найти строку с максимальной суммой элементов и строку с минимальной суммой элементов. Далее сформировать вектор B(2?M), элементы которого чередовались бы с элементами максимальной и минимальной строк.
42. Дана действительная квадратная матрица N?N. Требуется переставить строки матрицы по возрастанию первых элементов строк.
43. Дана действительная квадратная матрица N?N. Требуется преобразовать матрицу: поэлементно вычесть последнюю строку из всех строк, кроме последней.
44. Задана прямоугольная матрица A(N?M). Найти k – номер строки с максимальной суммой элементов. Далее сформировать матрицу B(N?M), каждый элемент строки которой равнялся бы элементу соответствующей строки матрицы А, деленному на соответствующий элемент k-й строки.
45. Дана квадратная матрица A(N?N). За один просмотр элементов матрицы A(N?N). сформировать вектор С(N), каждый j-й элемент которого равен произведению элементов j-го столбца исходной матрицы, и вектор D(N), каждый j-й элемент которого равен сумме соответствующей строки матрицы А.
46. Задана квадратная матрица A(N?N). Найти k – номер столбца с максимальной суммой элементов и номер строки l c минимальной суммой элементов, а также элемент с минимальным значением в матрице А. Далее сформировать вектор Р(N), каждый элемент которого равен разности соответствующих элементов k-столбца и l-строки, деленной на минимальный элемент матрицы А.
47. Задана квадратная матрица A(N?N). Сформировать вектор Х(N), каждый элемент которого равен наибольшему значению элементов соответствующей строки исходной матрицы. Вычислить Х1Х5+ Х2Х4+ Х3Х3+ Х4Х2+ Х5Х1.
48. В данной целочисленной квадратной матрице A(N?N) указать индексы всех элементов, имеющих наибольшее значение.
49. Даны две прямоугольные матрицы A(N?M) и B(N?M). Найти матрицу C(N?M), элементы которой равны сумме соответствующих элементов матриц А и В, после чего произвести транспонирование полученной матрицы С.
50. Дана квадратная матрица A(N?N). За один просмотр найти строку с минимальной суммой элементов и строку с максимальной суммой элементов и образовать произведение этих строк.
8. Процедуры и функции
8.1. Пример

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

1. Дано число k (0 2. Дана матрица размера 5 x 9. Найти суммы элементов всех ее четных1|нечетных2 строк3|столбцов4.
3. Дана матрица размера 5 x 10. Найти минимальное1|максимальное2 значение в каждой строке3|столбце4.
4. Дана матрица размера 5 x 10. В каждой строке1|столбце2 найти количество элементов, больших3|меньших4 среднего арифметического всех элементов этой строки1|столбца2.
5. Дана матрица размера 5 x 10. Преобразовать матрицу, поменяв местами минимальный и максимальный элемент в каждой строке1|столбце2.
6. Дана матрица размера 5 x 10. Найти минимальное1|максимальное2 значение среди сумм элементов всех ее строк3|столбцов4 и номер строки3|столбца4 с этим минимальным1|максимальным2 значением.
7. Дана матрица размера 5 x 10. Найти минимальный1 или максимальный2 среди максимальных1 или минимальных2 элементов каждой строки3 или столбца4.
8. Дана целочисленная матрица размера 5 x 10. Вывести номер ее первой1|последней2 строки3|столбца4, содержащего равное количество положительных и отрицательных элементов (нулевые элементы не учитываются). Если таких строк3|столбцов4 нет, то вывести 0.
9. Дана матрица размера 5 x 10. Вывести номер ее первой1|последней2 строки3|столбца4, содержащего только положительные элементы. Если таких строк3|столбцов4 нет, то вывести 0.
10. Дана целочисленная матрица размера N?M. Различные строки (столбцы) матрицы назовем похожими, если совпадают множества чисел, встречающихся в этих строках (столбцах). Найти количество строк1|столбцов2, похожих на первую3|последнюю4 строку1|столбец2.
11. Дана целочисленная матрица размера N?M. Найти количество ее строк1|столбцов2, все элементы которых различны.
12. Дана целочисленная матрица размера N?M. Вывести номер ее первой1|последней2 строки3|столбца4, содержащего максимальное количество одинаковых элементов.
13. Дана квадратная матрица порядка N. Найти сумму элементов ее главной1|побочной2 диагонали.
14. Дана квадратная матрица порядка N. Найти суммы элементов ее диагоналей, параллельных главной1|побочной2 (начиная с одноэлементной диагонали A[1,N]1|A[1,1]2).
15. Дана квадратная матрица порядка M. Вывести минимальные1|максимальные2 из элементов каждой ее диагонали, параллельной главной3|побочной4 (начиная с одноэлементной диагонали A[1,M]3|A[1,1]4).
16. Дана квадратная матрица порядка M. Заменить нулями элементы матрицы, лежащие ниже1|выше2 главной3|побочной4 диагонали.
17. Дана квадратная матрица порядка M. Заменить нулями элементы, лежащие одновременно выше1|ниже2 главной диагонали (включая эту диагональ) и выше3|ниже4 побочной диагонали (также включая эту диагональ).
18. Дана квадратная матрица порядка M. Зеркально отразить ее элементы относительно [горизонтальной оси симметрии]1|[вертикальной оси симметрии]2|[главной диагонали]3|[побочной диагонали]4 матрицы.
19. Дана квадратная матрица порядка M. Повернуть ее на 901|1802|2703 градусов в положительном направлении.
20. Дана матрица размера N?M. Вывести количество строк1|столбцов2, элементы которых монотонно возрастают3|убывают4.
21. Дана матрица размера N?M. Найти минимальный1|максимальный2 среди элементов тех строк3|столбцов4, которые упорядочены либо по возрастанию, либо по убыванию. Если такие строки3|столбцы4 отсутствуют, то вывести 0.
22. Даны два числа k1 и k2 и матрица размера N?M. Поменять местами строки1|столбцы2 матрицы с номерами k1 и k2.
23. Дана матрица размера N?M. Поменять местами строки1|столбцы2, содержащие минимальный и максимальный элементы матрицы.
24. Дана матрица размера N?M. Поменять местами столбец с номером 11|M 2 и первый3|последний4 из столбцов, содержащих только положительные элементы.
25. Дано число k и матрица размера N?M. Удалить строку1|столбец2 матрицы с номером k.
26. Дана матрица размера N?M. Удалить строку1|столбец2, содержащий минимальный3|максимальный4 элемент матрицы.
27. Дана матрица размера N?M. Удалить первый1|последний2|все3 столбцы, содержащие только положительные элементы.
28. Дано число k и матрица размера N?M. Перед1|после2 строки3|столбца4 матрицы с номером k вставить строку3|столбец4 из нулей.
29. Дана матрица размера N?M. Продублировать строку1|столбец2 матрицы, содержащий ее минимальный3|максимальный4 элемент.
30. Дана матрица размера N?M. Перед1|после2 первого3|последнего4 столбца, содержащего только положительные элементы, добавить столбец, состоящий из единиц.
31. Дана целочисленная матрица размера N?M. Найти элемент, являющийся максимальным в своей строке и минимальным в своем столбце. Если такой элемент отсутствует, то вывести 0.
32. Дана матрица размера N?M. Элемент называется локальным минимумом (максимумом), если он меньше (больше) всех окружающих его элементов. Заменить все локальные минимумы1|максимумы2 данной матрицы на 0.
33. Дана матрица размера N?M. Поменять местами ее строки1|столбцы2 так, чтобы их минимальные3|максимальные4 элементы образовывали возрастающую5|убывающую6 последовательность.

9. Множества
9.1. Пример
В качестве второго примера рассмотрим проект, в котором читается текстовый файл и составляется словарь неповторяющихся слов. В качестве разделителей используются символы: ' ','.',',',';',':','=' (пробел, запятая, точка, точка с запятой, двоеточие и знак равенства).
Создадим новый проект, запишем его в новый каталог и на форму выставим следующие компоненты: Memo1, ListBox1, OpenDialog1, Button1, Button2, Button3 (рис. 6.9). В редакторе Объектов изменим свойства: Button1.Name=OkButton, Button2.Name=CloseButton, Button1.Caption=Ok, Button2.Caption=Close, Button3.Name = WorkButton, Button3.Caption=Work, OpenDialog1.Filter= pas|*.pas|All|*.*, OpenDialog1.DafaultExt=pas.

Рис. 1. Главная форма проекта
Двойным щелчком на компоненте OpenButton создадим обработчик события OpenButtonClick и напишем в нем код, который очистит строки компонента Memo1 и загрузит файл с именем OpenDialog1.FileName:
Листинг 1. Загрузить файл в TMemo
procedure TForm1.OpenButtonClick(Sender: TObject);
begin
if OpenDialog1.Execute then
begin
Memo1.Clear;
Memo1.Lines.LoadFromFile(OpenDialog1.FileName);
end;
end;
Двойным щелчком на компоненте WorkButton создадим обработчик события WorkButtonClick и напишем в нем код, который в цикле будет читать все строки компонента Memo1 и анализировать их. Если очередной символ строки не разделитель [' ','.',',',';',':','='], то этот символ добавляется к строке s0, иначе строка s0 методом AddStr добавляется к списку строк:
Листинг 2. Добавление неповторяющихся слов
procedure TForm1.WorkButtonClick(Sender: TObject);
const MySet=[' ','.',',',';',':','='];
var i,j: integer;
begin
for i:=0 to Memo1.Lines.Count-1 do
begin
s:=Memo1.Lines[i]; s0:=''; j:=0;
while j begin
Inc(j);
if not (s[j] in MySet)
then s0:=s0+s[j] else AddStr(s0);
end;
AddStr(s0);
end;
end;
Напишем метод добавления строки AddStr, в котором метод FindStr проверяет, что строка s не входила ранее в список строк компонента ListBox1:
Листинг 3. Процедура добавления слова
procedure TForm1.AddStr(s: string);
begin
if (s'') and not FindStr(s) then ListBox1.Items.Add(s);
end;
function TForm1.FindStr(s: string): boolean;
var i: integer;
begin
Result:=false; i:=-1;
while (i begin
Inc(i); Result:=s=ListBox1.Items[i];
end;
end;
Методы AddStr и FindStr должны быть прописаны в классе Form1.
9.2. Задания
1. Даны три множества Х1, Х2, Х3, содержащие целые числа из диапазона 1..100. Известно, что мощность каждого из этих множеств равна 10. Сформировать новое множество Y=( Х1 ? Х2) (Х2\ Х3), из которого выделить подмножество нечетных чисел. На экран вывести исходные и полученное множества. Значения элементов исходных множеств ввести с клавиатуры.
2. Даны три множества Х1, Х2, Х3, содержащие целые числа из диапазона 1..100. Известно, что мощность каждого из этих множеств равна 10. Сформировать новое множество Y=( Х1 ? Х2) (Х2 ? Х3) и вывести на экран его мощность. Проверить, есть ли в множестве Y числа, делящиеся на 6 без остатка. Значения элементов исходных множеств ввести с клавиатуры.
3. Даны два множества М и N, состоящие из 10 целых чисел из диапазона 1..100. Из данных множеств выделить соответственно подмножества М1 чисел, делящихся на 3 без остатка, и N1 чисел, делящихся на 2 без остатка. На печать вывести мощность и значения элементов множества MN= М1 ? N1.
4. Даны три множества Х1, Х2, Х3, содержащие целые числа из диапазона 100...200. Известно, что мощность каждого из этих множеств равна 10. Сформировать новое множество Y=( Х1 Х2) (Х1 Х3). На печать вывести множества Х1, Х2, Х3 и Y.
5. Даны три множества Х1= {1,2,3,...,20}, Х2= {10,20,30,...,30} и Х3= {1,3,5,...,19,21}. Сформировать множество Y= (Х1 Х2) (Х1 Х3) (Х2 Х3), из которого выделить подмножество Y1 чисел, делящихся на 4 без остатка. На печать вывести множество Y и мощность множества Y1. Исходные множества ввести с клавиатуры.
6. Даны три множества Х1= {1,2,3,...,20}, Х2= {10,20,...,190,200} и Х3= {10,11,12,...40}. Сформировать множество Y= (Х2 Х3)\(( Х1 Х2) (Х1 Х3)) и множество Y1, состоящее из элементов Y, деленных на 2. Если полученное в результате деления число не целое, то округлить его до ближайшего целого. На печать вывести Y и Y1. Исходные множества ввести с клавиатуры.
7. Даны три множества Х1= {2,4,6,8,10}, Х2= {1,2,3,4,5} и Х3= {2,3,5,7,8}. Сформировать множество Y= (Х2\ Х3) (Х1\ Х3). На печать вывести Y и его мощность. Исходные множества описать как типизированные константы.
8. Разработать программу для определения, какому алфавиту (латинскому или русскому) принадлежит введенный с клавиатуры символ. На печать вывести введенный символ с комментарием, например НАБРАН СИМВОЛ "А" НА РУССКОМ РЕГИСТРЕ.
10. Структуры
10.1. Примеры
10.1.1. Пример. Поиск ближайшей точки
Динамическим массивом координат задана последовательность точек и точка (x,y). Определить номер точки, ближайшей к (x,y).
type
TPoint=record
x,y: real;
end;
var
A: array of TPoint;

function Distance(n: word; u,v: real): real;
begin
with A[n] do
Result:=Sqrt(Sqr(x-u)+Sqr(y-v));
end;

function FindPoint(x,y: real): integer;
var
i,L: integer;
d,dMin: real;
begin
L:=Length(A); Result:=0; dMin:=Distance(0,x,y);
for i:=1 to L-1 do begin
d := Distance(i,x,y);
if d Result:=i; dMin:=d;
end;
end;
end;
10.1.2. Пример. Интерполяционный многочлен Лагранжа
График функции, определенной интерполяционным многочленом Лагранжа, проходит через все точки (xi,yi)
(1)
Этот многочлен чрезвычайно прост в использовании, но обладает существенным недостатком: отклонение значений функции от ожидаемых может быть достаточно большим.
Для вычисления значений многочлена Лагранжа по уравнению (1) можно воспользоваться функций Lagr.
Листинг 9. Функция Лагранжа
function Lagr(x: real): real;
var i,j: integer;
s,p: real;
begin
Result:=0;
for i:=0 to L-1 do
begin
p:=A[i].y;
for j:=0 to L-1 do
if ji then p:=p*(x-A[j].x)/(A[i].x-A[j].x);
Result:= Result+p;
end;
end;
Для построения графика функции y = f(x) на бумаге выбирается прямоугольник с размерами (X1,X2)*(Y1,Y2). Основная проблема, возникающая при построении графиков функций на экране монитора, обусловлена необходимостью масштабировать прямоугольник (X1,X2)*(Y1,Y2) в прямоугольник на экране (I1,I2) * (J1,J2) (см. рис. 3).

Рис. 3. Масштабирование графиков
Масштабирование по осям OX и OY реализуется при помощи линейных зависимостей (2), (3), графики которых представлены на рис. 4.
(2)
(3)

Рис. 4. Функции масштабирования по осям OX и OY
При вычислении вертикальных экранных координат необходимо знаком учитывать, что нумерация строк идет сверху вниз. Ниже приводится текст двух функций масштабирования, часто используемых в графических программах.
В проекте предусмотрена возможность перетаскивания любой точки мышью. Поэтому, наряду с функциями прямого масштабирования
Листинг 10. Процедуры прямого масштабирования
function II(x: real): integer;
begin
II:=I1+Trunc((I2-I1)*(x-x1)/(x2-x1));
end;
function JJ(y: real): integer;
begin
JJ:=J1+Trunc((J2-J1)*(y-y2)/(y1-y2));
end;
используются функции обратного масштабирования
Листинг 11. Процедуры обратного масштабирования
function XX(i: integer): real;
begin
XX:=x1+(i-I1)*(x2-x1)/(I2-I1);
end;
function YY(j: integer): real;
begin
YY:=y1+(j-j2)*(y2-y1)/(J1-J2);
end;
и созданы обработчики трех событий onMouseDown, onMouseMove, onMouseUp. В процедуре Image1MouseDown определяется номер Num точки, ближайшей к (X,Y), и поднимается флаг, разрешающий перемещения - Drawing := True:
Листинг 12. Процедура обработки нажатия клавиши мыши
procedure TForm1.FormMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var i: integer;
begin
case fl_tools of
0: begin
drawing:=true;
NumPoint:=FindPoint(XX(X),YY(Y));
end;
1: begin
L:=Length(A); Inc(L); SetLength(A,L);
A[L-1].x:=XX(x); A[L-1].y:=YY(y);
ShowDraw;
end;
2: begin
NumPoint:=FindPoint(XX(X),YY(Y));
for i:=NumPoint+1 to L-1 do A[i-1]:=A[i];
L:=Length(A); Dec(L); SetLength(A,L);
ShowDraw;
end;
end;
end;
Во время перемещения работает процедура Image1MouseMove, в которой в режиме pmNotXor сначала стирает старое изображение кривой, а затем выводится новое:
Листинг 13. Процедура обработки перемещения мыши
procedure TForm1.FormMouseMove(Sender: TObject;
Shift: TShiftState; X,Y: Integer);
begin
if drawing then
case fl_tools of
0: begin
A[NumPoint].x:=XX(X); A[NumPoint].y:=YY(Y);
ShowDraw;
end;
end;
end;
Заканчивается движение отпусканием клавиши мыши и вызовом процедуры Image1MouseUp, в которой прорисовывается линия в режиме pmCopy и опускается флаг перемещения Drawing := False:
Листинг 14. Процедура обработки нажатия клавиши мыши
procedure TForm1.FormMouseUp(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
drawing:=false;
end;
10.2. Задания
1. Дано
type
имя = (Аня, Валя, Женя, Петя,
Саша, Таня, Шура, Юра);
данные = record
пол : (муж, жен);
рост : 140..200
end;
группа = array [имя] of данные;
Описать функцию СредРост( ГР ), определяющую средний рост женщин из группы ГР.
2. Дано
type
рац = record
числ : integer;
знам : 1..maxint
end;
массив = array[1..20] of рац;

Описать логическую функцию Равно( a, b ), сравнивающую два рациональных числа a и b.
3. Даны комплексное число z (пара вещественных чисел) и вещественное число ? > 0. Вычислить с точностью ? значение следующей комплексной функции:
o sh z = z + z3 / 3! + z5 / 5! + … + z2n+1 / (2n + 1)! + …;
o ch z = z + z2 / 2! + z4 / 4! + … + z2n / (2n)! + …;
o sin z = z - z3 / 3! + z5 / 5! - …+ (-1)nz2n+1 / (2n + 1)! + …;
o cos z = z – z2 / 2! + z4 / 4! - … + (-1)nz2n / (2n)! + …;
o ln (1 + z) = z - z2 / 2 + z3 / 3 - … + (-1)n-1zn / n + … (| z | o arctg z = z - z3 /3 + z5 /5 -…+ (-1)nz2n+1 /(2n + 1) +… (| z | 4. Дано
const
MaxN = 30;
type
ВещТип = record
знак : boolean;
мантисса, порядок : real;
end;
список = array[1..MaxN] of ВещТип;

Описать:
o функцию MaxNeg( C ) для нахождения минимального отрицательного числа из списка чисел С;
o функцию MaxDi( C ) для нахождения максимального порядка числа из списка вещественных чисел С;
5. Дано
type
декарт = record
x, y : real
end;
поляр = record
r, fi : real { r ? 0, -? end;
Описать процедуру ДП( d, p ), преобразующую координаты точки на плоскости из декартовых d в полярные p, и ПД( p, d ), выполняющую обратное преобразование.
6. Дано
type
число = 1..31;
месяц = 1..12;
год = 1..2000;
дата = record
ч : число;
м : месяц;
г : год
end;
ДеньНедели = (пн, вт, ср, чт, пт, сб, вс);

Считая, что все даты даются по григорианскому календарю (в «новом стиле»), описать:
o функцию ПослЧисло( d ), вычисляющую количество дней в том месяце, которому принадлежит дата d;
o логическую функцию ВернаяДата( d ), проверяющую правильность даты d;
o функцию ЧислоДней( d ), подсчитывающую, сколько дней прошло от 1 января 1-го года нашей эры до даты d;
o функцию ДН( d ) для определения дня недели, на который приходится дата d (учесть, что 1 января 1-го года нашей эры было понедельником);
o функцию Пятница13( d ), которая определяет количество дней до даты d, которые были пятницами 13-ого числа.

11. Файлы
11.1. Примеры
Пример 1. Запись в текстовый файл двумерного массива.
Листинг 1. Запись в текстовый файл двумерного массива
var x: array[1..n,1..m] of real;
F: filetext;
i,j: integer;
begin
AssignFile(f,’f.txt’); Rewrite(f);
for j:=1 to m do begin
for i:=1 to n do Write(f,x[i,j]:8:2,’ ‘);
Writeln(f);
end;
CloseFile(f);
end;
Пример 2. Чтение из текстового файла двумерного массива.
Листинг 2. Чтение из текстового файла двумерного массива
var x: array[1..n,1..m] of real;
f: filetext;
i,j: integer;
begin
AssignFile(f,’f.txt’); Reset(f);
i:=0;

while not EOF(f) do begin
Read(f,j);
for i:=1 to n do Read(f,x[i,j]);
Readln(f);
end;
CloseFile(f);
end;
Пример 3. Рисование на канве
Рассмотрим следующую задачу: в текстовом файле записано несколько строк. Каждая строка начинается с символа, обозначающего один из методов канвы. Затем в той же строке приведено несколько значений целого типа, необходимых для работы этих методов. Необходимо прочитать этот файл и построить графические примитивы на канве. В таблице приведены первые символы строки и методы соответствующие этим символам.
Символ Метод Назначение
L LineTo(x1,y1) Отрезок прямой
M MoveTo(x1,y1) Переместить указатель
R RectAngle(x1,y1,x2,y2) Прямоугольник
E Ellipse(x1,y1,x2,y2) Эллипс
C Brush.Color:=C Цвет кисти
C Pen.Color:=C Цвет пера
T TextOut(x1,y1,s); Строка текста
Список параметров каждого метода определяет число и тип значений, идущих в каждой строке за первым символом. Так, например, если строка начинается с символа T, то далее в строке ожидается два целых числа и строка.
Основная процедура DrawPicture открывает текстовый файл и циклом while читает все строки файла (листинг 6.35).
Листинг 3. Процедура чтения файла и рисования DrawPicture
procedure TFormMain.DrawPicture(FName: string);
var f: textfile; ch: char;
x1,y1,x2,y2,C: integer;
s: string;
begin
AssignFile(f,FName); Reset(f); // открыть файл
with Canvas do begin
while not EOF(f) do begin
Read(f,ch); // чтение первого символа строки
// чтение остальных данных в строке и построение
case ch of
'L': begin // линия
Readln(f,x1,y1); LineTo(x1,y1);
end;
'R': begin // прямоугольник
Readln(f,x1,y1,x2,y2); RectAngle(x1,y1,x2,y2);
end;
'E': begin // эллипс
Readln(f,x1,y1,x2,y2); Ellipse(x1,y1,x2,y2);
end;
'C': begin // установить цвет заливки
Readln(f,C); Brush.Color:=C;
end;
'c': begin // установить цвет линий
Readln(f,C); Pen.Color:=C;
end;
'T': begin // нарисовать строку символов
Readln(f,x1,y1,s); TextOut(x1,y1,s);
end;
end;
end;
end;
CloseFile(f); // закрыть файл
end;
Пример 4. Частотный словарь.
В качестве четвертого примера рассмотрим проект, в котором читается текстовый файл и составляется словарь неповторяющихся слов. В качестве разделителей используются символы:
[' ','.',',',';',':','=','(',')','{', '}','[',']'] (пробел, запятая, точка, точка с запятой, двоеточие, знак равенства и т.д.).
Для создания словаря введем структуру TWord (листинг 4), в которой есть поле Name для сохранения слова и поле Count для сохранения числа повторений этого слова в тексте. Все слова будут собираться в динамическом массиве Words.
Листинг 4.
type
TWord=record
Name : string; // слово
Count: integer; // число повторений в тексте
end;
var
Words: array of TWord;
Двойным щелчком на компоненте ButtonOpen создадим обработчик события ButtonOpenClick и напишем в нем код, который вызовет диалог OpnDialog, а затем вызовет процедуру SetWords.
Листинг 5. Вызов процедуры SetWords
procedure TFormMain.ButtonOpenClick(Sender: TObject);
begin
if OpenDialog1.Execute then begin
Memo1.Lines.LoadFromFile(OpenDialog1.FileName);
SetWords(OpenDialog1.FileName);
SetGrid;
end;
end;
Процедура SetWords прочитает файл, в каждой строке выделит слова NewWord. Если очередной символ строки не разделитель [' ','.',',',';',':','=','(',')','{','}','[',']'], то этот символ добавляется к строке NewWord, иначе строка NewWord процедурой AddWord будет добавлять это слово в динамический массив Words.
Листинг 6. Процедура SetWords
procedure SetWords(FileName: string);
const
MySet=[' ','.',',',';',':','=','(',')','{','}','[',']'];
var
s, NewWord: string;
j: integer;
begin
AssignFile(f,FileName); Reset(f); // открыть файл
while not EOF(f) do begin
Readln(f,s); // прочитать строку
NewWord:=''; j:=0;
while j Inc(j);
if not (s[j] in MySet) then NewWord:= NewWord+s[j]
else AddWord(NewWord); // добавить слово
end;
AddWord(NewWord); // добавить последнее слово строки
end;
CloseFile(f); // закрыть файл
end;
Напишем процедуру добавления строки AddWord, в которой функция FindWord проверяет, что строка NewWord не входила ранее в массив слов:
Листинг 7. Процедура добавления строки AddWord
procedure AddWord(var NewWord: string);
var n: integer;
begin
if NewWord='' then Exit;
n:=FindWord(NewWord); // пытаемся определить № слова в массиве
if n=-1 then begin // слово не найдено – добавляем в массив
L:=Length(Words); L:=L+1; SetLength(Words,L);
Words[L-1].Name:=NewWord;
Words[L-1].Count:=1;
end
else // слово найдено – увеличиваем счетчик
Words[n].Count:=Words[n].Count+1;
NewWord:='';
end;
Напишем код функции FindWord, которая пытается найти номер слова NewWord в массиве Words. Если слово найдено, то функция вернет номер этого слова, иначе она вернет -1:
Листинг 8. Функция поиска FindWord
function FindWord(NewWord: string): integer;
var i: integer;
Ok: boolean;
begin
L:=Length(Words);
Ok:=false; i:=-1;
while (i Inc(i); Ok:=NewWord=Words[i].Name;
end;
if Ok then Result:=i else Result:=-1;
end;

11.2. Задания
11.2.1. Текстовые файлы
1. Дан текстовый файл. Вывести количество содержащихся в нем символов и строк (маркеры концов строк EOLN и конца файла EOF при подсчете количества символов не учитывать).
2. Дана строка S и текстовый файл. Добавить строку S в начало1|конец2 файла.
3. Дан текстовый файл. Удалить из него первую1|последнюю2 строку.
4. Даны два текстовых файла с именами Name1 и Name2. Создать новый текстовый файл с именем Name3, являющийся объединением содержимого файлов Name1 и Name2 (в указанном порядке).
5. Даны два текстовых файла с именами Name1 и Name2. Добавить в конец файла Name1 содержимое файла Name2.
6. Дан текстовый файл, содержащий более трех строк. Удалить из него три последние строки.
7. Дано число k ( 8. Дано число k ( 9. Дано число k и текстовый файл. Удалить из файла строку с номером k (строки нумеруются от 0). Если строки с таким номером нет, то оставить файл без изменений.
10. Дано число k и текстовый файл. Вставить пустую строку перед1|после2 строки с номером k (строки нумеруются от 0). Если строки с таким номером нет, то оставить файл без изменений.
11. Дан текстовый файл. Удалить из него пустые строки.
12. Дана строка S и текстовый файл. Заменить в файле все пустые строки на строку S.
13. Дан текстовый файл. Заменить в нем все подряд идущие пробелы на один пробел.
14. Дан текстовый файл, содержащий текст, выровненный по левому краю. Выровнять его по [правому краю]1|центру2, добавив в начало каждой непустой строки необходимое количество пробелов (ширину текста считать равной 50). Строки нечетной длины перед центрированием дополнять слева пробелом.
15. Дан текстовый файл, содержащий текст, выровненный по левому краю. Абзацы текста разделяются одной пустой строкой. Выровнять текст по ширине (то есть и по левому, и по правому краю), увеличив в каждой непустой строке (кроме последних строк абзацев) количество пробелов между словами, начиная с первого1|последнего2 пробела в строке (ширину текста считать равной 50).
16. Дан текстовый файл. Найти количество абзацев в тексте, если абзацы отделяются друг от друга одной или несколькими пустыми строками.
17. Дан текстовый файл. Найти количество абзацев в тексте, если каждый абзац начинается с красной строки (5 пробелов). Пустые строки между абзацами не учитывать.
18. Дан текстовый файл. Абзацы выделяются в нем с помощью красной строки (5 пробелов), а пустых строк нет. Вставить между соседними абзацами по пустой строке.
19. Дан текстовый файл. Создать символьный файл, содержащий все знаки препинания, встретившиеся в текстовом файле (в том же порядке).
20. Дан текстовый файл. Вывести первое1|последнее2 слово текста наибольшей длины (с учетом знаков препинания, расположенных в начале и в конце слов).
21. Дано целое число N и текстовый файл. Создать строковый файл, содержащий все слова длины N из исходного файла (знаки препинания, расположенные в начале и в конце слов, не учитывать). Если исходный файл не содержит слов длины N, оставить результирующий файл пустым.
22. Дан символ C (прописная русская буква) и текстовый файл. Создать строковый файл, содержащий все слова из исходного файла, начинающиеся1|оканчивающиеся2 этой буквой (как прописной, так и строчной). Знаки препинания, расположенные в начале и в конце слов, не учитывать. Если исходный файл не содержит подходящих слов, оставить результирующий файл пустым.
23. Дано число N и текстовый файл. Удалить из файла абзац с номером N (абзацы отделяются друг от друга одной или несколькими пустыми строками и нумеруются от 1). Пустые строки, предшествующие и следующие за удаляемым абзацем, не удалять. Если абзац с данным номером отсутствует, то оставить файл без изменений.
24. Дано число N и текстовый файл. Удалить из файла абзац с номером N (абзацы выделяются с помощью красной строки (5 пробелов) и нумеруются от 1). Пустые строки между абзацами не учитывать и не удалять. Если абзац с данным номером отсутствует, то оставить файл без изменений.
25. Дан текстовый файл, каждая строка которого изображает целое число, дополненное слева и справа несколькими пробелами. Вывести сумму этих чисел и их количество.
26. Дан текстовый файл, каждая строка которого изображает целое или вещественное число, дополненное слева и справа несколькими пробелами (вещественные числа имеют ненулевую дробную часть). Вывести сумму целых1|вещественных2 чисел и их количество.
27. Дан текстовый файл, каждая строка которого содержит изображения нескольких вещественных чисел, разделенных пробелами. Создать файл вещественных чисел, содержащий эти числа в том же порядке.
28. Даны два текстовых файла с именами Name1 и Name2. Добавить в начало1|конец2 каждой строки файла Name1 соответствующую строку файла Name2. Если файл Name2 короче файла Name1, то оставшиеся строки файла Name1 не изменять.
29. Дан текстовый файл NameT и файл целых чисел NameN. Добавить в начало1|конец2 каждой строки файла NameT изображение соответствующего числа из файла NameN. Если файл NameN короче файла NameT, то оставшиеся строки файла NameT не изменять.
30. Дан текстовый файл с именем NameT. В каждой его строке первые 60 позиций отводятся под текст, а оставшаяся часть — под вещественное число. Создать два файла: строковый файл с именем NameS, содержащий текстовую часть исходного файла, и файл вещественных чисел с именем NameR, содержащий числа из исходного файла.
31. Даны два файла целых чисел одного размера с именами Name1 и Name2. Создать текстовый файл с именем NameT, содержащий изображения этих чисел, расположенные в два столбца шириной по 30 символов: первый содержит числа из файла Name1, второй — из файла Name2. В начале и конце каждой строки текстового файла ввести разделитель " | " (код 124). Числа выравниваются по левому1|правому2 краю столбца.
32. Даны вещественные числа A, B и целое число N. Создать текстовый файл, содержащий таблицу значений функции f(x) = [sin(x)]1|[cos(x)]2|[exp(x)]3 на промежутке [A, B] с шагом (B-A)/N. Таблица состоит из двух столбцов: с аргументами x (10 позиций, из них 3 под дробную часть) и со значениями f(x) (15 позиций, из них 8 под дробную часть). Столбцы выравниваются по правому краю и разделяются 10 пробелами.
33. Дан текстовый файл с именем NameT, содержащий таблицу из трех столбцов вещественных чисел. Ширина столбцов таблицы и способ их выравнивания являются произвольными. Специальных символов-разделителей таблица не содержит. Создать файлы вещественных чисел с именами Name1, Name2 и Name3, каждый из которых содержит числа из соответствующего столбца таблицы.
34. Дан текстовый файл, представляющий собой таблицу, состоящую из трех столбцов с целыми числами. В начале и в конце каждой строки таблицы, а также между ее столбцами располагается символ-разделитель. Ширина столбцов таблицы и способ их выравнивания являются произвольными. Создать файл целых чисел, содержащий сумму чисел из каждой строки исходной таблицы.
35. Дан текстовый файл. Создать символьный файл, содержащий все символы, встретившиеся в тексте, включая пробел и знаки препинания (без повторений). Символы располагать в порядке [возрастания их кодов]1|[убывания их кодов]2|[их первого появления в тексте]3.
36. Дан текстовый файл с именем NameT. Подсчитать число повторений в нем строчных русских букв ("а"–"я") и создать строковый файл с именем NameS, элементы которого имеют вид: "–". Буквы, отсутствующие в тексте, в файл не включать. Строки упорядочить по [возрастанию кодов букв]1|[убыванию числа повторений букв, а при равном числе повторений — по возрастанию кодов букв]2.
37. Дано целое число N и текстовый файл с именем Name1, содержащий один абзац текста, выровненный по левому краю. Отформатировать текст так, чтобы его ширина не превосходила N позиций, и выровнять текст по левому1|правому2 краю. Пробелы в конце строк удалить. Сохранить отформатированный текст в новом текстовом файле с именем Name2.
38. Дано целое число N и текстовый файл Name1, содержащий текст, выровненный по левому краю. Абзацы текста отделяются друг от друга одной пустой строкой. Отформатировать текст так, чтобы его ширина не превосходила N позиций, и выровнять текст по левому1|правому2 краю, сохранив деление на абзацы. Пробелы в конце строк удалить. Сохранить отформатированный текст в новом текстовом файле Name2.
39. Дана строка K, состоящая из 10 цифр, и файл с русским текстом. Зашифровать файл, выполнив циклическую замену каждой русской буквы, стоящей на i-й позиции строки, на букву того же регистра, расположенную в алфавите на K[i]-м месте после шифруемой буквы (символы строки K также перебираются циклически: для i = 11 снова используется смещение K[1] и т.д.). Букву "ё" в алфавите не учитывать, знаки препинания и пробелы не изменять.
40. Дана строка S1 и файл с русским текстом, зашифрованным по правилу, описанному в задании Text39. Строка S1 представляет собой первую расшифрованную строку текста. Расшифровать остальные строки и заменить в файле зашифрованный текст на расшифрованный. Если информации для расшифровки недостаточно, то исходный файл не изменять.
41. Прочитать текстовый файл. На отдельной форме вывести информацию о количестве слов, состоящих из одного символа, двух символов и т.д.
42. Прочитать текстовый файл. На отдельной форме вывести словарь, используемых слов с указанием частоты их использования.
43. Прочитать текстовый файл. На отдельной форме вывести текст, из которого удалены незначащие пробелы.
44. Прочитать текстовый файл. На отдельной форме вывести этот же текст, но в котором каждое новое предложение написано с новой строки (предложения заканчиваются точкой).
45. Прочитать текстовый файл. Реализовать функцию замены одного слова на другое.
46. Написать программу для кодирования и декодирования текстового файла с помощью слова-пароля.
47. Прочитать текстовый файл. На отдельной форме вывести текст, в котором все слова из латинских символов и цифр выделены другим цветом.
48. Прочитать текстовый файл. На отдельной форме вывести тот же текст, но в котором все числа записаны словами.
49. В текстовом файле записан английский /немецкий текст. Необходимо выделять сплошной фрагмент текста и определять, все ли буквы латинского алфавита в нём задействованы, отметить незадействованные.
50. Прочитать текстовый файл, в котором хранятся статьи уголовного кодекса. Разбить весь текст на отдельные статьи, если известно, что признаком начала статьи является предложение, состоящее из слова , за которым следует номер статьи с точкой, написанное в начале строки.
51. Прочитать текстовый файл, в котором хранятся одна статья уголовного кодекса. Разбить эту статью на пункты, если известно, что признаком начала пункта является предложение, состоящее из номера пункта с точкой, написанное в начале строки.
52. Прочитать текстовый файл, в котором хранятся одна статья уголовного кодекса, состоящая из одного единственного пункта. Отделить от этой статьи санкцию, если известно, что она начинается со слов или .
53. Описать функцию getInt(Name,k) целого типа, возвращающую k-й элемент файла целых чисел с именем Name (элементы нумеруются от 0). Если файл не существует или не содержит k-го элемента, то функция возвращает 0. С помощью этой функции вывести пять элементов данного файла с указанными номерами.
54. Описать функцию getLine(Name,k) строкового типа, возвращающую k-ю строку текстового файла с именем Name (строки нумеруются от 0). Если файл не существует или не содержит k-й строки, то функция возвращает пустую строку. С помощью этой функции вывести пять строк данного файла с указанными номерами.
55. Описать функцию IntFileSize(Name) целого типа, возвращающую размер файла целых чисел с именем Name. Если файл не существует, то функция возвращает –1. С помощью этой функции определить размер трех файлов с данными именами.
56. Описать функцию TextSize(Name) целого типа, возвращающую число строк в текстовом файле с именем Name. Если файл не существует, то функция возвращает –1. С помощью этой функции определить размер трех файлов с данными именами.
57. Описать процедуру InvertIntFile(Name), меняющую порядок следования элементов файла целого типа с именем Name на противоположный. Если файл не существует или содержит менее двух элементов, то процедура не выполняет никаких действий. Обработать с помощью этой процедуры три файла с данными именами.
58. Описать процедуру SplitIntFile(Name0,k,Name1,Name2), копирующую первые k (>= 0) элементов существующего файла целых чисел с именем Name0 в файл Name1, а остальные элементы — в файл Name2 (прежнее содержимое результирующих файлов стирается). Один из результирующих файлов может оказаться пустым. Применить эту процедуру к файлу Name0, используя указанные значения Name1, Name2 и k.
59. Описать процедуру SplitText(Name0,k,Name1,Name2), копирующую первые k (>= 0) строк существующего текстового файла с именем Name0 в файл Name1, а остальные элементы — в файл Name2 (прежнее содержимое результирующих файлов стирается). Один из результирующих файлов может оказаться пустым. Применить эту процедуру к файлу Name0, используя указанные значения Name1, Name2 и k.
60. Описать процедуру ConcatFile(NameA,NameB,NameAB), позволяющую объединить содержимое двух двоичных файлов NameA и NameB одного и того же типа в новом файле NameAB. Использовать процедуры BlockRead и BlockWrite. Применить эту процедуру к парам исходных файлов Name1–Name2, Name1–Name3 и Name2–Name3, создав файлы с именами Name12, Name13, Name23.
61. Описать процедуру StringFileToText(Name)1 или TextToStringFile(Name)2, преобразующую [двоичный строковый]1 или текстовый2 файл с именем Name в текстовый1 или [двоичный строковый]2 файл с тем же именем. Используя эту процедуру, преобразовать два данных строковых1|текстовых2 файла с именами Name1 и Name2 в текстовые1|строковые2.
62. Описать процедуру CodeText(Name,k), шифрующую текстовый файл с именем Name, выполняя циклическую замену каждой русской буквы на букву, расположенную в алфавите на k-й позиции после исходной (0 63. Дан текстовый файл, содержащий целые числа. Найти максимальное число в каждой строке файла. Найденные числа записать в новый текстовый файл по одному в строке.
64. Дан текстовый файл, содержащий строки. Создать новый текстовый файл, в каждой строке которого записать два числа: количество запятых и количество точек в соответствующей строке исходного файла.
65. Дан текстовый файл, содержащий целые числа. Найти количество отрицательных чисел в каждой строке файла. Найденные числа записать в новый текстовый файл по одному в строке.
66. Дан текстовый файл, в первой строке которого записаны два числа n и m (m>n), а в следующих строках - прямоугольная таблица целых чисел размером n×m. Заполнить целочисленный массив размером n×m числами из этой таблицы. В каждой строке массива удалить элемент, номер которого равен номеру соответствующей строки. Полученный массив записать в новый текстовый файл.
67. Дан текстовый файл, содержащий целые числа, количество которых кратно 3. Записать в новый текстовый файл все числа исходного файла по три числа в строке.
11.2.2. Типизированные и нетипизированные файлы
1. Дана строка S. Если S является допустимым именем файла, то вывести True и создать файл с этим именем. Если файл с именем S создать нельзя, то вывести False.
2. Даны имена четырех файлов. Вывести количество файлов с указанными именами, которые имеются в текущем каталоге.
3. Дано имя файла целых чисел. Вывести количество его элементов. Если файла с таким именем не существует, то вывести –1.
4. Дано число k и файл, содержащий ненулевые целые числа. Вывести элемент файла с номером k (элементы файла нумеруются от нуля). Если такой элемент отсутствует, то вывести 0.
5. Дан файл целых чисел, содержащий не менее четырех элементов. Вывести его нулевой, первый, предпоследний и последний элементы.
6. Даны имена двух файлов вещественных чисел. Известно, что один из них существует и содержит не менее двух элементов, а другой в текущем каталоге отсутствует. Создать отсутствующий файл и записать в него нулевой и последний элементы существующего файла.
7. Дан файл целых чисел. Вывести количество содержащихся в нем серий (то есть наборов последовательно расположенных одинаковых элементов).
8. Дан файл вещественных чисел. Найти количество его локальных минимумов1|максимумов2|экстремумов3.
9. Дан файл вещественных чисел. Найти количество его участков убывания1|возрастания2|монотонности3.
10. Даны два файла произвольного типа. С помощью процедуры Rename поменять местами их содержимое.
11. Дан файл произвольного типа. С помощью процедур BlockRead и BlockWrite создать его копию с новым именем.
12. Дано целое число N ( 13. Даны два файла одного и того же типа. С помощью процедур BlockRead и BlockWrite добавить к первому файлу содержимое второго файла, а ко второму файлу — содержимое первого.
14. Даны три файла одного и того же типа, но разного размера. С помощью процедур BlockRead и BlockWrite заменить содержимое самого длинного1|короткого2 файла на содержимое самого короткого1|длинного2.
15. Дан файл целых чисел. Создать новый файл, содержащий те же элементы, что и исходный файл, но в обратном порядке.
16. Даны три файла целых чисел одинакового размера с именами NameA, NameB и NameC. Создать новый файл с именем NameD, в котором чередовались бы элементы исходных файлов с одним и тем же номером: A0, B0, C0, A1, B1, C1, A2, B2, C2, ... .
17. Даны четыре файла целых чисел разного размера с именами NameA, NameB, NameC и NameD. Создать новый файл с именем NameE, в котором чередовались бы элементы исходных файлов с одним и тем же номером (как в задании File16). "Лишние" элементы более длинных файлов в результирующий файл не записывать.
18. Дан файл вещественных чисел с именем Name1. Создать два новых файла с именами Name2 и Name3, первый из которых содержит элементы исходного файла с четными номерами (0, 2, 4, ...), а второй — с нечетными (1, 3, 5, ...).
19. Дан файл, содержащий ненулевые целые числа. Создать новый файл, содержащий только положительные1|отрицательные2|четные3|нечетные4 числа исходного файла (в том же порядке).
20. Дан файл целых чисел. Создать новый файл, содержащий длины всех серий исходного файла.
21. Дан файл вещественных чисел. Создать файл целых чисел, содержащий длины всех убывающих1|возрастающих2|монотонных3 последовательностей его элементов.
22. Дан файл вещественных чисел. Заменить в нем все элементы на их квадраты.
23. Дан файл вещественных чисел. Заменить в файле каждый элемент, кроме начального и последнего, на его среднее арифметическое с предыдущим и последующим элементом.
24. Дан файл целых чисел с элементами A(i), i = 0, ..., N–1 (N — размер файла). Заменить исходное расположение его элементов на следующее: A(0), A(N–1), A(1), A(N–2), A(2), ... .
25. Дан файл целых чисел. Если его размер меньше 50, то дополнить его нулями до 50 элементов; если его размер больше 50, то урезать его до 50 элементов.
26. Дан файл целых чисел. Удалить в нем все положительные1|отрицательные2|четные3|нечетные4 числа.
27. Дан файл целых чисел. Продублировать в нем все числа, принадлежащие диапазону 5..10.
28. Дан файл, содержащий ненулевые целые числа. Заменить в нем все положительные1|отрицательные2|четные3|нечетные4 числа двумя нулями.
29. Дан файл вещественных чисел. Поменять в нем местами минимальный и максимальный элементы.
30. Даны два файла вещественных чисел с именами Name1 и Name2, элементы которых упорядочены по возрастанию1|убыванию2. Объединить эти файлы в новый файл с именем Name3, сохранив упорядоченность элементов.
31. Даны два целых числа i и j и файл вещественных чисел, содержащий элементы квадратной матрицы (по строкам). Вывести элемент матрицы, расположенный в i-й строке и j-м столбце (строки и столбцы нумеруются от 1). Если требуемый элемент отсутствует, то вывести 0.
32. Даны два целых числа i и j и файл вещественных чисел, содержащий элементы прямоугольной матрицы (по строкам), причем начальный элемент файла содержит количество столбцов матрицы. Вывести элемент матрицы, расположенный в i-й строке и j-м столбце (строки и столбцы нумеруются от 1). Если требуемый элемент отсутствует, то вывести 0.
33. Дан файл вещественных чисел, содержащий элементы квадратной матрицы (по строкам). Создать файл, содержащий элементы матрицы, транспонированной к исходной.
34. Дан файл вещественных чисел, содержащий элементы прямоугольной матрицы (по строкам), причем начальный элемент файла содержит количество столбцов матрицы. Создать новый файл той же структуры, содержащий матрицу, транспонированную к исходной.
35. Даны два файла вещественных чисел с именами NameA и NameB, содержащие элементы квадратных матриц A и B (по строкам). Создать новый файл с именем NameC, содержащий элементы произведения A•B. Если матрицы A и B нельзя перемножать, то оставить файл NameC пустым.
36. Даны два файла вещественных чисел с именами NameA и NameB, содержащие элементы прямоугольных матриц A и B (по строкам), причем начальный элемент каждого файла содержит количество столбцов соответствующей матрицы. Создать файл той же структуры с именем NameC, содержащий произведение A•B. Если матрицы A и B нельзя перемножать, то оставить файл NameC пустым.
37. Дан файл вещественных чисел, содержащий элементы [верхней треугольной]1|[нижней треугольной]2|трехдиагональной3 матрицы (по строкам). Создать новый файл, содержащий элементы ненулевой части данной матрицы (по строкам).
38. Даны два целых числа i и j и файл вещественных чисел, содержащий ненулевую часть [верхней треугольной]1|[нижней треугольной]2|трехдиагональной3 матрицы (по строкам). Вывести порядок матрицы и ее элемент, расположенный в i-й строке и j-м столбце (строки и столбцы нумеруются от 1). Если требуемый элемент находится в нулевой части матрицы, то вывести 0; если элемент отсутствует, то вывести –1.
39. Дан файл вещественных чисел, содержащий ненулевую часть [верхней треугольной]1|[нижней треугольной]2|трехдиагональной3 матрицы (по строкам). Создать новый файл, содержащий все элементы данной матрицы (по строкам).
40. Даны два файла вещественных чисел с именами NameA и NameB, содержащие ненулевые части [верхних треугольных]1|[нижних треугольных]2 матриц A и B (по строкам). Создать новый файл с именем NameC, содержащий ненулевую часть произведения A•B исходных матриц (по строкам). Если матрицы A и B нельзя перемножать, то оставить файл NameC пустым.
41. Дано целое число N ( 42. Дан файл целых чисел, содержащий данные из нескольких (не более четырех) файлов в формате, описанном в задании File41. Восстановить файлы, использованные при создании исходного файла, присвоив им имена вида ".tst", где — порядковый номер файла (n = 1, 2, ...).
43. Дан символьный файл, содержащий по крайней мере один символ пробела. Удалить все его элементы, расположенные после первого1|последнего2 символа пробела, включая и сам этот пробел.
44. Дан символьный файл, содержащий по крайней мере один символ пробела. Удалить все его элементы, расположенные перед первым1|последним2 символом пробела, включая и сам этот пробел.
45. Дан символьный файл. Упорядочить его элементы по возрастанию1|убыванию2 их кодов.
46. Дано число k и строковый файл с именем Name1, содержащий непустые строки. Создать два новых файла: строковый с именем Name2, содержащий первые1|последние2 k символов каждой строки исходного файла (если строка короче k символов, то она сохраняется целиком), и символьный с именем Name3, содержащий k-й символ каждой строки (если строка короче k, то в файл Name3 записывается пробел).
47. Дан строковый файл, содержащий непустые строки. Создать новый файл, содержащий все строки исходного файла наименьшей1|наибольшей2 длины (в том же порядке).
48. Дан строковый файл с именем NameS, содержащий даты в формате "день/месяц/год", причем под день и месяц отводится по две позиции, а под год — четыре. Создать файлы целых чисел с именами Name1 и Name2, содержащие соответственно значения [дней и месяцев]1|[дней и лет]2|[месяцев и лет]3 для дат из исходного строкового файла (в том же порядке).
49. Дан строковый файл, содержащий даты в формате "день/месяц/год", причем под день и месяц отводится по две позиции, а под год — четыре. Вывести строку, содержащую самую раннюю1|позднюю2 весеннюю3|летнюю4|осеннюю5|зимнюю6 дату. Если даты с требуемым временем года в файле отсутствуют, то вывести дату "01/01/1900".
50. Дан строковый файл, содержащий даты в формате "день/месяц/год", причем под день и месяц отводится по две позиции, а под год — четыре. Создать новый строковый файл, в котором даты из исходного файла располагались бы в порядке возрастания1|убывания2.

В задачах 1..15 использовать типизированный файл c информацией о студентах факультета Stud.dat со структурой:

const NumSemestr=10;
type
TStud=record
FIO : string[80]; // фамилия имя отчество
Year : TDateTime; // дата рождения
// средние оценки за семестр
MedB : array [1..NumSemestr] of real;
Kurs : byte; // курс
Group: byte; // группа
End;

1. Убедиться в отсутствии задолженностей для выбранного студента-выпускника (наличие положительных оценок за все десять семестров).
2. Вывести список студентов, для которых дни рождения попадают на дни текущей недели.
3. Вывести список студентов, у которых средний балл постоянно увеличивается от семестра к семестру.
4. Вывести список студентов, у которых средний балл постоянно уменьшается за всё время обучения.
5. Вывести информацию о самых молодых студентах с указанием возраста - N человек, начиная с самого молодого, N определяется вводом.
6. Вывести информацию о средних баллах по курсам.
7. Вывести информацию об однофамильцах.
8. Организовать поиск студентов по ФИО, курсу, группе, году рождения.
9. Определить группы студентов, у которых средний балл ниже факультетского среднего.
10. Вывести информацию о студентах, которые стали учиться хуже, чем на 1-ом курсе.
11. Упорядочить список студентов заданной группы по среднему баллу, вывести его.
12. Вывести список студентов, у которых средний балл больше 40.
13. Вывести студента с наибольшим средним баллом на каждом курсе.
14. Вывести студента с наименьшим средним баллом на каждом курсе.
15. Составить список 5 студентов с максимальным средним баллом.

12. Сортировки
12.1. Примеры

12.2. Задания
1. Написать программу, которая наглядно иллюстрирует работу следующих методов сортировки:
o пузырьковая;
o шейкерная.
Провести сравнение этих сортировок по количеству сравнений, по количеству обменов. Для этого построить графики зависимостей данных величин от количества элементов массива.
2. Написать программу, которая наглядно иллюстрирует работу следующих методов сортировки:
o простыми вставками;
o бинарными вставками.
Провести сравнение этих сортировок по количеству сравнений, по количеству обменов. Для этого построить графики зависимостей данных величин от количества элементов массива.
3. Примером сортировки по двум ключам может служить список файлов, имеющих одинаковые имена и разные расширения. Список упорядочен по именам, а для каждого имени – по расширениям.
Написать программу, которая сортирует элементы массива по двум ключам. Элементом массива является запись, два поля которой – два ключа
4. В магазине строительных материалов в продаже имеются стеновые панели, которые характеризуются следующими величинами:
o ширина,
o длина,
o количество штук,
o цена за 1 м2.
Вывести в порядке возрастания цены сведения о тех стеновых панелях, общая площадь которых не менее заданной.
5. Есть некий измерительный прибор, работа которого зависит от входных параметров a и x, а результат определяется следующей формулой у = a sin(ax) cos2 (x/a). Проводится серия опытов для значений xt ,х2,... xn, a = const. Вывести результат в виде таблицы, упорядоченной по убыванию значений показаний прибора, полученных в ходе опытов.
6. В чемпионате России по футболу принимают участие 16 команд. Для каждой команды известен список игроков, каждый игрок из команды имеет свой рейтинг. Вывести список команд в порядке убывания вероятности победы в чемпионате. Рейтинг команды равен сумме рейтингов игроков. Вероятность победы равна рейтингу команды минус сумма рейтингов 11 лучших игроков.
7. Элемент хэш-таблицы содержит информацию о номере телефона и фамилию человека, который доступен по этому телефону. То есть у одного человека может быть несколько телефонов: домашний, рабочий, мобильный и т.п. Напишите программу, которая по заданной фамилии выводит все номера телефонов, по которым доступен этот человек.
8. Упорядочить массив размера N по возрастанию1|убыванию2.
9. Дано множество A из N точек с целочисленными координатами. Порядок на координатной плоскости определим следующим образом: (x1, y1) 10. Из двух упорядоченных по невозрастанию массивов A(M) и B(N) получить путем слияния упорядоченный по убыванию массив C; удаляемые элементы собрать в массиве D. Подсчитать количество элементов в массивах C и D.
11. Заданы два одномерных массива А(N) и В(N). Сформировать массив С(2*N), содержащий элементы обоих массивов, расположенные в порядке возрастания.
12. Путем слияния из возрастающего A(M) и невозрастающего B(N) массивов получить возрастающий массив C (с удалением совпадающих элементов). Подсчитать количество элементов в массиве С.
13. Задан массив записей, поле key которого – целые числа. Написать программу, которая наглядно демонстрирует сортировку массива по ключу key:
o методом простого слияния;
o методом естественного слияния.
Количество элементов массива таково, что все элементы отображаются на экране. В данных сортировках используется дополнительный массив
14. Задан массив записей, поле key которого – целые числа. Написать программу, которая наглядно демонстрирует пирамидальную сортировку по ключу key. Массив изображен в виде последовательности элементов. При построении пирамиды на экране массив отображается не только в виде последовательности, но и в виде построенной пирамиды.
15. Написать программу, иллюстрирующую работу сортировки Хоара:
o реализовать рекурсивным методом;
o реализовать нерекурсивным методом;
o реализовать любым из методов, но учитывать, что для сортировки массива маленького размера лучше применять какой-нибудь другой метод сортировки (например, простыми вставками, пузырьком ...).
16. Написать программу, которая наглядно иллюстрирует работу следующих методов сортировки:
o пузырьковая
o шейкерная
17. Провести сравнение сортировок методом пузырька и шейкерной по количеству сравнений, по количеству обменов. Для этого построить графики зависимостей данных величин от количества элементов массива.
18. Написать программу, которая иллюстрирует работу метода Шелла с одной из формул вычисления шага сортировки:
o h[k–1] = 3h[k] + 1, h[t]=1, t = [log3n]–l;
o h[k–1] = 2h[k] + 1, h[t]=1, t = [log2n]–l;
o 2k–l;
o 2k +1;
o (2k–(–l)k)/3;
o (3k–l)/2;
o числа Фибоначчи.
19. Реализовать сортировку массива целых чисел методом двухпутевых вставок при использовании следующих дополнительных структур данных:
o массива;
o двунаправленного списка.
Программа должна наглядно иллюстрировать работу данного алгоритма.
20. Исследовать зависимость количества сравнений в сортировках простыми и бинарными вставками от количества элементов в этих массивах. При этом отобразить необходимое количество перестановок.
21. Написать программу, которая иллюстрирует сортировку массива распределяющим подсчетом. Элементом массива является запись следующего типа:
record
ch : char;
key : integer
end;
Указание.
Ключом сортировки является поле целого типа.
22. В магазине строительных материалов в продаже имеются стеновые панели, которые характеризуются следующими величинами:
o ширина,
o длина,
o количество штук,
o цена за 1 м2.
Вывести в порядке возрастания цены сведения о тех стеновых панелях, общая площадь которых не менее заданной.
23. Есть некий измерительный прибор, работа которого зависит от входных параметров a и x, а результат определяется следующей формулой у = a sin(ax) cos2 (x/a). Проводится серия опытов для значений xt ,х2,... xn, a = const. Вывести результат в виде таблицы, упорядоченной по убыванию значений показаний прибора, полученных в ходе опытов.
24. Информация агентства по продаже недвижимости содержит следующие сведения о квартирах:
o район, в котором находится квартира,
o этаж,
o количество комнат,
o общая площадь,
o цена за 1 м2.
Клиент, обращаясь в агентство, имеет возможность указать вес для каждого из критериев (важный критерий имеет большой вес, незначительный – маленький), а агентство, в свою очередь, предлагает ему список квартир, упорядоченный по невозрастанию суммы весов.
25. В чемпионате России по футболу принимают участие 16 команд. Для каждой команды известен список игроков, каждый из команды имеет рейтинг. Вывести список команд в порядке убывания вероятности победы в чемпионате. Вероятность победы равна рейтингу команды – сумме рейтингов 11 лучших игроков.

13. Списки, стеки, очереди

13.1. Примеры

13.2. Задания
1. Реализовать функцию поиска элемента Е в односвязном списке L.
2. Подсчитать число максимальных элементов списка.
3. В списке A хранится информация о людях (фамилия, имя, отчество, профессия). Имеется список В, содержащий перечень профессий. Удалить из списка А тех людей, чья профессия не указана в списке В.
4. Дан список слов. Из каждой группы подряд идущих одинаковых слов оставить только одно.
5. Дан текстовый файл. Распечатать слова, имеющие максимальную длину.
6. Дан список вещественных чисел. Проверить, упорядочены ли числа по возрастанию или по убыванию.
7. Дан список вещественных чисел. Для каждого элемента списка напечатать число отрицательных элементов, следующих за ним.
8. Реализовать проект "Частотный словарь". В качестве обрабатываемого текста можно использовать, например, модули этого проекта. Результатом должно явиться перечисление всех "слов" в алфавитном порядке с частотой их появления. Отметить, что частота появления таких слов, как begin и end, всегда одинакова.
9. Создать приложение, проверяющее правильность расстановки скобок в арифметическом выражении.
10. Даны два стека. Используя операции ИзСтека, ВСтек и функцию СтекПуст подсчитать общее число элементов в стеках. В качестве вспомогательных структур разрешается использование переменных целых типов. Алгоритм должен предусматривать восстановление исходного расположения элементов в стеках.
11. Дан текстовый файл А. Переписать его содержимое в файл В, перенося при этом в конец каждой строки все входящие в нее знаки препинания.
12. Даны две очереди X и Y, содержащие вещественные числа. Из каждой очереди одновременно извлекается по одному числу, х и у соответственно. Если х 13. Создать очередь, информационные поля которой содержат числа из текстового файла file1.txt. Вывести значения информационных полей очереди в поле метки. Содержимое файла file1.txt:
14 -9 8 -22 39
-1 -13 0 4 -7
27 5 -2 18 3
14. Создать очередь, информационные поля которой содержат числа из текстового файла file1.txt. Вставить в список новый элемент с информационным полем d после первого элемента. Содержимое файла file1.txt:
14 -9 8 -22 39
-1 -13 0 4 -7
27 5 -2 18 3
15. Создать очередь из 20 элементов, информационные поля которой содержат случайные числа из интервала [-30, 30]. Вставить в список новый элемент с информационным полем 100 за каждым отрицательным числом.
16. Создать очередь, информационные поля которой содержат строки из файла file2.txt . Удалить из списка второй элемент.
Содержимое файла file2.txt: file
edit
search
view
project
run
component
database
tools
window
help
17. Создать очередь из 20 элементов, информационные поля которой содержат случайные числа из интервала [-40, 40]. Удалить из списка все отрицательные числа.
18. Создать очередь, информационные поля которой содержат числа из текстового файла file1.txt. Вставить в конец списка (после последнего элемента) новый элемент с информационным полем d.
19. Создать очередь, информационные поля которой содержат числа из текстового файла file1.txt. Вставить в начало списка (перед первым элементом) новый элемент с информационным полем d.
20. Создать очередь, информационные поля которой содержат числа из текстового файла file1.txt. Вставить новый элемент с информационным полем d после 9ого элемента списка.
21. Создать очередь из 20 элементов, информационные поля которой содержат случайные числа из интервала [-50, 50]. Удалить из списка последний элемент.
22. Создать очередь, информационные поля которой содержат числа из текстового файла file3.txt. Удалить из списка за каждым вхождением элемента с информационным полем, равным d, один элемент, если он отличен от d. Содержимое файла file3.txt:
26 11 -8 34 2
41 -5 11 11 -37
-15 11 29 62 44
23. Создать очередь, информационные поля которой содержат строки из файла file4.txt (Список фамилий учащихся). Удалить из списка фамилии, начинающиеся с буквы ? С ?.
Содержимое файла file4.txt: Семёнов
Антонова
Кузнецов
Самойлов
Егорова
Колесников
Сидоров
Смирнова
Петрова
Сафонов
24. Создать очередь, информационные поля которой содержат строки из файла file4.txt (Список фамилий учащихся). Удалить из списка первую фамилию, начинающуюся с буквы ? К ?. (Учесть, что такая фамилия может оказаться первой в списке.)
25. Создать очередь, информационные поля которой содержат строки из файла file5.txt (Список фамилий учащихся, упорядоченный по алфавиту). Вставить в этот список новую фамилию с сохранением порядка.
Провести тестирование проекта для следующих исходных данных:
1) Авдеев 2) Кротов 3) Гаврилов 4) Шмелёв
Содержимое файла file5.txt: Антонова
Воротников
Егорова
Колесников
Кузнецов
Павлов
Петрова
Сафонов
Харитонов
26. Считалочка. N ребят расположены по кругу. (Каждому присвоен номер по порядку). Начав отсчёт от первого, удаляют каждого k-ого, смыкая при этом круг. Определить номер последнего, оставшегося в круге. ( k?N )
Тест 1: k=3 N=7 Ответ: 4
Тест 2: k=4 N=11 Ответ: 9
Указание. Для решения задачи использовать очередь, в которой ссылочное поле последнего элемента содержит адрес первого элемента.
27. Создать стек, информационные поля которого содержат числа из текстового файла file1.txt. Вывести значения информационных полей стека в поле метки. Содержимое файла file1.txt:
14 -9 8 -22 39
-1 -13 0 4 -7
27 5 -2 18 3
28. Написать программу, проверяющую правильность расстановки круглых скобок в арифметическом выражении.
29. Преобразовать последовательность действительных чисел, записанных в файле file6.txt, расположив сначала отрицательные числа последовательности, а затем неотрицательные. При этом порядок как отрицательных, так и неотрицательных чисел изменяется на обратный. Для отображения содержимого файла на форме использовать компонент Memo1.
Указание.
Для решения задачи создать два стека: с отрицательными и с неотрицательными числами последовательности.
Содержимое файла file6.txt: 19.5 8.06 -43.1 14.9 -35.8
-27.02 0 5.17 62.4 -4.7
30. Даны целые числа a1, a2, … an (n=20), содержащиеся в текстовом файле file7.txt. Вычислить значение выражения
p1 ? 10 + p2 ? 100 + p3 ? 1000 + … ,
где p1, p2 , p3 , … – встречающиеся в последовательности положительные числа, взятые в обратном порядке (начиная с последнего встретившегося положительного числа). Содержимое файла file7.txt:
5 -26 8 -12 19
-10 -13 0 4 -7
9 1 -2 18 -63
Указание.
Для решения задачи сформировать стек из положительных чисел последовательности.
31. Написать программу для вычисления значения выражения, представленного в обратной польской записи.
Обычная запись Обратная польская запись
(b + c) ? d b c + d ?
a + (b + c) ? d a b c + d ? +
(6 + 8)/2 + 11 6 8 + 2 / 11 +
Указание.
Просматривая строку, в которой записано выражение, анализируем очередной символ. Если это число, то записываем его в стек. Если это знак операции, то достаём два элемента из стека, выполняем арифметическую операцию, определяемую этим знаком, и заносим результат в стек.
32. Рассмотрим использование рекурсии при написании программы по вычислению n! Значение n (n ? 20) возьмём из текстового файла, туда же запишем результат вычисления.
33. Описать рекурсивную функцию для подсчёта количества запятых в данном текстовом файле.
34. Описать рекурсивную функцию
function step(z : real; m:byte):real;
для вычисления zm (z – вещественное, m – натуральное) и с её помощью подсчитать значение выражения a7 + b8 .
35. Описать рекурсивную функцию
function fib(n : integer) : integer;
для вычисления n-ого (n ? 40) числа Фибоначчи.
Указание.
Последовательность чисел Фибоначчи fk образуется так:
f0=1, f1=1, fk = fk-2 + fk-1.
36. Описать рекурсивную функцию
function arifm(a, d, k : integer) : integer;
для вычисления k-ого элемента арифметической прогрессии (a – первый элемент прогрессии, d – разность прогрессии).
37. Создать очередь из чисел файла file8.txt с помощью рекурсивной процедуры
procedure add(var r : link).
Описать рекурсивную функцию
function memb(r:link; b:integer) : boolean;
проверяющую, входит ли элемент с информационным полем b в список r.
Описать рекурсивную процедуру
procedure dele(var r:link; w:integer);
удаляющую из списка r первое вхождение элемента с информационным полем w.
Используя функцию memb, проверить, входит ли число, введённое в поле Edit1, в созданный список. Если да, то удалить из списка первое вхождение этого числа с помощью процедуры dele и вывести преобразованный список в файл file9.txt с помощью процедуры out. В противном случае вывести сообщение: «Такого элемента нет».
Содержимое файла file8.txt:
9 -38 15 4 -21
15 9 -47 15 36
38. Создать очередь с помощью рекурсивной процедуры
procedure add(var r : link).
Описать рекурсивную функцию
function neg(r : link) : boolean;
проверяющую, имеется ли в списке элемент с отрицательным информационным полем. Ответ вывести в поле метки.
Создать очередь с помощью рекурсивной процедуры
procedure add(var r : link).
Описать рекурсивную функцию
function nmemb(r:link; b:integer):integer;
подсчитывающую количество вхождений элемента с информационным полем b в список r.
С помощью этой функции подсчитать, сколько раз встречается в списке число, введённое в поле Edit1. Результат вывести в поле метки.
39. Создать очередь с помощью рекурсивной процедуры
procedure add(var r : link).
Описать рекурсивную функцию
function max(r:link) : integer;
для нахождения максимума в списке r. Результат вывести в поле метки.
40. Создать очередь, информационные поля которой содержат числа из текстового файла r1.txt . Вставить в список за каждым отрицательным числом новый элемент с информационным полем, равным модулю данного отрицательного числа.
41. Создать очередь из 20 элементов, информационные поля которой содержат случайные числа из интервала [-50,50]. Удалить из списка все числа, по модулю большие числа 20. Использовать метод фиктивного элемента.
42. Дана последовательность символов, состоящая из английских букв и цифр, записанных в текстовом файле r3.txt. Используя запись в стек, получить число, составленное из цифр последовательности, записанных в обратном порядке. Полученное число записать в текстовый файл.
43. Дана последовательность символов, состоящая из английских букв и цифр, записанных в текстовом файле. Используя запись в стек, получить текст, составленный из английских букв последовательности, записанных в обратном порядке. Полученный текст записать в текстовый файл.
44. Создать очередь, информационные поля которой содержат числа из текстового файла. Подсчитать число максимальных элементов списка.
45. Создать очередь, информационные поля которой содержат числа из текстового файла. Из каждой группы подряд идущих одинаковых чисел оставить только одно.
46. Создать очередь, информационные поля которой содержат вещественные числа из текстового файла. Проверить, упорядочены ли числа по возрастанию или по убыванию.
47. Создать очередь, информационные поля которой содержат вещественные числа из текстового файла. Для каждого элемента списка определить число отрицательных элементов, следующих за ним. Результаты записать в текстовый файл в виде:
элемент списка
число последующих отрицательных элементов.
48. Создать очередь, информационные поля которой содержат вещественные числа из текстового файла. Проверить, образуют ли числа, хранящиеся в списке, арифметическую или геометрическую прогрессию.
49. Дана последовательность вещественных чисел, записанных в текстовом файле. Вычислить произведение сумм: .
50. Дана последовательность вещественных чисел, записанных в текстовом файле. Вычислить произведение сумм:
.
14. Рекурсия
14.1. Примеры
Пример 1. Для примера рассмотрим рекурсивную функцию вычисления факториала:
Листинг 1. Вычисление факториала.
function Factorial(k: integer): integer;
begin
if k=1 then Factorial:=1
else Factorial:= k*Factorial(k-1);
end;

Пример 2. Ханойская башня. На одном из стержней лежат 64 (на рис. 1 приведены только 4) золотых кольца, различных по размеру и расположенных пирамидой: снизу самого большого диаметра, потом меньшего, и, наконец, на верху пирамиды — самый маленький.

Рис. 1. Ханойские башни (начальное положение).
Эти кольца нужно переложить на другой стержень, получив точно такую же пирамиду. Третий стержень используется как промежуточный. Условия перемещения колец следующие:
o за один раз можно перемещать только одно кольцо;
o кольцо можно брать только с вершины одной из пирамид, а класть либо на пустой стержень, либо на кольцо большего диаметра.
Когда монахи перенесут все 64 кольца, наступит конец света.
Мы выберем (за неимением золота-бриллиантов) более простую задачу: рисовать последовательность перемещений колец.
Напомним, что рекурсивное решение любой задачи состоит из этапов параметризации и поиска тривиального случая. Здесь естественным параметром является K — число колец. В число параметров нужно включить также и стержни, они пронумерованы: 1, 2, 3. Тривиальным случаем будет такой, при котором K = 0: в этом случае просто нечего делать.
K колец могут быть перемещены со стержня 1 на стержень 2 путем:
o переноса (рекурсивно) K – 1 кольца со стержня 1 (исходного) на стержень 3 с учетом правил игры. Стержень 2 используется как промежуточный.
o перемещения на стержень 2 со стержня 1 последнего — наибольшего — кольца (рис. 11.4);
o переноса (рекурсивно) K – 1 других колец со стержня 3 на стержень 2. Но теперь как промежуточный будет использоваться стержень 1.

Рис. 2. Ханойские башни (промежуточное положение).
Тогда структура процедуры Hanoj будет такой:
Листинг 1. Ханойская башня
procedure Hanoj(d1,d2,d3: integer; // стержни
k: integer); // количество колец
begin
if k>0 then begin
Hanoj(d1,d3,d2,k-1);
// переместить кольцо со стержня 1 на стержень 2,
// отобразить
Hanoj(d3,d2,d1,k-1);
end;
end;
В этой процедуре единственное реальное действие описывается строкой
переместить кольцо со стержня 1 на стержень 2, отобразить
остальные служат только для описания последовательности рекурсивных вызовов и соответствующих модификаций параметров.
Для рисования башен необходимо знать, сколько и какого размера колец лежит на каждом стержне. Поскольку по правилам игры брать со стержня можно только верхнее кольцо, класть кольцо можно только на верхушку стержня, то естественно в качестве структуры для хранения информации о кольцах на стержнях выбрать стек.
В стек помещаются целые числа, величина числа соответствует размеру кольца. Каждый стержень имеет свой стек. И тогда перемещение кольца с одного стержня на другой эквивалентно взятию числа из одного (соответствующего стержню) стека и помещению в другой стек. После каждого перемещения кольца отображаются башни. Процедура Hanoj приведена в листинге 2.
Листинг 2. "Ханойские башни". Основная процедура
procedure Hanoj(d1,d2,d3: integer; // стержни
k: integer); // количество колец
var e : TInfo;
i : integer;
tmp : TStack;
begin
if k>0 then begin
Hanoj(d1,d3,d2,k-1);
e:=PopStack(ArSt[d1]); // кольцо берется со стержня d1
PushStack(ArSt[d2],e); // кольцо кладется на стержень d2
UntHanoj.Form1.DrawTower; // рисование башен
Hanoj(d3,d2,d1,k-1);
end;
end;
14.2. Задания
1. Написать рекурсивную функцию для нахождения биномиальных коэффициентов

2. Для заданного М вычислить все
3. Задано конечное множество имен жителей некоторого города, причем для каждого из жителей перечислены имена его детей. Жители А и Б называются родственниками, если:
o либо А — ребенок Б,
o либо Б — ребенок А,
o либо существует некий В такой, что А является родственником В, а В является родственником Б.
Перечислить все пары жителей города, которые являются родственниками.
4. Подсчитать количество различных представлений заданного натурального N в виде суммы не менее двух попарно различных положительных слагаемых. Представления, отличающиеся порядком слагаемых, различными не считаются.
5. Вычислить определитель заданной матрицы, пользуясь формулой разложения по первой строке:

где матрица B получается вычеркиванием из А первой строки и k-го столбца.
6. Построить синтаксический анализатор для понятия простое_выражение,
o простое выражение ::= простой_ идентификатор | (простое_выражение знак_операции простое_выражение);
o простой идентификатор: := буква;
o знак_операци::= + | – | *;
7. Написать процедуру, которая по заданному простому логическому выражению вычисляет его значение.
o логическое выражение.:= TRUE | FALSE | NOT логическое_выражение
o (логическое_выражение знак_операции логическое_выражение);
o знак_операщш::= AND | OR;
8. Расставить на шахматной доске 8 ферзей таким образом, чтобы ни один не угрожал другому.
9. Получить расстановки 8 ладей на шахматной доске, при которых ни одна ладья не угрожает другой.
10. Получить все перестановки элементов 1,..., 6.
11. Получить все размещения из 10 элементов 1, 2,..., 10 по 3 в каждом. Размещением называется выборка из п указанных элементов т неповторяющихся элементов.
12. На шахматной доске определигь поля, в которые может попасть конь за п ходов из указанной позиции.
13. Имеются п городов. Некоторые из них соединены дорогами известной длины.
13.1. Найти кратчайшие маршруты из заданного города в остальные.
13.2. Найти кратчайший маршрут, начинающийся в заданном городе и проходящий через все остальные.
14. Найти расстановку 5 ферзей, при которой каждое поле шахматной доски будет находиться под ударом хотя бы одного из них.
15. «Задача о рюкзаке». Имеется М различных предметов, известны вес каждого предмета и его стоимость. Определить, какие предметы надо положить в рюкзак, чтобы общий вес не превышал заданной границы, а общая стоимость была максимальной.
16. Даны целое п от 2 до 20 и вещественное Е>0. Найти с точностью Е все корни n-го многочлена Чебышева Тп(х), определяемого формулами Т0 (х) = 1; Т1 (х) = х; Тk (х) = 2хTk-1 (х) - Тк-2 (х), (к = 2,3,...).
17. Найти расстановку 5 ферзей, при которой каждое поле шахматной доски будет находиться под ударом хотя бы одного из них.
18. Покрыть все клетки шахматной доски ходом коня, начальное положение коня на поле с координатами x0, y0
19. Задана система двусторонних дорог. Найти замкнутый путь, проходящий через каждую вершину и длиной не более 100 км.
20. Прямоугольная матрица содержит ячейки двух типов — "белые" и "черные". Написать процедуру, находящую хотя бы один путь от первой строки матрицы до последней по "белым" ячейкам. Переход возможен только в соседнюю ячейку: левую, правую, верхнюю, нижнюю, то есть при изменении только одного индекса.
21. Описать рекурсивные функции Fact(N) и Fact2(N) вещественного типа, вычисляющие значения факториала N! и двойного факториала N!! соответственно (N > 0 — параметр целого типа). С помощью этих функций вычислить факториалы и двойные факториалы пяти данных чисел.
22. Описать рекурсивную функцию PowerN(x,n) вещественного типа, находящую значение n-й степени числа x по формуле:
x0 = 1, xn = x•xn–1 при n > 0, xn = 1 / x–n при n = 0 — вещественное число, n — целое). С помощью этой функции найти значения XN при 5 различных значениях N для данного X.
23. Описать рекурсивную функцию SqrtK(x,k,n) вещественного типа, находящую приближенное значение корня k-й степени из числа x по формуле: y(0) = 1, y(n+1) = y(n) – (y(n) – x / y(n)k–1) / k, где y(n) обозначает SqrtK(x,k,n) (x — вещественный параметр, k и n — целые; x > 0, k > 1, n > 0). С помощью этой функции найти приближенные значения корня K-й степени из X при 6 различных значениях N для данных X и K.
24. Описать рекурсивную функцию FibRec(N) целого типа, вычисляющую N-е число Фибоначчи F(N) по формуле: F(1) = F(2) = 1, F(k) = F(k–2) + F(k–1), k = 3, 4, ... . С помощью этой функции найти пять чисел Фибоначчи с указанными номерами и вывести эти числа вместе с количеством рекурсивных вызовов функции FibRec, потребовавшихся для их нахождения.
25. Описать рекурсивную функцию C(m,n) целого типа, находящую число сочетаний из n элементов по m, используя формулу: C(0,n) = C(n,n) = 1, C(m,n) = C(m,n–1) + C(m–1,n–1) при 0 0, 0 26. Описать рекурсивную функцию NOD(A,B) целого типа, находящую наибольший общий делитель двух натуральных чисел A и B, используя алгоритм Евклида: NOD(A,B) = NOD(B mod A,A), если A 0; NOD(0,B) = B. С помощью этой функции найти наибольшие общие делители пар A и B, A и C, A и D, если даны числа A, B, C, D.
27. Описать рекурсивную функцию MinRec(A,N)1|MaxRec(A,N)2 вещественного типа, которая находит минимальный1 или максимальный2 элемент вещественного массива A размера N, не используя оператор цикла. С помощью функции MinRec1 или MaxRec2 найти минимальные1 или максимальные2 элементы массивов A, B, C размера NA, NB, NC соответственно.
28. Описать рекурсивную функцию Digits(S) целого типа, находящую количество цифр в строке S без использования оператора цикла. С помощью этой функции найти количество цифр в данных пяти строках.
29. Описать рекурсивную функцию Simm(S) логического типа, проверяющую, является ли симметричной строка S, без использования оператора цикла. С помощью этой функции проверить данные пять строк.
15. Разбор выражений

15.1. Пример

15.2. Задания
1. Вывести значение целочисленного выражения, заданного в виде строки S. Выражение определяется следующим образом:
::= | + | –
2. Вывести значение целочисленного выражения, заданного в виде строки S. Выражение определяется следующим образом:
::= | + | –
::= | *
3. Вывести значение целочисленного выражения, заданного в виде строки S. Выражение определяется следующим образом:
::= | + | –
::= | *
::= | ()
4. Вывести значение целочисленного выражения, заданного в виде строки S. Выражение определяется следующим образом:
::= | ()
::= + | – | *
5. Проверить правильность выражения, заданного в виде строки S (выражение определяется по тем же правилам, что и в задании Proc73). Если выражение составлено правильно, то вывести True, иначе вывести False.
6. Проверить правильность выражения, заданного в виде строки S (выражение определяется по тем же правилам, что и в задании Proc73). Если выражение составлено правильно, то вывести 0, в противном случае вывести номер первого ошибочного (или лишнего) символа в строке S.
7. Вывести значение логического выражения, заданного в виде строки S. Выражение определяется следующим образом ("T" — True, "F" — False):
::= T | F | And() | Or()
::= ,
8. Вывести значение логического выражения, заданного в виде строки S. Выражение определяется следующим образом ("T" — True, "F" — False):
::= T | F | And() | Or()
::= | ,
9. Вывести значение логического выражения, заданного в виде строки S. Выражение определяется следующим образом ("T" — True, "F" — False):
::= T | F | And() | Or() | Not()
::= | ,
10. Проверить правильность расстановки скобок в строке S. Текст в строке S определяется следующим образом:
::= |
::= a | b | c | () | [] | {} Если текст составлен правильно, то вывести True, иначе вывести False.
11. Проверить правильность расстановки скобок в строке S (текст в строке S определяется по тем же правилам, что и в задании Proc79). Если текст составлен правильно, то вывести 0; в противном случае вывести номер первой ошибочной скобки или –1, если в строке недостаточно закрывающих скобок.

16. Деревья
16.1. Пример

16.2. Задания
1. Дано упорядоченное дерево глубины N (> 0), каждая внутренняя вершина которого имеет K ( 2. Дано упорядоченное дерево глубины N (> 0), каждая внутренняя вершина которого имеет K ( 3. Дано упорядоченное дерево глубины N (N > 0 — четное), каждая внутренняя вершина которого имеет два непосредственных потомка: A с весом 1 и B с весом –1. Корень дерева C имеет вес 0. Записать в текстовый файл с именем Name все пути от корня к листьям, удовлетворяющие следующему условию: суммарный вес элементов пути равен 0. Каждый путь записывается в отдельной строке файла. Порядок перебора путей — тот же, что в задании 1.
4. Дано упорядоченное дерево глубины N (N > 0) того же типа, что и в задании 3. Записать в текстовый файл с именем Name все пути от корня к листьям, удовлетворяющие следующему условию: суммарный вес элементов для любого начального отрезка пути неотрицателен1|неположителен2. Каждый путь записывается в отдельной строке файла. Порядок перебора путей — тот же, что в задании 1.
5. Дано упорядоченное дерево глубины N (N > 0 — четное) того же типа, что и в задании 3. Записать в текстовый файл с именем Name все пути от корня к листьям, удовлетворяющие следующим условиям: суммарный вес элементов для любого начального отрезка пути неотрицателен1|неположителен2, а суммарный вес всех элементов пути равен 0. Каждый путь записывается в отдельной строке файла. Порядок перебора путей — тот же, что в задании 1.
6. Подсчитать сумму элементов на k-ом уровне заданного двоичного дерева (корень считать узлом 1-го уровня).
7. Подсчитать число узлов на k-ом уровне заданного двоичного дерева (корень считать узлом 1-го уровня).
8. Подсчитать минимум из чисел содержащихся в листьях заданного двоичного дерева.
9. Подсчитать максимум элементов на k-ом уровне заданного двоичного дерева (корень считать узлом 1-го уровня).
10. Дано вещественное x, целое k. Подсчитать количество чисел, меньших x, в узлах ниже k-ого уровня.
11. Даны два упорядоченных по возрастанию массива A и B. Получить из них путем слияния упорядоченный по возрастанию массив C; совпадающие элементы вставлять единожды. Подсчитать количество элементов в массиве C.
12. Из двух упорядоченных по невозрастанию массивов A(m) и B(n) получить путем слияния упорядоченный по убыванию массив C; удаляемые элементы собрать в массиве D. Подсчитать количество элементов в массивах C и D.
13. Путем слияния из возрастающего A(m) и невозрастающего B(n) массивов получить возрастающий массив C (с удалением совпадающих элементов). Подсчитать количество элементов в массиве С.
14. Упорядочить строки матрицы A(m,n) по неубыванию суммы элементов строк.
15. Упорядочить строки матрицы A(m,n) по неубыванию их евклидовых норм.
16. Упорядочить строки матрицы A(m,n) по неубыванию количества их нечетных элементов.
17. Упорядочить строки матрицы A(m,n) по неубыванию сумм цифр элементов строк.
18. Упорядочить строки данного текстового файла в порядке возрастания их длин.
19. Отсортировать в алфавитном порядке слова в заданном текстовом файле, основываясь на k-ой литере каждого слова. Например, если k=3, то слова должны быть отсортированы по возрастанию значения в третьей литере. Если длина слова меньше k, то будем предполагать, что его k-ой литерой, реально не существующей, служит пробел.

17. Графы

17.1. Примеры

17.2. Задания
Найти все вершины графа недостижимые из заданной.
Указание:
использовать рекурсивную процедуру проверки доступности одной вершины из другой.
1. Раскрасить граф минимальным количеством цветов. Каждая вершина должна быть «окрашена» в цвет отличный от цвета смежных вершин.
2. Определить является ли связанным заданный граф. Указание: использовать рекурсивную процедуру проверки доступности одной вершины из другой.
3. Найти длину кратчайшего цикла в графе.
4. Определить вершину, удалением которой можно свести граф к дереву.
5. Найти вершину заданного графа, которая принадлежит каждому пути между двумя заданными вершинами.
6. Задана система односторонних дорог. Найти путь, соединяющий города А и Б, не проходящий через заданное множество вершин.
7. Задана система двусторонних дорог. Найти замкнутый путь, проходящий через каждую вершину и длиной не более 100 км.
8. Найти город в системе двусторонних дорог, у которого сумма расстояний до любого города минимальна.
9. По системе двусторонних дорог определить, определить есть ли в ней город, из которого можно добраться в любой другой менее чем за 100 км. Разрешается построить дополнительно 3 дороги.
10. По системе двусторонних дорог, определить, можно ли закрыв какие-либо 3 из них, добиться того, чтобы из города А нельзя было попасть в город Б.
11. Задана система двусторонних дорог. N-периферией называется множество городов, расстояние от которых до выделенного города больше N. Определить N-периферию для заданного N.
12. Определить, изоморфны ли 2 графа.
13. Построить такой многоугольник (не обязательно выпуклый) с вершинами в заданном множестве, периметр которого максимален.
14. Найти минимальное множество прямых, на которых можно разместить все точки заданного множества.
15. В 3-мерном пространстве задано множество точек. Найти разбиение этого множество на 2 непустых и непересекающихся множества, чтобы их центры тяжести находились наиболее близко друг к другу.
16. Неориентированный граф называется двудольным, если его можно раскрасить в два цвета так, что концы любого ребра будут разного цвета. Составить алгоритм проверки, является ли заданный граф двудольным (число действий не превосходит N + M).
Указание:
• каждую связную компоненту можно раскрашивать отдельно;
• выбрав цвет одной вершины и обходя ее связную компоненту, определяется единственно возможный цвет остальных.
Замечание
В этой задаче безразлично, производить поиск в ширину или в глубину.
17. Решить ту же задачу для ориентированного графа (вывести все вершины, доступные из данной по дугам; граф может содержать циклы).
18. Доказать, что алгоритм Дейкстры можно модифицировать так, чтобы для N городов и N маршрутов он требовал не более O(N +K ln N) операций.
Указание:
на каждом шаге выбрать невыделенный город с минимальной стоимостью и скорректировать цены для всех городов, в которые из него есть маршруты. Если известен города, стоимость до которого минимальна, то хватило бы O(n + k) действий. Вычисление минимального элемента в массиве обходится в множитель log n.
19. Найти все вершины графа недостижимые из заданной вершины.
Указание:
использовать рекурсивную процедуру проверки доступности одной вершины из другой.
20. Раскрасить граф минимальным количеством цветов. Каждая вершина должна быть "окрашена" в цвет, отличный от цвета смежных вершин. Определить является ли связанным заданный граф.
Указание:
использовать рекурсивную процедуру проверки доступности одной вершины из другой.
21. Найти длину кратчайшего цикла в графе.
22. Определить вершину, удалением которой можно свести граф к дереву.
23. Найти вершину заданного графа, которая принадлежит каждому пути между двумя заданными вершинами.
24. Задана система односторонних дорог. Найти путь, соединяющий города А и Б, не проходящий через заданное множество вершин.
25. Задана система двусторонних дорог. Найти замкнутый путь, проходящий через каждую вершину и длиной не более 100 км.
26. Найти город в системе двусторонних дорог, у которого сумма расстояний до любого города минимальна.
27. В системе двусторонних дорог определить, есть ли в ней город, из которого можно добраться в любой другой менее чем за 100 км. Разрешается построить дополнительно 3 дороги.
28. В системе двусторонних дорог определить, можно ли, закрыв какие-либо 3 дороги, добиться того, чтобы из города А нельзя было попасть в город Б.
29. Задана система двусторонних дорог. N-периферией называется множество городов, расстояние от которых до выделенного города больше N. Определить N-периферию для заданного числа N.
30. Определить, изоморфны ли 2 графа.
31. Построить такой многоугольник (не обязательно выпуклый) с вершинами в заданном множестве, периметр которого максимален.
32. Найти минимальное множество прямых линий, на которых можно разместить все точки заданного множества.
33. В трехмерном пространстве задано множество точек. Найти разбиение этого множество на 2 непустых и непересекающихся множества, чтобы их центры тяжести находились наиболее близко друг к другу.
34. С эйлеровыми циклами связана задача китайского почтальона, условие которой звучит так: ребрам неориентированного графа приписаны положительные веса. Необходимо найти цикл, проходящий через каждое ребро графа не менее одного раза и такой, чтобы сумма весов с учетом кратности прохождения ребер была бы минимальна.
Замечание
Эта задача часто встречается на практике. Например, при решении задач планирования проверки электрических, телефонных или железнодорожных линий, при решении задач доставки почты или продуктов питания и т. п.

Литература:
1. Вирт Н. Алгоритмы + структуры данных = программы. М.: Мир, 1985.
2. Вирт Н. Алгоритмы и структуры данных. М.: Мир, 1989, СПб:, «Невский диалект», 2001.
3. Вирт Н. Систематическое программирование. Введение М.: Мир, 1982.
4. Кнут Д. Искусство программирования для ЭВМ. т.1. Основные алгоритмы. М.: Мир, 1976.
5. Кнут Д. Искусство программирования для ЭВМ. т.3. Сортировка и поиск. М.: Мир, 1976.
6. Кушниренко А.Г., Лебедев Г.В. Программирование для математиков. -М.: Наука, 1988.
7. Липский В. Комбинаторика для программистов. М.: Мир, 1988.
8. Стивенс Р. Delphi. Готовые алгоритмы. – М: ДМК Пресс; СПб.: Питер, 2004. – 384 с.
9. Тюкачев Н.А. Основы программирования в Delphi: Специальные вопросы. учеб. пособие, Воронеж: Воронежский госуниверситет, 2007, 195 c.
10. Тюкачев Н.А., Михайлова Е.Е. Основы программирования в Delphi: Алгоритмы на деревьях и графах. учеб. пособие, Воронеж: Воронежский госуниверситет, 2007, 193 c.
11. Тюкачев Н.А., Михайлова Е.Е., Копытин А.С. Языки и системы программирования. Delphi: учебное пособие, Воронежский государственный университет, 2004, 240 с.
12. Тюкачев Н.А., Михайлова Е.Е., Рыбак К.С. Основы программирования в Delphi: учеб. пособие, Воронеж: Воронежский госуниверситет, 2005, 280 c.
13. Тюкачев Н.А., Рыбак К.С., Михайлова Е.Е. Программирование в Delphi для начинающих. BHV-Питер, 2007 г., 672 с.
14. Ускова О.Ф. и др. Программирование на языке Паскаль. – СПб. «Питер» 2002.
15. Шень
16. Пильщиков
17.