Войти
Android, Windows, Apple, Ликбез. Социальные сети. Драйверы
  • Японские телефоны Новый японский смартфон
  • Lenovo G500S: характеристики, основные особенности
  • Определяем серию продукта видеокарт Nvidia Характеристики карты nvidia 9800 gt
  • А конкуренты у смартфона есть
  • Что такое расширение файла TRZ?
  • Не работает динамик в "айфоне"
  • Общий вид цикла с предусловием. Цикл с предусловием WHILE

    Общий вид цикла с предусловием. Цикл с предусловием WHILE

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

    Важность циклов в программировании

    Чем же является цикл? Зачем он необходим и какие преимущества получает программист при его использовании? Цикл является важной структурной составляющей программирования, которая позволяет автоматизировать выполнение определённого ряда действий, при условии что соблюдаются установленные параметры. Так, самый простой пример работы цикла - это поднесение определённого числа в степень. Нет нужды прописывать рядки до тех пор, пока не будет достаточно, ведь техника может всё сделать автоматически с его помощью. При практической реализации циклы также позволяют сэкономить много времени и труда, так как при использовании цикла нет необходимости каждый раз и на все действия прописывать программный код. Достаточно ввести заменяемые переменные и запустить реализацию. Но как построена схема цикла? Или даже нескольких? Самих вариантов реализации цикла довольно много - информации на целую книжку про программирование, "Паскаль" мы будем рассматривать или "Ассемблер". Поэтому в чисто ознакомительных целях предлагаем разобрать теоретическую схему работы двух самых популярных в использовании:

    1. Цикл с постусловием.
    2. Цикл с предусловием.

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

    while «условие» do «программный код»

    Общетеоретическая база цикла с постусловием

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

    «Программный код»

    until «Условие»

    Общетеоретическая база цикла с предусловием

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

    Практическая реализация в различных языках программирования

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

    Заключение

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

    Оператор цикла while организует выполнение одного оператора (простого или составного) неизвестное заранее число раз.

    Формат цикла while : while (B) S;

    где B

    S – тело цикла - оператор (простой или составной).

    Перед каждым выполнением тела цикла анализируется значение выражения В: если оно истинно, то выполняется тело цикла, и управление передается на повторную проверку условия В; если значение В ложно – цикл завершается и управление передается на оператор, следующий за оператором S.

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

    Пример:

    n.

    static void Main()

    Console.Write("N= ");

    while (i <= n) //пока i меньше или равно n

    //выводим i на экран, затем увеличиваем его на 1

    Console.Write(" "+ i++);

    Результат:

    1 2 3 4 5 6 7 8 9 10

    Цикл с постусловием

    Оператор цикла do while также организует выполнение одного оператора (простого или составного) неизвестное заранее число раз. Однако в отличие от цикла while условие завершения цикла проверяется после выполнения тела цикла.

    Формат цикла do while : do S while (B);

    где В – выражение, истинность которого проверяется (условие завершения цикла);

    S – тело цикла - оператор (простой или блок).

    Сначала выполняется оператор S, а затем анализируется значение выражения В: если оно истинно, то управление передается оператору S, если ложно - цикл завершается, и управление передается на оператор, следующий за условием B. Так как условие В проверяется после выполнения тела цикла, то в любом случае тело цикла выполнится хотя бы один раз.

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

    Пример:

    Вывод на экран целых чисел из интервала от 1 до n.

    static void Main()

    Console.Write("N= "); int n=int.Parse(Console.ReadLine());

    do Console.Write(" " + i++);

    while (i <= n); //пока i меньше или равно n

    Цикл с параметром

    Цикл с параметром имеет следующую структуру:

    for (<инициализация>; <выражение>; <модификация>) <оператор>;

    Инициализация используется для объявления и/или присвоения начальных значений величинам, используемым в цикле в качестве параметров (счетчиков). В этой части можно записать несколько опе­раторов, разделенных запятой. Областью действия переменных, объявленных в части инициализации цикла, является цикл и вложенные блоки. Инициализация выполняется один раз в начале исполнения цикла.

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

    Модификация выполняется после каждой итерации цикла и служит обычно для изменения параметров цикла. В части модификация можно записать несколько операторов через запятую.

    Оператор (простой или составной) представляет собой тело цикла.

    Любая из частей оператора for (инициализация, выражение, модификация, оператор) может отсутствовать, но точку с запя­той, определяющую позицию пропускаемой части, надо оставить.

    static void Main()

    Console.Write("N= ");

    int n=int.Parse(Console.ReadLine());

    for (int i=1; i<=n;) //блок модификации пустой

    Console.Write(" " + i++);

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

    Циклы могут быть простые или вложенные (кратные, циклы в цикле). Вложенными могут быть циклы любых типов: while, do while, for . Каждый внутренний цикл должен быть полностью вложен во все внешние циклы. «Пересечения» циклов не допускаются.

    В чем сложность?: Заранее не определено и неизвестно, сколько цифр нужно убрать, т.е. сколько шагов необходимо сделать.
    Как выполнить: Надо перестать отделять цифры, когда n = 0 , т.е. надо выполнять пока n > 0

    Решение примера на Паскале:


    Цикл while в Паскале применяется для создания повторений с неизвестным заранее их числом . Повторения () будут осуществляться, пока истинно некоторое условие .

    Блок-схема, соответствующая циклу while в Паскале:

    while условие do {Пока условие истинно выполняется оператор} оператор;

    • Здесь оператор, стоящий после служебного слова do , образует тело цикла и будет выполняться, пока значение "условия" равно true (истина).
    • Если операторов должно быть несколько, тогда необходимо применять .
    • Условие пересчитывается каждый раз при входе в цикл.
    • Непосредственно условием цикла while может быть переменная или .
    • Операторы тела цикла while выполнятся только в том случае, если условие будет истинно, если условие ложно — они игнорируются, и программа продолжается с тех операторов, которые стоят уже после конструкции. Таким образом, это существенное отличие цикла с предусловием от .

    Рассмотрим использование цикла while в Паскале на решенном примере:

    Пример: Печатать «ноль» указанное количество раз

    Показать решение:

    1 2 3 4 5 6 7 8 9 10 var i, n: integer ; begin write ("kolichestvo znakov" ) ; readln (n) ; i: = 1 ; while i<= n do begin {составной оператор} write (0 ) ; i: = i+ 1 end ; end .

    var i,n:integer; begin write ("kolichestvo znakov"); readln(n); i:=1; while i<=n do begin {составной оператор} write(0); i:=i+1 end; end.

    Задача 3. Ввести целое число и найти сумму его цифр.
    Пример: Введите целое число: 1234 Сумма цифр числа 1234 равна 10.

  • Можно использовать сложные условия:
  • Задача 4. Вычислять с использованием цикла while квадратные корни из чисел 900, 893, 886, 879 и т.д. до тех пор, пока это можно делать.

    Детальный разбор работы цикла While в Паскале рассмотрен в видеоуроке:

    Пример:


    которые по модулю больше 0,001 :

    Алгоритм:




    Задача 5: Вычислить сумму элементов следующей последовательности с точностью 0,001 :

    Результат: S = 1.157

    Вложенные циклы в Паскале

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

    Важно: Главным обстоятельством во вложенных циклах является использование разных переменных для счетчиков внутреннего и внешнего циклов

    Рассмотрим пример:

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

    Показать решение:

    const n = 9; {размер таблицы} var i, j:integer; begin for i:=1 to n do {номера строк} begin for j:=1 to n do {номера столбцов} write(i*j:4); writeln; {переход на новую строку} end; end.

    Произведение в Паскале

    Точно также, как существует для сложения, для умножения в паскале тоже существует специальная конструкция:

    Произведение вычисляется по рекуррентному выражению:

    где P – промежуточные произведения

    Y — сомножители

    Рассмотрим пример вычисления факториала числа в Паскале с использованием цикла while .

    Пример цикла While в Паскале для вычисления факториала 10! (10!=1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10 )

    1 2 3 4 5 6 7 8 9 10 11 12 var fact, n : integer ; begin fact : = 1 ; {начальное значение факториала =0! } n : = 1 ; {начальное значение для условия } while n<= 10 do {условие } begin {начало тела конструкции с составным оператором } fact : = fact* n; {вычисление факториала n! } n : = n + 1 {n должно меняться в теле конструкции} end ; {конец тела цикла } writeln (’10 != ’, fact) ; {вывод результата расчета } end .

    var fact, n: integer; begin fact:= 1; {начальное значение факториала =0! } n:= 1; {начальное значение для условия } while n<=10 do {условие } begin {начало тела конструкции с составным оператором } fact:= fact*n; {вычисление факториала n! } n:= n + 1 {n должно меняться в теле конструкции} end; {конец тела цикла } writeln(’10!= ’,fact); {вывод результата расчета } end.

    Здесь необходимо обратить внимание на то, что присваивание n:= 1 стоит до цикла, если этого не сделать, то условие будет работать некорректно, так как переменная n будет пуста.

    Программа возведения в степень числа в Паскале

    Для начала уточним, что есть . Но мы не будем ее использовать, а разберем алгоритм решения задачи возведения в степень.

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

    Таким образом, возведение числа n в степень d можно выразить так:
    n d = n 1 * n 2 * n 3 * … * n d , где нижние индексы просто указывают очередное по счету число n .

    Еще необходимо учесть следующее:

    • число в нулевой степени равняется 1
    • если показатель степени отрицателен, т.е. d n d = 1 / (n 1 * n 2 * n 3 * … * n d)

    Т.е., решая программу на Паскале, учитываем:

    • в программе на языке Паскаль количество итераций (повторений) цикла while должно быть равно показателю степени числа ;
    • если показатель степени - отрицательное число, то нужно впоследствии единицу разделить на результат.

    Задача 6. Вычислить в Паскале степень числа, используя цикл while .

    Цикл while называется с предусловием, т. к. проверка условия осуществляется перед каждым выполнением тела цикла. Используется, если число повторений цикла заранее неизвестно.

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

    В блок-схеме цикл while изображается так, как показано на рис. 5.3.

    Рис. 5.3. Блок-схема цикла while

    Ввод оператора цикла while осуществляется аналогично вводу цикла for, после нажатия кнопки while панели Программирование на экране появляются элементы, показанные на рис. 5.4. В первое поле введите условие выполнения цикла, и в нижнее поле операторы тела цикла. Если в теле цикла более одного оператора, то нужно воспользоваться кнопкой Add Line для добавления дополнительных операторов в тело цикла.

    Рис. 5.4. Вставка оператора цикла while

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

    Пример 5.4. Найти первый отрицательный член последовательности

    Блок-схема алгоритма решения примера:

    Пример 5.5. Вычислить значения функции при изменении аргумента х от -1 до 3 с шагом 0.5 и сформировать из этих значений вектор y .

    Эта задача уже была рассмотрена, но с использованием цикла For , решим ее с циклом While .

    Описание и вызов программы-функции:

    Пример 5.6. Найти количество и сумму цифр заданного натурального числа.Описание и вызов программы-функции:


    В данной программе используются две функции:

    · mod – выдаёт остаток при делении x на y .

    · trunc – выдает целую часть z , удаляя дробную часть.

    Пример 5.7. Составить программу для вычисления суммы членов бесконечного ряда с точностью до члена ряда .

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

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

    Описание и вызов программы-функции:



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

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

    Простейший случай вложенных циклов – двойной. В этом случае один цикл помещается внутри другого. Различные варианты вложенных циклов:

    Пример 6.1. Вычислить .

    Описание и вызов программы-функции:

    Работа вложенного цикла заключается в следующем: сначала задаётся первое значение параметра внешнего цикла i , затем управление передаётся внутреннему циклу и параметр внутреннего цикла j принимает по очереди все значения. Когда выполнение внутреннего цикла окончено, задаётся второе значение параметра внешнего цикла и вновь полностью выполняется внутренний цикл. Процесс повторяется до тех пор, пока параметр внешнего цикла не примет все значения.

    Как мы уже говорили, в паскале существуют 3 способа организации цикла (типа):

    2) Цикл с постусловием

    3) Цикл с предусловием

    Цикл В данной статье рассмотрим второй тип цикла — цикл с предусловием (цикл WHILE) . Если цикл со счетчиком мы используем в случаях, когда необходимо организовать цикл с известным числом повторений, то цикл с предусловием используется, когда число повторений неизвестно.

    WHILE условие DO действие; // тело цикла

    Тело цикла выполняется пока условие ИСТИННО.

    Если в теле цикла действий несколько — используются операторные скобки begin … end ;

    WHILE условие do begin действие_1; действие_2; действие_3; ... end;

    Рассмотрим пример, аналогичный рассмотренному в теме «Цикл со счетчиком», но реализуем его с помощью цикла WHILE .

    Требуется на экране вывести:

    Привет
    Привет
    Привет
    Привет

    Для реализации данного примера с помощью цикла с предусловием нам потребуется переменная n :

    WHILE n<4 do writeln("Привет");

    Данный цикл будет выполнять команду writeln(‘Привет’) бесконечное число раз. Почему? Потому что переменная n не изменяется и всегда будет меньше 4. Поэтому необходимо в цикле добавить код, изменяющий переменную n. Например: n:=n+1.

    WHILE n<4 do begin writeln("Привет"); n:=n+1; end;

    Теперь переменная n будет изменяться с каждым выполнением команд тела цикла (с каждой итерацией).

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

    Рассмотрим несколько задач, где число повторений в цикле явно не известно.

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

    var a,s:integer; begin s:=0; writeln("Введите число"); readln(a); while(a<>0) do begin s:=s+a; //подсчет суммы S writeln("Введите число"); readln(a); end; writeln(s); end.

    Зачем два раза используем ввод числа а (readln(a);)? Первый раз вводим число а для того, чтобы войти в цикл с некоторым значением переменной a, которое будет использоваться в условии цикла WHILE. Второй раз команда readln(a) используется внутри цикла — вводим числа до тех пор, пока не введем ноль.

    Задача 2.

    Даны два отрезка А и B (A>B). Не используя операции умножения и деления, определить, сколько отрезков В уместится в отрезке А.

    Рассмотрим изображение:

    Т.е. из рисунка видно, что нам нужно складывать длины отрезка A до тех пор, пока сумма не станет больше длины отрезка В . В этом нам поможет цикл с предусловием — цикл while .

    var a,b,s,k:integer; begin writeln("Введите длину отрезка А"); readln(a); writeln("Введите длину отрезка B"); readln(b); k:=0; S:=a; while s k:=k+1; //переменная k считает количество выполнения тела цикла s:=s+a; //суммирует длину отрезка А end; writeln("В отрезке В содержится ",k," отрезков А"); end.

    Рассмотрим работу программы на примере: А=5 , В=21 . Рассуждения запишем в таблицу:

    Задача 3.

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

    Рассмотрим блок-схему алгоритма Евклида:

    Запишем данной алгоритм с помощью Паскаля, опираясь на данную блок-схему. Как видим, у нас имеется цикл с предусловием (M>N) . Внутри цикла еще одно условие (M>N) , т.е. оператор IF… THEN .

    var M, N: integer; begin writeln("Введите М и N"); readln(M, N); while M<>N do begin if M>N then M:=M-N else N:=N-M end; write("Н0Д = ",М) end.

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

    © 2005-2017, HOCHU.UA