Оператор for to do — цикл со счётчиком
В сегодняшней статье разберем самый популярный вид цикла в языках программирования. Это цикл с параметром. У него есть и другие названия: цикл-для, цикл со счетчиком (оператор for to do, оператор цикла с параметром).
Особенность данного цикла заключается в том, что использовать его нужно когда заранее известно количество повторений команд.
Посмотрите на рисунок ниже. Там представлена блок схема for (блок-схема цикла с параметром) и его запись на языке программирования Паскаль.
Параметр это целая величина, которая обозначается любой латинской буквой. Чаще всего используют символ — i. Начальные и конечные значения параметра тоже целые числа. Счетчик цикла может работать в двух направлениях: увеличение или уменьшение значения параметра.
Как работает цикл с параметром ?
Разберемся, как работает for в паскале. Выполнение начинается с получения переменной i начального значения а. Затем проверяется это значение с конечным значением n. Выполнение операторов цикла происходит в случае, когда i меньше или равно n (при положительном шаге счетчика) или i больше или равно n (при отрицательном шаге счетчика).
Задание 1. Напишите программу, которая выводит на экран 10 строк следующего содержания: «**++==++**»
Решение:
program for1; { название программы } var i:integer; { описание переменных } begin { начало программы } for i:=1 to 10 do { цикл выполняется 10 раз } writeln('**++==++**'); {вывод строки символов экран } end. { конец программы }
Задание 2. Напишите программу, которая выводит значения функции y=kx+b на интервале [2,8] с шагом 1.
Решение:
program for2; { название программы } var x,a,n:integer; { x- параметр цикла, a,n - интервал} k,b:real; { коэффициенты функции} begin { начало программы } write('Введите значение k = ');readln(k); write('Введите значение b = ');readln(b); write('Введите значение начала интервала = ');readln(a); write('Введите значение конца интервала = ');readln(n); for x:=a to n do { цикл с параметром } writeln('x=',x,' y=',k*x+b); {вывод значений аргумента и функции } end. { конец программы }
В результате выполнения программы получим следующий вывод на экране
Задание 3. Найти сумму n первых элементов ряда чисел с точностью (е:=10**-6).
- 1 ряд: 1/1*2 + 1/2*4 +1/3*6…
- 2 ряд: 1/1*2*3 + 1/2*3*4 + 1/3*4*5….
- 3 ряд: 1/1*3 + 1/2*4 +1/3*5…
Решение:
var s:real; i, n:integer; begin writeln('Введите количество элементов в ряду ');read(n); for i:=1 to n do s:=s+1/(i*i*2); write('Сумма ряда = ',s:1:6); end.
Для второго ряда формула будет s:=s+1/(i*(i+1)*(i+2)); для третьего — s:=s+1/(i*(i+2));
Задание for12 (электронный задачник). Дано целое число N (>0). Найти произведение 1.1 · 1.2 · 1.3 · . . .(N сомножителей).
Решение:
uses PT4; var i,n:integer; p:real; begin Task('For12'); read(n); p:=1; {первоначальное произведение не должно быть нулевым} for i:=1 to n do p:=p*(1+i*0.1); { вычисление сомножителей} write(p); end.
Задание for13 (электронный задачник). Дано целое число N (>0). Найти значение выражения 1.1 + 1.2 — 1.3 + . . .(N слагаемых, знаки чередуются). Условный оператор не использовать.
Решение:
uses PT4; var i,n,k:integer; s:real; begin Task('For13'); read(n); k:=1; {k - переменная, определяющая знак слагаемого} for i:=1 to n do begin s:=s+(1+i*0.1)*k; {вычисление суммы} k:=k*(-1); {чередование знака слагаемого} end; write(s); end.
Вот так используется оператор цикла с параметром при решении задач.
Дополнительные задания:
iffor1 Составьте программу для проверки знаний таблицы умножения. Программа должна задать 5 вопросов на операцию умножения. Числа задаются случайным образом. Программа ведет подсчёт правильных ответов и в конце ставит оценку в соответствии с набранным количеством баллов.
iffor2 Составьте программу, которая выводит на экран все двузначные числа сумма цифр в которых равна заданному числу N. (N<19)
iffor3 Напишите программу определения количества трехзначных натуральных чисел, сумма цифр которых равна заданному числу N. Выведите эти числа на экран. Если таких чисел нет, то выведите сообщение об этом.
Если у вас возникли трудности с пониманием решения, приведенных здесь задач, спрашивайте в комментариях.
Рекомендуем ознакомиться с темой Текстовые файлы в Pascal
Здравствуйте, дорогие читатели! Вот мы с вами и подошли к изучению циклов. Циклы в Паскаль. Что это такое? Как этим пользоваться? Для чего они нужны? Именно на эти вопросы я сегодня и отвечу.
Если вы читали этот урок, то знаете, что существует три вида алгоритмов: линейный, разветвляющийся и циклический. Мы с вами уже знаем, как реализовывать линейные и разветвляющиеся алгоритмы на Паскале. Приступим к изучению последнего типа алгоритмов.
В языке Pascal, как и в большинстве языков программирования, существует три типа циклических конструкций.
Любой цикл состоит из тела и заголовка. Тело цикла — это набор повторяющихся операторов, а условие — это логическое выражение, в зависимости от результата которого и происходит повторное выполнение цикла.
Возьмем одну задачу, которую будем решать, используя различные виды циклов.
Задача 1. Вывести все числа от 1 до числа, введенного с клавиатуры.
Как вы, наверное, уже поняли из названия, while — это цикл, в котором условие стоит перед телом. Причем тело цикла выполняется тогда и только тогда, когда условие true; как только условие становится false, выполнение цикла прекращается.
While имеет формат:
while < условие> do <оператор 1>; {Пока … делай ….}
Данный цикл подходит только для одного оператора, если же вы хотите использовать несколько операторов в своем коде, вам следует заключить их в операторные скобки — begin и end;.
Решение задачи.
program example_while; var i, N: integer; { объявляем переменные } begin i := 1; { Присваиваем i значение 1 } readln(N); { Считываем последнее число } while i <= N do {Как только i станет больше N, цикл прекратится (можно было бы написать просто <, но пришлось бы добавлять 1 к N) } begin {Открываем операторные скобки} write(i, ' '); {Выводим i} Inc(i); {увеличиваем i на один.} end; { закрываем скобки } end.
Repeat, или цикл с постусловием
Repeat — полная противоположность while. Repeat — это цикл, в котором условие стоит после тела. Причем оно выполняется тогда и только тогда, когда результат условия false; как только логическое выражение становится true, выполнение цикла прекращается.
Repeat имеет формат:
repeat { повторяй … }
<оператор 1>;
< оператор 2>;
…
until {до…} <условие>
Begin и end не требуются.
Решение задачи.
program example_repeat; var i, N: integer;{ объявляем переменные } begin i := 1; { Присваиваем i значение 1 } readln(N); { Считываем последнее число } repeat {после repeat не требуется begin и end } write(i, ' '); {Выводим i} Inc(i); {увеличиваем i на один.} until i = N + 1; {Например, i = 11, а N = 10. Цикл прекратится, так условие стало true.} end.
For, или цикл с параметром
For — это цикл, в котором тело выполняется заданное количество раз.
Существует две формы записи этого цикла:
Первая форма
for <счетчик1> := <значение1> to <конечное_значение> do <оператор1>;
После каждой итерации значение <счетчик1> будет увеличиваться на 1.
<значение1> — это начальное значение счетчика. Это может быть переменная или число.
<конечное_значение> : как только значение <счетчик1> станет больше <конечное_значение>, выполнение цикла прекратится.
Если требуется написать несколько операторов в теле цикла, используем begin и end.
И <счетчик1>, и <конечное_значение>, и <значение1> — переменные целого типа.
Чаще всего в качестве счетчика используется переменная i.
Вторая форма
for <счетчик2> := <значение2> downto <конечное_значение> do <оператор1>;
После каждой итерации значение <счетчик2> будет уменьшатся на 1.
<значение2> — это начальное значение счетчика.
<конечное_значение> : как только значение <счетчик2> станет меньше <конечное_значение>, выполнение цикла прекратится.
Два важных примечания:
- Цикл повторяется, пока значение значение счетчика лежит в отрезке [значение ; конечное_значение].
- Изменять значение счетчика внутри тела нельзя! Вот что выводит компилятор:
Решение задачи:
program example_for; var i, N: integer; begin read(N); {предположим, что мы ввели 10} for i := 1 to N do write(i, ' '); {количество итераций - 10 - 1 + 1 = 10} end.
Согласитесь, данный код проще и лаконичнее, чем все предыдущие. И цикл for — не совсем обычный цикл, в нем нет логического условия. Поэтому цикл с параметром в программировании называют синтаксическим сахаром. Синтаксический сахар — это дополнения синтаксиса языка программирования, которые не добавляют новых возможностей, а делают использование языка более удобным для человека.
Давайте решим пару задач.
For1. Даны целые числа K и N (N > 0). Вывести N раз число K.
Организовываем простой цикл от 1 до требуемого числа.
program for1; var K, N, i: integer; begin read(K, N); for i := 1 to N do write(K, ' '); {Пишем К через пробел } end.
For2. Даны два целых числа A и B (A < B). Вывести в порядке возрастания все целые числа, расположенные между A и B (включая сами числа A и B), а также количество N этих чисел.
Так как A < B, то цикл должен будет выводить все числа от А до B. Чтобы сосчитать количество чисел, используем формулу: <конечное_значение> — <начальное_значение> + 1.
program for2; var A, B, i, count: integer; begin read(A, B); for i := A to B do write(i, ' '); {выписываем числа от меньшего к большему} count := B - A + 1; {считаем количество чисел} writeln; write( 'Количество чисел - ', count); end.
For9. Даны два целых числа A и B (A < B). Найти сумму квадратов всех целых чисел от A до B включительно.
Организовываем такой же цикл, как и в предыдущей задаче, но одновременно суммируем квадраты всех чисел. Чтобы высчитать квадрат, используем функцию Sqr.
program for9; var A, B, i, S: integer; begin read(A, B); S := 0; {PascalABC делает это автоматически, но если у вас другой компилятор советуем обнулять переменные вручную} for i := A to B do S := S + Sqr(i); {складываем все квадраты} writeln; write( 'Сумма квадратов - ', S); end.
For13°. Дано целое число N (> 0). Найти значение выражения 1.1 – 1.2 + 1.3 – … (N слагаемых, знаки чередуются). Условный оператор не использовать.
Для того, чтобы поменять знак, каждую итерацию цикла меняем значение специальной переменной на противоположное.
program for13; var N, A, i: integer; S: real; begin Write('N = '); readln(N); S := 1.1; A := 1; {Сначала положительное} for i := 2 to N do {первую итерацию цикла мы уже произвели, поэтому начинаем отсчет с 2} begin A := -A; {Теперь отрицательное} S := S + A * (1 + i / 10); {Складываем} end; Writeln(S:5:1); {Отдадим под дробную часть одно знакоместо} end.
While1°. Даны положительные числа A и B (A > B). На отрезке длины A размещено максимально возможное количество отрезков длины B (без наложений). Не используя операции умножения и деления, найти длину незанятой части отрезка A.
Каждый раз вычитаем B из А, пока А — В >= 0.
program while1; var A, B: integer; begin readln(A, B); while (A - B) >= 0 do A := A - B; {Пока разница положительная, вычитаем. Необходимо предусмотреть вариант с кратностью А и B, поэтому >=} write(A); end.
While4°. Дано целое число N (> 0). Если оно является степенью числа 3, то вывести True, если не является — вывести False.
Действуем следующим образом: пока N делится нацело на три, делим N нацело. Затем, если N = 1 — число является степенью тройки; если N <> 1, тогда число — не степень тройки. Для того чтобы решить эту задачу, требуется знать, что такое div и mod, и как работают логические выражения.
program while4; var N: integer; begin readln(N); while N mod 3 = 0 do N := N div 3; {Пока остаток от деления на три равен нулю, делим N нацело } writeln(N = 1); {логическое выражение} end.
На сегодня все! Не забывайте почаще заходить на наш сайт и кликать по кнопочкам, которые расположены перед комментариями.
Циклы с параметрами
Цель: дать понятие о циклах с параметром, блок-схемах, изображающих такие циклы. Учить на частных примерах составлять блок-схемы и программы с циклами; дать понятие о различиях между циклами с предусловием, постусловием и циклом с параметром; учить в одной программе использовать разные циклы, если программа содержит несколько циклов; вводить и выполнять программы, используя компиляторы BPW или Turbo Pascal.
1. Оператор цикла for … to … do …
Иногда заранее известно, сколько раз должен выполняться цикл. Для задач такого типа в языке Паскаль имеются операторы циклов с параметрами.
Формат записи таких операторов следующий:
for <пар.цикла> := <нач.знач> to <кон.знач.> do <оператор>.
Здесь for, to, do — зарезервированные слова (для, до, выполнить);
<пар. цикла> — параметр цикла — переменная типа integer (точнее, любого порядкового типа);
<нач. знач.> — начальное значение — число или выражение того же типа;
<кон. знач.> — конечное значение — число или выражение того же типа;
<оператор> — произвольный оператор Паскаля.
Если операторов несколько, тогда, как и в операторе while … do …, используются операторные скобки: begin … end.
Например, возможны такие записи оператора цикла:
for i := a to b do s1;
for j := a to b do begin s1; s2; …, sn end; или
for k := p to m do
begin
s1;
s2;
…
sn
end;
Здесь s1, s2, s3, … sn — операторы цикла.
При выполнении оператора for вначале вычисляется выражение <нач .знач.> и осуществляется присваивание его значения переменной цикла
<пар .цикла> := <нач. знач.>.
После этого циклически повторяются:
1) проверка условия <пар .цикла> <кон. знач.>; если условие не выполнено, оператор for завершает работу;
2) выполнение оператора <оператор> или операторов s1; s2; s3; … sn;
3) переменная цикла <пар. цикла> увеличивается на единицу.
Надо сразу заметить, что задать шаг цикла, отличный от 1 в этом операторе, нельзя.
Графическое изображение циклов for будет таким (см. рис. 33):
Рис. 33
Здесь: i — переменная цикла; n — ее начальное значение; k — ее конечное значение. Тело цикла составляет оператор или несколько операторов: s1; s2; … sn;, которые нарисованы в прямоугольнике.
Для иллюстрации работы оператора for рассмотрим пример уже ставший традиционным при изучении работы этого оператора.
Пример 1. Составить программу вычисления факториала числа n, т. е. n!.
Вспомним из математики, что факториал числа n равен произведению чисел от 1 до n.
Например:
Замечание. В математике принято: 0! = 1.
Блок-схема
Рис. 34
Программа
Program Problem1; { Вычисление факториала числа n! }
uses WinCrt;
var
n, f, i : longint;
begin
write(«Введите натуральное число «); readln(n);
f := 1;
if n <> 0 then for i := 1 to n do f := f*i;
writeln(«Факториал числа «, n, » равен «, f)
end.
Переменная n — для вводимого пользователем числа, факториал которого надо найти; f — переменная, в которой будет «накапливаться» значение факториала числа n; i — переменная цикла.
Устанавливается первоначальное значение переменной f := 1.
Далее начинается цикл. Переменной i присваивается начальное значение 1; оно сравнивается с конечным — n (1 <= n), если условие истинно, тогда выполняется оператор (в этой программе он один): f := f*i, 1*1=1; значение переменной цикла увеличивается на 1, т. е. станет равным: i := i + 1, 1 + 1 = 2 и цикл повторяется.
Когда значение i станет равным n, тогда цикл выполнится последний раз, потому что следующее значение i будет n + 1, что больше конечного значения n, условие i <= n — ложно, цикл не выполняется.
2. Оператор цикла for…downto…do…
Существует другая форма оператора цикла for:
for <пар .цик.> := <нач. зн.> downto <кон. зн.> do <оператор>.
Замена зарезервированного слова to на downto означает, что шаг параметра цикла равен (-1).
Изменение значения параметра идет от большего значения к меньшему, т. е.
<нач. знач.> <кон. знач.>.
Программу вычисления факториала числа можно составить, используя этот оператор цикла.
Программа
Program Problem1a;
uses WinCrt;
var
n, i, f : longint;
begin
write(«Введите натуральное число «); readln(n);
f := 1;
if n <> 0 then for i := n downto 1 do f := f*i;
writeln(«Факториал числа «, n, » равен «, f)
end.
Задание 1
1. Выполните программу примера 1 на компьютерах.
2. Измените и дополните ее так, чтобы она вычисляла следующую сумму:
Разберем другие, на мой взгляд, более интересные примеры с использованием циклов for … to … do …, а также вложенных друг в друга циклов (циклов в циклах), совмещение циклов с параметром с другими циклами.
Пример 2. Квадрат любого натурального числа n равен сумме n первых нечетных чисел:
12 = 1
22 = 1 + 3
32 = 1 + 3 + 5
42 = 1 + 3 + 5 + 7
52 = 1 + 3 + 5 + 7 + 9
. . . . . . . . . . . . . . . . . . .
Основываясь на этом свойстве, составить программу, позволяющую напечатать квадраты натуральных чисел от 1 до n.
Ясно, что цикл в программе надо организовать от 1 до n, в котором выполнять всего три оператора: находить сумму нечетных чисел (а их как раз столько, сколько раз будет выполняться цикл); выдавать полученную сумму на экран; «получать» следующее нечетное число.
Блок-схема
Рис. 35
Программа
Program Problem2;
uses WinCrt;
var
i, n, s, k: integer;
begin
writeln(«Введите натуральное число, до которого надо»);
write(«выводить квадраты чисел «); readln(n);
writeln(«Квадраты чисел следующие:»);
s := 0; k := 1;
for i := 1 to n do
begin
s := s + k;
writeln(«Квадрат числа «, i, » равен «, s);
k := k + 2
end
end.
Задание 2
1. Измените программу так, чтобы она выдавала на экран не таблицу квадратов чисел от 1 до n, а квадрат только одного числа n, введенного пользователем.
2. Измените и дополните программу так, чтобы она выдавала значение квадрата числа и те нечетные числа, сумме которых он равен.
3. Продолжая тему возведения натуральных чисел в степень, без операций умножения, рассмотрим еще два интересных примера. В первом из них нам придется совмещать, «вкладывать» друг в друга два цикла for, а во втором, циклы for и repeat.
Пример 3. Куб любого натурального числа n равен сумме n нечетных чисел, следующих по порядку за числами, сумма которых составляла куб предыдущего числа n — 1:
13 = 1
23 = 3 + 5
33 = 7 + 9 + 11
43 = 13 + 15 + 17 + 19
. . . . . . . . . . . . . . . . . . . . . .
Основываясь на этом свойстве, создайте программу, позволяющую напечатать таблицу кубов натуральных чисел.
Вот здесь уже нужны два цикла. Один — внешний, по количеству нечетных чисел, которое равно возводимому в куб числу, например, для 43 этот цикл должен выполняться 4 раза. В этом же цикле надо будет после подсчета суммы выводить ее значение на экран вместе с числом, которое возводится в куб.
Второй — внутренний, который будет суммировать нечетные числа и «вырабатывать» нужные нечетные числа для суммирования.
Блок-схема
Рис. 36
Программа
Program Problem3; { Кубы натуральных чисел от 1 до n }
uses WinCrt;
var
i, j, n, s, k : longint;
begin
writeln(«Введите натуральное число, до которого надо»);
write(«выводить кубы чисел «); readln(n);
writeln(«Кубы чисел следующие:»);
k := 1;
for i := 1 to n do
begin
s := 0;
for j := 1 to i do
begin
s := s + k;
k := k + 2
end;
writeln(«Куб числа «, i, » равен «, s)
end
end.
Разберем работу этой программы
Переменные i и j нужны в качестве переменных первого — внешнего и второго — внутреннего циклов. Переменная k для нечетных чисел, а s для суммы чисел. Тип этих переменных установлен целый, но longint, так как могут быть достаточно большие целые числа, большие 32767.
Программа начинается с запроса для пользователя с помощью операторов writeln и write о вводе натурального числа, до которого надо выдавать таблицу кубов чисел. Затем с помощью оператора readln это значение вводится в память компьютера и присваивается переменной n.
Выводится надпись «Кубы чисел следующие«. Она дана перед началом циклов по понятным причинам. В циклах ее дать нельзя, — она будет повторяться несколько раз. По окончании циклов тоже, тогда она будет написана внизу, после вывода самих чисел. Переменной k присваивается первое нечетное значение 1.
Начинается внешний цикл по количеству чисел, от 1 до n. В цикле несколько операторов, поэтому «открываются» операторные скобки: — begin …
Перед началом внутреннего цикла обнуляется переменная s — сумма. Причем такое обнуление будет происходить каждый раз, когда повторяется внешний цикл, перед началом выполнения внутреннего цикла.
Внутренний цикл выполняется от 1 до i. Почему? В цикле вычисляется сумма и увеличивается нечетное k на 2, т. е. «вырабатывается» следующее нечетное число.
Заметьте! Переменной k не присваивается перед началом каждого внутреннего цикла 1. Почему?
Следующим оператором writeln внутри внешнего цикла выдается информация на экран. Почему он размещен во внешнем цикле?
Пример 4. Из математики известно, что всякая натуральная степень числа n есть сумма n последовательных нечетных натуральных чисел. Составьте программу, которая для любой степени натурального числа n находила бы последовательность нечетных чисел, сумме которых равна эта степень.
Например, для 53 она выдавала бы последовательность чисел: 21, 23, 25, 27, 29.
План составления программы
1. Определим цель составления программы: надо показать, что действительно любую натуральную степень натурального числа можно представить в виде суммы последовательных нечетных чисел.
А если это так, тогда нам совершенно необходимо знать значение степени числа n с показателем k.
Это можно сделать с помощью простого цикла:
s := 1;
for i := 1 to k do s := s*n;
Значение степени будут накапливаться в переменной s, для этого ей устанавливается первоначальное значение 1.
В цикле, значение переменной s последовательно, k раз умножается на основание степени n. После выполнения цикла переменная s получит значение степени числа n с показателем k.
2. Вся острота вопроса состоит в том, что неизвестно первое нечетное число, от которого надо начинать суммирование последовательных нечетных чисел.
Для этого надо пробовать складывать нечетные числа вначале от 1 и далее (известно их количество — n);
1 + 3 + 5 + 7 + 9 …,
а затем проверять полученный результат, сравнивая со значением степени s. Если равенство выполняется, тогда закончить цикл и вывести на экран полученные нечетные числа, если равенство не выполняется, тогда надо начинать суммирование со следующего нечетного числа — 3: 3 + 5 + 7 + 9 … и т.д.
Этот процесс легче организовать с помощью цикла repeat. Переменной j, которая будет задавать начальные нечетные числа надо установить перед началом цикла первоначальное значение 1.
Общий вид такого цикла:
j := 1;
repeat
. . . . . .
j := j + 2
until …= s;
3. Осталось продумать, как подсчитывать суммы последовательных нечетных чисел. Мы уже сталкивались с этим вопросом и знаем, что для этого надо создать цикл от 1 до n, в котором в одну из переменных, скажем m, накапливать эту сумму, а вторая переменная должна «вырабатывать» следующее нечетное число.
Этот цикл можно записать так:
p := j; m := 0;
for i := 1 to n do
begin
m := m + p;
p := p + 2
end;
Обратите внимание! Переменная p, каждый цикл repeat, (внешний по отношению к данному), будет получать новое начальное значение нечетного числа, а переменная m — для суммы должна обнуляться перед каждым новым суммированием для другой последовательности нечетных чисел.
4. Наконец, когда последовательность нечетных чисел найдена, ее надо вывести на экран. Для этого надо устроить еще один цикл от 1 до n, в котором выдавать значения этих нечетных чисел. За первое нечетное число из последовательности надо взять значение j, но так как оно уже увеличилось на 2, то из j следует вычесть 2. Этот цикл будет:
j := j — 2;
for i := 1 to n do
begin
write(j, » «);
j := j + 2
end
Блок-схема
Рис. 37
Программа
Program Problem4;
uses WinCrt;
var
n, i, k, j, m, s, p : longint;
begin
write(«Введите натуральное число — основание степени «); readln(n);
write(«Введите натуральное число — показатель степени «); readln(k);
s := 1; j := 1;
for i := 1 to k do s := s*n;
repeat
p := j;
m := 0;
for i := 1 to n do
begin
m := m + p;
p := p + 2
end;
j := j + 2
until m=s;
write(«Степень с основанием «, n);
writeln(» и показателем «, k, » т. е. «, s);
writeln(«равна сумме следующих нечетных чисел»);
j := j — 2;
for i:=1 to n do
begin
write(j, » «);
j := j + 2
end
end.
Чтобы лучше понять ее работу, возьмите степень 25 и проверьте как будут последовательно выполняться операторы программы.
Задание 3
1. Выполните эту программу на компьютерах.
2. Составьте блок-схему и программу, которая выясняет, может ли произведение
а) трех; б) четырех последовательных натуральных чисел равняться некоторой степени некоторого натурального числа (квадрату, кубу, и т. д.)?
4. Разные задачи
Пример 5. Напечатать все четырехзначные числа, в десятичной записи которых нет двух одинаковых цифр.
Замечание. Перед началом составление блок-схемы этой задачи следует знать, как изображаются циклы в циклах, для циклов с параметрами. Общая конструкция двух вложенных циклов с параметрами будет такой:
Рис. 38
Сразу возникает мысль составить программу по следующей схеме:
организовать цикл по числу тысяч, t от 1 до 9, а затем внутренние циклы: по числу сотен, s от 0 до 9; по числу десятков, d от 0 до 9; по числу единиц, e от 0 до 9; проверка условия: если цифры различны, тогда составленное из них четырехзначное число выдавать на экран.
Блок-схема
Рис. 39
Программа
Program Problem5; { 1 — й способ }
uses WinCrt;
var
t, s, d, e : integer;
begin
writeln(«Все четырехзначные числа из разных цифр»);
for t := 1 to 9 do
for s := 0 to 9 do
for d := 0 to 9 do
for e := 0 to 9 do
if (t <> s) and (t <> d) and (t <> e) and (s <> d) and
(s <> e) and (d <> e)
then write(t*1000 + s*100 + d*10 + e, » «)
end.
Понятно, что эта программа выполнена нерационально. В ней все циклы выполняются полностью.
Программу можно усовершенствовать таким путем. Когда выполняется цикл сотен, тогда следующий цикл десятков надо начинать выполнять, если цифра сотен s не равна цифре тысяч t, в противном случае, иначе, цикл сотен надо продолжить, т. е. взять следующую цифру сотен.
Для цифры десятков, также установить условие, что следующий цикл единиц будет выполняться, если цифра десятков d не равна цифре сотен и тысяч, в противном случае, иначе, надо переходить к следующей цифре десятков.
И тогда, «внутри» цикла единиц достаточно записать условие, если цифры единиц e не равны цифре десятков d, сотен s и тысяч t, тогда четырехзначное число является искомым и оно выводится на экран.
Блок-схема
Рис. 40
Программа
Program Problem5a; { 2 — й способ }
uses WinCrt;
var
t, s, d, e : integer;
begin
writeln(«Все четырехзначные числа из разных цифр»);
for t := 1 to 9 do
for s := 0 to 9 do if s <> t then
for d := 0 to 9 do if (d <> s) and (d <> t) then
for e := 0 to 9 do
if (e <> d) and (e <> s) and (e <> t)
then write((((t*10 + s)*10 + d)*10) + e, » «)
end.
Задание 4
1. Дополните и измените эту программу так, чтобы она выдавала на экран не только различные четырехзначные числа, но и их количество.
2. При умножении четырехзначного числа, состоящего из разных цифр, на 9 получилось в произведении число, которое отличалось от множимого только тем, что между цифрами тысяч и сотен оказался нуль. Найти множимое. Составить блок-схему и программу.
Пример 6. Тройки натуральных чисел a, b, c, удовлетворяющих равенству: — называются Пифагоровыми числами.
Например, 3, 4 и 5 являются Пифагоровыми числами, поскольку
Составить программу для нахождения и печати всех Пифагоровых чисел, не превышающих 20.
Математика этого вопроса проста. Для чисел a, b и c возможные значения — это натуральные числа от 1 до 20.
Первоначальное значение a — единица, a = 1. Будем просматривать всевозможные значения b от 1 до 20, а также значения c от 1 до 20 и проверять выполнение равенства a a + b b = c c. Как только равенство будет выполняться, тогда выводить на экран значения a, b и c.
Далее надо брать значение a = 2 и проверять значения b уже от 2 до 20. Почему не от 1, а от 2? Да потому, что набор двух чисел из 1 и 2 уже был рассмотрен при значениях a = 1 и b = 2, чтобы не повторять значения a и b, т.е. избежать появления двух одинаковых пар чисел, значения b следует начинать просматривать или до значения a или от a до 20.
В связи с этим, возможны несколько способов организации циклов для переменных a и b.
1-й способ:
for a := 1 to 20 do
for b := a to 20 do
2-й способ:
for a := 20 downto 1 do
for b := 1 to a do
3-й способ:
for a := 1 to 20 do
for b := 1 to a do
Нетрудно видеть, что при каждом из этих способов не будут повторяться пары чисел. Проверьте это самостоятельно.
Для значений c мы обязаны проверять все натуральные числа от 1 до 20 для каждой пары чисел a и b. Поэтому цикл для c должен быть таким: for c := 1 to 20 do
Блок-схема
Рис. 41
Программа
Program Problem6;
uses WinCrt;
var
a, b, c : integer;
begin
writeln(«Тройки Пифагоровых чисел из промежутка [1; 20]»);
for a := 1 to 20 do
for b := 1 to a do
for c := 1 to 20 do
if a*a + b*b = c*c then writeln(a, » «, b, » «, c)
end.
Задание 5
1. Составьте блок-схему и программу, которая находит все решения уравнения где n — заданное число, из промежутка [2; 100].
2. Найти все натуральные x из промежутка [1; 1000], для которых выражение является квадратом натурального числа.
Пример 7. Сколькими способами заданное натуральное число n можно представить в виде суммы двух кубов натуральных чисел:
Перестановка слагаемых нового способа не дает. Операцией возведения в степень 1/3 пользоваться нельзя.
Сразу возникает следующая простая идея составления программы.
Организовать два цикла, один — внешний цикл с переменной i от 1 до n, а второй — внутренний цикл по j, также от 1 до n.
Сущность работы программы будет заключаться в следующем:
первое значение i равно 1, оно умножается трижды само на себя (этим заменяется возведение в 3-ю степень);
затем «перебираются» все значения j от 1 до n, каждое из которых также умножается трижды на себя и складывается со значением i i i, т. е. i в кубе;
далее, эта сумма проверяется, равна ли она значению n, если равенство выполняется, тогда счетчик, заведомо определенный в программе увеличивается на 1, а значения i и j можно вывести на экран;
цикл по i продолжается, i принимает второе значение — 2 и снова начинает выполняться внутренний цикл по j от 1 до n и так далее.
Если мы составим программу по этому плану, то она будет иметь два существенных недостатка:
1) проделывается много бесполезной работы — оба цикла организованы от 1 до n и среди них много лишних (достаточно брать значения от 1 до корня кубического из n);
2) программа будет выдавать значения, которые получаются при перестановки слагаемых, например: 2 2 2 + 3 3 3 = 35 и 3 3 3 + 2 2 2 = 35, что является недопустимым по условию задачи. Как устранить эти недостатки?
Первый недостаток устраним, если предварительно выясним, сколько значений для каждого из чисел надо рассматривать, чтобы выполнялось неравенство
Для этого можно организовать цикл с предусловием, цикл «пока«, в который включить счетчик — k, который бы подсчитывал, сколько раз такой цикл будет выполняться.
Это можно сделать так:
k := 0; i := 1;
while i*i*i + 1 <= n do
begin
k := k + 1;
i := i + 1
end;
Теперь можно значительно уменьшить число циклов для «испытуемых» чисел и организовать их от 1 до k, ибо при значениях i больше k, даже при самом маленьком значении j (j := 2) неравенство i i i + 1 <=n не выполняется.
Чтобы устранить второй недостаток, т. е., чтобы не выдавать варианты с перестановкой слагаемых можно поступить так:
внешний цикл по i первого числа устроить от k до 1, а внутренний цикл для второго числа по j делать от 1 до i. Получится такая часть программы:
p := 0;
for i := k downto 1 do
for j := 1 to i do
if i*i*i + j*j*j = n
then
begin
p := p + 1;
writeln(i, «*», i, «*», i, «+», j, «*», j, «*», j, «=», n)
end;
Внимательно разберитесь с этой частью программы и подумайте, почему в этом случае мы избегаем повторения вариантов и исключаем случаи перестановки слагаемых?
Осталось красиво закончить программу. Ведь очень часто будут встречаться случаи, когда число вообще нельзя представить в виде суммы кубов двух чисел. Надо учесть и это обстоятельство.
Для этого, после выполнения всех циклов введем условный оператор, в котором, в зависимости от значений счетчика p будут выдаться соответствующие сообщения.
Если p = 0, тогда выдать сообщение, что число нельзя представить в виде суммы кубов двух чисел, а иначе, выдать сообщение о количестве способов.
Эта часть программы может быть выполнена так:
if p = 0
then
begin
write(«Число «, n, » нельзя представить в виде «);
writeln(«суммы кубов двух чисел»)
end
else writeln(«Число способов равно «, p)
Блок-схема
Рис. 42
Программа
Program Problem7;
uses WinCrt;
var
i, j, n, k, p : longint;
begin
write(«Введите натуральное число «); readln(n);
k := 0; i := 1;
while i*i*i + 1 <= n do
begin
k := k + 1; i := i + 1
end;
p := 0;
for i := k downto 1 do
for j := 1 to i do
if i*i*i + j*j*j=n
then
begin
p := p + 1;
writeln(i, «*», i, «*», i, «+», j, «*», j, «*», j, «=», n)
end;
if p = 0
then
begin
write(«Число «, n, » нельзя представить в виде «);
writeln(«суммы кубов двух чисел»)
end
else writeln(«Число способов равно «, p)
end.
Еще одно решение этой задачи
Program Problem7b;
uses WinCrt;
label 1, 2;
var
i, j, m, k, n : longint;
begin
write(«Введите натуральное число «); readln(n);
m := 0; i := 1; j := 1;
while j*j*j + 1 < n do j := j + 1;
repeat
k := i*i*i + j*j*j;
if k = n then m := m + 1;
if k <= n then i := i + 1;
if k >= n then j := j — 1;
until i > j;
if m = 0 then goto 1;
write(«Число «,n,» можно представить в виде суммы»);
writeln(» кубов двух чисел «,m,» способами»); goto 2;
1: write(«Это число не представимо в виде»);
writeln(» суммы кубов двух чисел»);
2: end.
Задание 6
Дано натуральное n. Можно ли n представить в виде суммы трех квадратов натуральных чисел? Если можно, то указать все тройки x, y, z таких натуральных чисел, что Перестановка слагаемых нового способа не дает. Составить блок-схему и программу.
5. Преобразование типов
Пример 8. Двузначное десятичное число в сумме с числом, записанным теми же цифрами, но в обратном порядке, дает полный квадрат. Найти все такие числа.
Пусть искомое двузначное число = a 10 + b, тогда число, записанное теми же цифрами, но в обратном порядке будет = b 10 + a, например, 12 и 21, 13 и 31 и т. п.
Сумма этих чисел должна давать полный квадрат, т.е. точный квадрат целых чисел. Как это проверить?
Проверку можно было бы выполнить так: извлечь квадратный корень из полученной суммы; затем округлить результат до целого числа, а потом умножить полученный результат на себя, если снова получится сумма этих чисел, то значит она является точным или полным квадратом.
Например, 12 + 21=33, извлекаем квадратный корень из 33, он равен 5.74…; округляем, будет 6; умножаем 6 само на себя и получаем 36.
Мы не получили исходного результата, значит сумма 33 не является точным квадратом.
Еще один пример, чтобы вам была понятна идея решения. Пусть двузначное число 29, тогда число, записанное теми же цифрами, но в обратном порядке — 92, в сумме они дают 121. Извлекаем квадратный корень из 121 и получаем 11. Умножив 11 само на себя, снова получим 121. Делаем вывод, что получен точный квадрат, а значит двузначное число 29 является искомым.
Чтобы составить программу по этому принципу, придется извлекать квадратный корень из суммы, что можно сделать с помощью стандартной функции sqrt(x). Результат функции sqrt(x) является вещественным числом, его надо округлить или отбросить дробную часть, а нам неизвестно, как это сделать.
Но, даже более существенным, является то, что если квадратный корень в множестве целых чисел извлекается нацело, как для 121 (он равен 11), то на множестве вещественных чисел мы не получим строго число 11, а результат будет очень близок к 11 и после умножения на себя всё равно не получится 121, т.е. возникает необходимость преобразовать вещественное значение в целое.
Итак перед нами две задачи: 1) выяснить как округлять числа и; 2) установить, как преобразовывать вещественный тип в целый.
Для этого в Паскале есть стандартные функции round(x) и trunc(x)
Стандартные функции round и trunc предназначены для замены значений вещественного типа значениями целого типа.
Функция round(x) округляет вещественное число x до целого — ее значение есть ближайшее целое число:
round(4.2) = 4, round(4.7) = 5, round(4.5)=5,
round(-4.2) = -4, round(-4.7) = -5, round(-4.5) = -5.
Функция trunc(x) отбрасывает (без округления) дробную часть вещественного числа x:
trunc(1.2) = 1, trunc(5.8) = 5, trunc(-1.2) = -1,
trunc(-5.8) = -5, trunc(-6.7) = -6, trunc(8,9) = 8
Функции округления связаны так:
trunc(x + 0.5) = round(x), если x 0,
trunc(x — 0.5) = round(x), если x < 0.
Итак, в программе можно воспользоваться одной из этих функций. Какой? Подумайте сами и попробуйте применить в программе вначале функцию trunc, а потом замените ее на round и сравните полученные результаты.
Блок-схема
Рис. 43
Программа
Program Problem8;
uses WinCrt;
var
d, e, k : integer;
begin
writeln(«Искомые двузначные числа»);
for d := 1 to 9 do
for e := 1 to 9 do
begin
k := round(sqrt(d*10 + e + e*10 + d));
if k*k = d*10 + e + e*10 + d
then write(d*10 + e, » «)
end
end.
Задание 7
Найти целые числа из заданного промежутка [m; n], которые являются точными квадратами и остаются таковыми после приписывания к ним справа единицы (в десятичной системе записи). Составить блок-схему и программу.
Упражнения
- Составьте программу, которая находит 4 последовательных натуральных числа, произведение которых равно 1680.
- Показать, что четырехзначное число, у которого цифры тысяч и десятков одинаковы и цифры сотен и единиц тоже одинаковы, не может быть точным квадратом.
- Произведение шести последовательных натуральных чисел может быть равно произведению трех последовательных натуральных чисел. Например, 1 2 3 4 5 6 = 8 9 10 = 720. Есть ли еще такие числа?
- Доказать, что произведение четырех последовательных целых чисел в сумме с единицей дает полный квадрат.
- Найдите 11 последовательных натуральных чисел, сумма квадратов которых есть квадрат целого числа.
- Существуют ли такие целые числа, которые уменьшаются в 57 раз при зачеркивании их первой (слева) цифры?
- Найти четырехзначное число, зная, что оно является квадратом натурального числа и что цифры его распадаются на две пары, состоящие из одинаковых цифр.
- Найдите все семизначные числа, которые делятся на 15 и записываются только цифрами 0 и 1.
- Шестизначное число начинается с цифры 1. Если эту цифру переставить в конец числа, то новое число будет в три раза больше первоначального. Найдите число.
- Сколько точных квадратов можно составить из цифр 3, 4, 5, 6?
- Даны 20 различных натуральных чисел, не больших 50. Найдите два из них, разность которых равна 4, 5 или 9.
- Во сколько раз увеличится двузначное число, если справа к нему приписать такое же двузначное число?
- Определить наибольшее значение отношения трехзначного числа к числу, равному сумме цифр этого числа.
- Найти трёхзначное число, кратное 45, если разность между этим числом и числом, записанным теми же цифрами, но в обратном порядке равна 297.
- Найти четырёхзначное число , кратное 11, при условии: b + c = a и есть полный квадрат.
- Найти трёхзначное число, равное сумме цифры десятков, квадрата цифры сотен и куба цифры единиц.
- Найти два числа, произведение которых есть трёхзначное число, являющееся кубом некоторого числа, а частное является квадратом этого числа.
- Разность между числом и произведением его цифр равна сумме цифр этого числа. Найти это число.
- Найти все значения числа m, для которых сумма 1! + 2! + ,,, + m! является полным квадратом.
- Найти положительное четырёхзначное число, кратное 7 и представляющее собою сумму куба и квадрата некоторого числа.
- Некоторое число при делении на 7 дает в остатке 3; его квадрат при делении на 72 дает остаток 44; его куб при делении на 73 даёт остаток 111. Найти это число.
- При каком натуральном значении a число a2 + a + 1589 будет точным квадратом?
- Найти совершенное число вида 16p.
- Найти два числа, если сумма их квадратов равна 468, а сумма их общего наибольшего делителя и наименьшего кратного равна 42.
Автор: Тишин Владимир Иванович
Первое тысячелетие путь к познанию
Средние века, с начала IV и до XV вв. включительно, были периодом значительного упадка в развитии естественнонаучных знаний на европейском континенте. Причинами тому были гибель к началу этого периода вместе с разрушением государства Византии первого в Европе греко-римского центра культуры и науки. Завоеватели — северные «варвары» с одной стороны, и арабские племена с Аравийского … |
Откуда прилетают и как падают на Землю метеориты
Орбиты метеоритов. Все как-то привыкли к тому, что астероиды кружатся вокруг Солнца на огромных расстояниях. Они в 2—3 раза дальше от Солнца, чем наша Земля. Лишь немногие астероиды приближаются к Земле, но происходит это не из-за малых размеров орбит, а из-за большого их эксцентриситета. Афелии орбит таких астероидов всегда остаются за орбитой Марса. Метеориты, … |
Расчет массы вещества в растворе по его массовой доле
Задание: Сколько граммов сахара и воды необходимо взять для получения 200 г 5 % раствора? № п/п 1. 2. 3. … |
To have has got
В разговорной речи для выражения значения ‘иметь, обладать’ в настоящем времени употребляется оборот ‘to have/ has got’: HAVE (хэв), HAS (хэз), GOT (гот). I/ you/ we/ they/ you HAVE(got). Можно делать сокращения : |
Когда в алгоритме некоторое действие нужно выполнить несколько раз, используются циклы. В программирование цикл — это многократное повторение определенных инструкций. Циклы состоят из заголовка и тела. Заголовок содержит в себе условия, которые определяют работу цикла, а тело – повторяющиеся действия. В этом уроке рассмотрим:
- цикл со счетчиком (с параметром);
- цикл с предусловием;
- цикл с постусловием.
- вложенные циклы/a>.
Их алгоритмы выполнения различны, но есть и общее: после выполнения тела цикла, проверяется условие, и в зависимости от него работа цикла заканчивается, либо снова выполняется тело.
1 For — цикл с параметром
Цикл с параметром, известный также как цикл со счетчиком, используется при известном количестве повторений. Он имеет две формы записи. В любом случае он выполняет следующий после него оператор (как правило, это составной оператор заключенный в «операторные скобки» Begin..End), каждый раз изменяя переменную цикла с шагом 1
For <счетчик>:=< начальное значение> To <конечное значение> Do <тело цикла>; For <счетчик>:=<начальное значение> Downto <конечное значение> Do <тело цикла>;
Счетчик – это переменная порядкового типа. Начальное и конечное значение должны быть того же типа, что и счетчик. Тело выполняется до тех пор пока условие истинно.
Условия выполнения цикла проверяются перед выполнением блока операторов. Если переменная цикла больше максимального значения (при to) или меньше минимального (downto), то цикл FOR не выполняется.
Формы записи, представленные выше, отличаются словами To
и Downto
. Если Вы используете цикл с To
, то значение счетчика с каждым шагом будет увеличиваться на единицу, а если с Downto
, то уменьшаться. Из этого следует, что в первом варианте начальное значение не должно превышать конечное, во втором — верно противоположное. В программе ниже, указанное пользователем количество раз, будут выводиться символы.
program for_primer; uses crt; var i, x: integer; begin write('X='); readln(x); for i:=1 to x do write('a'); readkey; end.
Здесь тело цикла не заключено в Begin-End
, так как оператор всего один. Но если их будет больше, то операторные скобки обязательны. Стоит также отметить, что счетчик по выходу из цикла не будет иметь определенного значения, но если цикл закончиться раньше положенного, то счетчик сохранит последнее, записанное в него значение.
Другой пример — вычисление суммы чисел от A до B:
Program Summa; Var a, b, S: Integer; Begin ClrScr; Write('a = '); Readln(a); Write('b = '); Readln(b); S:=0; For I:=a To b Do S:=S + I; Writeln ('Cумма = ', S); ReadLn End.
2 While – цикл с предусловием
Оператор While
– начинает описание цикла с предусловием. Такой вид цикла нужен, в тех алгоритмах, где число повторений неизвестно заранее. В общем виде он выглядит так:
While <выражение> Do <тело цикла>;
Если выражение истинно, то тело выполняется, иначе цикл завершается. Поэтому нужно составить такой код, чтобы на какой-то из итераций выражение стало ложным, и цикл не выполнялся бесконечно.
Пример программы написанный с использованием цикла While
:
program while_primer; uses crt; var i, x, limit: integer; begin write('Предел='); readln(limit); write(' Числа Фибоначчи: '); i:=1; x:=1; while i<=limit do begin write(i,' '); i:=i+x; x:=i-x; end; readkey; end.
В данном коде использовался составной оператор Begin-End
, так как операторов в теле цикла несколько.
3 Repeat – цикл с постусловием
Главной особенностью цикла с постусловием (часто встречается название: цикл-ДО) является выполнение его тела минимум один раз. Это связано с тем, что условие записывается в конце и соответственно вначале выполнится тело, а затем провериться условие. Формально он выглядит так:
Repeat <тело цикла> Until <условие>
В противоположность двум рассмотренным прежде циклам, этот прекращает свое выполнение тогда, когда условие становиться истинным, т. е. чтобы итерации продолжались условие должно быть ложно. Рассмотрим работу цикла с постусловием на примере:
program repeat_primer; uses crt; var i, otvet: integer; begin i:=1; repeat i:=i+1; write(i,'+',i,'*2='); read(otvet); until otvet<>i+i*2; readkey; end.
Программа продолжает работать до тех пор, пока пользователь не допустит ошибку в ответе. Думаю, Вы заметили, что в примере (непосредственно в цикле) составной оператор Begin-End
, несмотря на количество операторов не поставлен. Просто его роль выполняют слова repeat
и until
.
Для переходных манипуляций с циклом обычно используются три оператора:
Goto
– переходит в отмеченную область;Break
– производит безусловный выход из цикла;Continue
– осуществляет переход к новой итерации.
4 Вложенные циклы
Циклы в паскаль могут вкладываться друг в друга. Житейский пример: например, у нас есть список студентов, у каждого из которых есть оценки — если мы захотим перебрать все оценки для каждого студента то один цикл (внешний) будет перебираться студентов, а второй (вложенный) — оценки конкретного студента. Обрабатывать списки (массивы) мы научимся дальше.
Рассмотрим вложенные циклы на примере цикла с параметром:
For <счетчик 1>:=<начальное знач.> To <конечное знач.> Do <тело цикла 1>; For <счетчик 2>:=<начальное знач.> To <конечное знач.> Do <тело цикла 2>; … For <счетчик n>:=<начальное знач.> To <конечное знач.> Do <тело цикла n>;
Вернувшись к терминологии, отметим, что в таких структурах одни циклы называются внешними, а другие внутренними. Так цикл 2 относительно цикла 1 является внутренним, а для цикла n он внешний.
Принцип работы вложенных циклов заключается в следующем. Сначала один раз выполняется цикл, идущий первым в программе, затем управление передается следующему циклу (№2), и если после него нет никаких других циклов, то он прокручивается до конца и снова единожды выполняется внешний цикл, иначе, если после цикла №2 стоит еще один вложенный цикл, то №2 выполняется один раз, передавая управление циклу идущему после него. Такой алгоритм продолжается до тех пор, пока самый внешний цикл не выполниться необходимое количество раз.
Предположим у нас есть вложенные циклы for
:
for i:=1 to m1 do for j:=1 to m2 do … for k:=1 to mn do
Количество проходов по первому циклу = m1
, второму = m2*m1
, n-ому = mn*mn-1*mn-2*..*m2*m1
. В качестве доказательства предлагаю разобраться в следующей программе.
program counter_performance; uses crt; var i, j, k, g, h: integer; s_i, s_j, s_k, s_g, s_h: integer; begin s_i:=0; s_j:=0; s_k:=0; s_g:=0; s_h:=0; for i:=1 to 5 do begin s_i:=s_i+1; for j:=1 to 3 do begin s_j:=s_j+1; for k:=1 to 19 do begin s_k:=s_k+1; for g:=1 to 10 do begin s_g:=s_g+1; for h:=1 to 6 do s_h:=s_h+1; end; end; end; end; write('i=',s_i,' j=',s_j,' k=',s_k,' g=',s_g,' h=',s_h); readkey; end.
Имеются 5 циклов со счётчиками от i до h. В каждом из них при помощи переменных подсчитывается, сколько раз выполняется каждый цикл. Запустив программу на своем компьютере, Вы должны увидеть такой результат:
Результат работы вложенных циклов
Посчитав способом, изложенным выше, получите результат соответствующий величинам, отображенным на скриншоте. Вложенные конструкции аналогично работают в циклах с предусловием и постусловием. В следующей программе с помощью оператора while
фигурка выводиться на экран.
program nested_loops; uses crt; var i, j: integer; begin i:=1; j:=1; while i<20 do begin while j<i+1 do begin write(''); j:=j+1; end; j:=1; i:=i+1; writeln; end; readkey; end.
При работе с массивами очень часто применяются вложенные циклы, а когда дело доходит до матриц (двумерных массивов), то даже их заполнение, как правило, делается через рассмотренные нами в этой статье конструкции.
На занятии изучается работа в Паскаль с циклом for — цикл с параметром или счетчиком. Рассматриваются примеры работы операторов Continue и Break в Паскале
Содержание:
- Цикл со счетчиком в Паскаль (цикл for)
- Pascal: выход из цикла
- Break и Continue
- Произвольный шаг в цикле for
- Табулирование функции на отрезке с заданным шагом
- Exit и Halt
Цикл со счетчиком или, как он еще называется — цикл с параметром в Паскале служит для организации повторений (итераций) с заранее известным их количеством, т.е. когда точно известно, сколько раз должны выполниться операторы тела цикла.
Блок-схема, соответствующая циклу For:
Ну или если на простом примере:
Пример: вывести пять раз слово «Привет!»
Паскаль цикл For: синтаксис:
Прямое направление цикла (от меньшего значения к большему):
{при движении от меньшего значения к большему, например, от 1 до 10} for счетчик:=значение to конечное_значение do тело_цикла;Обратное направление (от большего к меньшему):
{при движении от большего значения к меньшему, например, от 10 до 1} for счетчик:=значение downto конечное_значение do тело_цикла;
Решение на Паскале:
Оператор в теле конструкции может быть одиночным или составным оператором.
Счетчик цикла или параметр цикла — это обычная переменная, которая может быть только порядкового (целочисленного, символьного, логического) или перечислимого типа.
При прямом направлении цикла счетчик в каждой итерации увеличивается на единицу, при обратном направлении — уменьшается на единицу.
Важно знать: счетчик (параметр цикла) нельзя изменять внутри тела цикла! Кроме того, нельзя менять его начальное и конечное значения.
PascalABC.NET
:
for [var] i: integer := 1 to 5 do <оператор>
for var i := 1 to 5 do <оператор>
Значение переменной цикла после завершения цикла будет не определено (локальная).
Рассмотрим на решенном примере, как используется в Паскаль цикл for:
Пример: Печатать «ноль» указанное количество раз
Pascal | PascalABC.NET | ||||
|
|
Более детально цикл со счетчиком в Паскале рассмотрен в видеоуроке:
Пример: Вывести на экран квадраты и кубы целых чисел от 1 до 8 (от a до b). Реализовать двумя способами: 1. переменная цикла должна увеличиваться и 2. переменная цикла должна уменьшаться.
Решение в виде блок-схемы:
Решение на Паскале:
Задача 8. Найти среднее арифметическое чисел в Паскале, числа вводятся с клавиатуры, их количество произвольно. Использовать цикл for
[Название файла: L3task8.pas
]
Задача 9. Составить блок-схему по программе нахождения среднего арифметического в pascal.
[Название файла: L3task9.pas
]
Пример: Вывести на экран квадраты и кубы нечётных целых чисел от 1 до 9.
Решение:
Pascal: выход из цикла
Break и Continue
Для выхода из цикла предусмотрена процедура break
в Паскале. Break
досрочно прекращает выполнение циклов while
, repeat
и for
.
Процедура Continue
досрочно выходит из текущей итерации цикла, но, не завершая его, а переходя к следующей итерации.
Рассмотрим использование процедур выхода из цикла Continue и Break в Паскале (будем использовать цикл while
):
Пример: Программа вывода на экран степеней двойки с использованием процедур break
и continue
1 2 3 4 5 6 7 8 9 10 11 |
var a:integer; begin a:=1; while a<1000 do begin a:=a*2; if a=64 then continue; if a=256 then break; write(a:4); {4 позиции на вывод каждого числа} end; end. |
В результате программы на экране будут напечатаны: 2 4 8 16 32 128.
Число 64 пропущено, так как при условии a=64
происходит выход из текущей итерации (continue
) и число не выводится на экран, а при a=256
выполнение цикла прерывается окончательно (break
), так и не распечатав число 256.
Задача 10. Решить рассмотренную задачу с процедурами break
и continue
для циклов repeat
и for
[Название файла: L3task10.pas
]
Произвольный шаг в цикле for
Пример:
Выполнить: Выведите все двухзначные нечетные числа от 11 до 21.
Примерный результат:
11 13 15 17 19 21
✍ Алгоритм:
- Решение 1. С циклом
loop
- Решение 2. С циклом
for
loop
Задание 1 (step):
Выполнить: Выведите последовательность 3 5 7 9 … 21 (от 3 до 21 с шагом = 2). Выполнить дважды: с циклом loop
и циклом for
.
Фрагмент программы:
begin println('результат с циклом loop'); var ...; loop ...; ... println('результат с циклом FOR'); for var ... ... end.
[Файл: task-01step.pas
]
Задание 2 (step):
Выполнить: Вывести последовательность: 20 18 16 … 2 (от 20 до 2 с шагом = 2). Выполнить дважды: с циклом loop
и циклом for
.
[Файл: task-02step.pas
]
Пример 3:
Выполнить: Вывести последовательность: 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2.0.
✍ Алгоритм:
- Решение 1. С циклом
loop
- Решение 2. С циклом
for
Задание 3 (step):
Выполнить: Вывести последовательность 0.1 0.3 0.5 0.7 0.9 1.1. Выполнить дважды: с циклом loop
и циклом for
.
Примерный результат:
0.1 0.3 0.5 0.7 0.9 1.1
[Файл: task-03step.pas
]
Табулирование функции на отрезке с заданным шагом
* Следует учесть, что эта тема не обязательна для школьного курса информатики, в основном предполагается ознакомление студентами.
Табулирование функции одной переменной
Пример: На отрезке [a,b] с шагом h протабулировать функцию f(x)=x2+Ln|x|
и вывести на печать значения этой функции.
Алгоритм:
Для решения задачи в области определения функции вводится сетка – совокупность точек:
{x0, x1, x2, …, xi}, где x0 = а, x1= x0+h, …, xi = xi-1+h, xn = b.
Тогда задача сводится к вычислению функции f в точках xi, то есть нужно вычислить:
f(x0), f(x1), …, f(xi), f(xn)
✍ Решение:
Pascal | PascalABC.NET | ||||
|
|
Пример: Вычислить 7 значений функций
0.15x + a y= ----------- a2 + x2
где начальное значение а=0.14х, шаг Δа=0.22
Результаты для x = 2:
a =0.28 y = 0.142212632404865 a =0.5 y = 0.188235294117647 a =0.72 y = 0.225743626062323 a =0.94 y = 0.253911049225981 a =1.16 y = 0.273121819814427 a =1.38 y = 0.284533568186437 a =1.6 y = 0.289634146341463
✍ Решение:
var x, a, y, h: real; i:integer; begin writeln('ведите x'); readln(x); h:=0.22; a := 0.14*x; for i:=1 to 7 do begin y := (0.15*x + a)/(sqr(a)+sqr(x)); writeln('a =', a, ' y = ', y); a := a + h; end end.
Табулирование функции двух переменных
Пример: На интервале xn≤x≤xk с шагом Δх, для каждого у из интервала уn≤y≤yk с шагом Δу вычислить значение функции f=x2+ln|y|
.
Например:
если xn = 2; xk = 3 уn = -1; yk = 1 шаг Δх = 1, шаг Δy = 0.5 то f1 = 22+ln|-1| = 4 f2 = 22+ln|-0.5|= 3.30685281944005 ...
Результат:
x= 2 y= -1 f= 4 x= 2 y= -0.5 f= 3.30685281944005 x= 2 y= 0 f= -∞ x= 2 y= 0.5 f= 3.30685281944005 x= 2 y= 1 f= 4 x= 3 y= -1 f= 9 x= 3 y= -0.5 f= 8.30685281944005 x= 3 y= 0 f= -∞ x= 3 y= 0.5 f= 8.30685281944005 x= 3 y= 1 f= 9
✍ Решение:
var xn, xk, yn, yk, f, hx, hy,x,y: real; begin writeln('отрезок для x от ... и до ...'); readln(xn, xk); writeln('отрезок для y от ... и до ...'); readln(yn, yk); writeln('шаг для x'); readln(hx); writeln('шаг для y'); readln(hy); x := xn; y := yn; while x <= xk do begin while y <= yk do begin f := sqr(x) + ln(abs(y)); writeln('x= ', x, ' y= ', y, ' f= ', f); y := y + hy; end; x := x + hx; y:=yn; end end.
Задача 11:
Вычислить значение функции:
z(x, у) = sin x + cos y
при всех х, изменяющихся на интервале [-1, 1] с шагом Δх = 0.2, и у, изменяющихся на интервале [0, 1] с шагом Δу = 0.1.
Результат:
x=-1.00 y=0.00 z=0.16 x=-1.00 y=0.10 z=0.15 x=-1.00 y=0.20 z=0.14 x=-1.00 y=0.30 z=0.11 x=-1.00 y=0.40 z=0.08 x=-1.00 y=0.50 z=0.04 x=-1.00 y=0.60 z=-0.02 x=-1.00 y=0.70 z=-0.08 x=-1.00 y=0.80 z=-0.14 x=-1.00 y=0.90 z=-0.22 x=-1.00 y=1.00 z=-0.30 x=-0.80 y=0.00 z=0.28 ...
Дополните код в местах, где стоят троеточия:
var x, y, z: real; // описание переменных begin writeln('x y z(x,y)'); x := -1.0; y := ...; // начальное значение while (x <= 1) do begin while (...) do //запуск внутреннего цикла begin z := sin(x) + cos(y); write(' x=', x:3:2, ' y=', y:3:2, ' z=', z:3:2 ); y := y + ...; writeln(); end; writeln(); x := ...; // изменение параметра х на шаг y:= 0; end end.
[Название файла: L3task11.pas
]
Exit и Halt
Процедура Pascal Exit
служит для завершения работы того программного блока, в котором она используется (условный оператор, цикл, процедура…). Если Exit
вызывается внутри процедуры или функции, то завершается работа данной процедуры/функции. Если процедура Exit
находится в основном блоке программы, то это приводит к ее завершению.
Процедура halt
в pascal завершает работу программы.
Потренируйтесь в решении задач по теме, щелкнув по пиктограмме: