Операторы организации цикла

Цель: дать понятие о циклах вообще, цикле с предусловием, блок-схеме, изображающих такой цикл. Учить на частных примерах составлять блок-схемы и программы с циклами; дать понятие о метках о операторе безусловного перехода goto; вводить и выполнять программы, используя компиляторы BPW или Turbo Pascal.

1. Что такое цикл?

 

Давайте отвлечемся на некоторое время от программирования и попытаемся на природных явлениях, примерах из повседневной жизни человека, а затем и его мыслительной деятельности дать понятие цикла.
Если вас спросят, что такое цикл, то, наверное, вы не задумываясь ответите, что это повторяемость чего-то.
И это совершенно правильно!
Повторяемость времен года в природе - это цикл, кругооборот воды в природе - это цикл, смена дня и ночи - это цикл и многие другие процессы в природе повторяются, образуя циклы или, что чаще нами употребляется, цикличность.
Циклы в математике - явление очень часто встречающееся.
Например, пока натуральные числа меньше 10, тогда надо суммировать их.
Другими словами, мы находим сумму чисел от 1 до 10.
В этом примере повторяется сложение натуральных чисел, пока выполняется условие (числа меньше 10).
Такие циклы называются циклами с предыдущим условием или, коротко, с предусловием, потому что условие записывается перед выполнением повторяющейся группы операторов.

Цикл в программировании - это многократно выполняемая группа команд, часть программы.

Сразу заметим, что в программе может быть такая ситуация, когда цикл вообще не выполняться ни разу.
На языке Паскаль возможны циклы с предусловием, которые организуются с помощью оператора:
while (пока) ... do (выполнять) ...

Формат оператора: while <условие> do <операция>.
Работа оператора заключается в том, что операция выполняется до тех пор, пока будет выполняться условие, указанное в операторе while.
Если операция содержит не один оператор, а несколько, то их объединяют с помощью ОПЕРАТОРНЫХ СКОБОК begin и end, например; 

while <условие> do
begin
s1; s2; s3; ...
end;

В этом примере символами s1, s2, s3, ... обозначены операторы.
Действие цикла while ... do ... можно изобразить графически следующей схемой (см. рис. 20):

Рис. 15

Рассмотрим работу оператора while ... do ... на примере.

Пример 1. Определить и вывести на экран цифры целого числа n.

Разберем математику этого вопроса на частном примере.

Найдем цифры числа 4538. Для этого надо найти остаток от деления 4538 на 10 с помощью операции нахождения остатка от деления целых чисел (mod):
4538 mod 10 = 8, получим последнюю цифру числа (она же является первой справа).
Выдаем сообщение: "1 - я цифра справа равна 8".
После этого выполним целочисленное деление заданного числа 4538 на 10, получим 453 (остаток отбрасывается):
4538 div 10 = 453.
Далее процесс повторяем:
2 - й раз;          453 mod 10 = 3
2 - я цифра справа равна 3,
453 div 10 = 45,
3 - й раз;           45 mod 10 = 5,
3 - я цифра справа равна 5,
45 div 10 = 4,
4 - й раз;           4 mod 10 = 4,
4 - я цифра справа равна 4,
4 div 10 = 0.


Обратите внимание! Процесс будет продолжаться пока число n не равно нулю. Как только оно станет равно нулю цикл заканчивается.

В программе еще надо указывать какая по счету цифра в числе справа. Для этого надо завести еще одну переменную в качестве счетчика. Эта переменная каждый цикл должна увеличиваться на 1.


Блок-схема


Рис. 16

Программа

Program Problem1; {Опред. и вывод на экран цифр числа.}
uses WinCrt;
var
n, p, i : integer;
begin
write("Введите натуральное число n <= 32767 "); readln(n);
i := 1;
while n <> 0 do
begin
p := n mod 10;
writeln(i, " - я цифра справа равна ", p);
n := n div 10;
i := i + 1
end
end.

Построение программы и ее работа.

