34854

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

Лекция

Информатика, кибернетика и программирование

Для любого оператора цикла вход в цикл возможен только через его начало выход осуществляется как вследствие естественного окончания цикла так и путем выполнения оператора перехода GOTO или процедур выхода содержащихся внутри цикла. Счетный оператор цикла FOR реализует циклический процесс с известным числом повторений и имеет две формы записи: Первая форма позволяет наращивать параметр цикла на единицу: FOR параметр цикла := min.значение DO оператор ; параметр цикла это переменная целого либо любого порядкового типа min и mx...

Русский

2013-09-08

77 KB

5 чел.

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

Для многократного повторения одних и тех же действий в ТР предусмотрены три оператора цикла:

1) счетный оператор цикла (оператор цикла с параметром) - FOR

2) оператор цикла с предусловием - WHILE

3) оператор цикла с постусловием – REPEAT

Если число повторений цикла (или итераций) заранее неизвестно, однако известно условие завершения цикла, в таких случаях примеряются операторы  WHILE и REPEAT.

Если число повторений известно, то применяется оператор FOR.

 

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

Счетный оператор цикла FOR реализует циклический процесс с известным числом повторений, и имеет две формы записи:

Первая форма позволяет наращивать параметр цикла на единицу:

FOR <параметр цикла>:= <min.значение> ТО <mаx.значение> DO <оператор>;

<параметр цикла> - это переменная целого либо любого порядкового типа, <min> и <max> значения - это выражения, определяющие соответственно начальное и конечное значения параметра цикла.
Их типы должны быть совместимыми для присваивания с параметром цикла.

Вторая форма позволяет уменьшать на единицу значение параметра цикла:

FOR<параметр цикла>:=<max.значение> DОWNTO<min.значение> DO 

<оператор>;

Если  начальное значение превышает (или не превышает во второй форме) или равно конечному значению с самого начала, <оператор> (стоящий после DO) не выполнится ни разу.

Вот примеры оператора цикла с параметром:

-----------------------------------------------------------

Program L_1;

   var p, x, i: integer;

     begin

      writeln('введите x');

        read(x);

          p:=1;

           for i:=1 to 5 do

                p:=p*sqr(x);

               writeln('p=',p);

      end.

-------------------------------------------------------------

F9 – ctrl+F9 – alt+F5 –

получим результат

введите x                                                                     

3                                                                             

p=59049  

                                                                   

введите x                                                                     

5                                                                             

p=9765625   

В этом примере значение переменной x возводится в квадрат, затем полученная величина присваивается переменной p и так пять раз.

---------------------------------------

Program L;

 var i: char;

   begin

     for i:='z' downto 'a' do

       write(i,’ ‘);

   end.

---------

ответ:

z y x w v u t s r q p o n m l k j i h g f e d c b a

В этом примере оператор цикла с параметром использован для вывода букв латинского алфавита в обратном порядке (с z до a). Дело в том, что тип Char является порядковым, причём буквы начала алфавита (как значения типа Char), считаются меньше букв, взятых в конце алфавита. Не будет, например, ошибочным неравенство

                             A<B;  d<f

-------------------------------------------------------------

Program L;

 var i:integer;

   begin

    writeln;

    for i:=170 downto 100 do

       write(chr(i),’ ‘);

   end.

---------

ответ:

