2. Введение в Турбо Паскаль.  

2.1.Общая характеристика языка Паскаль
2.2.Основные понятия языка Турбо-Паскаль

2.3.Операторы языка Паскаль


2.1. Общая характеристика языка Паскаль.

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

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

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

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

Для описания синтаксиса алгоритмического языка используется специальный метаязык, позволяющий в компактной форме отразить все особенности конкретных конструкций алгоритмического языка. Мы воспользуемся для этих целей металингвистическими формулами Бэкуса-Наура (язык БНФ).

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

Для каждого понятия языка должна существовать единственная метаформула, в левой части которой указывается определяемое понятие, т.е. метапеременная языка БНФ, а правая часть формулы тем или иным способом задает все множество значений этой метапеременной, т.е. все допустимые конструкции, которые объединяются в это понятие. Все метапеременные заключаются в специальные угловые скобки <  и  >, которые не принадлежат алфавиту определяемого языка, т.е. являются метасимволами, например, <выражение>, <число>  и т.д. Основные же символы языка указываются непосредственно. Левая и правая части метаформулы разделяются специальным знаком : : =, смысл которого можно интерпретировать как «по определению есть». Обычно в качестве значений метапеременной может приниматься любая из нескольких допустимых конструкций. Все допустимые конструкции указываются в правой части формулы и разделяются метасимволом "|", смысл которого можно передать словом «или» («либо»). Кроме перечисления всех возможных значений метапеременной в правой части метаформулы может быть указано правило построения значений.

наверх

2.2. Основные понятия языка Турбо-Паскаль.

 2.2.1. Алфавит языка.

Язык Турбо-Паскаль допускает использование прописных и строчных букв латинского алфавита, знака подчеркивания, арабских цифр и ограничителей. 

            <алфавит> :: = <буквы> | <цифры> | <знак подчеркивания> |<ограничители>

<буквы> :: = A | B | …| Z | a | b | …| z | <знак подчеркивания>

<цифры> :: = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

<знак подчеркивания> :: = _ 

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

<ограничители>::=<знаки операций>|<скобки> |<зарезервированные слова>| <разделители> 

<знаки операций>::= <арифметические>|<отношения>|<логические>|<над строками>|<над множествами>

<арифметические знаки операций>::=  + | - | * | / | div | mod

<знаки операций отношения>::=  = | <> | > | < | >= | <=

            <логические знаки операций>::= not | and | or | xor

<знаки операций над строками>::=  + |<знаки операций отношения>

<знаки операций над множествами>::= * | + | - | = | <> | <= | >= | in

<скобки>::= <для индексов>|<для выражений и функций>|<операторные>| <для строк>

<скобки для индексов>::=  [ ] | (.  .)

<скобки для выражений и функций>::= (  )

            <скобки операторные>::= begin  end

<скобки для строк>::= ' '

<зарезервированные слова>::= and | asm | array | begin | case | const| constructor | destructor | div | do | downto | else | end | exports | file | for | function | goto | if | implementation | in | inherited | inline | interface | label | library | mod | nil | not | object | of | or | packed | procedure | program | record | repeat | set | shl | shr |  string | then | to | type | unit | until | uses | var | while |  with | xor

<разделители>::= := | . | , | : | ; | ^ | $ | # 

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

Комментарий - это текст, заключенный между { и } или (* и *). Может содержать  буквы, цифры, специальные знаки. Используется для обозначения участков программ или пояснения команд. Может располагаться в любом месте программы, но не после END.

2.2.2. Элементарные конструкции.

          Из основных символов непосредственно образуются элементарные конструкции языка, которые являются минимальными неделимыми синтаксическими единицами. К ним относятся: идентификаторы, константы, переменные, указатели стандартных функций.

Различные объекты программы должны иметь имена. В качестве имен используются идентификаторы. Идентификатор - последовательность букв и цифр, а также знака подчеркивания, начинающаяся с буквы. Длина идентификатора может быть до 63 знаков. Желательно выбирать значащие идентификаторы, например, MAX, MIN, SUMMA и т.д. Зарезервированные слова нельзя использовать в качестве идентификаторов.

         Константы – это данные, значения которых не изменяются в процессе работы программы. Константы могут быть поименованными (с типом и без типа) и явно заданными.

         Арифметические константы предназначены для представления целых и вещественных числовых данных.  

Тип константы

Диапазон

Объем памяти

Примечания

Shortint

-128..127

       1 байт

