мета-данные страницы
  •  
Загрузка не удалась. Возможно, проблемы с правами доступа?

Различия

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

Ссылка на это сравнение

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
pascal:iterations [20/10/2010 14:11] ocapascal:iterations [20/10/2010 14:28] (текущий) oca
Строка 47: Строка 47:
 Часть оператора, которая определяет условие окончания исполнения цикла, называется __заголовком цикла__. Повторяемые операторы образуют __тело цикла__, а однократное исполнение тела цикла называется __итерацией__. С помощью заголовка, оператор цикла управляет тем, как будут выполняться операторы тела цикла при каждом вызове программы, в зависимости от конкретных входных данных и пути, которым пошло выполнение алгоритма. Кстати, путь, которым  пошло выполнение алгоритма в каждом конкретном случае, на самом деле тоже определяется входными данными. Просто это не всегда очевидно. Различные требования к описанию того, как именно организуется повторение операторов тела, определяют разнообразие операторов цикла.  Часть оператора, которая определяет условие окончания исполнения цикла, называется __заголовком цикла__. Повторяемые операторы образуют __тело цикла__, а однократное исполнение тела цикла называется __итерацией__. С помощью заголовка, оператор цикла управляет тем, как будут выполняться операторы тела цикла при каждом вызове программы, в зависимости от конкретных входных данных и пути, которым пошло выполнение алгоритма. Кстати, путь, которым  пошло выполнение алгоритма в каждом конкретном случае, на самом деле тоже определяется входными данными. Просто это не всегда очевидно. Различные требования к описанию того, как именно организуется повторение операторов тела, определяют разнообразие операторов цикла. 
  
-Операторы повторяются либо заранее указанное количество раз (цикл ''for''), либо до тех пор, пока верно (или неверно) некоторое условие (циклы ''while'' и ''repeat'' соответственно). Явное указание количества итераций является частным, но важным случаем выходного условия. +Операторы повторяются либо заранее указанное количество раз (цикл ''for''), либо до тех пор, пока верно (или неверно) некоторое условие (циклы ''while'' и ''repeat'' соответственно). Явное указание количества итераций является частным, но важным случаем выходного условия. Примерами циклов в могут быть команды "сделать десять шагов вперёд", "тереть, пока не протрёшь дырку" и т.д
  
 Также существуют команды, которые позволяют управлять оператором цикла из тела цикла. Хотя с точки зрения теории программирования считается, что цикл должен завершаться в соответствии с заголовком, на практике целесообразно допускать в отдельных случаях досрочный выход из цикла согласно условиям, указанным в теле цикла.  Также существуют команды, которые позволяют управлять оператором цикла из тела цикла. Хотя с точки зрения теории программирования считается, что цикл должен завершаться в соответствии с заголовком, на практике целесообразно допускать в отдельных случаях досрочный выход из цикла согласно условиям, указанным в теле цикла. 
Строка 53: Строка 53:
 Обычно при выполнении тела цикла производится многократный пересчёт одной или нескольких переменных, пока не будет достигнут нужный результат или не станет ясно, что он недостижим. Как правило, именно изменение состояния каких-то целевых переменных является целью выполнения цикла. С другой стороны, часто смыслом цикла является исполнение некоторых желательных для пользователя чисто внешних по отношению к программе действий, либо ожидание некоторого события. Но в любом случае, для того чтобы цикл мог завершиться, абсолютно необходимо, чтобы в системе что-то изменилось. Обычно при выполнении тела цикла производится многократный пересчёт одной или нескольких переменных, пока не будет достигнут нужный результат или не станет ясно, что он недостижим. Как правило, именно изменение состояния каких-то целевых переменных является целью выполнения цикла. С другой стороны, часто смыслом цикла является исполнение некоторых желательных для пользователя чисто внешних по отношению к программе действий, либо ожидание некоторого события. Но в любом случае, для того чтобы цикл мог завершиться, абсолютно необходимо, чтобы в системе что-то изменилось.
  
