Pascal цикл внутри цикла

Pascal цикл внутри цикла thumbnail

При решении задач может возникнуть необходимость повторить одни и те же действия несколько или множество раз. В программировании блоки кода, которые требуется повторять не единожды, оборачиваются в специальные конструкции – циклы. У циклов выделяют заголовок и тело. Заголовок определяет, до каких пор или сколько раз тело цикла будет выполняться. Тело содержит выражения, которые выполняются, если в заголовке цикла выражение вернуло логическую истину (True, не ноль). После того как достигнута последняя инструкция тела, поток выполнения снова возвращается к заголовку цикла. Снова проверяется условие выполнения цикла. В зависимости от результата тело цикла либо повторяется, либо поток выполнения переходит к следующему выражению после всего цикла.

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

Блок схемы циклов

Цикл for

Часто цикл for называют циклом со счетчиком. Этот цикл используется, когда число повторений не связано с тем, что происходит в теле цикла. Т.е. количество повторений может быть вычислено заранее (хотя оно не вычисляется).

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

Цикл for существует в двух формах:

for счетчик:=значение to конечное_значение do тело_цикла; for счетчик:=значение downto конечное_значение do тело_цикла;

Счетчик – это переменная любого из перечисляемых типов (целого, булевого, символьного, диапазонного, перечисления). Начальные и конечные значения могут быть представлены не только значениями, но и выражениями, возвращающими совместимые с типом счетчика типы данных. Если между начальным и конечным выражением указано служебное слово to, то на каждом шаге цикла значение параметра будет увеличиваться на единицу. Если же указано downto, то значение параметра будет уменьшаться на единицу.

Количество итераций цикла for известно именно до его выполнения, но не до выполнения всей программы. Так в примере ниже, количество выполнений цикла определяется пользователем. Значение присваивается переменной, а затем используется в заголовке цикла. Но когда оно используется, циклу уже точно известно, сколько раз надо выполниться.

var i, n: integer; begin write (‘Количество знаков: ‘); readln (n); for i := 1 to n do write (‘(*) ‘); readln end.

Цикл while

Цикл while является циклом с предусловием. В заголовке цикла находится логическое выражение. Если оно возвращает true, то тело цикла выполняется, если false – то нет.

Когда тело цикла было выполнено, то ход программы снова возвращается в заголовок цикла. Условие выполнения тела снова проверяется (находится значение логического выражения). Тело цикла выполнится столько раз, сколько раз логическое выражение вернет true. Поэтому очень важно в теле цикла предусмотреть изменение переменной, фигурирующей в заголовке цикла, таким образом, чтобы когда-нибудь обязательно наступала ситуация false. Иначе произойдет так называемое зацикливание, одна из самых неприятных ошибок в программировании.

var i, n: integer; begin write (‘Количество знаков: ‘); readln (n); i := 1; while i <= n do begin write (‘(*) ‘); i := i + 1 end; readln end.

Цикл repeat

Цикл while может не выполниться ни разу, если логическое выражение в заголовке сразу вернуло false. Однако такая ситуация не всегда может быть приемлемой. Бывает, что тело цикла должно выполниться хотя бы один раз, не зависимо оттого, что вернет логическое выражение. В таком случае используется цикл repeat – цикл с постусловием.

В цикле repeat логическое выражение стоит после тела цикла. Причем, в отличие от цикла while, здесь всё наоборот: в случае true происходит выход из цикла, в случае false – его повторение.

var i, n: integer; begin write (‘Количество знаков: ‘); readln (n); i := 1; repeat write (‘(*) ‘); i := i + 1 until i > n; readln end.

В примере, даже если n будет равно 0, одна звездочка все равно будет напечатана.

Источник

Мы переходим к одному из самых интересных из наших уроков по Паскалю, речь здесь пойдёт о вложенных циклах, чтобы перейти этому уроку, вы должны быть уже знакомы с конструкциями циклов:

  1. for — цикл с параметром.
  2. while — цикл с предусловием.
  3. repeat/until — цикл с постусловием.

Основная идея использования вложенных циклов

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

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

Графическое представление вложенных циклов