В разделе описаний
Переменная n для целого числа, p - для цифр числа, i - счетчик цифр.
В разделе операторов
С помощью оператора write выводится на экран запрос для пользователя о вводе целого числа. Оператор readln заносит его значение в память и присваивает переменной n.
Счетчику i устанавливается первоначальное значение 1.
В операторе while записывается условие (пока n не равно 0), при котором цикл будет выполняться.
Так как в цикле несколько операторов, то используются операторные скобки
begin ... end.
В них записаны операторы:
p := n mod 10; - определяется последняя цифра;
writeln(i," - я цифра справа равна ", p); - выводится на экран порядковый номер цифры справа и сама эта цифра;
n := n div 10; - от числа "зачеркивается" последняя цифра;
i := i + 1; - счетчик увеличивается на 1.

Задание 1

 

1. Введите эту программу и выполните.


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

Пример 2. Составить программу перестановки первой и последней цифр введенного натурального числа.

Математику этого вопроса разберем на частном примере.
Пусть пользователем введено число 4538. После перестановки первой и последней цифр число станет таким: 8534.
Определить последнюю цифру числа нетрудно. Это можно сделать уже известным нам способом: 4538 mod 10.
Чтобы найти и отделить первую цифру числа, надо использовать прием, который применялся в предыдущих программах для вывода цифр числа и для подсчета суммы цифр, т. е. отделять по одной цифре справа. Но, если в предыдущих программах такой процесс продолжался до тех пор пока n <> 0 (n не равнялось нулю), а когда n становилось равным нулю, то цикл заканчивался т. е. все цифры, включая первую, отделялись, то теперь надо этот процесс остановить на одну цифру раньше и тогда последним значением переменной n будет первая цифра числа.
В нашем примере она равна 4.
Итак, первая и последняя цифры найдены. Как переставить их в числе.
Для введенного нами числа это можно сделать так. Вычесть из него первую цифру, умноженную на 1000 и вычесть последнюю цифру:
4538 - 4 1000 - 8 = 530.
К полученному результату прибавить последнюю цифру - 8, умноженную на 1000 и прибавить первую цифру: 530 + 8 1000 + 4 = 8534.
Две последние операции можно записать в одной строке:
4538 - 4 1000 - 8 + 8 1000 + 4 = 8534.
Возникает одна трудность. Как определить разряд, в котором находится первая цифра числа (первая слева) и на сколько надо умножить ее при вычитании? Тысячи ли это, десятки тысяч или другой разряд?
Для того, чтобы это выяснять заведем переменную, первоначальное значение которой 1, а затем, каждый раз при отделении цифры она умножается на 10.
Посмотрим весь процесс на примере того же числа 4538.
Первоначальные значения: n = 4538, i = 1.
Цикл продолжается пока n  10, 4538  10 - истина, значит операторы цикла выполняются первый раз: i := i*10 = 1*10 = 10; - переменная i получает первое значение,
n := 4538 div 10 = 453.
Проверка условия: 453  10 - условие выполняется, значит цикл выполняется второй раз: i := i*10 = 10*10 = 100; n := 453 div 10 = 45.
Проверка условия: 45  10 - истина, значит цикл выполняется третий раз:
i := i*10 = 100*10 = 1000, n := 45 div = 4.
Проверка условия: 4>=10 - ложь, значит операторы цикла не выполняются. Цикл заканчивается. Конечные значения переменных: n = 4 - первая цифра числа, i = 1000. Теперь остается выполнить сам процесс перестановки цифр и выдать результат на экран.

Блок-схема


Рис. 17

Программа

Program Problem2; { Перест. первой и последней цифр числа }
uses WinCrt;
var
n, n1, p, a, i : integer;
begin
write("Введите натуральное число n "); readln(n);
a := n; i := 1;
p := n mod 10; {последняя цифра введенного числа}
while n >= 10 do
begin
i := i*10;
n := n div 10;
end;
n1 := a - n*i - p + n + p*i;
writeln("Число после перестановки цифр ", n1);
end.

2. Целый тип longint

 