Со знаком

Byte

0..255

1 байт

Без знака

Integer

-32768..32767

2 байта

Со знаком

Word

0..65535

2 байта

Без знака

Longint

-2147483648..2147483647

4 байта

Со знаком

Single

1.5e-45..3.4e38

4 байта

7-8 значащих цифр

Real

2.9e-39..1.7e38

6 байтов

11-12 значащих цифр

Double

5.0e-324..1.7e308

8 байтов

15-16 значащих цифр

Extended

3.4e-4932..1.1e4932

10 байтов

19-20 значащих цифр

Сomp

-9.2e18..9.2e18

8 байтов

19-20 значащих цифр

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

MAXINT=32767,             MAXLONGINT=2147483647,

PI= 3.1415926536E+00.

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

<мантисса>Е{ }<порядок>

Логические константы могут принимать одно из двух значений: True(истина) или False(ложь). В языке предусмотрены следующие логические типы констант: Boolean(1 байт), Bytebool(1 байт), Wordbool(2 байта), Longbool(4 байта).

Константы символьного типа  Char представляют собой 1 символ кодового набора ASCII (американский стандартный код обмена информацией). Занимает в памяти 1 байт. Символьная константа заключается в апострофы ‘’. Существует упорядоченность символов в соответствии с их кодами. Для букв латинского алфавита ‘0’<’9’<‘A’<…<’Z’<’a’<…<’z’.

Константы строкового типа String представляют собой последовательность символов, заключенную в апострофы. Длиной строки называется количество символов в ней. Если среди символов константы строкового типа имеется хотя бы один апостроф, он изображается двумя апострофами. Длина строки может быть от 0 до 255 символов.   

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

2.2.3. Типы данных.

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

Все переменные, используемые в программе должны быть описаны в разделе описания переменных VAR.

VAR <идентификатор> [,<идентификатор>,…]: <тип>; [<идентификатор> [,<идентификатор>,…]: <тип>;…]

Например,

VAR A : Integer;
  
              B, C: Real;

Здесь описана переменная А целого типа и две переменные В и С вещественного типа. Тип, в свою очередь может быть предварительно определен в разделе описания типов TYPE.        

TYPE <идентификатор типа> = <тип> ; 

Например,

TYPE     I = Integer;
  
            R = Real;

После такого описания типов описания переменных А, В и С могут быть следующими:

            VAR A : I;
  
             B, C: R;

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

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

            TYPE <идент-тор типа> = (<идентификатор>[,<идентификатор>,…]); 

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

TYPE <идентификатор типа> = <константа>. .<константа>; 

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

         Например,

            TYPE   GR = (DS101, DS102,DS201,DS202,DS301,DS302);
   
             SPEC = DS101. . DS302;

   
             DIGIT = 0. .9;

            VAR    A : DIGIT;
   
             B : SPEC;

   
             D :  100. .
200;

         Строчный тип используется для описания строк длиной от 0 до 255 символов. Максимальная длина строки указывается в  квадратных скобках. Если она не указана, максимальная длина полагается 255. Строковые переменные, как и строковые константы, занимают количество байтов, равное максимальной длине строки плюс 1 байт (нулевой), предназначенный для хранения текущей длины этой строковой переменной. Важной особенностью Турбо Паскаля является то, что к каждому символу строки возможен доступ по его номеру. 

TYPE  <идентификатор типа> = String[<максимальная длина>]; 

Например,

TYPE
  
             TString = String[100];
  
             TS = String;

  
         VAR    S,S1 : Tstring;

  
             S2 : String[20];

  
             SS : TS;

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

TYPE <идентификатор типа> = ARRAY [<список типов индексов>] OF<тип>;

<тип индексов> :: = <простой тип>

<простой тип>:: = <идентификатор типа>|<идентификатор> [,<идентификатор>]| <константа>. .<константа>

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

         Например,

            TYPE T1 = ARRAY [-10 .. 20,1..30] OF BYTE;
  
             T2 = ARRAY [0..50] OF BOOLEAN;

  
             T3 = ARRAY [BYTE] OF INTEGER;

            VAR A, B: T1;
  
             C: T2;

                Z: ARRAY[1..100] OF REAL;
  
            MAS
