Ответы по параграфу 3.5 Программирование циклических алгоритмов



Задание 2. Дана последовательность операторов. Сколько раз будет повторен цикл и какими будут значения переменных a, b, s?

a:=1;
b:=2;
while a+b<8 do
begin
 a:=a+1;
 b:=b+2;
end;
s:=a+b

Ответ: 2 раза будет повторен цикл, a=3, b=6, s=9.

Задание 3. Требовалось написать программу вычисления факториала. Программист написал его неправильно. Ниже представлена программа, в которой содержатся ошибки. Найдите ошибки и внесите исправления.


Задание 4. Проанализируйте следующий цикл. В чём его особенность?


Значение переменной "c" будет типом boolean, то есть значение будет true или false. Выражение c:=a=b проверяет равенство "a" и "b" и будет делать проверку, пока a < b. В этом случае программа зациклится.

Задание 5. Запишите на языке Паскаль программы решения задач № 26-30 из параграфа 2.4. Используйте оператор while.

program z26;
var a, b, c: real; n: integer;
BEGIN
 readln(a, b, c);
 n:=0;
while a>c do begin
 a:=a+0.15*a-b;
 n:=n+1;
end;
writeln ('В течение ', n, ' лет');
END.

program z27;
var a, b, n: integer;
BEGIN
 write('Сумма слагаемых первых членов последовательности: ');
 readln(b);
 a:=5;
 n:=1;
while a<b do begin
 a:=a+(a+4);
 n:=n+1;
end;
writeln (n, ' слагаемых');
END.

program z28;
var m,k: longint;
begin
write('Введите число: ');
readln(m);
k:=0;
while m<>0 do begin
k:=k+1;
m:=m div 10;
end;
writeln('Кол-во цифр: ',k);
end.

program z29;
var m, d: real; n:integer;
begin
m:=10000;
d:=2*m;
n:=0;
while m<d do begin
m:=m*1.05; //Подсчитываем количество рублей через год
n:=n+1; //Считаем количество лет
end;
writeln('Сумма увеличится в два раза через ',n, ' лет');
end.

program z30;
var m, t, X: real;
begin
 write('Введите количество амёб: ');
 readln(X);
m:=1;
t:=0;
while m<X do begin
m:=m*2; 
t:=t+3;
end;
writeln('Пройдет ',t, ' часов');
end.

Задание 6. Дана последовательность операторов. Сколько раз будет повторен цикл и какими будут значения переменных a, b, s?

a:=1;
b:=1;
repeat
 a:=a+1;
 b:=b*2;
until b>8;
s:=a+b

Ответ: 4 раза будет повторен цикл, a=5, b=16, s=21.

Задание 7. Напишите программу, в которой осуществляется ввод целых чисел (ввод осуществляется до тех пор, пока не будет введен ноль) и подсчет суммы и среднего арифметического введенных положительных чисел. Используйте оператор repeat.

program z_7;
var m, n: integer; s: real;
begin
 n:=0;
 s:=0;
repeat
 readln (m);
 if m>0 then begin
 n:=n+1;
 s:=s+m
 end;
until m=0;
writeln('Сумма положительных чисел: ', s);
s:=s/n;
writeln('Среднее арифметическое положительных чисел: ', s)
end.

Задание 8. Напишите программу, в которой осуществляется ввод целых чисел (ввод осуществляется до тех пор, пока не будет введен ноль) и определение максимального (наибольшего) из введённых чисел. Используйте оператор repeat.

program z_8;
var m, s: integer;
begin
repeat
 readln (m);
 if m>s then
 s:=m;
until m=0;
writeln('Наибольшее число: ', s)
end.

Задание 9. Напишите программы вычисления наибольшего общего делителя НОД двух целых чисел:

а) используя оператор repeat:
program z9_a;
var a,b,с: integer;
begin
write('Введите два числа: ');
readln(a, b);
if a < b then с := a + 1 else с := b + 1;
repeat с := с - 1
until (a mod с = 0) and (b mod с = 0);
write('NOD = ', с)
end.

б) используя оператор while:
program z9_b;
var a,b: integer;
begin
writeln('Введите два числа: ');
readln(a, b);
while a <> b do
if a > b then
a := a - b
else
b := b - a;
writeln('NOD = ', a);
end.

Задание 10. Сколько раз будет выполнен цикл?
а) for i:=0 to 15 do s:=s+1;
б) for i:=10 to 15 do s:=s+1;
в) for i:=-l to 1 do s:=s+1;
г) for i:=10 to 10 do s:=s+1;
д) k:=5; for i:=k-1 to k+1 do s:=s+1;

а) 16 раз
б) 6 раз
в) 3 раза
г) 1 раз
д) 3 раза

Задание 11. Напишите программу, которая 10 раз выводит на экран ваши имя и фамилию.

program z11;
var a, b: string; i: integer;
begin
write('Введите имя: ');
readln(a);
write('Введите фамилию: ');
readln(b);
for i:=0 to 9 do
 writeln (a,' ',b);
end.

Задание 12. Напишите программу, выводящую на экран изображение шахматной доски, где черные клетки изображаются звёздочками, а белые – пробелами.

program z11;
var a, b: string; i, k, n: integer;
begin
a:='*';
b:=' ';
for i:=0 to 3 do begin
 for k:=0 to 3 do
 write (b,a);
 writeln;
 for n:=0 to 3 do
 write (a,b);
 writeln;
 end;
end.

Задание 13. Напишите программу, которая вычисляет сумму:
а) первых n натуральных чисел;
б) квадратов первых n натуральных чисел;
в) всех чётных чисел в диапазоне от 1 до n;
г) всех двузначных чисел.

program z13;
var i, z1, z2, z3, z4, n: integer;
BEGIN
write('Введите n: ');
readln(n);
z1 := 0;
z2 := 0;
z3 := 0;
z4 := 0;

for i := 1 to n do
 begin
 z1 := z1 + i;
 z2 := z2 + sqr(i);
 if i mod 2 = 0 then z3 := z3 + i;
 end;

for i := 10 to 99 do z4 := z4 + i;

writeln('Сумма первых n натуральных чисел: ', z1);
writeln('Сумма квадратов первых n натуральных чисел: ', z2);
writeln('Сумма всех четных чисел: ', z3);
writeln('Сумма всех двухзначных чисел: ', z4);
END.

Задание 14. Напишите программу, которая генерирует 10 случайных чисел в диапазоне от 1 до 20, выводит эти числа на экран и вычисляет их среднее арифметическое.

program z13;
var i, s, d: integer; sr: real;
BEGIN
 s:=0;
for i:=1 to 10 do begin
 d:= random(20)+1;
 writeln(i, ' число: ', d);
 s:=s+d
 end;
 sr:=s/i;
 writeln('Среднее арифметическое: ', sr)
END.

Задание 15. Запишите на языке Паскаль программы решения задач 33 и 34 из параграфа 2.4. Используйте оператор for.

program z15_1;
var i, a, b, k: integer;
BEGIN
write('Введите первый множитель: ');
readln (a);
write('Введите второй множитель: ');
readln (b);
k:=0;
for i:=1 to b do begin
 k:=k+a;
 end;
 writeln(a, '*', b, '=', k)
END.

В программе мы вводим изначальную численность населения. Далее она считает количество населения в каждый год и итогом будет количество населения через три года.
program z15_2;
var i: integer; k, a: real;
BEGIN
write('Введите население города: ');
readln (a);
k:=0;
for i:=1 to 3 do begin
 a:=1.05*a;
 writeln(i, ' год: ', a, ' человек')
 end;
 writeln('Численность населения через 3 года: ', a)
END.

Задание 16. Напишите программу, которая выводит на экран таблицу степеней двойки (от нулевой до десятой).

Десятую степень не добавили в цикл, она отрабатывает после цикла и выводит эту степень ровно по вертикали.
program z16;
var i, k, a: integer;
BEGIN
 a:=2;
 k:=1;
writeln('Таблица степеней двойки:');
writeln('0 1');
for i:=1 to 9 do begin
 k:=k*a;
 writeln(i,' ',k);
 end;
 k:=k*a;
 writeln('10 ',k);
END.

Задание 17. Напишите программу, которая выводит на экран таблицу умножения на n (n – целое число от 2 до 10, вводимое с клавиатуры).

program z17;
var i, k, n: integer;
BEGIN
write('Введите n>>');
readln(n);
for i:=2 to 10 do begin
 k:=n*i;
 writeln(n,' * ',i,' = ',k)
 end;
END.

Задание 18. Какой из трёх рассмотренных операторов цикла является, по вашему мнению, основным, т.е. таким, что им можно заменить два других?

Рассмотренные операторы:
repeat until
while do
for 1 to n do

Я думаю, что циклы "repeat until" и "while do" могут заменить другие циклы. Цикл "for" не сможет заменить других, так как в этом цикле происходит известное количество повторений. А в двух других разница в том, что цикл "repeat until" сначала выполняется тело цикла и потом проверяется условие, а с циклом "while do" наоборот. Решение заданий из учебника Информатика 8 класс Босова, параграф 3.5 Программирование циклических алгоритмов. Программирование циклов с заданным условием продолжения работы, с заданным условием окончания работы, с фиксированным числом повторений, различные варианты программирования циклического алгоритма.