Турбо-Паскаль имеет возможности для расширения диапазона значений целых переменных.
Так, если тип integer устанавливает диапазон целых значений от -32768 до 32767, то целый тип longint расширяет его от -2147483648 до 2147483647.
Итак, если установить тип переменных longint, тогда выше приведенные программы будут работать для значительно большего множества целых чисел.

Программы станут такими:

Program Problem1; { Опред. и вывод на экран цифр числа }
uses WinCrt;
var
n, p, i : longint;
begin
write("Введите натуральное число n "); readln(n);
i := 1;
while n <> 0 do
begin
p := n mod 10;
writeln(i, " - я цифра справа равна ", p);
n := n div 10;
i := i+1
end
end.

Program Sum; { Сумма цифр числа }
uses WinCrt;
var
a, n, s, p : longint;
begin
write("Введите натуральное число n "); readln(n);
a := n; s := 0;
while n <> 0 do
begin
p := n mod 10; {Определяются цифры числа}
s := s + p; {Находится их сумма}
n := n div 10
end;
writeln("Сумма цифр числа ", a, " равна ", s)
end.


Program Problem2a; { Перест. первой и последней цифр числа }
uses WinCrt;
var
n, n1, p, a, i : longint;
begin
write("Введите натуральн. число n <= 2147483647 "); readln(n);
a := n;
i := 1;
p := n mod 10;   {последняя цифра введенного числа}
while n >= 10 do
begin
i := i*10;
n := n div 10;
end;
n1 := a - n*i - p + n + p*i;
writeln("Число после перестановки цифр ", n1);
end.

Подведем итог о целых типах.

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

Целые типы

Длина, байт

Название типа

Диапазон значений

1

byte

0 ... 255

1

shortint

-128 ... 127

2

word

0 ... 65535

2

integer

-32768 ... 32767

4

longint

-2147483648 ... 2147483647

При использовании процедур и функций с целочисленными па раметрами следует руководствоваться "вложенностью" типов, т.е. везде, где может использоваться WORD, допускается использование BYTE (но не наоборот), в LONGINT входит INTEGER, который, в свою очередь, включает в себя SHORTINT.

Целый тип данных относится к порядковым типам, которые отличаются тем, что каждый из них имеет конечное число возможных значений. Эти значения можно определенным образом упорядочить и, следовательно, с каждым из них можно сопоставить некоторое целое число - порядковый номер значения (отсюда название типов - порядковый).
Вещественные типы, строго говоря, тоже имеют конечное число значений, которое определяется форматом внутреннего представления вещественного числа. Однако количество возможных значений вещественных типов настолько велико, что сопоставить с каждым из них целое число (его номер) не представляется возможным.
Порядковый и вещественный типы, в свою очередь, относятся к простым типам.

Задание 2

 

1. Выполните эту программу на компьютерах.


2. Составить блок-схему и написать программу переработки данного целого числа  в целое число, записанное теми же цифрами, но в обратном порядке.

3. Условия в программах с циклами

Рассмотрим два примера, в программах которых используются не только циклы, но и в циклах необходимо применение условного оператора
if ... then ... else ...


Пример 3. Составить программу разложения натурального числа n на простые множители.

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

Единица имеет только один делитель - само себя и поэтому она не может относится ни к простым, ни к составным числам. Если выписать простые числа в порядке их возрастания, начиная от самого меньшего - 2, то получим следующий ряд чисел:
2, 3, 5, 7, 11, 13, 17, 19, 23, 29, ...
А теперь вспомним, как в младших классах мы раскладывали натуральные числа на простые множители.
Для этого берем первое простое число - 2 и пробуем делить данное натуральное число на 2, если число делится на 2, тогда надо 2 записать, а число разделить на 2 и снова полученный результат пробуем делить на два, если делится, тогда повторяем процесс деления, если не делится, тогда пробовать делить на следующее простое число - 3 и так далее.
Обычно такой процесс мы записывали "столбиком":
Например:                      или

Таким образом, число 360 можно разложить на следующие простые множители: 360 = 2 2 2 3 3 5.
Самый простой алгоритм для составления программы может быть таким.
Алгоритм

