Предисловие дорогие друзья !

Вид материалаДокументы

Содержание


§20. Оператор цикла с предусловием WHILE.
Program Ex44; Var
End; Writeln(' ÷èñëå ',n,' - ',k,' öèôð'); {âûâîä êîëè÷åñòâà öèôð } Readln; End
Program Ex45; Var
End; Writeln ('Íîìåð ìèíèìàëüíîãî ýëåìåíòà - ', k); Readln; End.
Program z5P16_46; Var
While Not
End; Close(Out); End.
Program Ex47; Var
Для любознательных
§21. Оператор цикла с постусловием REPEAT.
Repeat {Повторять} P:=P*A; {Умножение} I:=I+1 {и увеличение счётчика} until
Program Ex50; Var
Until s>p; Writeln('Ñóììàðíàÿ ñòîèìîñòü ïîêóïêè ïðåâûñèëà ïðåäåëüíóþ ñóììó'); Readln End.
Program ex51; Var
Until s>5; {как только сумма станет больше 5 — выход из цикла} Write(‘n=’,n); {выводим число слагаемых} Readln End
Для любознательных
§22. Программирование алгоритмов с циклами.
Program Ех52; Var
Program Ех54; Var
...
Полное содержание
Подобный материал:
1   ...   9   10   11   12   13   14   15   16   ...   29

§20. Оператор цикла с предусловием WHILE.


Представь себе, что ты спринтер и во время тренировки многократно пробегаешь стометровку. Тренер стоит на старте и перед каждым забегом спрашивает тебя: «Есть ещё силы бежать?» если ты отвечаешь «Да», то снова бежишь, ну, а если «Нет», то бег заканчивается. Это типичная ситуация, которую отражает оператор цикла с предварительным условием.

Цикл WHILE (пока) используется тогда, когда число повторений тела цикла заранее неизвестно.

Общий вид оператора следующий:

WHILE <условие> DO <îïåðàòîð>;

ãäå WHILE (пока) и DO (выполнить) являются служебными словами, а îïåðàòîð (ïðîñòîé èëè ñîñòàâíîé) – тело цикла. Îïåðàòîð öèêëà выполняется ñëåäóþùèì îáðàçîì (рисунок 27).
  1. Вначале проверяется условие, т.е. вычисляется çíà÷åíèå ëîãè÷åñêîãî âûðàæåíèÿ P.
  2. если Р=True («истина»), то выполняется тело цикла (<оператор>) и управление опять передается на проверку этого же условия. Цикл будет повторяться до тех пор, пока условие выполняется.
  3. если Р=False («ложь»), то цикл завершается и управление передается следующему за оператором WHILE оператору.

Если первый раз ëîãè÷åñêîе âûðàæåíèе принимает çíà÷åíèå False, òî тело цикла íå âûïîëíитñÿ íè ðàçó. Åñëè ëîãè÷åñêîå âûðàæåíèå íèêîãäà íå ïðèмåò çíà÷åíèå False, òî тело öèêëа áóäåò âûïîëíÿòüñÿ áåñêîíå÷íî (происходит «зацикливание» программы). Чтобы этого не произошло, в òåëå öèêëà äîëæåí áûòü îïåðàòîð, âëèÿþùèé íà ñîáëþäåíèå óñ­ëîâèÿ. Прервать бесконечное выполнение программы можно одновременным нажатием клавиш CTRL и BREAK (PAUSE).

Возможен случай, когда в циклической части стоит оператор перехода, передающий управление за пределы цикла. В такой ситуации цикл может завершиться до его естественного окончания (при истинном значении логического выражения). Но следует учесть, что такой прием не соответствует принципам структурного программирования.

Всякий раз, когда число повторений каких-то действий заранее неизвестно, используется цикл WHILE (пока). Составление таких циклов — трудная задача. Короткий цикл может описывать длинную последовательность действий. Чтобы не запутаться и что-нибудь не забыть, лучше всего конструировать цикл WHILE по частям. Ïðîöåññ ñîñòàâëåíèÿ àëãîðèòìîâ ñ öèêëîì WHILE можно разбить на следующие этапы.

1) Ïîíÿòü, êîãäà öèêë äîëæåí çàêîí÷èòüñÿ, ò.å. ñôîðìóëèðîâàòü óñëîâèå îêîí÷àíèÿ öèêëà. Çàïèñàòü ïîñëå WHILE (ïîêà) ïðîòèâîïîëîæíîå óñëî­âèå — óñëîâèå ïðîäîëæåíèÿ öèêëà.

2) Âûÿñíèòü, ÷òî è êàê áóäåò ìåíÿòüñÿ â öèêëå, îïèñàòü ïðîìå­æóòî÷íûå ñîñòîÿíèÿ ïîñëå íåñêîëüêèõ ïîâòîðåíèé öèêëà.

3) Îïèñàòü, ÷òî ïðîèñõîäèò ïðè îäíîêðàòíîì âûïîëíåíèè öèêëà (ïðèíÿòî ãîâîðèòü "çà îäèí øàã öèêëà"), ò.å. çàïèñàòü òåëî öèêëà.

4) Ïðîâåðèòü, ÷òî öèêë ðàíî èëè ïîçäíî çàêîí÷èòñÿ, à íå áóäåò ïîâòîðÿòüñÿ âå÷íî.

Ïðèìåð 43. Âû÷èñëèòü À7.

Решение. Показатель степени (7) говорит о том, что основание степени (А) нужно умножить само на себя семь раз. А7=А*А*А*А*А*А*А. Используем для решения задачи цикл с предусловием. Переменная I — счётчик числа умножений. Условие окончания цикла: I>7. следовательно, условие продолжения цикла: пока I<=7. Пусть Р — результат умножения. В теле цикла нужно умножать предыдущее значение Р на А. и ещё в теле цикла нужно считать число умножений. Фрагмент программы будет выглядеть так:

I:= 1; P:=1; {Начальные значения I и P}

While I<=7 do {Пока (WHILE) I<=7. то выполнять (DO)}

begin {начало тела цикла}

P:=P*A; {Умножаем очередной раз предыдущее значение Р на А}

I:=I+1 {Считаем число умножений, изменяя значение переменной I,}

end; {которая влияет на соблюдение условия}

Пусть А=3, тогда во время выполнения программы переменные принимают следующие значения:

I

Логическое выражение

Значение

P

1

17

Истина

3

2

27

Истина

9

3

37

Истина

27

4

47

Истина

81

5

57

Истина

243

6

67

Истина

729

7

77

Истина

2187

8

87

Ложь

Выход из цикла

Ïðèìåð 44. Ïîäñ÷èòàòü êîëè÷åñòâî öèôð çàäàííîãî íàòóðàëüíîãî ÷èñëà n.

Ðåøåíèå. Вычисление êîëè÷åñòâа öèôð числа íà÷íåì ñ ïîñëåäíåé. Íà î÷åðåäíîì øàãå öèêëà óâåëè÷èì ñ÷åò÷èê öèôð íà åäèíèöó, à ÷èñëî óìåíüøèì â 10 ðàç (òåì ñàìûì ìû èçáàâëÿåìñÿ îò ïîñëåäíåé öèôðû ÷èñëà). Äàëåå ñ ïîëó÷èâøèìñÿ ÷èñëîì ïðîäåëàåì òó æå ïîñëåäîâàòåëü­íîñòü äåéñòâèé è ò.ä., ïîêà ÷èñëî íå ñòàíåò ðàâíûì íóëþ. следовательно, условие продолжения цикла: число не равно нулю.Блок-схема и программа на языке Паскаль решения задачи могут быть представлены в виде:



Program Ex44;

Var m, n:Longint;{n — само число, m — копия числа}

k:Integer; {ñ÷åò÷èê öèôð }

Begin

Write('Ââåäèòå íàòóðàëüíîå ÷èñëî: ');

Readln(n); { ââîäèì íàòóðàëüíîå ÷èñëî n>0 }

m:=n; {Cоздадим копию, чтобы сохранить исходное значение}

k:=0; {Начальное значение счётчика цифр}

While m<>0 Do {ïîêà (While) ÷èñëî m<>0 дåëàòü (Do)}

Begin

Inc(k) ;{равносильно оператору k:=k+1, «считаем» очередную цифру}

m:=m div 10 ; { "âûáðàñûâàåì" èç ÷èñëà ïîñëåäíþþ öèôðó}

End;

Writeln(' ÷èñëå ',n,' - ',k,' öèôð'); {âûâîä êîëè÷åñòâà öèôð }

Readln;

End.


Òðàññèðîâêà ïðèìåðà. Ðàññìоòðèì âûïîëíåíèå ýòîé ïðîãðàììû â ïîøàãîâîì ðåæèìå äëÿ ÷èñëà 65387:

N

M

K

65387

65387

0

65387

6538

1

65387

653

2

65387

65

3

65387

6

4

65387

0

5

 ðåçóëüòàòå ðàáîòû íà ýêðàíå ïîÿâèòñÿ ïðåäëîæåíèå:

 ÷èñëå 65387 - 5 öèôð

Ïðèìåð 45. Äàíà ïîñëåäîâàòåëüíîñòü íàòóðàëüíûõ ÷èñåë, çà êîòîðîé ñëåäóåò 0. Íàéòè ïîðÿäêîâûé íîìåð íàèìåíüøåãî ýëåìåíòà ïîñëåäîâà­òåëüíîñòè.

Ðåøåíèå. Введем идентификаторы переменных:

x - î÷åðåäíîé ýëåìåíò ïîñëåäîâàòåëüíîñòè;

i – íîìåð элемента;

min – значение ìèíèìàëüíого ýëåìåíòа ïîñëåäîâàòåëüíîñòè;

k - порядковый íîìåð минимального элемента.

Ñ÷èòûâàíèå ýëåìåíòîâ ïîñëåäîâàòåëüíîñòè ïðîèçâîäèòñÿ äî òåõ ïîð, ïîêà íå áóäåò ââåäåí 0, òî åñòü ïîêà x<>0. Будем считать первый элемент последовательности ìèíèìàльным. О÷åðåäíîé ýëåìåíò ïîñëåäîâàòåëüíîñòè òðåáóåòñÿ ñðàâíèâàòü ñ òåêóùèì çíà÷åíèåì min, è åñëè òåêóùåå çíà÷åíèå min îêàæåòñÿ áîëüøå î÷åðåäíîãî, òî в min íóæíî çàïîìíèòü введённое значение х, а в k – íîìåð î÷åðåäíîãî ýëåìåíòà ïîñëåäîâà­òåëüíîñòè. Блок-схема и программа на языке Паскаль решения задачи могут быть представлены в виде:



Program Ex45;

Var x, i, min, k: integer;

Begin

Write ('Ââåäèòå 1 ýëåìåíò ïîñëåäîâàòåëüíîñòè');

Readln (x);

k:=1;

min:=x;

i:=2;

While x<>0 Do

Begin

If xThen Begin min:=x; k:=i-1 End;

Write ('Ââåäèòå ',i,'-й ýëåìåíò ïîñëåäîâàòåëüíîñòè');

Readln (x);

Inc (i);

End;

Writeln ('Íîìåð ìèíèìàëüíîãî ýëåìåíòà - ', k);

Readln;

End.


Пример 46. Вернёмся к примеру 42. Написать программу, осуществляющую автоматическое тестирование задачи 5 §16, при условии, что количество тестов во входном файле не известно.

Решение. Исходные данные для задачи будем считывать из файла INPUT.TXT. содержит число тестов. Каждая строка файла содержит три числа. Для определения окончания тестов будем проверять значение функции EOF(F), определяющей окончание файла F. Эта функция логического типа. Значение её равно TRUE, если обнаружен конец файла и FALSE в противном случае. Так как число тестов не известно, то воспользуемся циклом с предусловием. Условие окончание цикла — значение EOF(INP)=TRUE. Следовательно, условие продолжения цикла — EOF(INP)=FALSE. Циклическая часть такая же как и в примере 42.

Program z5P16_46;

Var a,b,c,x,n,i:Integer;

Inp,Out:Text;

Begin

Assign(inp,'input.txt');

Assign(out,'output.txt');

Reset(inp); Rewrite(out);

ReadLn(inp,n); {Считываем количество тестов}

While Not Eof(inp) Do {Выполняем тестирование до тех пор, пока есть тесты}

Begin

ReadLn(inp,a,b,c); {Считываем очередной тест}

If a>b then begin x:=a; a:=b; b:=x end;

If b>c then begin x:=b; b:=c; c:=x end;

If a>b then begin x:=a; a:=b; b:=x end;

