Задачи к урока по теме Подпрограммы

Задача1: 
Описать процедуру нахождения по заданной длине стороны треугольника и величинам двух прилежащих углов длин остальных сторон треугольника и величины третьего угла.
Алгоритм решения задачи: 
По известным двум углам треугольника и стороне между ними можно найти остальные стороны, используя теорему синусов: отношение синусов углов треугольника к длинам противолежащих сторон равны между собой. Для треугольника ABC получаем: sin A / BC = sin B / AC = sin C / AB.
Отсюда AC = (sin B * AB) / sin C, BC = (sin A * AB) / sin C.
Если известны два угла треугольника, то третий угол легко вычисляется, учитывая, что сумма углов треугольника равна 180 градусам.
В Pascal функция sin() принимает угол выраженный в радианах. Чтобы перевести градусы в радианы нужно воспользоваться формулой: rad = Угол * pi / 180.
Программа на языке Паскаль: 
var
K,L,M,KL,LM,KM: real;
 
procedure triangle(var A,B,C,AB,BC,AC: real);
var radA, radB, radC: real;
begin
C := 180 - A - B;
radA := A * PI/180;
r
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·Задача2: 
Описать функцию вычисления f(x) по формуле: f(x)= x^2 при -2<=x<2; x^2+4x+5 при x>=2; 4 при x<-2.
Используя эту функцию для n заданных чисел, вычислить f(x). Среди вычисленных значений найти наибольшее.
Программа на языке Паскаль: 
const
n =
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·('Result: ');
for i:=1 to n do
write(arr[i], ' ');
writeln;
writeln('max = ', max);
 
readln;
end.


Задача 3: 
Число представленное в шестнадцатеричной системе счисления перевести в десятичную систему счисления.
Алгоритм решения задачи: 
Алгоритм аналогичен [ Cкачайте файл, чтобы посмотреть ссылку ], за исключением того, что цифры обозначенные буквами от A до F следует заменить цифрами от 10 до 15.
Программа на языке Паскаль: 
var
hexa: string; {шестнадцатеричное число}
n: byte; {его длина}
ch: char; {цифра очередного разряда как символ}
digit: byte; {цифра очередного разряда}
m: byte; {степень 16}
decimal: integer; {десятичное число}

·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
· 'F': digit := 15
end
else
digit := ord(ch) - ord('0');
m := m - 1;
decimal := decimal + digit * pow16(m);
end;
 
writeln('Decimal: ',decimal);
 
readln
end.
Задача 4.
Алгоритм решения задачи: 
Представленная ниже программа с процедурой вычисления корней квадратного уравнения не возвращает в основную программу ничего (просто выводит результат на экран). Однако можно написать такую процедуру, которая будет использовать глобальные переменные x1 и x2. В результате в основной ветке программы можно будет использовать полученные корни квадратного уравнения.
Программа на языке Паскаль: 
var
a, b, c: real;
 
procedure sq (a,b,c: real);
var d, x1, x2: real;
begin
d := b * b - 4 * a * c;

·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·'Корней нет!')
end;
 
begin
 
write ('a = '); readln (a);
write ('b = '); readln (b);
write ('c = '); readln (c);
 
writeln (a:6:2,'x*x + ',b:6:2,'x + ',c:6:2,' = 0');
 
sq (a, b, c);
 
readln
end.
Задача5: 
Найти разность двух матриц по модулю, т.е. из большего элемента одной матрицы вычесть меньший элемент второй матрицы, находящийся в той же позиции.
Алгоритм решения задачи: 
Решение задачи нахождения разности двух матриц аналогично нахождению [ Cкачайте файл, чтобы посмотреть ссылку ].
Поскольку нужно из большего элемента вычесть меньший, то можно было бы воспользоваться оператором ветвления. Однако проще использовать встроенную в Pascal функцию abs(), которая возвращает модуль переданного ей параметра. При этом не важно из большего элемента вычитается меньший (например, 5 - 3) или из меньшего больший (3 - 5), результат будет один и тот же.
Программа на языке Паскаль: 
const N = 2; M = 5;
type arr = array[1..N,1..M] of integer;
var
one,two,three: arr;
i,j: byte;
 