В качестве первого делителя взять 2, присвоить это значение некоторой переменной i;
начать цикл "пока i <= n";
если данное число n делится на i, тогда выдать на экран значение i и разделив данное число на i, присвоить новое значение той же переменной n (n := n div i);
далее цикл продолжить, но значение i не увеличивать на 1, а проверить деление нового значения n на прежнее значение i;
если n не делится на i, тогда i увеличить на 1 (i := i + 1) и продолжить цикл, т.е. выполнить проверку условия цикла (i <= n), а затем снова проверить деление n на уже новое значение i.


Обратите внимание, что при таком алгоритме в качестве делителей уже не попадут составные числа. Объясните почему?

Блок-схема

Рис. 18


Программа

Program Problem3; { Разлож. числа на прост. множит.. 1- й спос. }
uses WinCrt;
var
n, i : integer;
begin
write("Введите натуральное число "); readln(n);
write("Простые делители числа ", n, " следующие; ");
i := 2;
while i <= n do
if n mod i =0
then
begin
write(i, " ");
n := n div i
end
else i := i + 1
end.

Конечно, эта программа далека от совершенства и не может иметь претензии на оригинальность.
Она заставляет компьютер выполнять много лишних проверок на деление.
Вот более совершенный алгоритм.
Он основывается на следующих соображениях.
Вначале находим все делители, равные 2. Для этого последовательно делим число 360 на 2:

После этого, полученный результат делим на нечетные числа. Причем на каждое нечетное число делим не один раз, а до тех пор, пока такое деление будет возможным.
Делим на 3: 45:3 = 15, 15:3 = 5.
Делим на 5: 5:5 = 1.
Делим на 7, не делится, пробуем делить на следующее нечетное число.
Делим на 9, не делится, переходим к следующему нечетному числу.
Делим на 11, не делится, и так далее.
До тех пор будем пробовать деление на нечетные числа, пока они будут меньше или равны получаемому частному от деления числа на соответствующий делитель.

На основании этих соображений составляем программу.
Program Problem3a;
uses WinCrt;
var
i, n : integer;
begin
write("Введите целое число "); readln(n); writeln;
writeln("Простые делители целого числа ", n);
{----------------------------------------------------------------------------------------}
while n mod 2 = 0 do { Цикл для вывода делителей, равных 2 }
               begin
write(2, " ");
n := n div 2
end;
{----------------------------------------------------------------------------------------}
i := 3;
while i <= n do      { Цикл для нечетных делителей }
if n mod i = 0
then
begin        
write(i, " ");
n := n div i
end
else i := i + 2;
writeln
end.

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

Пример 4. Написать программу, в результате выполнения которой выяснится, входит ли цифра 2 в запись данного целого числа n.

Идея составления программы проста. Надо организовать цикл, в котором выделять цифры числа уже известным вам способом и каждую из них сравнивать с цифрой 2. Если цифра числа оказывается равной двум, тогда надо счетчик, которым может быть некоторая числовая переменная, увеличивать на единицу, иначе, цикл надо продолжать.
Когда цикл будет выполнен полностью, т. е. все цифры числа проверены и каждая из них будет сравнена с цифрой 2, надо снова использовать условный оператор и сравнить значение переменной - счетчика с нулем. Если значение переменной равно нулю, то это значит, что цифра 2 не входит в запись числа, иначе - входит.

Алгоритм

1. Начало. Переменные целого типа n, p, k: n - для вводимого числа; p - для цифр этого числа; k - счетчик, подсчитывающий количество цифр в числе, равных 2.
2. Ввод целого числа.
Счетчику k устанавливается первоначальное значение 0.
3. Цикл, пока n <> 0. В цикле, переменной p присваивать значение цифры числа.
Если p = 2, тогда увеличивать k на единицу.
Вычесть из числа n последнюю цифру и разделить его на 10.
Продолжить и закончить цикл.
4. Если k = 0, тогда выдать сообщение: "Цифра 2 не входит в запись числа", иначе, выдать сообщение: "Цифра 2 входит в запись числа".
5. Конец.