If (b>a) and (b
End;

Close(Out);

End.

Пример файла Input.txt.

2 2 2

1 2 3

1 3 2

2 1 3

2 3 1

3 1 2

3 2 1

2 2 1

2 1 2

1 2 2

Файл Output.txt.

no

2

2

2

2

2

2

no

no

no

Пример 47. Íàïèñàòü ïðîãðàììó íàõîæäåíèÿ íàèáîëüøåãî îáùåãî äåëèòåëÿ äâóõ натуральных ÷èñåë.

Ðåøåíèå. Из курса математики вам известно, что наибольшим общим делителем (НОД) двух чисел а и b называется наибольшее натуральное число, на которое делятся без остатка оба числа.

В курсе математики для нахождения НОД. необходимо разложить исходные числа на простые множители и затем выбрать из них, наибольший, входящий в оба разложения.

Известен и более простой способ нахождения НОД двух натуральных чисел, который называется алгоритмом Евклида.

Он заключается в следующем.

Ïóñòü õ  ó è õ>ó. Íàïðèìåð, õ=48, à ó=18. заменим большее число разностью х и у, получим: х=30, у=18. снова сравним числа и заменим большее число разностью: х=12, у=18 и т.д. до тех пор, пока числа не сравнятся. В качестве НОД можно взять любое из получившихся чисел. В нашем примере НОД=6.

Äëÿ ðåøåíèÿ äàííîé çàäà÷è âîñïîëüçóåìñÿ öèêëîì WHILE. Условие окончания работы цикла х=у, следовательно, условие продолжения работы цикла x<>y:




Program Ex47;

Var x,y: Integer;

Begin

Write('Ââåäèòå äâà ÷èñëà:');

Readln(õ, y);

While x<>y do {пока числа не сравнятся, âûïîëíÿòü}

If x>y Then x:=x-y Else y:=y—x;{Большее число заменяем разностью}

Writeln('ÍÎÄ=',x); {âûâîä ÍÎÄ}

Readln;

End.


Пример 48. Найти наименьшее общее кратное (НОК) двух натуральных чисел.

Решение. Если а и b — два натуральных числа, и если число с таково, что с делится на а и с делится на b, то число с называют общим кратным чисел а и b. Произвольные два числа всегда обладают общим кратным. Таким кратным является число, равное произведению ab.

наименьшим общим кратным (НОК) чисел а и b называют наименьшее натуральное число, которое кратно и а и b

В курсе математики приводится следующий алгоритм нахождения НОК. Необходимо разложить числа на простые множители и затем выбрать те из них, которые входят хотя бы в одно разложение. Этот способ достаточно трудоёмкий. Поэтому для нахождения НОК можно воспользоваться следующим свойством: НОК(а, b)=аb/НОД(а, b). Для нахождения НОД следует применять алгоритм Евклида.

Программу для решения данной задачи напишите самостоятельно.

Вопросы и задания.
  1. Сколько раз выполняется оператор цикла с предусловием?
  2. как осуществляется выход из оператора цикла с предусловием?
  3. объясните порядок выполнения оператора цикла с предусловием?
  4. объясните блок-схему оператора цикла с предусловием?
  5. Может ли тело оператора цикла с предусловием:
  1. не выполниться ни разу;
  2. выполняться бесконечное число раз (или до тех пор, когда пользователь прервёт его выполнение)?
  1. Дано натуральное число. Определить:
  1. Первую цифру;
  2. Сумму первой и последней цифр.
  1. Спортсмен в первый день пробежал 10 км. Каждый следующий день он увеличивал норму на 10% от нормы предыдущего дня.

а) Определить, через сколько дней спортсмен пробежит суммарный путь более 100 км.

б) Определить, через сколько дней спортсмен будет пробегать более 20 км.

в) Какой путь пробежит спортсмен на 7-й день.
  1. Дано натуральное число. Найти:
  1. число, получаемое при прочтении его цифр справа налево;
  2. число, получаемое из исходного перестановкой его первой и последней цифр.
  1. Дано число n
    1. Напечатать те натуральные числа, квадрат которых не превышает n;
    2. Найти первое натуральное число, квадрат которого больше n.
  2. Учитывая, что многократное вычитание из большего числа меньшее число есть операция деления, усовершенствуйте алгоритм нахождения НОД в примере 45.
  3. Если 1 марта в банке открыт счёт, размер которого 1 000 000 руб. Через каждый месяц размер вклада увеличивается на 20% от имеющейся суммы. Определить:

а) за какой месяц величина ежемесячного увеличения вклада превысит 30 000 руб;

б) через сколько месяцев размер вклада превысит 1 200 000 руб.


Для любознательных

На первом построении вновь призванные в армию солдаты построились в шеренгу. В результате исполнения команды "налево" некоторые солдаты повернулись налево, а некоторые - направо. Солдаты, которые оказались лицом к лицу со своим соседом, сразу поняли, что совершили ошибку. Чтобы ее исправить, каждый из них опять повернулся на 180 градусов. Если эта ситуация опять повторялась, то есть, какие-то солдаты оказывались лицом друг к другу, то такие солдаты снова поворачивались на 180 градусов. Это продолжалось до тех пор, пока в шеренге была хотя бы одна пара солдат, стоящих лицом друг к другу.

Требуется написать программу, которая по расположению солдат сразу после исполнения команды "налево" вычисляет число пар солдат, совершивших впоследствии развороты на 180 градусов в соответствии с вышеописанной процедурой.

Входной файл INPUT.TXT состоит из двух строк. В первой строке записано число N (1 N30000) - количество солдат в шеренге. Во второй строке содержится последовательность из N символов, каждый из которых может быть либо символом «<», либо символом «>» (символ «<» означает солдата, повернувшегося налево, символ «>» - солдата, повернувшегося направо).

Выходной файл OUTPUT.TXT должен содержать одно число - количество развернувшихся пар, либо число -1, если процесс бесконечен.

Пример INPUT.TXT:

OUTPUT.TXT для примера:

6

7

>><<><



§21. Оператор цикла с постусловием REPEAT.


Снова представь себе, что ты спринтер и во время тренировки многократно пробегаешь стометровку. Но теперь тренер стоит на финише. После каждого забега он спрашивает: «Устал?». если ты отвечаешь «Нет», то снова бежишь, ну, а если «Да», то бег заканчивается. Это типичная ситуация, которую отражает оператор цикла с последующим условием. Оператор цикла с последующим условием имеет вид:



REPEAT

Операторы (òåëî öèêëà)

UNTIL <условие>;





Слова REPEAT (повторить) и UNTIL (до тех пор) являются служебными словами. Îïåðàòîð öèêëà REPEAT выполняется ñëåäóþùèì îáðàçîì:
  1. выполняется тело цикла.
  2. вычисляется значение логического выражения (проверяется условие).
  3. если значение логического выражения False, то цикл повторяется, в противном случае (значение логического выражения True) цикл завершается и управление передается следующему за оператором REPEAT оператору.

Если в теле цикла REPEAT встречается оператор перехода, указывающий на метку за пределы цикла, то цикл может завершиться до его естественного окончания.

На блок-схеме оператор цикла с постусловием выглядит так, как на рисунке 31.

Отметим, что цикл с постусловием единственный из операторов цикла, который обязательно выполняется хотя бы один раз.

Напомним, что в операторе цикла WHILE (пока) логическое выражение определяет условие продолжения цикла. В операторе цикла REPEAT логическое выражение определяет условие выхода из цикла

Íèæíÿÿ ãðàíèöà îïåðàòîðîâ öèêëè÷åñêîé ÷àñòè ÷åòêî îáîçíà÷åíà ñëîâîì until, ïîýòîìó íåò íóæäû â îïåðàòîðíûõ ñêîáêàõ.

Если в циклической части встречается оператор перехода, указывающий на метку за пределы цикла, то цикл может завершиться до его естественного окончания. Цикл с постусловием единственный из операторов цикла, который обязательно выполняется хотя бы один раз.

Посмотрим, как можно решить задачу из предыдущего параграфа ещё одним способом.

Ïðèìåð 49. Âû÷èñëèòü À7.

Решение. Мы уже решали эту задачу с помощью цикла WHILE (пример 43 §20). Сейчас же воспользуемся циклом REPEAT.

I:= 1; P:=1; {Начальное значение счётчика и произведения}

Repeat {Повторять}

P:=P*A; {Умножение}

I:=I+1 {и увеличение счётчика}

until I>7; {до тех пор, пока I не станет больше 7}

Оператор мы применили другой, а результат получается тот же. Очень часто при решении одной и той же задачи можно применить любой из операторов цикла.

Ïðèìåð 50. Ñîñòàâèòü ïðîãðàììó ïëàíèðîâàíèÿ çàêóïêè òîâàðà â ìàãàçèíå íà ñóììó, íå ïðåâûøàþùóþ çàäàííîé âåëè÷èíû.

Ðåøåíèå. Введем идентификаторы перменных:

õ — öåíа òîâàðà;

ê – êîëè÷åñòâî товара;