proc
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
Задача 6: 
Преобразовать строку так, чтобы буквы каждого слова в ней были отсортированы по алфавиту.
Алгоритм решения задачи: 
Решение данной задачи в общей сложности сводится к двум подзадачам. Это 1) найти индексы первого и последнего очередного слова, 2) отсортировать буквы между этими индексами. Эти две подзадачи должны выполняться столько раз, сколько слов в строке.
Вся строка в цикле перебирается посимвольно. Вводится флаговая переменная, которая сигнализирует о том, находимся ли мы внутри слова или нет. Если очередной символ не пробел и флаг показывает, что мы не в слове, то значит, текущий символ - первая буква слова. Присвоим его индекс переменной start, поменяем значение флаговой переменной (теперь она указывает, что мы внутри слова).
Если очередной символ не пробел, и флаг указывает, что мы внутри слова, то присвоим текущий индекс переменной finish. Если впоследствии за ним будет идти буква, то finish изменится, если же пробел - то эта переменная будет иметь индекс последней буквы слова.
Если встречается пробел, то флаг сбрасывается (мы вне слова). Также буквы с индексами от start до finish сортируются. Если после последнего слова строки нет пробела, то оно не будет отсортировано. Поэтому после цикла перебора символов строки выполняется еще одна сортировка.
Сортировка оформлена в виде отдельной процедуры. В качестве параметров передаются сама строка, начало и конец среза для сортировки. Используется сортировка выбором, т.к. можно использовать индексы непосредственно. В то время как в сортировке пузырьком находится разность между ними, что в данном случае приведет к ошибке.
Программа на языке Паскаль: 
var
s: string;
l, i, start, finish: byte;
flag: boolean;
procedure sort(var s: string; first, last: byte);
var
max, i: byte;
c: char;
begin
while last > first do begin
max := first;
for i:=first+1 to last do
if s[i] > s[max] then
max := i;
c := s[max];
s[max] := s[last];
s[last] := c;
last := last - 1;
end;
end;
begin
readln(s);
l := length(s);
start := 1;
finish := 1;
flag := False;
for i:=1 to l do
if s[i] = ' ' then begin
flag := False;
if start < finish then
sort(s,start,finish);
end
else
if flag = False then begin
flag := True;
start := i;
end
else
finish := i;
 
if start < finish then // для последнего слова, когда после него не было пробела
sort(s,start,finish);
 
writeln(s);
end.
Задача 7: 
С помощью подпрограммы заполнить матрицы случайными числами. Написать подпрограмму, вычисляющую сумму двух матриц. Вывести на экран две исходные матрицы и их сумму (используя процедуру).
Описание переменных: 
one, two - исходные матрицы; three - матрица-сумма двух предыдущих; matrix - процедура, заполняющая массив случайными числами; printer - процедура, выводящая содержимое массивов на экран; plus - процедура, вычисляющая сумму матриц.
Алгоритм решения задачи: 
Под суммой матриц будем понимать сложение их элементов, находящихся в одинаковых позициях (имеющих одинаковые индексы). Таким образом уместно складывать матрицы одинаковой размерности. При этом будет получена третья матрица с такой же размерностью как исходные.
При решении подобной задачи лучше использовать подпрограммы (процедуры или функции), так как нам приходится заполнять несколько массивов и выводить их на экран. Без подпрограмм в коде будет содержаться много почти идентичного кода.
Используются процедуры, а не функции, так как при заполнении массивов в подпрограмму передается переменная, а не значение. Таким образом, процедура заполняет "внешнюю" для нее матрицу.
В процедуру, вычисляющую сумму матриц, передается три параметра: переменная матрицы-суммы, значения первой и второй матрицы.
В основной ветке программы процедуры последовательно вызываются.
Следует обратить внимание, что randomize вызывается единожды в основной ветке программы. Если данную команду вставить в процедуру заполнения массива, то оба массива будут заполнены одинаковыми числами. Это связано с тем, что "зерно" зависит от таймера, а между двумя вызовами проходит мало времени, чтобы таймер изменил значение. Таким образом, "зерно" в программе надо получать один раз. В этом случае при повторном вызове процедуры отсчет по формуле генерации псевдослучайных чисел продолжается, а не инициируется заново.
Программа на языке Паскаль: 
const N = 2; M = 5;
type arr = array[1..N,1..M] of integer;
var
one,two,three: arr;
i,j: byte;
 
procedure matrix(var a: arr);
begin
for i:=1 to N do
for j:=1 to M do
a[i,j] := random(100);
end;
 
procedure plus(var a: arr; b: arr; c: arr);
begin
for i:=1 to N do
for j:=1 to M do
a[i,j] := b[i,j]+c[i,j];
end;
 
procedure printer(a: arr);
begin
for i:=1 to N do begin
for j:=1 to M do
write(a[i,j]:4);
writeln;
end;
end;
 
begin
randomize;
matrix(one);
printer(one);
writeln;
matrix(two);
printer(two);
writeln;
plus(three,one,two);
printer(three);
end.

15