Работу циклов также можно сравнить с вращением связанных шестерёнок разного размера:

— внешний цикл это как бы большая шестерёнка, за один свой оборот (виток цикла), внешний цикл заставляет вращаться вложенный цикл (меньшую шестерёнку) несколько раз.

Такая иллюстрация точна в случае, если число повторов вложенного цикла не зависит от того какой именно (1-ый, n-ый или иной) виток делает внешний цикл, а так бывает не всегда. Почему выясним, рассматривая примеры ниже.

Примеры кода решений задач с вложенными циклами

Пример №1.1: Repeat/until + For: работа с пользователем до его указания на завершение программы

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

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

Читайте также:  Цикл у девушки что это

В качестве конкретного пример рассмотрим решение задачи:

Пользователь вводит целые положительные числа, большие $5$. Пока он не введёт число $22$ в ответ на каждое введённое число выводите все целые числа от $1$ до этого числа, если же пользователь ввёл ноль, то объявите о завершении работы программы.

Решение:

var a,i:integer; begin repeat // внешний цикл writeln(‘vvedite chislo >5:’); readln(a); for i:=1 to a do // (вложенный цикл) выводим все числа до a write(i, ‘ ‘); writeln(); // перенос строки until (a = 22); // конец тела внешнего цикла writeln(‘zaversheno!’); readln(); end.

Прокомментируем это решение:

  1. В качестве внешнего цикла мы выбрали repeat/until, чтобы проверять условие уже после ввода значения пользователем.
  2. В качестве внутреннего цикла мы выбрали for — ведь каждый раз будет известно число, до которого надо выводить меньшие числа. Можно было бы использовать и любой другой цикл, но for в таких случаях использовать грамотнее и красивее.
  3. минусом выбора repeat/until внешним циклом является то, что эта программа, в случае если пользователь введёт число $22$, все равно выведет ряд чисел, а только потом завершится.

Последний пункт вызывает желание (да-да, программирование должно вас увлекать 😉 переписать код так, чтобы в случае, если пользователь ввёл $22$ ряд чисел не выводился.

Пример №1.2 (продолжение): While + For: работа с пользователем до его указания на завершение программы

Это пример является продолжением предыдущего и одновременной иллюстрацией ситуации, где цикл For вложен в While:

var a,i:integer; begin writeln(‘vvedite chislo >5:’); readln(a); while (a <> 22) do begin // начало тела внешнего цикла for i:=1 to a do // (вложенный цикл) выводим все числа до a write(i, ‘ ‘); writeln(); // перенос строки writeln(‘vvedite chislo >5:’); // очередной раз запрашиваем число в цикле readln(a); end; // конец тела внешнего цикла writeln(‘zaversheno!’); readln(); end.

Как работает эта программа:

  1. Сначала, ещё до цикла мы просим пользователя ввести число первый раз, если это число = 22, то цикл вообще не начнётся и программа будет завершена без вывода ряда.
  2. Если пользователь вводит число не равное 22, то цикл начнётся, так как число уже известно, то в витке цикла мы сначала выведем значения до введённого числа, а только потом в конце витка запросим очередное число.

Пример №2 — вывод таблицы умножения

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

Основная идея в подобных задачах состоит в том, что:

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

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

Рассмотрим решение задачи:

Вывести на экран таблицу умножения чисел от 1 до 9.

Решение (for в for):

var i, j: integer; begin for i := 1 to 9 do // цикл по строкам таблицы, счетчик как левый множитель begin for j := 1 to 9 do // выводим равенства очередной строки, счётчик как правый множитель write(i, ‘*’, j, ‘=’, i*j, ‘ ‘); writeln(); // переносим строку end; readln(); end.

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

var i, j: integer; begin i := 1; // начальное значение для счетчика внешнего цикла while (i <= 9) do // цикл по строкам таблицы, счетчик как левый множитель begin for j := 1 to 9 do // выводим равенства очередной строки, счётчик как правый множитель write(i, ‘*’, j, ‘=’, i*j, ‘ ‘); writeln(); // переносим строку i:=i+1; // увеличиваем значение счетчика внешнего цикла end; readln(); end.

Или даже while в repeat-until:

var i, j: integer; begin i := 1; // начальное значение для счетчика внешнего цикла repeat // начало тела внешнего цикла j := 1; // сбрасываем значение счетчика внутреннего цикла в единицу (чтобы он повторился как и предыдущий раз), или если речь идёт о первом витке, то это действие можно назвать заданием начального значения счетчика while (j<=9) do // выводим равенства очередной строки, счётчик как правый множитель begin write(i, ‘*’, j, ‘=’, i*j, ‘ ‘); j:=j+1; // увеличиваем значение счетчика внутреннего цикла end; writeln(); // переносим строку i:=i+1; // увеличиваем значение счетчика внешнего цикла until (i > 9); // проверка условия выхода из внешнего цикла и конец его тела readln(); end.

Задачи для самостоятельного решения

  1. Выведите на экран таблицу умножения используя только циклы вида repeat/until.
  2. Выведите на экран таблицу умножения используя только циклы вида while.
  3. Выведите на экран таблицу умножения используя один цикл while и один repeat-until .
  4. Пользователь вводит числа до тех пор пока не введёт число меньшее $1$. В ответ на каждое введённое им число выводите на экран все нечетные числа от 1 до это числа, при этом делящиеся на 5. Если же пользователь ввел число меньшее $1$, то завершите программу.
  5. Пользователь вводит первое целое число-ограничитель $m$. А затем начинает вводить целые числа по одному, пока не введёт число большее числа-ограничителя.

    Если очередное целое число больше $1$, то в ответ на каждое такое число программа должна выводить все целые числа от единицы до этого числа.

    Примечание: это задача на вложенные циклы, в качестве внешнего надо использовать while, а в качестве внутреннего можно использовать или for или while.

  6. Пользователь вводит целое положительное число, если оно не соответствует критериям (то есть не является положительным), выведете сообщение об ошибке, в противном случае выведете на экран все числа от 1 до введённого пользователем.
  7. Модифицируйте предыдущую задачу так, чтобы в случае, если число удовлетворяет требованиям (целое, положительное), то на экран выводились четные числа.
  8. Выведете на экран числа от 1 до 5 два раза с помощью вложенных циклов. Так чтобы в консоли было:

    1 2 3 4 5 1 2 3 4 5

  9. M раз выведете на экран числа от 1 до N с помощью вложенных циклов. Так чтобы в консоли было:

    $

    left.

    begin{array}{ccc}

    1 & … & N \

    1 & … & N \

    end{array}

    right} text{M раз}

    $

  10. Модифицируйте предыдущую задачу так, чтобы в каждой чётной (той, у которой номер чётный) строке выводилось N символов, а в каждой нечетной N/2 символов (сделайте проверку того, что $N/2$ больше нуля)
  11. Пользователь вводит числа до тех пор пока им не будет передан ноль. В ответ на каждое число программа должна сообщать чётное оно или нет.
  12. Пользователь вводит четное целое число (если нечетное сообщите об ошибке). Делите это число в цикле на $2$ до тех пор пока оно делится, выводя каждый промежуточный результат, например для $12$ в консоли получим:

    6 3

    А для 8:

    4 2 1

  13. Пользователь вводит два целых числа $M$ и $N$, если $M$ четное, делайте то же, что и в предыдущей задаче, а если нечётное, то умножайте $M$ в цикле на $3$ до тех пор пока результат не станет больше $N$ (и выводите каждый из промежуточных результатов умножения на экран), например для:

    M := 3; N := 15;

    Получим:

    9 27

  14. С помощью вложенных циклов выведите на экран таблицу умножения числе от 1 до 9, начнётся она как-то так:

    1×1 = 1 1×2 = 2 ……

  15. С помощью вложенных циклов выведите на экран таблицу деления чисел от 1 до 9.
  16. Пользователь вводит целое положительное число $N$, если оно не соответствует критериям (то есть не является положительным), выведете сообщение об ошибке, в противном случае выведите на экран все числа последовательности, не большие $N$, сформированной следующим образом:

    8 10 3 12 14 3 16 18 3 20 22 3 и т.д.

    — то есть всё начинается с восьмерки, затем число увеличивается на 2, затем выводит тройка и ещё пара увеличенных на 2 чисел и т.д.

  17. Модифицируйте решение предыдущей задачи. так чтобы пользователь вводил второе число $M$, которое отвечало бы за длину возрастающего фрагмента, например для $M=4$:

    $ underbrace{8 ;10 ;12 ;14}_{text{четыре числа}} ;3 underbrace{;16 ;18 ;20 ;22}_{text{четыре числа}} ;3 ; …. ;3 ;…. ;text{и т.д.} $

    Заметьте. что в предыдущей задаче $M$ было зафиксировано $=2$:

    $ underbrace{8 ;10}_{text{два числа}} ;3 underbrace{;14 ;16}_{text{два числа}} ;3 ; …. ;3 ;…. ;text{и т.д.} $

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

    $underbrace{; 8 ;10}_{text{два числа}} ;3; underbrace{10 ;12 ;14 }_{text{три числа}} ;3; underbrace{;16 ;18 ;20 ;22}_{text{четыре числа}} ;3 ; …. ;3 ;…. ;text{и т.д.} $

    ПРИМЕЧАНИЕ: эту задачу можно решить, как вложенными циклами, так и вообще одним циклом (что более изящно), при этом решение одним циклом можно сделать, как используя делимость нацело (для определения момента вывода тройки), так и не используя.

    Решите всеми тремя способами.

  19. Пользователь передает целое положительное число $N$, выведете на экран последовательность от $1$ до $N$ “ёлочкой”, например для $N = 17$:

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

    ПРИМЕЧАНИЕ: эту задачу можно решить, как вложенными циклами, так и вообще одним циклом (что более изящно).

    Решите указанными двумя способами.

  20. Модифицируйте предыдущий вывод “ёлочкой” так, чтобы в каждой нечетной строке выводились только четные числа, а в каждой четной только нечетные, например для $N = 17$:

    3 4 6 7 9 12 14 15 17

  21. Пользователь передает целые положительные число $N$ и $M$, выведете на экран последовательность от $1$ до $N$, так чтобы ширина “ёлочки” увеличивалась до $M$ чисел, то уменьшалась до $1$. Например, для $M = 3$ и $N = 25$ получим:

    $

    1; \

    2; 3; \

    4; 5; 6;;;;;;;;; text{–максимум три числа} \

    7; 5; \

    9; \

    10; 17; \

    18; 19; 20;;;;;;; text{–снова три числа} \

    21; 22; \

    23; \

    24; 25;…..

    $

  22. Пользователь передает целые положительные число $N$, выведете на экран последовательность от $1$ до $N$, так чтобы ширина “ёлочки” росла волнами. Например, для $N = 49$ получим:

    $

    1; \

    2; 3; ;;;;;;;; text{–сначала до двух} \

    4; \

    5; 6; \

    7; 8; 9; ;;;;;;;; text{–потом до трёх} \

    10; 11; \

    12; ;;;;;;;; text{–возвращаемся к одному} \

    13; 14; \

    15; 16; 17; \

    18; 19; 20; 21; ;;;;;;;; text{–тут уже четыре} \

    22; 23; 24; \

    25; 26; ;;;;;;;; text{–снова убывает } \

    27; \

    28; 29; \

    30; 31; 32; \

    33; 34; 35; 36; \

    37; 38; 39; 40; 41; \

    42; 43; 44; 45; \

    46; 47; 48; \

    49;

    $

Источник

Pascal цикл внутри цикла

Операторы цикла в паскале

Циклы – одна из самых больших тем в паскале , по совместительству одна из самых сложных.

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

Что такое цикл , для чего он нужен , как используется и другое

Что такое цикл. Цикл – это повторения определенного участка кода N количество раз. Циклы также можно встретить в повседневной жизни и при этом довольно часто. Например : мыть посуду пока она не закончится.

Циклы имеют свои условия окончания , например : пока a больше b.

В языке программирования pascal предусмотрено 3 вида циклов. Первый цикл это for , второй – while, третий – repeat. Все они немного отличаются друг от друга и все же они довольно простые.

Цикл for :

Цикл for

Результат выполнения данной программы будет таким – на экран будут выведены цифры 1 , 2 , 3 , 4 и 5.

На картинке показано как именно записывается этот самый цикл for. Вначале пишется слово for далее мы обозначаем переменную – счетчик и задаем ей начальное значение , в нашем случае это переменная i ( i:= 1 ).

Её значение ( которое мы задали ) равно 1 , переменной – счетчику можно задать любое целое значение , например : 0,1,2,3 …

Важно запомнить , что переменная счетчик ( её тип ) должен быть целым !

Далее пишется слово to и после него целое число ( конечное значение переменной -счетчика ). В конце слово do ( делай ).