ð – çà­äàííая ïðåäåëüíая ñóììа;

s – ñòîèìîñòü ïîêóïêè.

Íà÷àëüíîå çíà÷åíèå îáùåé ñòîèìîñòè ïîêóïêè s ðàâíî íóëþ. Çíà÷åíèå ïðåäåëüíîé ñóììû вводится ñ êëàâèàòóðû. Íåîáõîäèìî ïîâòîðÿòü çàïðîñ öåíû è êîëè÷åñòâà âûáðàííîãî òîâàðà, âû÷èñëÿòü åãî ñòîèìîñòü, ñóììèðîâàòü åå ñ îáùåé ñòîèìîñòüþ è âûâîäèòü ðåçóëüòàò íà ýêðàí äî òåõ ïîð, ïîêà ñòîèìîñòü íå ïðåâûñèò ïðåäåëüíую ñóììу ð.

Program Ex50;

Var x, k, p, s: Integer;

Begin

Write('Ïðåäåëüíàÿ ñóììà -');

Readln(p);

s:=0;

Repeat

Write('Ââåäèòå öåíó òîâàðà è åãî êîëè÷åñòâî');

Readln(x,k);

s:=s+x*k;

Writeln('Ñòîèìîñòü ïîêóïêè ðàâíà ',s);

Until s>p;

Writeln('Ñóììàðíàÿ ñòîèìîñòü ïîêóïêè ïðåâûñèëà ïðåäåëüíóþ ñóììó');

Readln

End.

Пример 51. Какое наименьшее число слагаемых должно быть в сумме , чтобы эта сумма оказалась больше 5?

Решение. Пусть S — значение суммы. N — число слагаемых. Будем прибавлять последовательно слагаемые, увеличивая значение N от 1 до тех пор, пока не получим сумму большую 5. Блок-схема и программа на языке Паскаль решения задачи могут быть представлены в виде:




Program ex51;

Var n: integer;

S: real;

Begin

S:=0; n:=0; {начальное значение суммы и счётчика слагаемых}

Repeat {выполнять— начало цикла}

Inc(n); {считаем количество слагаемых}

S:=s+1/n: {вычисляем сумму}

Until s>5; {как только сумма станет больше 5 — выход из цикла}

Write(‘n=’,n); {выводим число слагаемых}

Readln

End.


Вопросы и задания.
  1. Сколько раз выполняется оператор цикла с постусловием?
  2. как осуществляется выход из оператора цикла с постусловием?
  3. объясните порядок выполнения оператора цикла с постусловием?
  4. объясните блок-схему оператора цикла с постусловием?
  5. Всегда ли можно вместо оператора цикла с предусловием использовать оператор цикла с постусловием?
  6. Всегда ли можно вместо оператора цикла с параметром использовать оператор цикла с постусловием?
  7. Дано натуральное число.
  1. Верно ли, что сумма его цифр больше 10?
  2. Верно ли, что произведение его цифр больше 50?
  3. Верно ли, что количество его цифр есть чётное число?
  4. Верно ли, что это четырёхзначное число?
  5. Верно ли, что оно начинается и заканчивается одной и той же цифрой?
  1. Дано натуральное число. Выяснить, является ли оно палиндромом («перевёртышем»), т.е. числом, десятичная запись которого читается одинаково слева направо и справа налево.
  2. Дано натуральное число. Определить:
  1. сколько цифр «3» в нём;
  2. сколько раз в нём встречается цифра, равная последней;
  3. сумму его цифр, больше «5».
  1. Составьте программу для определения количества сомножителей в произведение 1*2*3*4*...*n, при котором его значение станет больше 1000000.
  2. Запросить имя пользователя и напечатать "Привет, Вася!" 10 раз (если Вася – имя пользователя).
  3. Программа должна вычислять произведение двух чисел и спрашивать, завершать программу или нет, если нет, то продолжать запрашивать данные вычислять произведение и печатать его.
  4. Вывести на печать все трёхзначные натуральные числа, сумма цифр которых равна заданному числу N. (Операции div и mod не использовать.)
  5. Население города увеличивается на 3% каждый год. В 1983 году население города составляло 65000. Напишите программу, которая выведет на экран предсказываемую численность населения города в каждом году вплоть до 2004 г.
  6. Найдите все натуральные числа от 1 до 1000, кратные 3.
  7. Произведение N первых нечетных чисел равно р. Сколько сомножителей взято?
  8. Числами Фибоначчи называются числа образованные по правилу: первые два равны 1, а каждое следующее равно сумме двух предыдущих (1,1,2,3,5,8…). Cоставить программу:

а) определения 40-го числа Фибоначчи;

б) поиска первого числа Фибоначчи, большего m (m>1);

в) вычисления S - суммы всех чисел Фибоначчи, которые не превосходят 1000.


Для любознательных

Петя решил купить подарок другу, который стоит S рублей. Но у него не было столько денег, а было всего лишь K рублей. И тогда он решил обратиться в банк. В банке ему сказали, что если он положит свои деньги к себе на счет, то на следующий день ему начислят в 2.5 раза больше, а начиная с третьего, ему будет начисляться сумма, которая будет равна текущей, умноженной на 2, минус та, которая у него была за день до этого (т.е. если у него было в первый день 5 рублей, то во второй день у него станет 12.5 рублей, а на третий у него будет 12.5*2-5=20). И тогда Петя решил подсчитать количество дней, которое ему понадобится, чтобы набрать S рублей. Но самостоятельно он этого не смог сделать и поэтому обратился за помощью к вам.

Ваша задача состоит в том, чтобы подсчитать, сколько дней понадобится Пете.

Если Петя вообще не пошел в банк, считать количество дней равным нулю.

Ввод: S, K (0<S<=1000, 0<=K<=1000).

Вывод: единственное число (количество дней) или ‘No solution.’, если Пете вообще не удастся набрать нужную сумму.

Пример:

input.txt output.txt

18.7 5.0 3

§22. Программирование алгоритмов с циклами.


Часто встречающимися ошибками при программировании алгоритмов с циклами являются использование в теле цикла переменных, которым не были присвоены начальные значения, а также неверная запись условия продолжения цикла. Нужно помнить и о том, что в операторе while истинным должно являться условие повторения вычислений, а в операторе repeat - условие их окончания.

Чтобы избежать ошибок, рекомендуется:
  • не забывать о том, что если в теле циклов while и for требуется выполнить более одного оператора, нужно заключать их в блок;
  • убедиться, что всем переменным, встречающимся в правой части операторов присваивания в теле цикла, до этого присвоены значения, а также возможно ли выполнение других операторов;
  • проверить, изменяется ли в теле цикла хотя бы одна переменная, входящая в условие продолжения цикла.

Пример 52. Найти сумму квадратов первых n натуральных чисел, которые делятся на 7. n вводится с клавиатуры.

Решение. Исходное данное — количество исследуемых чисел N. Результат — S. Промежуточная переменная а служит для последовательного получения натуральных чисел из заданного промежутка. Для проверки делимости очередного числа на 7, используется операция MOD. Блок-схема и программа на языке Паскаль решения задачи представлены на рисунке 33.




Program Ех52;

Var

a, s, n : Longint;

Begin

Write(‘Ввести количество чисел: ’);

Readln(n);

s := 0; {Начальное значение суммы}

a := 1; {Первое натуральное число}

repeat

if a mod 7 = 0 then s := s+sqr(a); {Если число делится на 7, то прибавляем его квадрат}

a := a+1 {Следующее число}

until a>n; {Число больше N  выход из цикла}

Writeln(‘Сумма квадратов первых n натуральных чисел,’);

Writeln(‘которые делятся на 7, равна ’, s);

Readln

End.


Пример 53. Вывести таблицу значений функции y=4x3-3 на отрезке [a,b] с шагом h. Значения a, b и h вводятся с клавиатуры (оператор while).

Program Ех53;

Var

a, b, h, x, y : real;

i : byte;

Begin

{Ввод данных}

Write(‘Введите значения концов отрезка: ’);

Readln(a, b);

Write(‘Ввядите значение шага: ’);

Readln(h);

{Создание заголовка таблицы}

For i:=1 to 25 do Write(‘-’);

Writeln;

Write(‘| x | Y |’);

Writeln;

For i:=1 to 25 do Write(‘-’);

Writeln;

{Вычисление и запись значений х и у в таблицу}

X:=A;

While x <= b do

begin

y := 4*x*x*x-3;

Writeln(‘| ’, x:5:2, ‘ | ’, y:7:2, ‘ |’);

x := x+h;

end;

{Подчёркивание таблицы}

For i:=1 to 25 do Write(‘-’);

Readln

End.

Пример 54. Вычислить значение выражения

,

если натуральное значение n вводится с клавиатуры.

Решение. Посмотрим, как будет выглядеть значение выражения при N=1, 2, 3.



Как видим, вычислять значение выражения лучше всего начиная с самого конца. Для этого применим цикл FOR с вариантом DOWNTO. Исходное данное — N, «высота» дроби. Переменная а — значение дроби. S — значение знаменателя более высокого порядка. В конце работы программы переменная S будет равна значению выражения. начальное значение суммы — 0.

Program Ех54;

Var

a, s : real;

i, n : longint;

Begin

{Ввод данных}

Write(‘Введите значение n: ’);

Readln(n);

{Вычисление суммы}

s := 0; {Начальное значение суммы}

a := (2*n-1)/(2*n+1); {Вычисляем значение самой нижней дроби}

s := (2*n-1)+a; {Вычисляем значение знаменателя более высокого порядка}

for i := n-1 downto 1 do {Уменьшая I от n-1 до 1}

begin

a := (2*i-1)/s; {Вычисляем дробь}

s := (2*i-1)+a; {И знаменатель следующего порядка}

end;

Writeln(‘Значение выражения равно: ’, s:10:7);

Readln

End.

Пример 55. Каждый год жители островов А и В обмениваются сваими ценностями. Жители острова А отвозят половину своих ценностей на остров В, а жители острова В – третью часть своих ценностей на остров А. Сколько ценностей будет на каждом острове через n лет, если первоначально на островах А и В было Х и Y ценностей соответственно.

Решение. Обозначим исходное количество ценностей на островах А и В соответственно a и b, а перевозимое количество — d и t. Для решения задачи воспользуемся циклом FOR. В теле цикла будем вычислять перевозимое количество ценностей и новое количество ценностей на каждом острове.

Program Ех55;

Var

a, b, d, t : real;

i, n : integer;

Begin

{Ввод данных}

Write(‘Введите число ценностей на острове А: ’);

Readln(a);

Write(‘Введите число ценностей на острове В:’);

Readln(b);

Write(‘Введите число прашедших лет: ’);

Readln(n);

{Решение задачи}

for i := 1 to n do {Цикл выполняется n раз}

begin

d := a/2; {Вычисляется увозимое с острова А количество ценностей}

t := b/3; {Вычисляется увозимое с острова В количество ценностей}

a := a-d+t; {Вычисляется новое количество ценностей на острове А}

b := b-t+d; {Вычисляется новое количество ценностей на острове В}

end;

Writeln(‘На острове А через ’, n, ‘лет станет ’, a:10:2, ‘ ценностей’);

Writeln(‘На острове В через ’, n, ‘лет станет ’, b:10:2, ‘ ценностей’);

Readln;

End.

Пример 56. Написать программу перемещения символа по экрану дисплея слева направо.

Program Ех56;

uses crt; {Подключаем библиотеку CRT}

var i:integer; {Параметр цикла}

begin {Начало программы}

clrscr; {Очистка экрана}

for i:=1 to 40 do {Цикл по ширине экрана}

begin {Начало цикла}

gotoxy(i,1); {Смещаемся в i-ую позицию в строке}

writeln(' *':i); {Печатаем символ *, «затирая» предыдущее изображение *}

delay(500); {Задерживаем выполнение цикла, чтобы заметить движение}

end; {Конец цикла}

readln { Задерживаем выполнение программы}

end. {Конец программы}

Пример 57. Написать программу вычисления суммы n первых элементов ряда

.

Значение n вводится с клавиатуры (оператор for).

Program Ех57;

Var

s : real;

i, n : longint;

Begin

{Ввод даных}

Write(‘Введите значение n: ’);

Readln(n);

{Вычисление суммы}

s := 0;

for i := 1 to n do

s := s+i/(i+1);

Writeln(‘Сумма n первых элементов ряда равна: ’, s:10:7);

Readln

End.

Пример 58. Мальчик листает книгу, начиная со страницы с номером N в обратном порядке (в порядке убывания номеров страниц) и подсчитывает при этом сумму нечетных номеров страниц. Вывести получившуюся сумму если известно, что мальчик пролистал К страниц. N и К - натуральные числа (N>=K).

program Ех58;

var i,N,K,S:longint;

BEGIN

Readln(N,K); S:=0;

FOR i:=1 TO K DO

BEGIN

IF N mod 2 =1 THEN S:=S+N;

N:=N-1;

END;

WRITELN(S);

end.

Пример 59. На конференцию приехало N человек. Для их перевоза выделили автомобили вместимостью K и M человек (без водителя). К гостинице автомобили подаются в таком порядке: сначала вместимостью K человек, потом - M человек, после этого опять - K человек, потом M человек и так далее. В автомобиле можно перевозить не более максимально допустимого количества пассажиров. Определить, сколько необходимо автомобилей для перевозки всех делегатов конференции.

Идея решения. До тех пор, пока число делегатов не будет равно нулю (пока всех не увезут), отнимаем от числа N число K, затем число M, и так далее. Ввод исходных данных производится из текстового файла.

program Ех59;

var n,k,m,i:integer;

f:text;

begin

assign(f,'input.txt');

reset(f);

read(f,n,k,m);

close(f);

i:=0;

while N>0 do

begin

i:=i+1;

if i mod 2<>0 then n:=n-k else N:=N-M;

end;

assign(f,'output.txt');

rewrite(f);

writeln(F,i);

close(f);

end.

Пример 60. Хлестакова приглашали управлять департаментом. В первый день ему прислали 1000 курьеров, а в каждый следующий - в 2 раза больше, чем в предыдущий. Хлестаков согласился, когда прислали 30000 курьеров. На какой день это произошло? (Учесть, что Хлестаков слаб в умножении и делении).

Идея решения. Типичная итерационная задача. В цикле выполняем действие, пока количество курьеров не достигло 30000, каждый следующий день увеличиваем их количество в 2 раза ( без умножения), считая при этом количество дней.

