Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Алгоритмы с повторениями. Цикл с предусловием WHILE. Цикл с постусловием REPEAT
На прошлом занятии мы познакомились и научились использовать счётный цикл FOR. Продолжим работу по этой теме и познакомимся с ещё двумя циклами: - цикл WHILE с предусловием; - цикл REPEAT...UNTIL c постусловием. Эти циклы удобно использовать тогда, когда заранее неизвестно число повторений. Решим задачу zadacha3_1 используя циклы WHILE и REPEAT и попытаемся понять принцип работы этих циклов.
Найти сумму всех натуральных чисел от 1 до n. 1) цикл FOR program zadacha3_1a; var i, n, s: integer; Begin writeln(' введите натуральное n'); readln(n); s: =0; for i: =1 to n do s: =s+i; writeln('сумма от 1 до', n, ' = ', s); End. 2) цикл WHILE program zadacha3_1b; var i, n, s: integer; Begin writeln('введите натуральное n'); readln(n); s: =0; i: =1; while i< =n do begin s: =s+i; i: =i+1; end; writeln('сумма от 1 до', n, '=', s); End. Цикл WHILE будет выполняться до тех пор, пока выполняется условие i< =n. Причем переменную i изменяем внутри цикла. 3) цикл REPEAT program zadacha3_1c; var i, n, s: integer; Begin writeln(' введите натуральное n'); readln(n); s: =0; i: =1; repeat begin s: =s+i; i: =i+1; end; until i> n; writeln('сумма от 1 до', n, ' = ', s); End. Цикл REPEAT... UNTIL будет выполняться до тех пор, пока не выполниться условие i> n.
Задано натуральное число n. Вычислить сумму цифр числа. program zadacha3_4; var n, sum, cif: integer; Begin writeln('Введите n'); readln(n); sum: =0; while n> 0 do begin cif: =n mod 10; sum: =sum+cif; n: =n div 10; end; writeln('Сумма цифр введённого числа = ', sum); End.
Найти минимальное натуральное число, которое при делении на 2 даёт в остатке 1, при делении на 3 даёт в остатке 2, при делении на 4 - в остатке 3, при делении на 5 - в остатке 4, при делении на 6 - в остатке 5 а при делении на 7 дают в остатке 6. program zadacha3_5; var i, kl: longint; Begin kl: =0; i: =0; while kl=0 do begin i: =i+1; if (i mod 2=1) and (i mod 3=2) and (i mod 4=3) and (i mod 5=4) and (i mod 6=5) and (i mod 7=6) then kl: =1; end; writeln(i); End. Вопросы для повторения: 8. Какие циклы существуют в языке Паскаль? 9. Какой формат записи имеют циклы WHILE и REPEAT? 10. В каких случаях удобно применять эти циклы? 11. Чем отличается цикл WHILE от цикла REPEAT? 12. Будет ли остановлено выполнение данного цикла? Почему? s: =0; i: =1; while i< =4 do s: =s+i; Задания для самостоятельной работы: 1. Дано натуральное число n. a) Сколько цифр в числе n? b) Сколько чётных цифр в числе n? 2. Дано натуральное число n. a) Вычислить, входит ли цифра 3 в запись числа n2. b) Поменять порядок цифр числа n на обратный. c) Переставить первую и последнюю цифры числа n. d) Приписать по единице в начало и в конец записи числа n. e) Является ли число n - палиндромом? (9889 - да, 9878 -нет) 3. Дано натуральное число n. Является ли n степенью 3. 4. Для данного натурального числа m> 1 найдите максимальное k, для которого ещё выполняется равенство 2k< m. (например, если m=10, то k=3). Для данного натурального числа m> 1 найдите минимальное k, для которого уже выполняется равенство k! > m. (например, если m=10, то k=4). Вложенные циклы. Для решения задачи достаточно часто требуется использовать несколько вложенных друг в друга циклических конструкций. Такие конструкции называют вложенными циклами. Рассмотрим несколько примеров: Дано натуральное число S. Требуется написать программу для нахождения всех прямоугольников, площадь которых равна S и стороны выражены натуральными числами. program zadacha3_6; var s, a, b: longint; Begin writeln('Введите s'); readln(s); for a: =1 to s do for b: =1 to s do if a*b=s then writeln ('стороны ', a, ' и ', b); End. Данную задачу можно было решить, используя только один цикл. Подумайте, как это сделать.
Даны натуральные числа n, m. Получить все натуральные числа, меньшие n, сумма квадратов цифр которых равна m. program zadacha3_7; var n, m, i, a, sum, cif: longint; Begin writeln('введите n и m'); readln(n, m); for i: =1 to n do begin a: =i; sum: =0; while a> 0 do begin cif: =a mod 10; sum: =sum+sqr(cif); a: =a div 10; end; if sum=m then write(i, ' '); end; End. Найти все решения заданного числового ребуса. Каждой букве соответствует некоторая цифра. Причём одинаковым буквам соответствуют одинаковые цифры, разным буквам - разные цифры. Поскольку здесь всего три буквы, то для решения достаточно написать три вложенных цикла, и перебрать все варианты сложения трёхзначных чисел. program zadacha3_8a; var k, t, o, kto, kot, tok: longint; Begin for k: =0 to 9 do for t: =0 to 9 do for o: =0 to 9 do begin kto: =k*100+t*10+o; kot: =k*100+o*10+t; tok: =t*100+o*10+k; if (k< > t) and (k< > o) and (t< > o) and (kto+kot=tok) then writeln(kto, '+', kot, '=', tok); end; End. В данном алгоритме тело цикла выполнялось 10∙ 10∙ 10=1000 раз. (будем говорить сложность алгоритма =1000) Если же для решения более сложных ребусов потребуется написать 8-10 вложенных циклов, то такой полный перебор будет работать достаточно долго. Можно немного упростить данный алгоритм, если увидеть что 1≤ k≤ 4, t≥ 2. for k: =1 to 4 do for t: =2 to 9 do for o: =0 to 9 do Теперь сложность алгоритма 4∙ 8∙ 10=320. Простое косметическое исправление дало увеличение скорости в 3 раза. Но и данный алгоритм не является оптимальным. Посмотрите, при k =2 и t =2 программа переберёт все 10 вариантов o. В таких случаях когда k = t цикл по o вообще необходимо не выполнять. Назовём такой метод - контролируемый перебор. program zadacha3_8c; var k, t, o, kto, kot, tok: longint; Begin for k: =1 to 4 do for t: =2 to 9 do if k< > t then for o: =0 to 9 do if (k< > o) and (t< > o) then begin kto: =k*100+t*10+o; kot: =k*100+o*10+t; tok: =t*100+o*10+k; if kto+kot=tok then writeln(kto, '+', kot, '=', tok); end; End. Такой алгоритм даже при 8-10 вложенных циклах работает очень быстро. Вопросы для повторения: 51. Может ли во вложенных циклах использоваться одна и та же переменная, например i? 52. Можно ли вкладывать друг в друга различные циклы: FOR в WHILE или REPEAT в FOR? Задания для самостоятельной работы: 1. Старинная задача. Сколько можно купить быков, коров и телят, если бык стоит 10 рублей, корова – 5 рублей, телёнок – полтинник (0, 5 рубля), при условии, что на 100 рублей надо купить 100 голов скота. 2. Задано натуральное n. Для всех чисел от 1 до n найти: a) количество делителей; b) сумму чётных делителей. 3. Найти все решения следующих числовых ребусов: a) БАБКА+ДЕДКА+РЕПКА=СКАЗКА (4 решения) b) КОРОВА+ТРАВА+ДОЯРКА=МОЛОКО (2 решения) c) АЛЁНКА+ИВАН+КОЗЛИК=СКАЗКА (1 решение) d) ВЕТКА+ВЕТКА+СТВОЛ=ДЕРЕВО (3 решения) ВОРОТА+ТРАВА=ФУТБОЛ (3 решения) Популярное:
|
Последнее изменение этой страницы: 2016-05-30; Просмотров: 1023; Нарушение авторского права страницы