Дополнительное задание 1 Параграф 24 ГДЗ Семакин 8 класс (Информатика)
Практическое задание №25
Тема: Программирование циклов и ветвлений на Паскале.
Алгоритм Евклида
1 уровень сложности
1. Набрать и отладить программу нахождения наибольшего общего делителя и протестировать её на следующих исходных данных:
а) a=40 b=64
б) a=32 b=16
в) a=12 b=20
г) a=5 b=12
2. Составить на языке Паскаль программу, которая запрашивает с клавиатуры N целых чисел и считает, сколько из них положительных, сколько отрицательных и сколько нулей. Разработать для программы не менее двух тестов и доказать правильность её работы.
3. Написать программу, которая выводит на экран все двухзначные числа, делящиеся на 3 или на 5 (использовать операции целочисленного деления div или mod).
1.
program task_1;
var
M, N: integer;
begin
write(‘Введи M и N > > ‘);
readln(M, N);
while M < > N do
if M > N then M := M — N
else N := N — M;
writeln(‘НОД=’, M)
end.
2.
program task_2;
var
i, a, k1, k2, k0, n: integer;
begin
k1 := 0; k2 := 0;k0 := 0;
write(‘Введи количество чисел’);
readln(n);
for i := 1 to n do
begin
write(‘Введи число:’);
readln(a);
if a > 0 then k1 := k1 + 1
else if a < 0 then k2 := k2 + 1
else k0 := k0 + 1
end;
writeln('Положительных > > ‘, k1, ‘ Отрицательных > > ‘, k2, ‘ Количество нулей > > ‘, k0)
end.
3.
program task_3;
var
i: integer;
begin
for i := 10 to 99 do
if (i mod 3 = 0) or (i mod 5 = 0) then write(i, ‘ ‘)
end.
2 уровень сложности
1. Составить программу нахождения наименьшего общего кратного (НОК) двух чисел m и n, используя формулу n*m=НОД(n,m)*НОК(n,m). Разработать тесты для проверки правильности работы программы.
2. Проверить, являются ли два числа a и b взаимно простыми. Два числа называются взаимно простыми, если их наибольший общий делитель равен 1. Протестировать программу для следующих исходных данных:
а) a=5 b=95
б) a=3 b=100
в) a=11 b=98
3. Написать программу сокращения дроби , где N – целое, M – натуральное число. Использовать алгоритм Евклида. Разработать тесты для проверки правильности работы программы.
1.
program task_1;
var
m, n, p, d: integer;
begin
write(‘Введи M, N > > ‘);
readln(m, n);
p := m * n;
while m < > n do //определение НОД
if m > n then m := m — n
else n := n — m;
d := m;//НОД
writeln(‘НОK =’, p div d)
end.
1) 10, 30
2) 40, 16
3) 15, 80
2.
program task_2;
var
a, b: integer;
begin
write(‘Введи a и b > > ‘);
readln(a, b);
while a < > b do
if a > b then a := a — b
else b := b — a;
if a = 1 then writeln(‘Числа взаимно простые’)
else writeln(‘Числа не взаимно простые’);
end.
3.
program task_3;
var
M, N, a, b, c: integer;
begin
write(‘Введи M и N > > ‘);
readln(M, N);
a := M; b := N;
while M < > N do
if M > N then M := M — N
else N := N — M;
c := M;
writeln(‘Сокращенная дробь > ‘, a / c, ‘/’, b / c)
end.
1) 5 15
2) 24 4
3) 21 43
3 уровень сложности
1. Составить на языке Паскаль программу нахождения наибольшего общего делителя трёх чисел, используя следующую формулу: НОД(a,b,c)=НОД(НОД(a,b),c). Протестировать программу на следующих исходных данных:
а) a=40 b=64 c=120
б) a=32 b=45 c=60
в) a=11 b=220 c=33
г) a=175 b=1025 c=600
2. Написать программу, запрашивающую с клавиатуры целые числа и определяющую максимальное и минимальное из них. Окончание ввода – число 0. Протестировать программу для последовательности: -3 5 6 -11 24 -1 0.
3. Составить программу для графического изображения делимости чисел от 1 до N (N – исходное данное). В каждой строке надо выводить число и столько плюсов, сколько делителей у этого числа. Например, если исходное данное число равно 4, то на экране должно быть выведено:
1+
2++
3++
4+++
1.
program task_1;
var
a, b, c, d: integer;
begin
write(‘Введи a, b, c > > ‘);
readln(a, b, c);
while a < > b do
if a > b then a := a — b
else b := b — a;
d := a;//НОД a, b
while d < > c do
if d > c then d := d — c
else c := c — d;
writeln(‘НОД =’, d)//НОД a, b, c
end.
2.
program task_2;
var
a, max, min: integer;
begin
write(‘Введи число > > ‘);
readln(a);
max := a; min := a;
while a < > 0 do
begin
if a > max then max := a;
if a < min then min := a;
write('Введи число > > ‘);
readln(a);
end;
writeln(‘max=’, max, ‘ min=’, min)
end.
3.
program task_3;
var
n, j, i: integer;
begin
writeln(‘введите число’);
readln(n);
for i := 1 to n do
begin
write(i);
for j := 1 to n do
if (i mod j = 0) then
write(‘+’);
writeln;
end;
end.
Для всех трёх уровней используем алгоритм Евклида: наибольший общий делитель находится повторяющимся вычитанием меньшего числа из большего, пока числа не станут равны. Затем этот результат применяем в нужной задаче.
1 уровень
program task_1;
var
M, N: integer;
begin
write(‘Введи M и N >>’);
readln(M, N);
while M <> N do
if M > N then M := M — N
else N := N — M;
writeln(‘НОД=’, M)
end.
Проверка для заданных данных:
- $$40$$ и $$64$$: $$\gcd(40,64)=8$$
- $$32$$ и $$16$$: $$\gcd(32,16)=16$$
- $$12$$ и $$20$$: $$\gcd(12,20)=4$$
- $$5$$ и $$12$$: $$\gcd(5,12)=1$$
program task_2;
var
i, a, k1, k2, k0, n: integer;
begin
k1 := 0; k2 := 0; k0 := 0;
write(‘Введи количество чисел’);
readln(n);
for i := 1 to n do
begin
write(‘Введи число:’);
readln(a);
if a > 0 then k1 := k1 + 1
else if a < 0 then k2 := k2 + 1
else k0 := k0 + 1
end;
writeln(‘Положительных >> ‘, k1, ‘ Отрицательных >> ‘, k2, ‘ Количество нулей >> ‘, k0)
end.
Тесты:
- $$n=5$$, числа: $$1,\,-2,\,0,\,7,\,-3$$ → положительных $$2$$, отрицательных $$2$$, нулей $$1$$.
- $$n=4$$, числа: $$0,\,0,\,5,\,-1$$ → положительных $$1$$, отрицательных $$1$$, нулей $$2$$.
program task_3;
var
i: integer;
begin
for i := 10 to 99 do
if (i mod 3 = 0) or (i mod 5 = 0) then write(i, ‘ ‘)
end.
2 уровень
program task_1;
var
m, n, p, d: integer;
begin
write(‘Введи M, N >>’);
readln(m, n);
p := m * n;
while m <> n do
if m > n then m := m — n
else n := n — m;
d := m;
writeln(‘НОК =’, p div d)
end.
Тесты:
- $$10$$ и $$30$$: $$\gcd=10$$, $$\operatorname{lcm}=\dfrac{10\cdot 30}{10}=30$$
- $$40$$ и $$16$$: $$\gcd=8$$, $$\operatorname{lcm}=\dfrac{40\cdot 16}{8}=80$$
- $$15$$ и $$80$$: $$\gcd=5$$, $$\operatorname{lcm}=\dfrac{15\cdot 80}{5}=240$$
program task_2;
var
a, b: integer;
begin
write(‘Введи a и b >>’);
readln(a, b);
while a <> b do
if a > b then a := a — b
else b := b — a;
if a = 1 then writeln(‘Числа взаимно простые’)
else writeln(‘Числа не взаимно простые’);
end.
Проверка:
- $$5$$ и $$95$$: $$\gcd(5,95)=5$$, числа не взаимно простые.
- $$3$$ и $$100$$: $$\gcd(3,100)=1$$, числа взаимно простые.
- $$11$$ и $$98$$: $$\gcd(11,98)=1$$, числа взаимно простые.
program task_3;
var
M, N, a, b, c: integer;
begin
write(‘Введи M и N >>’);
readln(M, N);
a := M; b := N;
while M <> N do
if M > N then M := M — N
else N := N — M;
c := M;
writeln(‘Сокращенная дробь > ‘, a div c, ‘/’, b div c)
end.
Тесты:
- $$5/15$$ → $$\gcd(5,15)=5$$, получаем $$1/3$$
- $$24/4$$ → $$\gcd(24,4)=4$$, получаем $$6/1$$
- $$21/43$$ → $$\gcd(21,43)=1$$, дробь не сокращается
3 уровень
program task_1;
var
a, b, c, d: integer;
begin
write(‘Введи a, b, c >>’);
readln(a, b, c);
while a <> b do
if a > b then a := a — b
else b := b — a;
d := a;
while d <> c do
if d > c then d := d — c
else c := c — d;
writeln(‘НОД =’, d)
end.
Проверка:
- $$40, 64, 120$$ → $$\gcd(40,64)=8$$, $$\gcd(8,120)=8$$
- $$32, 45, 60$$ → $$\gcd(32,45)=1$$, $$\gcd(1,60)=1$$
- $$11, 220, 33$$ → $$\gcd(11,220)=11$$, $$\gcd(11,33)=11$$
- $$175, 1025, 600$$ → $$\gcd(175,1025)=25$$, $$\gcd(25,600)=25$$
program task_2;
var
a, max, min: integer;
begin
write(‘Введи число >>’);
readln(a);
max := a; min := a;
while a <> 0 do
begin
if a > max then max := a;
if a < min then min := a;
write(‘Введи число >>’);
readln(a);
end;
writeln(‘max=’, max, ‘ min=’, min)
end.
Для последовательности $$-3,\ 5,\ 6,\ -11,\ 24,\ -1,\ 0$$ получаем:
- $$max=24$$
- $$min=-11$$
program task_3;
var
n, j, i: integer;
begin
writeln(‘введите число’);
readln(n);
for i := 1 to n do
begin
write(i);
for j := 1 to i do
if (i mod j = 0) then
write(‘+’);
writeln;
end;
end.
Для $$N=4$$ вывод будет таким:
$$1+$$
$$2++$$
$$3++$$
$$4+++$$
Ответ
Приведены программы и тесты для всех заданий.