program Ех60;

var s,n:longint;

i:byte;

begin
i:=0;
n:=1000;
s:=0;
while s<=30000 do
begin
  s:=s+n;
  i:=i+1;
  n:=n+n;
end;
writeln('На ',i,' день!');

end.

Вопросы и задания.

1. ×òî áóäåò íàïå÷àòаíî ïîñëå âûïîëíåíèÿ ñëåäóþùåãî ôðàãìåíòà ïðîãðàììû ïðè n=6?

a:=1; b:=1;

For i:=0 To n Do

Begin

For j:=1 To b Do Write('*');

Writeln;

c:=a+b; a:=b; b:=c;

End;

Ðåøåíèå êàêîé çàäà÷è ðåàëèçîâàíî â ýòîì ôðàãìåíòå?

2. ×òî áóäåò íàïå÷àòàíî ïîñëå âûïîëíåíèÿ ñëåäóþùåãî ôðàãìåíòà ïðîãðàììû ïðè a=13305?

b:=0;

While a<>0 Do

Begin

b:=b*10+a mod 10;

a:=a div 10;

End;

Write(b);

Ðåøåíèå êàêîé çàäà÷è ðåàëèçîâàíî â ýòîì ôðàãìåíòå?

3. Íàïèñàòü ïðîãðàììó äëÿ íàõîæäåíèÿ âñåõ ïðÿìîóãîëüíèêîâ, ïëîùàäü êîòîðûõ ðàâíà çàäàííîìó íàòóðàëüíîìó ÷èñëó q è ñòîðîíû âû­ðàæåíû íàòóðàëüíûìè ÷èñëàìè.

4. Ñîñòàâèòü ïðîãðàììó äëÿ ãðàôè÷åñêîãî èçîáðàæåíèÿ äåëèìîñòè ÷èñåë îò 1 äî n (n çäàåòñÿ).  êàæäîé ñòðîêå íàäî ïå÷àòàòü î÷åðåä­íîå ÷èñëî è ñòîëüêî ïëþñîâ, ñêîëüêî äåëèòåëåé ó ýòîãî ÷èñëà. Íàï­ðèìåð, åñëè çàäàíî ÷èñëî 4, òî íà ýêðàíå äîëæíî áûòü íàïå÷àòàíî:

1+

2++

3++

4+++

5. Ñîñòàâèòü ïðîãðàììó ïîëó÷åíèÿ âñåõ ñîâåðøåííûõ ÷èñåë, ìåíü­øèõ çàäàííîãî ÷èñëà n. Íàïîìíèì, ÷òî ÷èñëî íàçûâàåòñÿ ñîâåðøåííûì, åñëè îíî ðàâíî ñóììå âñåõ ñâîèõ ïîëîæèòåëüíûõ äåëèòåëåé, êðîìå ñà­ìîãî ñåáÿ. Íàïðèìåð, 28 - ñîâåðøåííîå ÷èñëî, ò.ê. 28=1+2+4+7+14.

Èç èñòîðèè. Ãðåêàì áûëè èçâåñòíû ïåðâûå ÷åòûðå ñîâåðøåííûõ ÷èñëà: 6, 28, 496, 8128. Ýòè ÷èñëà âûñîêî öåíèëèñü. Äàæå â XII âå­êå öåðêîâü óòâåðæäàëà, ÷òî äëÿ ñïàñåíèÿ äóøè íåîáõîäèìî íàéòè ïÿ­òîå ñîâåðøåííîå ÷èñëî. Ýòî ÷èñëî áûëî íàéäåíî òîëüêî â XV âåêå. Äî ñèõ ïîð ñîâåðøåííûå ÷èñëà ïîëíîñòüþ íå èññëåäîâàíû - íåèçâåñòíî, èìååòñÿ ëè êîíå÷íîå ÷èñëî ñîâåðøåííûõ ÷èñåë èëè èõ ÷èñëî áåñêîíå÷­íî, êðîìå òîãî, íåèçâåñòíî íè îäíîãî íå÷åòíîãî ñîâåðøåííîãî ÷èñëà, íî è íå äîêàçàíî, ÷òî òàêèõ ÷èñåë íåò.

6. Äàíî íàòóðàëüíîå ÷èñëî n. Ìîæíî ëè åãî ïðåäñòàâèòü â âèäå ñóììû êâàäðàòîâ òðåõ íàòóðàëüíûõ ÷èñåë? Åñëè ìîæíî, òî:

à) óêàçàòü òðîéêó x, y, z òàêèõ íàòóðàëüíûõ ÷èñåë, ÷òî x2+y2+z2=n.

b) óêàçàòü âñå òðîéêè x, y, z òàêèõ íàòóðàëüíûõ ÷èñåë, ÷òî x2+y2+z2=n.

7. Íàéòè íàòóðàëüíîå ÷èñëî îò 1 äî 10000 ñ ìàêñèìàëüíîé ñóììîé äåëèòåëåé.

8. Äàíû íàòóðàëüíûå ÷èñëà n, m. Ïîëó÷èòü âñå íàòóðàëüíûå ÷èñ­ëà, ìåíüøèå n, êâàäðàò ñóììû öèôð êîòîðûõ ðàâåí m.

9. Äàíû íàòóðàëüíûå ÷èñëà n è m. Íàéòè âñå íàòóðàëüíûå ïàðû äðóæåñòâåííûõ ÷èñåë, ëåæàùèõ â äèàïàçîíå îò n äî m. Äâà ÷èñëà íà­çûâàþòñÿ äðóæåñòâåííûìè, åñëè êàæäîå èç íèõ ðàâíî ñóììå âñåõ äåëè­òåëåé äðóãîãî (ñàìî ÷èñëî â êà÷åñòâå äåëèòåëÿ íå ðàññìàòðèâàåòñÿ).

10. Ñîñòàâèòü ïðîãðàììó, ïå÷àòàþùóþ k-þ öèôðó ïîñëåäîâàòåëü­íîñòè 12345678910..., â êîòîðîé âûïèñàíû ïîäðÿä âñå íàòóðàëüíûå ÷èñëà.

11. Ñîñòàâèòü ïðîãðàììó âîçâåäåíèÿ çàäàííîãî ÷èñëà â òðåòüþ ñòåïåíü, èñïîëüçóÿ ñëåäóþùóþ çàêîíîìåðíîñòü:

13=1

23=3+5

33=7+9+11

43=13+15+17+19

53=21+23+25+27+29

12. Äâà ÷èñëà íàçûâàюòñÿ âçàèìíî ïðîñòûìè, åñëè èõ íàèáîëüøèé îáùèé äåëèòåëü ðàâåí 1. Ïðîâåðèòü, ÿâëÿþòñÿ ëè äâà äàííûõ ÷èñëà âçàèìíî ïðîñòûìè.

13. Íàéòè íàèìåíüøåå îáùåå êðàòíîå (ÍÎÊ) ÷èñåë n è m, èñïîëüçóÿ ñîîòíîøåíèå

ÍÎÊ(n,m)=nm/ÍÎÄ(n,m).