Блок-схема

Рис. 19

Программа
Program Problem4; { Входит ли цифра 2 в запись числа }
uses WinCrt;
var
          n, p, k : integer;
begin
write("Введите целое число "); readln(n);
k := 0;
while n <> 0 do
begin
p := n mod 10;
if p = 2 then k := k + 1;
n := n div 10
end;     
if k = 0 then writeln("Цифра 2 не входит в запись этого числа")
else writeln("Цифра 2 входит в запись этого числа")
end.
Если вы внимательно разобрались в работе программы, то могли заметить, что во многих случаях в программе будет проделываться бесполезная работа.
Например, если нами введено число 31572. В программе сделано так, что отделяется по одной цифре справа и так продолжается до первой цифры слева.
Первой цифрой справа является 2. Казалось бы, раз в числе сразу первой цифрой найдена двойка, то можно выдать сообщение, что число содержит цифру 2 и на этом работу закончить. Однако в программе сделано не так. Цикл будет продолжаться до последней цифры числа и большая работа будет проделываться бесполезно.
Возникает необходимость в досрочном прерывании цикла. Как это сделать мы рассмотрим ниже.

4. Досрочное прерывание цикла. Метка. Оператор безусловного перехода goto

 

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

Оператор перехода указывает, что дальше программа должна выполняться, начиная с оператора, помеченного меткой, которая записана в этом операторе перехода.
Оператор перехода имеет вид: goto <метка>. Здесь goto - зарезервированное слово (перейти на ... [метку]).

Метка в Турбо Паскале - это произвольный идентификатор, позволяющий именовать (помечать) некоторый оператор программы и таким образом ссылаться на него. Допускается в качестве меток (в том числе) использовать целые числа без знака (это сделано с целью совместимости Турбо Паскаля со стандартным языком Паскаль).
Например:
goto 2341, goto 23, goto 1, goto bl1, goto mnk3, goto n56.
Любая метка должна быть описана в разделе описания меток, который обычно располагается в программе до начала раздела операторов:
label <список меток>.
Например: label 2341; label 1, 2; label bl1, 18, mnk.
В программе метка записывается перед оператором, на который осуществляется переход. Метка отделяется от оператора двоеточием. Между меткой и оператором можно включать один или несколько пробелов, например:
1: writeln("Число не содержит цифру 2");
Оператор можно помечать несколькими метками, которые в этом случае отделяются друг от друга двоеточием.
1: 25: a := b div 10;
Теперь составим программу решения предыдущей задачи с использованием меток и оператора перехода.


Блок-схема



Рис. 20

Программа

Program Problem4a; { Входит ли цифра 2 в запись числа }
uses WinCrt;
label 1, 2;
var
n, p : integer;
begin
write("Введите целое число "); readln(n);
while n <> 0 do
begin
p := n mod 10;
if p = 2 then goto 1 else n := n div 10
end;
writeln("Цифра 2 не входит в запись этого числа");
goto 2;
1: writeln("Цифра 2 входит в запись этого числа");
2: end.

Внимательно разберитесь в ее работе. Постарайтесь ответить на следующие вопросы.
1) Зачем в программе две метки? Для чего служит каждая из них?
2) Почему в программу введен второй оператор перехода goto 2?


3) Как будет выполняться программа, если этот оператор исключить из нее?

Замечания

 

1. Оператор goto вносит фактическое безумие в составление программы. Посудите сами, какой человек может идти, идти, а затем без всякой причины повернуться и пойти обратно! У нормального человека всегда должна быть причина, условие такого поступка.
Оператор goto может заставить даже без всякой причины, условия нарушить естественный ход выполнения программы и перевести работу на помеченную строку.

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

