![]() Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву ![]() Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Алгоритмы с повторениями. Цикл с предусловием 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 вложенных циклах работает очень быстро. Вопросы для повторения: 59. Может ли во вложенных циклах использоваться одна и та же переменная, например i? 60. Можно ли вкладывать друг в друга различные циклы: 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-08-15; просмотров: 499; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.144.6.254 (0.008 с.) |