14. Îò ïðÿìîóãîëüíèêà 324*141 îòðåçàþò êâàäðàòû ñî ñòîðîíàìè 141, ïîêà ýòî âîçìîæíî. Çàòåì âíîâü îòðåçàþò êâàäðàòû ñî ñòîðîíîé, ðàâíîé 324-2*141=42, è ò.ä. Íà êàêèå êâàäðàòû è íà ñêîëüêî êâàäðà­òîâ áóäåò ðàçðåçàí ïðÿìîóãîëüíèê?

15. Сократить дробь m/n. То есть нàéòè òàêèå íàòóðàëüíûå âçà­èìíî ïðîñòûå p è q, ÷òî p/q=m/n.

16. Найдите сумму цифр числа n.

17. Из данного числа n получить число, записанное теми же цифрами, но в обратном порядке. Например: из числа 12435 получить число 53421.

18. найти значение выражения: .

19. найти значение выражения:
  1. S=1+2+…+n;
  2. ;
  3. S=1+12+123+…+123…n.

20. Определите, какая из цифр в десятичной записи всех простых чисел из заданного диапазона встречается чаще всего. Если таких цифр несколько, найдите наименьшую из них.

21. Дано натуральное число. Определить, является ли сумма его максимальной и минимальной цифр кратной числу а.

22. Дано натуральное число. Определить, является ли разность его максимальной и минимальной цифр чётным числом.

23. Написать программу перемещения символа справа налево.

24. Написать программу перемещения символа по диагонали, из левой верхней позиции в правую нижнюю позицию.

25. Написать программу перемещения символа по диагонали, из нижней левой позиции в правую верхнюю позицию.

26. Написать программу заполнения экрана дисплея символом звездочка.

27. Написать программу перемещения по экрану дисплея фигурки, состоящей из нескольких символов.
  1. Найти сумму и произведение
  1. чётных чисел от 1 до n;
  2. нечётных чисел от 1 до n;
  3. чисел, кратных 3, от 1 до n.
  1. Найти сумму
  1. квадратов чётных чисел из первых n натуральных чисел;
  2. кубов чётных чисел из первых n натуральных чисел.
  1. Известна масса каждого из 12 предметов. Определить массу самого тяжёлого предмета.
  2. Вывести все чётные числа, начиная с числа N и до числа M. Числа N и M задает пользователь.
  3. Написать программу перемещения символа справа налево.
  4. Написать программу перемещения символа по диагонали, из левой верхней позиции в правую нижнюю позицию.
  5. Написать программу перемещения символа по диагонали, из нижней левой позиции в правую верхнюю позицию.
  6. Написать программу заполнения экрана дисплея символом звездочка.
  7. Написать программу перемещения по экрану дисплея фигурки, состоящей из нескольких символов.


Для любознательных

Написать программу, определяющую минимально возможное количество игроков в команде КВН, если известно, что девушек в команде больше X%, но меньше Y%.

Формат входных данных

В первой строке входного файла записаны числа X и Y, разделенные пробелом. X и Y - целые, 1 <= X,Y <= 100.

Формат выходных данных

Нужно вывести одно число - минимальное количество членов команды при ограничениях, заданных во входном файле.

Пример:

input.txt output.txt

40 50 7

§23. Вложенные циклы.


циклы могут быть вложены один в другой. При использовании вложенных циклов необходимо составить программу таким образом, чтобы внутренний цикл полностью укладывался в циклическую часть внешнего цикла. Внутренний цикл может также в свою очередь содержать другой внутренний цикл (циклы). Почти как матрёшки. Но только внутри матрёшки находится только одна матрёшка, внутри которой опять одна матрёшка и т.д. внутри же одного цикла могут быть расположены сразу несколько циклов, каждый из которых может содержать также несколько циклов.

FOR I:=1 TO 5 DO

FOR J:=1 TO 8 DO

FOR K:=1 TO 6 DO

Тело цикла;

FOR I:=K TO N DO

BEGIN

FOR J:=M TO L DO

Тело цикла;

REPEAT

Тело цикла

UNTIL A>B;

END;

Ïðèìåð 61. Äàíû íàòóðàëüíûå ÷èñëà n è k. Ñîñòàâèòü ïðîãðàììó âû÷èñëåíèÿ âûðàæåíèÿ 1k+2k+...+nk.




Program Ex61;

Var n,i,m: Integer;

S,y:Longint;

Begin

Write('Ââåäèòå çíà÷åíèå n');

Readln(n);

s:=0;

For i:=1 To n Do

Begin

y:=1;

For m:=1 To i Do y:=y*i; {íàõîæäåíèå ñòåïåíè i ÷èñëà i}

s:=s+y;

End;

Writeln('Îòâåò: ',s);

Readln

End.


Ðåøåíèå. В данной задаче ïîêàçàòåëü ñòåïåíè î÷åðåäíîãî ñëàãàåìîãî ñîâïàäàåò ñî çíà÷åíèåì åå îñíîâàíèÿ. Äëÿ âû÷èñëåíèÿ óêàçàííîé ñóììû öåëåñîîáðàçíî îðãàíèçîâàòü внутренний öèêë ñ ïàðàìåòðîì m, â êîòîðîì вычисляется çíà÷åíèå î÷å­ðåäíîãî ÷ëåíà ðÿäà (y=ik).

Блок-схема приведена на рисунке 34, а рядом приведено решение на языке Паскаль.

Ïðèìåð 62. Ìîäèôèöèðîâàòü ïðåäûäóùóþ ïðîãðàììó òàê, ÷òîáû â íåé âû÷èñëÿ­ëàñü ñóììà 11+22+...+nn.

Ðåøåíèå. Äàííàÿ çàäà÷à îòëè÷àåòñÿ îò ïðåäûäóùåé òåì, ÷òî ïîêàçàòåëü ñòåïåíè î÷åðåäíîãî ñëàãàåìîãî ñîâïàäàåò ñî çíà÷åíèåì åå îñíîâàíèÿ, ñëåäîâàòåëüíî, âåðõíÿÿ ãðàíèöà âíóòðåííåãî öèêëà (â êîòîðîì âû÷èñ­ëÿåòñÿ î÷åðåäíîå ñëàãàåìîå) îïðåäåëÿåòñÿ çíà÷åíèåì ñ÷åò÷èêà âíåø­íåãî öèêëà.

Program Ex62;

Var n,i,m: Integer;

S,y:Longint;

Begin

Write('Ââåäèòå çíà÷åíèå n');

Readln(n);

s:=0;

For i:=1 To n Do

Begin

y:=1;

For m:=1 To i Do y:=y*i; {íàõîæäåíèå ñòåïåíè i ÷èñëà i}

s:=s+y;

End;

Writeln('Îòâåò: ',s);

Readln

End.

Ïðèìåð 63 (ñòàðèííàÿ çàäà÷à). Ñêîëüêî ìîæíî êóïèòü áûêîâ, êîðîâ è òåëÿò, åñëè ïëàòà çà áûêà - 10 ðóáëåé, çà êîðîâó - 5 ðóáëåé, çà òåëåíêà - ïîëòèííèê (0,5 ðóáëÿ) è íà 100 ðóáëåé íàäî êóïèòü 100 ãîëîâ ñêîòà?