: T3; 

            Здесь в разделе описания типов вводится три различных типа массивов. T1 – это тип двумерного массива, в котором номера строк могут принимать значения от –10 до 20, а номера столбцов – от 1 до 30. Элементами массива типа T1 должны быть целые числа без знака от 0 до 255. Тип T2 определяет одномерный массив с элементами логического типа, номера элементов могут быть от 0 до 50. Тип T3 определяет одномерный массив с элементами целого типа со знаком, при этом диапазон изменения индексов массива от 0 до 255. В разделе описания переменных определяются переменные А и В типа T1, С – типа Т2 и MAS – типа Т3. Помимо предварительного описания типа возможно описывать массивы непосредственно в разделе описания переменных, как это сделано для переменной Z.

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

Например,
  
            

  
             S := S + Z [I];

  
             P := P * A [I] [J] ;

  
             C[6] := TRUE ;

  
             P := P * A[I,J] ;

  
             R := B [I+5,J] ;

  
             MAS [I] := MAS [I-1] * MAS [I] ;

  
            

Рассмотрим  различные способы описания массивов.

Пусть требуется описать матрицу A, содержащую 10 строк и 50 столбцов, с элементами целого типа.

1) CONST  N = 10;
  
                M = 50;
                T
YPE TMATR = ARRAY [1..N, 1..M] OF INTEGER;

  
             VAR A : TMATR;
 

2) TYPE TSTR = ARRAY [1..50] OF INTEGER;
TMATR = ARRAY [1..10] OF TSTR;
VAR A : TMATR;
 

3) VAR A : ARRAY[1..10,1..50] OF INTEGER; 

4) VAR A : ARRAY[1..10] OF ARRAY[1..50] OF INTEGER;

наверх

2.3. Операторы языка Паскаль.

 2.3.1. Оператор присваивания.

            Наиболее простым и часто используемым оператором языка является оператор присваивания:

<переменная> : = <выражение>;

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

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

В Паскале приоритеты выполнения операций следующие (в порядке убывания):
  
         -         одноместный минус;
            -         операция
NOT;
            -         операции типа умножения ;
            -         операции типа сложения;
            -         операции сравнения (отношения).

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

            Например, если в выражении  … (X > 5)  AND  (Y > 10) … не поставить скобки, то будет синтаксическая ошибка, так как приоритет операции AND выше приоритета операций сравнения  >.

             <операции типа умножения> :: = * | / | div | mod | and

             <операции типа сложения> :: = + | - | or | xor

             <операции сравнения> :: = = | <> | < | > | <= | >= | in

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

            Например,   (5 + 6) < (5 - 6) = TRUE   в результате даст FALSE, а NOT(8.5 < 4) будет равно TRUE.

            Сравнение строк символов выполняется слева направо посимвольно. Более короткие строки дополняются пробелами справа.

2.3.2. Оператор перехода. Пустой оператор. Составной оператор.

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

GOTO <метка> ;

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

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

< метка> :[<метка>: …] <оператор>;

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

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

         Если необходимо, чтобы группа операторов рассматривалась транслятором, как один оператор, эту группу операторов заключают в операторные  скобки   BEGIN  и   END.  Такой  оператор  называется   составным оператором. Составной оператор может быть использован в любом месте программы, где разрешен простой оператор, но требуется выполнения группы операторов.    

 2.3.3. Условный оператор.

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

            IF <логическое выражение> THEN<оператор 1> [ ELSE <оператор 2>] ;  <следующий оператор >;

Оператор выполняется таким образом: если результат вычисления логического выражения TRUE, то выполняется <оператор 1>, затем <следующий оператор >; если – FALSE, то выполняется <оператор 2>, затем <следующий оператор>. Операторы 1 и 2 могут быть простым или составным оператором. Если часть оператора, начинающаяся ELSE, отсутствует, то при логическом выражении равным FALSE, будет выполняться <следующий оператор>. При вложенности условных операторов ELSE всегда относится к ближайшему предшествующему IF. Следует избегать большой глубины вложенности условных операторов, так как при этом теряется наглядность и возможно появление ошибок.

         Например,

         … IF A > 0 THEN P := P + 1
  
             ELSE
  
                 IF A < 0 THEN O := O + 1
  
                     ELSE  N := N + 1 ; …

         … IF A > 0 THEN
  
             BEGIN
                    S := S+ A ; K := K + 1
  
             END
;…

2.3.4. Оператор выбора.

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

            CASE <селекторное выражение> OF
               
