В 10 уроке при разборе 5 и 6 задач из 9 урока были
допущены ошибки, которые и были замечены
подписчиком Stranger. В задаче 5 строка
y:=(x mod 10)*1000+((x div
100) mod 10)*100+((x div 1000) mod 10)*10+x div 1000;
должна быть вот такой:
y:=(x mod 10)*1000+((x div
10) mod 10)*100+((x div 100) mod 10)*10+x div 1000;
Аналогичная ошибка в след задаче: строка
X2:=(x div 1000) mod 10+(x div 100)
mod 10+x mod 10; {сумма последних трех цифр}
должна быть вот такой:
X2:=(x div 100) mod 10+(x div 10)
mod 10+x mod 10; {сумма последних трех цифр}
Спасибо за исправление ошибки.
Урок 11
Продолжим знакомство с операторами
цикла, имеющимися в Паскале. Повторение группы
операторов (тела цикла) можно организовать и с
помощью оператора, где проверка условия
осуществляется после выполнения тела цикла.
11.1.Оператор цикла
REPEAT (цикл ДО).
Формат оператора: REPEAT оператор; оператор;...оператор UNTIL
логическое условие;
Часть программы, заключенная между
служебными словами REPEAT и UNTIL, повторяется до тех
пор, пока не станет истинным логическое
выражение, стоящее после слова UNTIL. Между словами
REPEAT (повторить) и UNTIL(до тех пор, пока) можно
записать любое количество операторов без
использования операторных скобок.
В отличие от оператора WHILE вычисление
логического выражения происходит не до, а после
очередного повторения цикла. Из-за этого цикл REPEAT
обязательно выполнится хотя бы раз, а цикл WHILE
может не выполнится ни разу. Если условие в цикле
ПОКА является условием продолжения повторений,
то условие в цикле ДО - условием выхода из цикла,
его завершения. Поэтому для одной и той же задачи
эти условия противоположны.
Пример 1. Составить программу подсчета
суммы S первых 1000 членов гармонического ряда
1+1/2+1/3+1/4+...1/N используя оператор цикла REPEAT.
Program Summa;
Var S:real;
N:integer;
Begin
S:=0;N:=0;
repeat
N:=n+1;
S:=s+1/n
Until n>1000;
Writeln(s);
Readln
End.
11.2.Поиск
наибольшего числа.
Предположим, нам необходимо ввести с
клавиатуры N чисел, найти из них наибольшее и
вывести его. Для решения этой задачи
предлагается следующий алгоритм:
1. Ввести первое число в переменную Max.
2. Ввести следующее число в переменную Next.
3. Если Next>Max, то Max:=Next.
Пункты 2 и 3 повторять, пока не будут введены все
числа.
4. Вывести значение переменной Max.
Действительно ли будет напечатано
наибольшее из N чисел? Докажем это.
После выполнения первого пункта в переменной
Max находится наибольшее из уже введенных чисел.
Это справедливо, т.к. введено лишь одно число.
Повторение пунктов 2 и 3, в сущности,
представляет собой цикл, который выполняется,
пока не будут введены все числа. Если перед
очередным повторением цикла в Max находится
наибольшее из введенных чисел, то после
выполнения пунктов 2 и 3 там снова будет
наибольшее из введенных чисел.
В последнем пункте значение Max будет
выведено.
Этот пример показывает, что алгоритм
можно доказать, как доказывают математическую
теорему. Программируя доказательный алгоритм,
можно не опасаться ошибок в алгоритме, конечно,
если нет ошибок в доказательстве.
Program maximum;
Var N, max, next, k: integer;
Begin
Write('Введите количество чисел'); Readln(n);
Write('Введите число'); Readln(max);
k:=1;
repeat
Write('Введите число'); Readln(next);
K:=k+1;
If next>max then max:=next
Until k=n;
Writeln(max);
Readln
End.
Тренировочные
задания.
1. Введите с клавиатуры 6 чисел и определите их
среднее арифметическое.
2. Напишите программу, которая вводит целые числа
с клавиатуры и складывает их, пока не будет
введено число 0.
3. Напечатайте 20 первых степеней числа 2.
4. Найдите минимальное из N чисел.
5. Дано натуральное число. Выяснить, является ли
оно простым, т.е. делится только на 1 и на само
себя.
Разбор заданий
урока 10.
1. Даны целые числа а и b (а>b). Определить:
a. Результат целочисленного деления a на b,
не используя стандартную операцию
целочисленного деления;
Program prim_10_1a;
Var a, b, n: integer;
Begin
Write('Введите два числа, a>b ');
Readln(a,b);
N=0;
While a>b do
Begin
N:=n+1;
A:=a-b
End;
Writeln(' результат целочисленного деления ',n);
Readln
End.
2. Известны оценки по информатике каждого из 20
учеников класса. В начале списка перечислены все
пятерки, затем все остальные оценки. Сколько
учеников имеют по информатике оценку "5"?.
Условный оператор не использовать.
Program prim_10_2;
Var х ,n :word;
Begin
Write('Введите оценку');
Readln(х);
N=0;
While х=5 do
Begin
N:=n+1;
Write('Введите оценку');
Readln(х);
End;
Writeln(' имеют отлично ',n, ' учеников');
Readln
End.
5. *В некоторой стране используются денежные
купюры достоинством в 1, 2, 4, 8, 16, 32 и 64. дано
натуральное число N. Как наименьшим количеством
таких денежных купюр можно выплатить сумму N
(указать количество каждой из используемых для
выплаты купюр)? Предполагается, что имеется
достаточно большое количество купюр всех
достоинств.
Program prim_10_5;
Var n,k,x:word;
Begin
Write('Введите число'); Readln(n);
K:=64;
While n>0 do
Begin
If n>=k then begin Writeln(n div k, 'купюр по ', k);n:=n mod
k end;
K:=k div 2
End;
Readln
End.
Желаю успехов!
Ганилова Татьяна Евгеньевна school6@rikt.ru