§23 ГДЗ Семакин 10 класс (Информатика)
2. В чем различие между процедурами и функциями?
3. Какие существуют способы передачи данных между подпрограммой и вызывающей ее программой?
4. Составьте программу вычисления площади кольца по значениям внутреннего и внешнего радиусов, используя подпрограмму вычисления площади круга (два варианта: с процедурой и с функцией).
5. Составьте программу сложения двух простых дробей. Результат должен быть несократимой дробью. Используйте подпрограмму вычисления НОД по алгоритму Евклида. Простая дробь задается двумя целыми числами: числителем и знаменателем.
6. По координатам вершин треугольника вычислите его периметр, используя подпрограмму вычисления длины отрезка между двумя точками.
7. Даны три целых числа. Определите, у которого из них больше сумма цифр. Подсчет суммы цифр организуйте через подпрограмму.
1. Подпрограммы используют для разбиения программы на более простые части, повторного использования одинаковых действий и упрощения записи и отладки программы.
2. Процедура выполняет действия и не возвращает значение, а функция вычисляет одно значение и может использоваться в выражениях. В процедуру данные обычно передаются через параметры-аргументы, в функцию — через параметры и возвращаемое значение.
3. Данные между вызывающей программой и подпрограммой передаются через параметры, а также через глобальные переменные.
4. Площадь кольца равна разности площадей двух кругов:
$$S=\pi R^2-\pi r^2=\pi(R^2-r^2)$$
Ниже приведены два варианта программы: с процедурой и с функцией.
var r1, r2: real;
procedure pCircleSquare(r: real; var S: real);
begin
S := Pi * sqr(r);
end;function fCircleSquare(r: real): real;
begin
fCircleSquare := Pi * sqr(r);
end;begin
Write(‘r1, r2 = ‘);
ReadLn(r1, r2);
WriteLn(‘Функция S = ‘, abs(fCircleSquare(r1) — fCircleSquare(r2)):5:2);
pCircleSquare(r1, r1);
pCircleSquare(r2, r2);
WriteLn(‘Процедура S = ‘, abs(r1 — r2):5:2);
end.
5. Для сложения дробей сначала находим общий знаменатель, затем числитель суммы и сокращаем дробь, разделив числитель и знаменатель на НОД. НОД удобно находить по алгоритму Евклида.
Если даны дроби $$\frac{a}{b}$$ и $$\frac{c}{d}$$, то
$$\frac{a}{b}+\frac{c}{d}=\frac{ad+bc}{bd}$$
После этого:
$$g=\gcd(ad+bc,\,bd), \quad \frac{ad+bc}{bd}=\frac{(ad+bc)/g}{(bd)/g}$$
program SumFractions;
var
a, b, c, d, num, den, g: integer;function GCD(x, y: integer): integer;
begin
while y <> 0 do
begin
g := x mod y;
x := y;
y := g;
end;
GCD := x;
end;begin
ReadLn(a, b, c, d);
num := a * d + c * b;
den := b * d;
g := GCD(abs(num), abs(den));
num := num div g;
den := den div g;
WriteLn(num, ‘/’, den);
end.
6. Периметр треугольника равен сумме длин его сторон. Длину стороны находим по формуле расстояния между двумя точками:
$$d=\sqrt{(x_2-x_1)^2+(y_2-y_1)^2}$$
var a1, b1, a2, b2, a3, b3: integer;
p, a, b, c: real;procedure dlina(x1, x2, y1, y2: integer; var d: real);
begin
d := sqrt(sqr(x2 — x1) + sqr(y2 — y1));
end;begin
Read(a1, b1, a2, b2, a3, b3);
dlina(a1, a2, b1, b2, a);
dlina(a2, a3, b2, b3, b);
dlina(a3, a1, b3, b1, c);
p := a + b + c;
Write(p:0:2);
end.
7. Для каждого числа находим сумму его цифр и сравниваем полученные значения.
Сумму цифр удобно вычислять подпрограммой:
$$s=\sum \text{цифр числа}$$
var
a, b, c, sa, sb, sc: integer;function SumDigits(n: integer): integer;
var s: integer;
begin
s := 0;
n := abs(n);
while n > 0 do
begin
s := s + n mod 10;
n := n div 10;
end;
SumDigits := s;
end;begin
ReadLn(a, b, c);
sa := SumDigits(a);
sb := SumDigits(b);
sc := SumDigits(c);
if (sa >= sb) and (sa >= sc) then
WriteLn(a)
else if (sb >= sa) and (sb >= sc) then
WriteLn(b)
else
WriteLn(c);
end.
Ответ
1. Подпрограммы нужны для упрощения программы, повторного использования кода и разделения задачи на части.
2. Процедура не возвращает значение, функция возвращает одно значение и может входить в выражение.
3. Передача данных осуществляется через параметры и глобальные переменные.
4–7. Программы приведены выше.