<метка>, [<метка>,<метка> . . <метка>] : <оператор 1> ;
  
             <метка>, [<метка>,
<метка> . . <метка>] : <оператор 2> ;
  
                 . . . . .
                <метка>, [<метка>,
<метка> . . <метка>] : <оператор 2> ;
  
         [
ELSE  <оператор>]
  
         END;

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

<оператор 1>,<оператор 2>,<оператор n> - простой или составной оператор.     

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

         Например,

Z= cos x, при k=3
sin x, при k=2
e, при k=1
ln x, при k=0
0, в остальных случаях

CASE K OF
  
             0:  Z := LN(X) ;

  
             1:  Z := EXP(X) ;

  
             2:  Z := SIN(X) ;

  
             3:  Z := COS(X)
  
        
ELSE
  
             Z := 0

  
             END ; …  

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

         В следующем примере переменная OTVET получает значение YES или NO в зависимости от введенного значения символьной переменной V. Здесь метки варианта задаются перечислением.

            … VAR V : CHAR;
  
                 OTVET : STRING;

  
                
                  

                    CASE  V  OF
  
                     ‘D’, ‘d’, ‘
Д’, ‘д’ : OTVET := ‘YES’;

                        ‘N’, ‘n’, ‘Н’, ‘н’ : OTVET := ‘NO’
                    ELSE
  
                     OTVET := ‘ ‘

  
                 END; …
 

         В следующем примере метки выбора заданы интервалом.

            … VAR V : CHAR;
  
                 OTVET : STRING;

  
                

                    CASE  V  OF
  
                     ‘A’ . . ‘Z’,’a’ . . ‘z’ : OTVET := ‘
буква’;
  
                     ‘0’ . . ‘9’ : OTVET := ‘
цифра
                    ELSE
  
                     OTVET := ‘специальный символ‘

  
                 END; …

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

Операторы цикла используются для многократного повторения входящих в их состав операторов. В языке  Турбо Паскаль различают операторы цикла  типа арифметической прогрессии (оператор цикла со счетчиком FOR) с шагом  +1 или  -1 и операторы цикла итерационного типа (WHILE  и REPEAT).

Оператор цикла типа арифметической прогрессии используется, если заранее известно количество повторений цикла и шаг изменения параметра цикла +1 или –1.

            FOR<параметр цикла>:=<выражение1> TO | DOWNTO <выражение2> DO < оператор > ;

            < параметр цикла > - это переменная цикла любого порядкового типа (целого, символьного, перечисляемого, интервального);
  
         TO – шаг изменения параметра цикла  +1;
  
         DOWNTO -  шаг изменения параметра цикла -1;
            < выражение 1> - начальное значение параметра цикла, выражение того же типа, что и параметр цикла;
            < выражение 2>  -конечное  значение параметра цикла, выражение того же типа, что и параметр цикла;
            < оператор>-  тело цикла - простой или составной оператор.
 

При выполнении оператора FOR выполняются следующие действия:

-  вычисляется  < выражение 1> , которое присваивается  параметру цикла;
            -  проверяется условие окончания цикла : <параметр цикла> больше <выражения 2> при использовании конструкции
TO  и <параметр цикла> меньше <выражения 2> при использовании конструкции DOWNTO;

            -  выполняется тело цикла;

            -  наращивается (
TO)  или уменьшается (DOWNTO) на единицу параметр цикла;

            -  все этапы, кроме первого,  циклически повторяются.

При использовании оператора необходимо помнить :

- Внутри цикла  FOR нельзя изменять начальное , текущее или конечное  значения параметра цикла.
            - Если в цикле с шагом  +1 начальное значение больше конечного, то цикл не выполнится ни разу. Аналогично для шага  -1, если начальное значение меньше конечного.

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

            - Телом цикла может быть другой оператор цикла.

   Например, вычислить значение факториала     F=N! 

        a) F:=1;                                        b)  F:=1;
                 FOR I:=1 TO N DO                          FOR I:=N DOWNTO 1 DO

  
                  F:=F*I; …                                           F:=F*I; …
 

В следующем примере цикл выполняется 26 раз и SIM  принимает значения всех латинских букв от ’A  до  Z’.

  
  
             FOR  SIM:=’A’ TO ‘Z’ DO

                    WRITELN( SIM);
  
            

