![]() |
Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Алгоритмы с повторениями. Цикл с предусловием WHILE. Цикл с постусловием REPEAT
На прошлом занятии мы познакомились и научились использовать счётный цикл FOR. Продолжим работу по этой теме и познакомимся с ещё двумя циклами: - цикл WHILE с предусловием; - цикл REPEAT...UNTIL c постусловием. Эти циклы удобно использовать тогда, когда заранее неизвестно число повторений. Решим задачу zadacha3_1 используя циклы WHILE и REPEAT и попытаемся понять принцип работы этих циклов.
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.
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.
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). Вложенные циклы. Для решения задачи достаточно часто требуется использовать несколько вложенных друг в друга циклических конструкций. Такие конструкции называют вложенными циклами. Рассмотрим несколько примеров:
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. Данную задачу можно было решить, используя только один цикл. Подумайте, как это сделать.
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;
Поскольку здесь всего три буквы, то для решения достаточно написать три вложенных цикла, и перебрать все варианты сложения трёхзначных чисел. 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; Нарушение авторского права страницы