Ðåøåíèå. Îáîçíà÷èì ÷åðåç b êîëè÷åñòâî áûêîâ; k - êîëè÷åñòâî êîðîâ; t - êîëè÷åñòâî òåëÿò. Ïîñëå ýòîãî ìîæíî çàïèñàòü äâà óðàâíåíèÿ:

10b+5k+0.5t=100

b+k+t=100

Умножим превое уравнение на 2, получим:

20b+10k+t=200

b+k+t=100

Íà 100 ðóáëåé ìîæíî êóïèòü:

* íå áîëåå 10 áûêîâ, ò.å. 0<=b<=10;

* íå áîëåå 20 êîðîâ, ò.å. 0<=k<=20;

* íå áîëåå 200 òåëÿò, ò.å. 0<=t<=200.

Òàêèì îáðàçîì, ïîëó÷àåì:

Program Ex63;

Var b,k,t: Integer;

Begin

For b:=0 To 10 Do

For k:=0 To 20 Do

For t:=0 To 200 Do

If (20*b+10*k+t =200) and (b+k+t=100) Then

Writeln('áûêîâ',b,'êîðîâ',k,'òåëÿò',t);

Readln

End.

В этой задаче зíà÷åíèå ïåðåìåííîé b èçìåíÿåòñÿ 11 ðàç (îò 0 äî 10), äëÿ êàæ­äîãî åå çíà÷åíèÿ ïåðåìåííàÿ k èçìåíÿåòñÿ 21 ðàç, à äëÿ êàæäîãî çíà÷åíèÿ k ïåðåìåííàÿ t èçìåíÿåòñÿ 201 ðàç. Òàêèì îáðà­çîì, óñëîâèå áóäåò ïðîâåðÿòüñÿ 11*21*201 ðàç. Íî åñëè èçâåñòíî êî­ëè÷åñòâî áûêîâ è êîðîâ, òî êîëè÷åñòâî òåëÿò ìîæíî âû÷èñëèòü ïî ôîðìóëå t=100-(b+k) - è öèêë по ïåðåìåííîé t можно èñêëþ÷ить.

Program Ex63_1;

Var b,k,t: Integer;

Begin

For b:=0 To 10 Do

For k:=0 To 20 Do

Begin

t:=100-(b+k);

If (20*b+10*k+t=200) Then Writeln('áûêîâ-',b,'êîðîâ-',k,'òåëÿò-',t);

End;

Readln

End.

Ïðè ýòîì ðåøåíèè óñëîâèå ïðîâåðÿåòñÿ 11*21 ðàç.

Ìîæíî ëè åùå óìåíüøèòü êîëè÷åñòâî ïðîâåðîê?

Да, если заметить, что с покупкой каждой головы скота, уменьшается сумма оставшихся денег. Тогда программа будет выглядеть так:

Program Ex63_2;

Var b,k,t,n: Integer;

Begin

For b:=0 To 10 Do

Begin

N:= (100 - b*10) div 5;

For k:=0 To n Do

Begin

t:=100-(b+k);

If (20*b+10*k+t=200) Then Writeln('áûêîâ-',b,'êîðîâ-',k,'òåëÿò-',t);

End;

End;

Readln

End.

Пример 64. Найти сумму цифр всех чётных натуральных чисел на заданном промежутке от A до В.

Решение. Просматриваем все чётные числа промежутка и находим сумму их цифр. Исходные данные — А и В, начало и конец промежутка. S — результат работы программы.

Блок-схема и программа приведены на рисунке 35.

Если после запуска программы ввести значения А и В равные 100 и 120 соответственно, то на экране появится сообщение:

S=58

А если ввести значения 21 и 221, то на экране появится сообщение:

S=886.

Вопросы и задания.

1. Что называется циклом? Приведите пример.

2. Какой алгоритм называется циклическим? Приведите примеры.




Program Ex43;

Var a,b,k,s: Integer;

Begin

repeat

Writeln(‘введите границы промежутка ‘);

Readln(a,b);

until a
if odd(a) then inc(a); {если начальная граница –нечётное, то увеличить на 1}

s:=0; {начальная сумма равна 0}

repeat

k:=a; {в переменной k запоминаем очередное число из промежутка}

While k>0 do {Находим сумму цифр числа}

begin

s:=s+k mod 10;

k:=k div 10;

end;

inc(a,2); {следующее чётное число}

until a>b; {проверка окончания промежутка}

writeln(‘s=’,s); {вывод результата}

end.


3. Какие виды циклов Вы знаете? Почему они имеют такие названия?

4. В теле какого цикла не нужно ставить операторные скобки, даже если выполняется составной оператор?

5. Каким должно быть условие, чтобы тело цикла while ни разу не выполнилось? Почему?

6. Каким должно быть условие, чтобы тело цикла repeat выполнилось один раз? Почему?

7. Каким должно быть условие, чтобы тело цикла for ни разу не выполнилось? Почему?

8. Чему равен шаг изменения параметра цикла в операторе for?

9. Укажите отличительные особенности каждой из конструкций циклов.

10. Будет ли выполняться циклическая часть программы, если логическое выражение в конструкции REPEAT истинно с самого начала?

11. Какие условия предъявляются к переменной цикла?

12. Какого типа должна быть переменная цикла?

13. Может ли переменная цикла использоваться в вычислениях?

14. Что называется шагом? Что означает выражение “шаг равен пяти”?

15. Что происходит на каждом шаге выполнения тела цикла при выполнении оператора Summa:=Summa+Chislo?

22. Что обозначает слово downto в операторе цикла for?

23. Найдите количество точек с целочисленными координатами попадающих в круг радиуса R.

24. Составить программу, которая распечатывает на экране таблицу умножения.

25. Найдите все трёхзначные числа, равные сумме кубов своих цифр. Учтите, что abc=100a+10b+c

26. Составить программу вывода всех трёхзначных чисел, сумма цифр которых равна данному целому числу. Программа должна печатать именно числа, а не набор цифр.

27. Имитировать на экране работу электронных часов.

28. Задано n троек чисел a, b, c. Определить, сколько из предложенных троек можно использовать для построения треугольника, если a, b, c - длины его сторон. (Известно, что треугольник существует, если ни какая из его сторон не больше суммы двух других).

29. Укажите все целые числа, которые увеличатся на 20%, если их цифры записать в обратном порядке.

30. Составить программу, в которой среди двухзначных чисел печатаются те числа, которые равны сумме своих цифр.

31. В бригаде, работающей на уборке сена, имеется N косилок. Первая из них работала m ч., а каждай следующая на 10 мин. больше, чем предыдущая. Сколько часов проработала вся бригада?

32. В компьютер вводятся по очереди данные о росте N учащихся класса. Определить средний рост учащихся класса.

33. Каждая бактерия делится на две в течение одной минуты. В начальный момент имеется одна бактерия. Составьте программу, которая рассчитает количество бактерий на заданное Вами целое значение момента времени.

34. Дана последовательность из N целых чисел. Определить произведение максимального и минимального элементов этой последовательности.

35. Для двух последовательностей из N и M элементов соответственно найти произведение максимального элемента первой последовательности и минимального элемента второй последовательности.


Для любознательных

Написать программу определения количества шестизначных "счастливых" трамвайных билетов, у которых сумма первых трех цифр совпадает с суммой трех последних. Оптимизировать решение по времени выполнения. Количество билетов вывести в файл output.txt