После слова do идет тело цикла ( команды ). Следует помнить о том , что в теле цикла выполняется только первая команда. Для того , чтобы в теле цикла выполнялось сразу несколько команд их следует заключать в блок begin end.

Цикл for Коротко о том , как работает этот цикл , в чем его преимущество и как его можно использовать. Вначале работы цикла переменная i равна 1 , далее выполняется первый шаг цикла . После того , как тело цикла будет выполнено , переменная счетчик возрастает на 1.

Поэтому после переменная i равна двум. И так далее пока i не станет равна 5 , при этом тело цикла выполнится , когда переменная i равна 5.

Пример его использования такой – например нам нужно заполнить массив значениями с клавиатуры. Это делается так , как показано на картинке ниже.

Цикл for

Цикл while :

Отличие цикла while от цикла for заключается в том , что цикл while не имеет переменную счетчика . Аналог работы программы , которая выводит циклом for 5 цифр будет выглядеть так :

Цикл while Как видно по картинке , в этом виде цикла есть только условие , в нашем случае это – пока i меньше либо равно 5 ( до цикла мы задали переменной i значение 1 ). Тело цикла заключается в блок begin end , так как они нужны для использования нескольких команд ( больше одной ) в цикле.

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

Немного о том , как работает данные цикл. Вначале работы цикла проверяется условие , если оно истинно , то выполняется тело цикла. После выполнения тела цикла снова проверяется условие , если оно истинно то тело выполнится ещё раз. И так далее пока условие не станет ложным. Как только условие становится ложным , тело цикла не выполняется и программа идет дальше.

Цикл repeat :

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

Цикл repeat Такой цикл закончится тогда , когда переменная i станет больше 5. Тело цикла записывается между словами repeat until.

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

Вложенные циклы :

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

Код

program mypascal;

uses

crt;

var

a: array[1..10,1..10] of integer;

i,i1:integer;

begin

for i:= 1 to 10 do

for i1:= 1 to 10 do

a[i,i1]:= random(11)+1;

end.

Break :

Команда break позволяет выйти из цикла в любое время и на любом шаге. Данная команда довольно часто используется , поэтому вам следует запомнить её. Для чего нужна команда break ? Допустим , мы имеем очень большой массив с числами ,в котором нам нужно найти всего одно отрицательное число ( меньше 0 ). Как только цикл находит первое отрицательное число мы можем выйти из него , так как остальные шаги в цикле будут бесполезны и займут очень большое время. Как это работает :

Код

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

program mypascal;

uses

crt;

var

a: array[1..1000] of integer;

i:integer;

begin

for i:= 1 to 1000 do

a[i]:= random(21)-10;

for i:= 1 to 1000 do

if ( a[i] < ) then

begin

writeln(a[i]);

break;

end;

end.

Вначале программы мы заполняем массив длинной в 1000 ячеек ( диапазон значений от -10 до 10 ). После это начинаем цикл. Как только находим отрицательное число , выводим его и выходим из цикла , чтобы не тратить время. При этом переменная i будет равна шагу , на котором было найдено отрицательное число.

Continue :

Данная команда работает почти так же как и break , однако она не выходит из цикла , а лишь завершает шаг , на котором находится цикл. Если мы поставим команду contineu в середине тела цикла , то цикл будет выполнять лишь половину цикла. Узнать о работе с файлами в Паскаль

[Всего голосов: 12 Средний: 3.9/5]

Источник

Читайте также:  Что зависит от цикла месячных