Если телом цикла является другой цикл, то циклы называются вложенными или сложными. Цикл, содержащий в себе другой цикл, называют внешним. Цикл, содержащийся внутри другого цикла, называется внутренним. Внутренний и внешний циклы могут быть любыми из трех видов: FOR, WHILE или REPEAT. При построении вложенных циклов необходимо, чтобы все операторы внутреннего цикла полностью находились в теле внешнего цикла. Возможная глубина вложенности циклов ограничивается объемом памяти компьютера. Вначале выполняется самый внутренний цикл при фиксированных значениях параметров циклов с меньшим уровнем вложенности, затем изменяется параметр цикла следующего (за внутренним) уровня и снова выполняется самый внутренний цикл и т.д.

Пример  Вычислить значение Y , определяемое по формуле

            PROGRAM SP;
  
         CONST N=10;
  
            M=15;

  
        VAR A: ARRAY [1..N,1..M] OF REAL;

  
             I,J: INTEGER;

  
             P,Y: REAL;

            BEGIN
  
             FOR I:=1 TO N DO

  
                 FOR J:=1 TO M DO

  
                     READLN(A[I,J]);

  
             Y:=0;

  
             FOR I:=1 TO N DO

  
                 BEGIN

  
                     P:=1;

  
                     FOR J:=1 TO M DO
P:=P*A[I,J];
  
                     Y:=Y+P
  
                 END;

  
             WRITELN(‘Y=’,Y)

  
         END
. 

Операторы цикла итерационного типа используются обычно в том случае, если число повторений цикла заранее неизвестно или шаг изменения параметра цикла отличен от +1 или –1.

            Оператор цикла с предусловием:

            WHILE   <логическое выражение > DO  <оператор>; 

Логическое выражение вычисляется перед каждым выполнением тела цикла. Если логическое выражение  принимает значение TRUE, то тело цикла выполняется, если значение FALSE, происходит выход из цикла. Тело цикла может не выполниться ни разу, если логическое выражение сразу ложно. Телом цикла является простой или составной оператор.

Любой алгоритм, реализуемый через оператор FOR, может быть записан с помощью конструкции WHILE. Например, вычисление значения факториала F=N!:

  
  
             F:=1;

  
             I:=1;

  
             WHILE I<=N DO

  
                 BEGIN

  
                     F:=F*I;

  
                     I:=I+1;

  
                 END;
  
            

В следующем примере требуется подсчитать значение Sin (x) с использованием разложения функции в ряд:

В сумму включить только те члены ряда, для которых выполняется условие:

т.е. очередной член ряда больше заданной точности вычислений.

Program SINX;
  
         Var X,Y,E,U,Z : real;
  
             K: integer;

Begin
  
             Readln(X,E);

  
             K:=0;

  
             Y:=0;

  
             U:=X;

  
             Z:=sqr(X);

  
             While  abs(U)>E do

  
                 Begin

  
                     Y:=Y+U;

  
                     K:=K+2;

  
                     U:= -U* Z/ (K*(K+1));

  
                 End;

  
             Writeln( ‘ SIN(X)=’, SIN(X), ‘  Y=’,Y);

  
         End
.

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

Рассмотрим пример вычисления значения квадратного корня из числа Х по итерационной формуле

            Yi+1 =(Yi  + X/ Y i ) /2   с точностью    Yi+1  -  Yi     <=e

Начальное приближение Y0=A является параметром.

Program SQRTX;
  
         Var   X:  real;  {
аргумент                              }

  
             EPS
:  real;  {точность вычисления         }
  
            Y0:  real;  {предыдущее приближение}
  
            Y1:  real;  {очередное приближение    }
  
            A:  real;  {начальное приближение    }

Begin
  
             Readln( A,EPS,X);

                If  X>0 then

  
                 Begin

  
                     Y0:=A;

  
                     Y1:=(Y0+X/Y0)/2;

  
                     While abs(Y1-Y0)>EPS do

                            Begin
  
                             Y0:=Y1;

  
                             Y1:=(Y0+X/Y0)/2

  
                         End;

  
                     Writeln(‘Y1=’,Y1,’ 
при X=’,X)
  
                 End

  
             Else

  
                 Writeln(‘
Число ’, X, ' меньше нуля');

            E
nd.
 

Оператор цикла с постусловием: 

REPEAT
  
             <
оператор 1 >  [< оператор 2 >] [
< оператор n >]
  
         UNTIL   <логическое выражение>;
 

Данная конструкция оператора цикла используется, если число повторений цикла заранее неизвестно, но известно условие выхода из цикла. Управляющее циклом логическое выражение является условием выхода из цикла. Если оно принимает значение TRUE (истина), то выполнение цикла прекращается. При использовании оператора  REPEAT цикл выполняется хотя бы один раз. В отличие от других операторов цикла  оператор данного вида не требует операторных скобок  BEGIN - END, так как их роль выполняют REPEAT - UNTIL.