к й и з ж е д г в б а Я Ю Э Ь Ы Ъ Щ Ш Ч Ц Х Ф У Т С Р П О Н М Л К Й И З Ж Е Д Г В Б А ⌂ ~ } | { z y x w v u t s r q p o n m l k j i h g f e d

-------------------------------------------------------------------------------------------------

 Program L;

 var i:char;

   begin

    writeln;

     for i:='z' downto 'a' do

       write(ord(i),' ');

   end.

----------

Ответ:

122 121 120 119 118 117 116 115 114 113 112 111 110 109 108 107 106 105 104 103 102 101 100 99 98 97

---------------------------------------------------------------------------------------------------

Пример:

 Вычислить Y=1+1/2+1/3+…+1/N;

Для реализации программы необходимо многократно произвести вычисления по формуле Y=1+1/i при изменении параметра i от 1 до N 

------------------------------------------------------------------------------------------------                                                                                                                                                                                                   Реализация 1: 

Program L_2;

var i, N: integer;

    y: real;

  begin

     writeln('введите N');

     read(N);

      y:=0;

       for i:=1 to N do

         y:=y+1/i;

         writeln('y=',y:5:2);

   end.

---------------------------------------------------------------------

Ответ:

введите N

6

y= 2.45

введите N

2

y= 1.50

---------------------------------------------------------------------

Реализация 2:  

Program L_2;

var i, N: integer;

    y: real;

  begin

     writeln('введите N');

     read(N);

      y:=0;

       for i:=N downto 1 do

         y:=y+1/i;

         writeln('y=',y:5:2);

   end.

---------------------------------------------------------------------

Ответ:

введите N

6

y= 2.45

введите N

2

y= 1.50

---------------------------------------------------------------------------------

Значение параметра цикла в теле цикла может не использоваться, а лишь выполнять функцию счетчика. Например, пусть необходимо вычислить Y=Xn. Тогда фрагмент тела программы запишется в следующем виде:

              .

              .

Y:=1;

 FOR i:=1  ТО  N  DO  Y=Y*X;

.

.

Пример вложенности операторов с применением оператора IF:

------------------------------------------------------------------------------------

Program L5;

 var i, n: integer;

       p:longint;

  begin

    writeln('введите n');

      read(n);

       p:=1;

        for i:=1 to n do

           begin

           if i mod 2=0 then

              begin

               p:=p*i;

               writeln(p:8);

                end;

                 end;

       end.

---------------------------------------------------------------------------------

Ответ:

введите n

6

      2

      8

     48

---------------------------------------------------------------------------------

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

Оператор цикла с предусловием используется в случае, когда число повторений цикла заранее не известно и действия в цикле по условию могут ни разу не выполниться. Структура этого оператора имеет вид:

WHILE <условие> DO <оператор>;

WHILE«пока»;  DO – «выполнить».

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

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

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

Пример. Вычислить Y=1+1/2+1/3+...+1/N.  

-------------------------------------------------------------------------------------

       Программа с применением оператора WHILE может быть составлена в следующем виде:

Program L15_2;

  var

       i, n: integer;

        y: real;

 begin

    writeln(‘введите N’);

     read(N);

                         Y:=0;

                           i:=1;

while i<= N   do

                                                      begin

                                                                   Y:=Y+1/i;

i:=i+1

end;

                              writeln(‘y=’,y:5:2);

                end.

---------------------------------------------------------------------

ответ:

введите n

7

  y= 2.59

-----------------------------------------------------------------------

    Пример:

   Для значения a=0.5 протабулировать функцию  при изменении аргумента x на интервале [0,2] с шагом равным dx=a/2.

------------------------------------------------------------------------

Program L5_3;

 const a=0.5;

  var x, p: real;

   begin

    x:=0;

     while x<=2 do

                          begin

                             p:=sqr(x)*exp(((-x)*x)/a);

                             x:=x+a/2;

                              writeln(p:5:5);

                         end;

    end.

------------------------------------------------------------------------

Ответ:

0.00000

0.05516

0.15163

0.18262

0.13534

0.06865

0.02500

0.00670

0.00134

-----------------------------------------------------------------------

Эта же задача, но результат требуется записать в виде таблицы

Program L5_3;

 const a=0.5;

  var x, p: real;

        n: integer;

   begin

      writeln('---------------------');

      writeln(' n   |   x    |     p    ');

      writeln('---------------------');

    x:=0;

    n:=0;

     while x<=2 do

            begin

             p:=sqr(x)*exp(((-x)*x)/a);

             x:=x+a/2;

             n:=n+1;

            writeln(n:3,'   ',x:5:2,'   ',p:5:5);

            end;

     writeln('----------------------');

    end.

_____________________________________________________

Ответ:

--------------------------

n  |    x    |     p

--------------------------

 1   0.25   0.00000

 2    0.50   0.05516

 3    0.75   0.15163

 4    1.00   0.18262

 5    1.25   0.13534

 6    1.50   0.06865

 7    1.75   0.02500

 8    2.00   0.00670

  9    2.25   0.00134

---------------------------

_____________________________________________________

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

REPEAT <оператор1>;

                . . .

               <операторN>

UNTIL <условие_выхода>;

REPEAT«повторять до тех пор»;

UNTIL«пока не будет выполнено условие».

(PEREAT и UNTIL – зарезервированные слова).

<оператор1>. . .<операторN> - любой оператор ТР

<условие выхода> - выражение логического типа.

При истинности значения логического выражения <условие_выхода> выполняется выход из цикла. В данном операторе ключевые слова REPEAT и UNTIL выполняют роль операторных скобок, поэтому точку с запятой перед словом UNTIL не ставят.

Оператор цикла REPEAT отличается от WHILE 

    во-первых:

   здесь условие проверяется после выполнения тела цикла. Иными   словами, гарантируется хотя бы однократное его выполнение;

   во-вторых:

   оператор REPEAT выполняется до тех пор, пока условие равно false, и управление передаётся следующему (за repeat) оператору, когда условие становится равным true (для оператора while имеет место обратная зависимость).

Пример фрагмента программной реализации вычисления значения Y=1+1/2+1/3..+1/N при использовании оператора цикла с постусловием.

.

.

begin

Y:=0;

  i:=1;

Repeat

             Y:=Y+1/i;

                                  i:=i+1

                  until i>N;

       end.

Пример:

 Вычислить сумму с точностью E=0.00001

     Y=1+x/3+x2/5+x3/7+…+xn/(2n+1)+…

               где |x|<1,

     т.е. когда очередное слагаемое будет меньше E, мы заканчиваем вычисление.

-------------------------------------------------------------------

Program l5_4;

 const e=0.00001;

   label M;

    var

       i, n: byte;

       x, y, r: real;

       begin

        M: writeln('введите x');

              read(x);

               if abs(x)>=1 then goto M;

                 y:=1;

                 n:=1;

                  repeat

                       r:=1;                 {расчёт x в степени n}

                       for i:=1 to n do {             ---\\---           }

                               r:=r*x;      {             ---\\---           }

                              y:=y+r/(2*n+1); {расчёт суммы, к итогу добавляется новое слагаемое}

                              n:=n+1         {переход к следующему слагаемому}

                                 until(r/(2*n+1))<e;

                                  writeln('y=',y:7:5);

           end.

-------------------------------------------------------------------

Ответ:

введите x

0.5

y=1.24644

введите x

2

введите x

0.9

y=1.91674

--------------------------------------------------------------------

Или эта же задача, но без r

Program l5_4;

 const e=0.00001;

   label M;

    var

       i, n: byte;

       x, y: real;

       begin

        M: writeln('введите x');

              read(x);

                if abs(x)>=1 then goto M;

                   y:=1;

                   n:=1;

                   repeat

                    y:=y+exp(n*ln(x))/(2*n+1); {расчёт суммы, к итогу добавляется новое слагаемое}

                           n:=n+1      {переход к следующему слагаемому}

                            until(exp(n*ln(x))/(2*n+1))<e;

                                writeln('y=',y:7:5);

           end.

--------------------------------------------------------------------------

Ответ: тот же


 

А также другие работы, которые могут Вас заинтересовать

44946. Организация вычисляемого перехода 41.46 KB
  Вычисляемый переход осуществляется при помощи команды ddwf PCF которая формально описывается так: сложить содержимое регистров W и PC с сохранением результата сложения в регистре PC имеется ввиду младший байт счетчика команд с названием PCL. Для вычисляемого перехода адрес в PC на момент исполнения команды ddwf PCF является как бы начальной точкой отсчета т. число находящееся в регистре W на момент исполнения команды ddwf PCF которое и будет приращением счетчика команд PC.
44947. Динамическая индикация 59.87 KB
  Для краткости эти регистры обозначим под названиями LED с соответствующей нумерацией. Например если результат измерения подсчета нужно вывести на индикацию как 4 разрядное десятичное число то двоичный результат измерения “прогоняется†через двоично-десятичное преобразование о нем позднее в итоге которого результат измерения помещается в младшие полубайты 4х регистров LED от LED0 до LED3.0 MHz ; DtL equ 0Ch DtH equ 0Dh D_H equ 0Eh D_L equ 0Fh Step equ 1Bh Led0 equ 1Ch Led1...
44949. Работа с EEPROM памятью данных 61.93 KB
  Поставим перед собой достаточно простую и конкретную задачу (что-то типа задания на первоначальную разработку). Допустим, что в ходе исполнения программы нужно изменить (модифицировать) содержимое пяти ячеек EEPROM памяти, начиная с адреса 7. Для простоты модификации (и для обеспечения наглядности наблюдения за происходящими в EEPROM памяти изменениями) к первому числу (по адресу 7) необходимо добавить 1...
44950. Однокристальные микроконтроллеры серии PIC 231 KB
  Микроконтроллеры семейств PIC (Peripheral Interface Controller) компании Microchip, обладающие особой популярностью, построены на основе передовых технологий микроконтроллеров. Им свойственны следующие особенности: электрически программируемые пользователем ППЗУ, минимальное энергопотребление, высокая производительность, хорошо развитая RISC-архитектура
44952. Автоколебательный мультивибратор 33.87 KB
  Проанализируем нашу программу, реализующую функцию автоколебательного мультивибратора, с одним выходом. Форма сигнала меандр (скважность, т.е. отношение периода к длительности импульса – 2). Под этот выход можно назначить любой из выводов порта А или В...
44953. Устройство формирования сигнала тонального вызова 87.52 KB
  Полупериоды формируем используя €œзакольцовку рабочей точки программы в подпрограммах задержки по аналогии с программой Multi. К моменту начала составления текста программы желательно определиться с как можно большим количеством исходных данных. Так как программа должна исполняться непрерывно то в случае нахождения устройства в режиме ожидания включения на передачу рабочая точка программы должна €œзакольцеваться€ до последующего нажатия на кнопку в какой-нибудь подпрограмме. Часто такого рода закольцовки осуществляют в...
44954. Сканирование с прерыванием 110.21 KB
  Определимся с терминологией применяемой при описании программы работы устройства. Для удобства объяснения и восприятия целесообразно разделить рабочую часть программы на две части. Условимся называть группу команд в которой осуществляется сканирование каналов на наличие сигнала прерывания “основным телом†программы а часть которая отрабатывается после ухода в прерывание как подпрограмму прерывания. Следовательно речь идет о необходимости “ухода†рабочей точки программы на время наличия сигнала прерывания в подпрограмму...