Из-за этого программа становится менее понятной и труднее определяется ее правильность. Часто это становится гордиевым узлом, о котором программисты могут сказать: "Но все-таки программа работает". Почему и как работает программа, однако, остается секретом из-за оператора goto.
2. Частое использование операторов перехода указывает, что программист еще не научился программировать "структурно", т. е. использовать последовательные, разветвляющиеся и циклические структуры управления.
Оператор перехода рекомендуется использовать только в исключительных случаях. Такой случай может быть, когда цикл прерывается при удовлетворении определенного условия. Именно такой случай есть в нашей программе.
3. Переход внутрь сложного оператора не определен. Ошибок такого рода транслятор может и не обнаружить.

1) if p then goto 3;
.....................
if q then 3: s;
2) while i<= 10 do
 begin
s1;
3: s2;
end;
.............
goto 3;

4. Метка в Турбо Паскале - это произвольный идентификатор (может быть обозначен и буквами), позволяющий именовать некоторый оператор программы и таким образом ссылаться на него.


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

Само собой возникает вопрос, можно ли программу примера 4 составить без оператора перехода goto?
Оказывается это возможно, о чем вы узнаете в следующих занятиях.

Задание 3

1. Введите и выполните две предыдущие программы. Измените их так, чтобы они выполнялись для целых чисел больших 32767.
2. Найти все трехзначные числа, сумма цифр которых равна данному натуральному числу. (Программа с циклом и условием.) Составьте блок-схему и программу.


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

5. Циклы в циклах

 

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


Пример 5. Составить программу вывода всех натуральных чисел, меньших n, квадрат суммы цифр которых равен заданному числу m.

Сущность задачи такова. Вводится натуральное число, до которого надо выводить все натуральные числа, удовлетворяющие заданному условию. Пусть, например, пользователь введет число - 21.
Второе число, которое надо ввести пользователю - это число, которому равен квадрат суммы цифр натуральных чисел.
Понятно, что это число должно быть точным квадратом, оно может быть: 4, 9, 16, 25, 36 и т.д.
Допустим, что пользователь ввел число 4.
Надо найти все натуральные числа от 1 до 21, квадрат суммы цифр которых равна 4. Начинаем из чисел: 1, 2, 3, 4, 5, ..., 21, выбирать те, которые удовлетворяют заданному условию.
Первое из них - 2, так как 22 = 4, второе - 11, так как (1 + 1)2 = 22 = 4, третье - 20, так как (2 + 0)2 = 22 = 4.
Других натуральных чисел до 21, удовлетворяющих такому условию нет.
Все отобранные числа надо вывести на экран, т. е. 2, 11 и 20.

Алгоритм
1. Раздел описаний.
Переменные: n, m, k, a, p, s. Тип целый.
n - для границы значений натуральных чисел, m - для числа, с которым сравнивается квадрат суммы цифр (точный квадрат), k - для натуральных чисел от 1 до n, a - для запоминания натурального числа, перед тем, как будет определяться сумма его цифр, p - для цифр числа, s - для суммы цифр.
2. Раздел операторов.
Ввод значений n и m. Установить первоначальное значение для k (эта переменная "перебирает" все натуральные числа от 1 до n, k := 1).
Цикл, пока k <= n.
В цикле: установить первоначальные значения для суммы s (s:=0); запомнить число в переменную a (a := k).
Цикл для подсчета суммы цифр, пока k <> 0.
В цикле: выделять по одной цифре числа, известным способом; прибавлять по одной цифре к сумме; уменьшать число на последнюю цифру и на порядок.
Закончить цикл для подсчета суммы цифр.
Проверка выполнения условия.
Если квадрат суммы цифр равен заданному числу,
тогда вывести это натуральное число на экран.
Перейти к проверке следующего числа.
Закончить основной цикл проверки чисел.
3. Закончить программу.

Блок-схема

Рис. 21
Программа

Program Problem5;
uses WinCrt;
var
n, m, k, a, p, s : integer;
begin
write("Введите натуральное число, до которого ");
write("выводить искомые числа "); readln(n);
writeln("Введите число, с которым сравниваете квадрат");
write("его суммы цифр. Оно должно быть точн. квадрат. "); readln(m);
write("Искомые числа: ");
k := 1;
while k <= n do
begin
s := 0; a := k;
while k <> 0 do
begin
p := k mod 10;
s := s + p;
k := k div 10
end;
if sqr(s) = m then write(a, " ");
k := a + 1
end
end.

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