Вычисление   F=N!   с использованием конструкции REPEATUNTIL будет выглядеть следующим образом:

   . . .
  
             F:=1;

  
             I:=1;

  
             Repeat

  
                 F:=F*I;

  
                 I:=I+1;

  
             Until  I>N;

  
             . . .

         Рассмотрим другой пример использования этого оператора. Вводится последовательность чисел. Определить количество элементов кратных 7.

            Program rep;
  
         Var  A,K: integer;

  
             C    : char;

Begin
  
             K:=0;

  
             Repeat

  
                 Writeln(‘  Введите очередное число ‘);
  
                Readln( A);

  
                 If A mod 7=0 then K:=K+1;

  
                 Writeln
(‘
Хотите выйти  из цикла? д/y’ );
  
                 Readln( C );

  
             Until  ( C=’
д‘ ) or ( C=’y’) ;
  
             Writeln(‘kol=’,K);

  
         End
.
 

         Здесь условием выхода из цикла является ввод символов Д или Y при ответе на вопрос о выходе из цикла. Если вводится одна из этих букв, логическое выражение, записанное после UNTIL, становится TRUE и происходит выход из цикла.

         В следующем примере требуется поменять местами  максимальный и минимальный элементы, найденные среди элементов четных строк матрицы А(M,N). 

Program Obmen;
Var A: array[1..30,1..30] of integer;

  
I,J : integer;
  
K1,L1,K2,L2 : integer;

   T,M,N: integer;

Begin
  
             Readln(M,N);

  
             For I:=1 to M do

  
                 For J:=1 to N do

  
                     Readln( A[I,J]);

  
             K
1:=1;L1:=1;  {координаты максимального элемента}
  
            K2:=1;L2:=1;  {координаты минимального элемента}
  
            I:=2;

  
             While I<=M do

                    Begin
                        For J:=1 to N do

                            If A[K1, L1]< A[I,J] then
                                Begin

  
                                 K1:=I;L1:=J;

  
                             End

  
                         е
lse
  
                             If A[K2, L2]> A[I,J] then

  
                                 Begin

  
                                     K2:=I;L2:=J;

  
                                 End;

  
                     I:=I+2;

                    End;
  
             T:= A[K1, L1];

  
             A[K1, L1]:= A[K2, L2];

  
             A[K2, L2]:=T;

  
             For I:=1 to M do

  
                 Begin

  
                     For J:=1 to N do
Write ( A[I,J] :6);
  
                     Writeln ;
  
                 End;

  
         End.
 

         Здесь используется цикл WHILE для индексации строк, т.к. нас интересуют только четные строки, следовательно, шаг для строк должен быть равен 2. В цикле FOR этого сделать нельзя.

В языке Турбо Паскаль 7.0 имеются процедуры  BREAK  и CONTINUE . Эти процедуры могут использоваться  только внутри циклов FOR, WHILE   или REPEAT. Процедура BREAK прерывает выполнение цикла и вызывает переход к оператору, следующему за циклом (может использоваться вместо оператора GOTO).Процедура CONTINUE осуществляет переход к следующему повторению цикла с пропуском последующих операторов  тела цикла.

Например, необходимо определить номер первого элемента одномерного массива, оканчивающегося  на 3. 

Program Kon;
  
         Var A:array [1.. 30] of integer;

  
             FL: Boolean;

  
             I,N: Integer;

Begin
                Readln(N);

  
             For I:=1 to N do

  
                 Readln( A[I] );

  
             FL:=false;

  
             For I:=1 to N do

                    Begin

                        If A[I] mod 10 <> 3 then Continue;

  
                     Writeln
(‘
Номер первого числа на 3  ’,I);
                        FL:=true
;

  
                     Break
;
  
                 End;

  
             If not FL then Writeln
(‘
нет чисел на 3‘);
  
         End
.
 

Если встречается число, оканчивающееся на 3, происходит вывод сообщения об этом, флаг – переменная FL – становится равным TRUE и программа заканчивает свою работу, т.к. цикл прерывается. Если же такое число не встречается, происходит нормальное завершение цикла, переменная FL остается равной FALSE и выводится сообщение о том, что таких чисел нет.

наверх

к следующей главе

Hosted by uCoz