- •Часть I
- •1.1 Простейшее консольное приложение. Основные понятия
- •Задачи.
- •1.2 Простые типы
- •Целые типы.
- •Задачи.
- •Символьные типы.
- •Логические типы
- •Перечислимый тип
- •Задачи.
- •Вещественные типы
- •Тип дата-время
- •1.3 Операторы Оператор присваивания
- •Составной оператор
- •Условный оператор if
- •Задачи.
- •Оператор выбора case
- •Задачи.
- •Операторы цикла
- •Задачи.
- •Задачи.
- •Задачи.
- •1.4 Процедуры и функции.
- •Процедуры.
- •Функции.
- •Вызов подпрограмм.
- •Локализация имён.
- •Параметры.
- •Задачи.
- •Перегрузка функций.
- •Процедурные типы.
- •1.5 Динамическая память и указатели
- •1.6 Массивы
- •Статические массивы
- •Задачи.
- •Задачи.
- •Задачи.
- •Задачи.
- •Динамические массивы
- •Параметры-массивы
- •1.7 Строки Строковые типы
- •Стандартные подпрограммы для строк.
- •Строковые выражения
- •Задачи.
- •Преобразование строк в числовые типы и обратно.
- •1.8 Множества
- •Задачи.
- •1.9 Записи
- •Задачи.
- •Литература.
- •Оглавление
Задачи.
103. Заполнить массив случайными числами от -30 до 30. Распечатать массив.
1) Найти сумму положительных элементов.
function sum_pol(x:lin):integer;
2) Подсчитать количество чётных элементов.
function kol_chet(x:lin):integer;
3) Напечатать номера нечётных элементов.
procedure nechet(x:lin);
4) Если элемент является чётным числом, то прибавить к нему первый элемент массива, в противном случае – последний элемент массива. Первый и последний элементы массива не изменять.
procedure solve1(var x:lin);
5) Заменить элементы с k1-ого по k2-ой на противоположные по знаку.
procedure solve2(var x:lin; k1, k2:integer);
6) Сформировать массив b, каждый элемент которого равен
b[i]=a[1] + a[2] + … +a[i].
procedure solve3(x:lin; var y:lin);
7) Все элементы массива, предшествующие последнему отрицательному элементу массива, умножить на 10.
function last_neg(x:lin):integer;
procedure solve4( var x:lin);
104. Заполнить одномерный целочисленный массив размерности 10 элементами геометрической прогрессии, первый элемент которой равен а, знаменатель прогрессии – d.
procedure init_geom(var q:lin; a, d:integer),
105. Заполнить одномерный целочисленный массив размерности 20 числами Фибоначчи.
procedure init_fib(var x:lin);
106. Даны действительные числа a1, a2, … , an (n=10). Получить числа b1, b2, … , bn (n=10) , где bi – среднее арифметическое всех элементов последовательности a1, a2, … , an , кроме ai (i=1, 2,…,n).
107. Даны действительные числа a1, a2, … , an, b1, b2, … , bn (n=10). Вычислить (a1 + bn)(a2 + bn-1) … (an + b1).
Максимум и минимум одномерного массива.
Пример 30. Найти максимальный элемент целочисленного массива размерности n.
const n = 10;
type lin = array[1..n] of integer;
var a : lin; res : integer;
procedure init1(var x : lin);
var i : integer;
begin
for i:=1 to n do read(x[i]);
end;
function max(x : lin) : integer;
var i : integer;
begin
result:=x[1];
for i:=2 to n do
if x[i]>result then result:=x[i]
end;
begin
init1(a);
res:=max(a); writeln(res);
readln; readln
end.
Задачи.
108. Найти номер максимального элемента одномерного целочисленного массива размерности 10.
109. Даны целые числа a1, a2, … , a10 . Заменить элемент последовательности нулём, если ai max(a1, a2, … , a10 ), и единицей в противном случае.
110. Даны целые числа a1, a2, … , a10 . Все элементы этой последовательности, предшествующие первому по порядку элементу со значением max(a1, a2, … , a10 ) домножить на max(a1, a2, … , a10 ).
111. Дана последовательность действительных чисел a1,…,a10 . Требуется домножить все элементы этой последовательности на квадрат её минимума, если a10, и на квадрат её максимума, если a10.
112. Дана последовательность из 20 различных целых чисел. Найти сумму чисел этой последовательности, расположенных между максимальным и минимальным числами (включая их).
113*. Дано вещественное число a и вещественный массив из n элементов. Среди элементов массива найти два таких элемента b и c (если они существуют), что числа a, b, c могут быть сторонами прямоугольного треугольника с максимальной площадью. Вывести длины сторон этого треугольника и его площадь.
114*. Даны координаты n точек на плоскости (x1,y1), (x2,y2),…, (xn,yn) . Найти номера двух точек, расстояние между которыми наибольшее. (Считать, что такая пара точек единственная).
Удаление, вставка, перестановка элементов одномерного массива.
Пример 31. В одномерном целочисленном массиве размерности n удалить элемент с номером k.
Решение. Удаление элемента будет осуществлять процедура del(kk:byte; var m:lin). Её работа заключается в том, что все элементы, начиная с номера kk+1, и до номера n сдвигаются на один влево. Например, для удаления 5ого элемента массива
11 3 -8 6 23 -17 9 31 4 15
нужно осуществить сдвиг:
11 3 -8 6 23 -17 9 31 4 15
const n = 10;
type lin = array[1..n] of integer;
var a : lin; k : byte;
procedure init1(var x : lin);
var i : byte;
begin
for i:=1 to n do read(x[i])
end;
procedure del(kk : byte; var x : lin);
var i : byte;
begin
for i:=kk to n-1 do x[i]:=x[i+1];
x[n]:=0
end;
procedure print1(nn : byte; x : lin);
var i : byte;
begin
for i:=1 to nn do write(x[i]:5);
writeln
end;
begin
init1(a);
readln(k); del(k, a);
print1(n-1, a);
readln
end.
После введения последовательности чисел
11 3 -8 6 23 -17 9 31 4 15
и номера удаляемого элемента 5 на экран будет выведен преобразованный массив:
11 3 -8 6 -17 9 31 4 15
Пример 32. В одномерном целочисленном массиве размерности n вставить целое число x после элемента с номером k.
Решение. Вставку числа x после элемента с номером k будет осуществлять процедура ins(kk:byte; xx:integer; var x:lin). Её работа заключается в том, что все элементы, начиная с номера kk, и до номера n сдвигаются на один вправо (начиная с конца массива). Например, для вставки числа 100 после 5ого элемента массива
11 3 -8 6 23 -17 9 31 4 15
нужно осуществить сдвиг:
11 3 -8 6 23 -17 9 31 4 15
Затем поставить число 100 на место элемента с номером kk+1
11 3 -8 6 23 100 -17 9 31 4 15
Полученный массив будет содержать n+1 элемент, поэтому массив сразу должен быть описан, как массив размерности n+1.
const n=10;
type lin=array[1..n+1] of integer;
var a:lin; k:byte; r:integer;
procedure init1(var x:lin);
var i:byte;
begin
for i:=1 to n do read(x[i])
end;
procedure ins(kk:byte; rr:integer; var x:lin);
var i:byte;
begin
for i:=n downto kk+1 do x[i+1]:=x[i];
x[kk+1]:=rr
end;
procedure print1(nn:byte; x:lin);
var i:byte;
begin
for i:=1 to nn do write(x[i]:5);
writeln
end;
begin
init1(a);
readln(k, r); ins(k, r, a);
print1(n+1, a);
readln
end.
Пример 33. В одномерном целочисленном массиве размерности n поменять местами первую и вторую половины массива.
Решение. Алгоритм заключается в том, что 1ый элемент меняется местами с последним, 2ой элемент – с предпоследним и так далее. Процедура swap(k1, k2:byte; var m:lin); меняет местами два элемента с номерами k1 и k2.
const n=10;
type lin=array[1..n] of integer;
var a:lin; j:byte;
procedure init1(var x:lin);
var i:byte;
begin
for i:=1 to n do read(x[i])
end;
procedure swap(k1, k2:byte; var x:lin);
var d:integer;
begin d:=x[k1]; x[k1]:=x[k2]; x[k2]:=d end;
procedure print(x:lin);
var i:byte;
begin
for i:=1 to n do write(x[i]:5);
writeln
end;
begin
init1(a);
for j:=1 to n div 2 do swap(j, n – j + 1, a);
print(a);
readln; readln
end.
Сортировка одномерного массива.
Для решения многих задач необходимо упорядочить данные по определённому признаку. Процесс упорядочения заданного множества объектов по определённому признаку называется сортировкой. Элементы массива можно сортировать по возрастанию a[1]<a[2]<…<a[n], по неубыванию a[1]a[2]…a[n], по убыванию a[1]>a[2]>…>a[n], по невозрастанию a[1]a[2]…a[n]. Научившись выполнять одну сортировку, изменить её, чтобы получить другую, не составляет особого труда.
Пример 34. Сортировка простого обмена (пузырьком).
Рассмотрим идею метода на примере. Отсортируем по возрастанию массив из 5 элементов 5 11 9 4 3. Будем просматривать пары рядом стоящих элементов массива и, если элементы стоят неправильно, то менять их местами.
1ый просмотр. 5 11 9 4 3 ( 5 < 11 не меняем)
5 11 9 4 3 ( 11 > 9 меняем)
5 9 11 4 3 ( 11 > 4 меняем)
5 9 4 11 3 ( 11 > 3 меняем)
Элемент 11 теперь находится на своём месте.
2ой просмотр. 5 9 4 3 11 ( 5 < 9 не меняем)
5 9 4 3 11 ( 9 > 4 меняем)
5 4 9 3 11 ( 9 > 3 меняем)
Элемент 9 теперь находится на своём месте.
3ий просмотр. 5 4 3 9 11 ( 5 > 4 меняем)
4 5 3 9 11 ( 5 > 3 меняем)
Элемент 5 теперь находится на своём месте.
4ый просмотр. 4 3 5 9 11 ( 4 > 3 меняем)
Элементы 3 и 4 теперь находятся на своих местах.
Процедура сортировки.
procedure sort(var x:lin);
var k, i, w:integer;
begin
for k:=1 to n-1 do
for i:=1 to n-k do
if x[i] > x[i+1] then
begin w:=x[i]; x[i]:=x[i+1]; x[i+1]:=w end;
end;
Таким образом, мы произвели n-1 просмотр массива, на каждом k-ом просмотре выполняется n-k сравнений. Массив отсортирован. Этот метод называют также методом пузырька, так как в процессе сортировки элементы с заданным свойством постепенно всплывают на поверхность.
Пример 35. Сортировка простыми вставками.
На i-ом шаге сортировки считается, что часть массива, содержащая первые i-1 элементов уже упорядочена, то есть a[1]<a[2]< …<a[i-1]. Далее берётся i-й элемент, и для него подбирается место в отсортированной части массива, такое, что после его вставки упорядоченность не нарушается, то есть нужно найти такое j (0ji-1), что a[j]<a[i]<a[j+1]. Затем выполняется вставка элемента a[i] на место j+1. На каждом шаге отсортированная часть массива увеличивается.
Рассмотрим этот процесс на примере. Пусть требуется отсортировать массив из пяти элементов 13 6 8 11 3 по возрастанию.
1ый шаг. 13 6 8 11 3
2ой шаг. 6 13 8 11 3
3ий шаг. 6 8 13 11 3
4ый шаг. 6 8 11 13 3
5ый шаг. 3 6 8 11 13
Процедура сортировки.
procedure sort(var x:lin);
var i, j, w:integer;
begin
for i:=2 to n do
begin
w:=x[i]; j:=i-1;
while (j>0) and (w<x[j]) do
begin x[j+1]:=x[j]; dec(j) end;
x[j+1]:=w
end;
end;
