Тема: Программирование задач циклической структуры (оператор While).
Цель: Разобрать структуры повторения (оператор цикла с предусловием - While).
План занятия:
· обсуждение оператора;
· эксперименты с программами определения количества цифр;
· в числе, преобразования натурального числа n в 1;
· выполнение самостоятельной работы.
Ход работы:
Теоретические сведения:
Оператор Whileимеет вид:
While<логическое выражение> d o<оператор (составной оператор)> ;
Оператор While содержит логическое выражение, значение которого (True-1 или False-0) управляет повторным выполнением оператора (после служебного слова do), им может быть и составной оператор. Значение выражения вычисляется перед выполнением оператора. Если результат равен True, то оператор выполняется, при значении False — нет. Таким образом, если в начале логическое выражение имеет значение False, оператор после do вообще не выполняется. В операторе (составном операторе) обязательно изменение значений переменных, влияющих на значение логического выражения. При невыполнении этого условия получаем пример того, что называется «зацикливанием». Простейший пример — While True do <что-то> — бесконечный цикл.
Экспериментальный раздел работы:
1. Дано натуральное число n. Подсчитать количество цифр данного числа.
Количество цифр в числе n неизвестно, поэтому необходимо использовать оператор While. Использование For потребует или введения дополнительных переменных, или искусственного выхода из цикла, а мы договорились, что это плохо — каждый фрагмент нашей логики должен иметь одну точку входа и одну точку выхода. Подсчет количества цифр начнем с последней цифры числа. Увеличим счетчик цифр на единицу (k). Число (m) уменьшим в 10 раз, убирая тем самым из него последнюю цифру (подсчитанную). Далее с получившимся числом проделаем ту же последовательность действий и т. д., пока число не станет равным нулю. Для этого и всех остальных примеров занятия, требуется выполнять ручную «трассировку».
Порядок действий:
1. пусть введено число 65387;
2. присвоим это значение переменной с именем m;
3. значение счетчика числа цифр (k) равно 0. Выполним действия, описанные выше.
4. окончательное значение переменной k равно 5, в числе 5 цифр;
5. после этого работаем с программой Му9_1 по традиционной схеме: набор, компиляция, сохранение, запуск и проверка работы на конкретных примерах.
Program My8_l;
Var m, n: LongInt;
k: Integer;{счетчик числа цифр}
Begin
WriteLn (‘ Введите целое число n неравное 0'); ReadLn(n);
m:=n;
k:=0;
While m<>0 do
Begin
Inc(k);{увеличивает значение на единицу}
m:=m Div 10;
End;
WriteLn (‘В числе ' ,n,' ~ ' ,k,' цифр !');
ReadLn;
End.
Модифицируя программу Му9_1, решить следующие задачи:
· найти сумму цифр числа (компьютер №1, 15) ;
· найти первую цифру числа, например для числа 7265 это цифра 7
(компьютер №2, 14);
· поменять порядок цифр числа на обратный. Например,
было 12345, стало 54321(компьютер №3, 13);
1. найти количество четных цифр числа (компьютер №4, 12);
2. найти самую большую цифру числа (компьютер №5, 11);
3. найти сумму цифр числа, больших 5(компьютер №6, 10);
4. ответить на вопрос, сколько раз данная цифра встречается
в числе (компьютер №7,9)?
5. найти самую маленькую цифру в числе (компьютер №8).
Домашнее задание: придумать еще 5 задач (как минимум), решаемых по данной схеме.
2.В программе Му9_2 реализована «гипотеза Сиракуз». Осуществляется последовательное преобразование натурального числа n в 1. Запустите программу, проверьте ее работу при нескольких значениях n. Результат есть. Мы делаем предположение, что при любом значении n работа программы завершится, т. е. будет получен результат. Однако это неизвестно, доказательства факта завершения работы программы (алгоритма) при любом значении n в настоящее время никем не получено. Проверка циклов типа While требует особо тщательной работы, ибо циклы этого типа «потенциально бесконечны во времени».
Program My8_2;
Var n:Integer;
Begin
WriteLn (‘Введите натуральное число:' );
ReadLn (n);
Write (n);
While n<>1 do
Begin
If n Mod 2=0 Then
n:=n Div 2
Else n:=(3*n+1)Div 2;
Write ( ' - ‘n) ;
End;
ReadLn;
End.
С помощью последовательного запуска программы оцените среднюю длину цепочек чисел при изменении n от 2 до 20. Как избавиться от этой ручной работы по запуску программы? Наблюдая за полученными цепочками чисел нетрудно заметить, что фрагменты этих цепочек часто повторяются. Например, 8=>4=>2=>1, 5=>16=>8=>4=>2=>1. Как использовать этот факт при подсчете средней длины цепочек для чисел (п) из большого интервала, например типа Integer? Потребуется ли в приведенном фрагменте программы что-либо изменять в этом случае?
Задания для самостоятельной работы:
1. Дана последовательность операторов:
a:=1; b:=1;
While a+b<8 do
Begin a:=a+l; b:=b+2
End;
S:=a+b:
Сколько раз выполняется проверка логического выражения в операторе While? Определите значения переменных а, Ь, и s после завершения этой последовательности операторов?
2. Определите значения переменных а и b после выполнения операторов:
a:=1; b:=1;
While a<=3 do a:=a+1; b:=b+1.
3. Определите значение переменной s после выполнения следующих операторов:
s:=0; i:=0; While i<5 do Inc(i); s:=s+100 Div i;
s:=0; i:=1; While i>1 do Begin s:=s+100 Div i;
dec (i) End;
4. Дан фрагмент программы с ошибками (их не больше 5) вы числения факториала f числа п:
k:=1; f:=0;
While k<n do f=f*k
k:=k+l;
Найдите эти ошибки.
5. Найдите и исправьте ошибки в следующем фрагменте программы, определяющей для заданного натурального числа n число, записанное цифрами числа n в обратном порядке.
р : = n;
While p>=0 do
Begin
а : =а + р Mod 10;
р : = р Div 10
End;
П р имечание:
Задания № 1-5 рекомендуется выполнять, используя режим ручной трассировки.
6. Найти минимальное число, большее 300, которое нацело делится на 19.
7. Приписать по 1 в начало и в конец записи числа n. Например, было n=3456, стало n=134561.
8. Поменять местами первую и последнюю цифры числа. Например, из числа 8547 должно быть получено число 7548.
9. Приписать к исходному числу n такое же число. Например, из числа 1903 должно быть получено число 19031903.
10. Определить, является ли заданное число степенью 3.
11. Составить программу, проверяющую, является ли заданное натуральное число палиндромом, то есть таким, десятичная запись которого читается одинаково слева направо и справа налево.
Примечание:
Задача отличается от ранее рассмотренной тем, что количество цифр в числе неизвестно, а из этого следует, что тип используемого цикла должен быть другой.
12. Выяснить, является ли последовательность цифр натурального числа при просмотре их справа налево возрастающей последовательностью. Например, для числа 76431 ответ положительный, для чисел 6331, 9782 — отрицательный.
13. Вводится последовательность целых ненулевых чисел, признак окончания ввода — ввод 0. Количество чисел не меньше 2. Выяснить:
· является ли последовательность возрастающей;
· есть ли в ней хотя бы одна пара одинаковых «соседних» чисел; является ли последовательность знакочередующейся (3,
-2, 4, -5, 0 — «да»; 5, -4, -7, 8, 0 — «нет»).
14. Выяснить, сколько раз в натуральном числе встречается его максимальная цифра. Например, в числе 581088 — 3 раза, в числе 4537 — 1 раз.
15. Выяснить, является ли разность максимальной и минимальной цифр числа четной.
Контрольные вопросы:
1. Как называются программы, в основе которых лежит структура повторения?
2. Каков тип выражения в операторе цикла с предусловием?
3. Верно ли, что в теле цикла с предусловием должен находиться один оператор?
4. Когда проверяется истинность выражения в операторе WHILE?
5. Верно ли, что истинность выражения в цикле с предусловием является условием продолжения цикла?
6. Сколько раз выполнится оператор в теле цикл WHILE а, если с самого начала значение выражения равно false?
7. Верно ли, что цикл WHILE используется при вычислении всякого рода сумм и произведений, когда заранее не известно число повторений?