Задание 4

 

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


Упражнения

 

  1. Найти все трехзначные числа, при делении каждого из которых на 11 получается частное, равное сумме квадратов значений отдельных цифр данного числа.
  2. Трехзначное десятичное число оканчивается цифрой 3. Если эту цифру переместить через два знака влево, т. е. с этой цифры будет начинаться запись нового числа, то это новое число будет на единицу больше утроенного исходного числа. Найдите это число.
  3. Найдите все трехзначные числа, которые равны сумме кубов своих цифр.
  4. Шестизначное десятичное число начинается слева цифрой 1. Если эту цифру перенести с первого места слева на последнее место справа, то значение образованного числа будет втрое больше исходного. Найдите исходное число.
  5. Дано целое число  Написать программу получения m последних цифр десятичной записи числа n.
  6. Найти четырехзначное число, равное квадрату числа, выраженного двумя последними цифрами этого четырехзначного числа.
  7. Натуральное число называется совершенным, если оно равно сумме всех своих делителей, за исключением самого себя.
  8. Число 6 является совершенным, так как 6 = 1 + 2 + 3, число 8 не является совершенным, так как 8 не равно 1 + 2 + 4. Написать программу вывода всех совершенных чисел, меньших заданного числа n.
  9. Найти четырехзначные числа, каждое из которых делится на 11 и сумма цифр каждого равна 11.
  1. Найти четырехзначные числа, которые, будучи приписаны справа к числу 400, дают полный квадрат.

Автор: Тишин Владимир Иванович

Тема поэта и поэзии в творчестве Маяковского

XX век - это век колоссальных общественных противоречий и потрясений. Каждый век нуждается в собственном поэте, который сделал бы "боль времен своею собственной болью". Таким поэтом своего времени был Маяковский, с его мощной, властно вошедшей в наше сознание и литературу поэзией связано очень много. Он первый, используя свой необыкновенный ритм, соединил политику и лирику. ...

Задача 3

Задача 3 Два шахматиста сыграли две партии: первая партия продолжалась ч, а вторая - на ч больше. Сколько часов продолжалась игра? Выразите продолжительности игры в минутах. Решение и ответ Первая партия длилась ч, а вторая на ч больше. Значит, вторая партия длилась Чтобы узнать время всей игры, нужно сложить время первой партии и время второй партии 2: ч ...

К Луне!

В конце ноября 2004 г. в Северном Удайпуре (Индия) состоялась пятидневная Международная конференция по исследованию и использованию Луны. Более 200 делегатов представили на ней 16 стран! Мадхаван Наир, председатель Индийского управления по изучению космоса, сообщил научному сообществу, что в стране уже начата дискуссия о космической миссии с ручным управлением. Хотя ...

Hours - Часы

FIVE O"CLOCK = ПЯТЬ ЧАСОВ. FIVE O"CLOCK IN THE MORNING = ПЯТЬ ЧАСОВ УТРА. SIX O"CLOCK = ШЕСТЬ ЧАСОВ. SIX O"CLOCK IN THE EVENING = ШЕСТЬ ЧАСОВ ВЕЧЕРА. AT FIVE O"CLOCK = В ПЯТЬ ЧЯСОВ. AT FIVE O"CLOCK IN THE MORNING = В ПЯТЬ ЧАСОВ УТРА. AT SIX O"CLOCK = В ШЕСТЬ ЧЯСОВ. AT SIX O"CLOCK IN THE EVENING = В ШЕСТЬ ЧАСОВ ВЕЧЕРА. AT FIVE 20 = В 5. 20 . AT FIVE 23 IN THE MORNING = В 5. 23 УТРА. AT SIX 30 = В 6. 30. AT SIX 27 IN THE EVENING = В ШЕСТЬ 27 ВЕЧЕРА ...