-Случай, когда программа не в состоянии завершить один из своих циклов, называется __зацикливанием__. Оно очень похоже на зависание программы, но обычно под зависанием понимается переход отдельной программы или всей системы в неработоспособное состояние, в то время как зацикливание – это просто такой способ "нормальной" работы отдельной программы, который не приводит ни к какому результату. Для правильно работающей системы это не должно представлять никакой опасности, хотя данный запуск программы придется прервать. Зацикливание является проявлением неправильности алгоритма данной программы, в то время как зависание может быть вызвано аппаратными сбоями. Зависание как правило относится ко всей системе.+Случай, когда программа не в состоянии завершить один из своих циклов, называется __зацикливанием__. Оно очень похоже на зависание программы, но обычно под зависанием понимается переход отдельной программы или всей системы в неработоспособное состояние, в то время как зацикливание – это просто такой способ "нормальной" работы отдельной программы, который не приводит ни к какому результату. Для правильно работающей системы это не должно представлять никакой опасности, хотя данный запуск программы придется прервать принудительно. Зацикливание является проявлением неправильности алгоритма данной программы, в то время как зависание может быть вызвано аппаратными сбоями. 
  
 Большой цикл, который запрашивает очередное действие пользователя, ожидает ответной команды, реагирует на нее и вновь переходит в состояние ожидания, лежит в основе всех интерактивных программ, т.е. программ, которые постоянно взаимодействуют с пользователем, в отличие от неинтерактивных или пакетных программ, которые раз получив начальные данные, работают дальше автоматически. Подобно интерактивным программам ведёт себя большинство программ, взаимодействующих с тем или иным оборудованием, включая драйвера, которые берут на себя обеспечение взаимодействия отдельных аппаратных компонент со всей остальной системой. Как правило, если предполагается, что программа обрабатывает данные или выполняет команды, что в данном случае фактически одно и тоже, поступающие от какого-то внешнего источника, то для того, чтобы отсеять или переспросить опасные, непонятные или заведомо неверные данные и команды, их обработка тоже должна вестись с помощью цикла, иначе ничего не помешает "недобросовестному" источнику повторить "некачественный" ввод. Большой цикл, который запрашивает очередное действие пользователя, ожидает ответной команды, реагирует на нее и вновь переходит в состояние ожидания, лежит в основе всех интерактивных программ, т.е. программ, которые постоянно взаимодействуют с пользователем, в отличие от неинтерактивных или пакетных программ, которые раз получив начальные данные, работают дальше автоматически. Подобно интерактивным программам ведёт себя большинство программ, взаимодействующих с тем или иным оборудованием, включая драйвера, которые берут на себя обеспечение взаимодействия отдельных аппаратных компонент со всей остальной системой. Как правило, если предполагается, что программа обрабатывает данные или выполняет команды, что в данном случае фактически одно и тоже, поступающие от какого-то внешнего источника, то для того, чтобы отсеять или переспросить опасные, непонятные или заведомо неверные данные и команды, их обработка тоже должна вестись с помощью цикла, иначе ничего не помешает "недобросовестному" источнику повторить "некачественный" ввод.
 +
 +
  
 ==== Цикл с предварительным условием (While-Do) ==== ==== Цикл с предварительным условием (While-Do) ====
Строка 68: Строка 70:
 Действие данного цикла проявляется следующим образом. В начале каждой итерации проверяется логическое условие, которое может быть либо логическим выражением, результатом которого может быть ответ "да" или "нет", либо переменной типа Boolean. Например: Действие данного цикла проявляется следующим образом. В начале каждой итерации проверяется логическое условие, которое может быть либо логическим выражением, результатом которого может быть ответ "да" или "нет", либо переменной типа Boolean. Например:
  
-Многие компиляторы запрещают в заголовке цикла константные выражения, т.е. выражения, значения которых определены до начала работы программы.  Turbo и Free Pascal допускают в качестве условия логические константы TRUE (Истина) и FALSE (Ложь) для реализации бесконечных циклов. Затем тело цикла выполняется только в том случае, если условие выполнено. Если условие выполения изначально ложно, то цикл не исполняется ни разу, но это не считается ошибкой, а нормальным выполнением программы!+
  
 Используя цикл While, следует помнить, что в теле цикла должны либо быть команды, которые изменяют результат проверки условия выполнения, либо явный выход из цикла. Поэтому, тело оператора While обычно содержит несколько исполняемых операторов и нуждается в операторных скобках Begin-End. Используя цикл While, следует помнить, что в теле цикла должны либо быть команды, которые изменяют результат проверки условия выполнения, либо явный выход из цикла. Поэтому, тело оператора While обычно содержит несколько исполняемых операторов и нуждается в операторных скобках Begin-End.
Строка 77: Строка 79:
 <code pascal| Цикл While-Do> <code pascal| Цикл While-Do>
 writeln('Печатаем числа от 1 до 10'); writeln('Печатаем числа от 1 до 10');
-While (i <10) Do +While (i >0) Do 
   { Потеряны Begin и End? }   { Потеряны Begin и End? }
-  writeln(i); +  writeln(10 - i);
  { Судя по коду, значение i - неопределено }  { Судя по коду, значение i - неопределено }
-  i:=i+1;  +  i:=i-1;  
-  { Эта команда никогда не выполнится }+  { Эта команда может никогда не выполнится }
 </code>   </code>  
  
Строка 89: Строка 91:
 <code pascal| Цикл While-Do> <code pascal| Цикл While-Do>
 writeln('Печатаем числа от 1 до 10'); writeln('Печатаем числа от 1 до 10');
-i:=1; +i:=9;
  { Инициализация }  { Инициализация }
-While (i <10) Do +While (i >0) Do 
 Begin Begin
-  writeln(i);  +  writeln(10-i);  
-  i:=i+1; +  i:=i-1;
   { Шаг цикла }   { Шаг цикла }
 End;   End;  
 </code> </code>
  
-|<latex> \frac{q}{3} </latex>|w|e|r|t|| + 
-|1|2|3|4|5|6|+==== Общие замечания ==== 
 + 
 +Многие компиляторы запрещают в заголовке цикла константные выражения, т.е. выражения, значения которых определены до начала работы программы.  Turbo и Free Pascal допускают в качестве условия логические константы TRUE (Истина) и FALSE (Ложь) для реализации бесконечных циклов. Затем тело цикла выполняется только в том случае, если условие выполнено. Если условие выполения изначально ложно, то цикл не исполняется ни разу, но это не считается ошибкой, а нормальным выполнением программы! 
 +