Основная часть программы на языке ТР представляет собой последовательность операторов, каждый из которых производит некоторые действия по преобразованию данных. Операторы выполняются последовательно в том порядке, в котором они записаны в тексте программы. Идущие друг за другом операторы программы разделяются точкой с запятой. Все операторы языка ТР можно разбить на три группы: • простые; • ввода-вывода; • структурированные (структурные). Фактически операторы ввода-вывода являются обращением к стандартным процедурам, т.к. в Паскале нет операторов ввода-вывода. Но по установившейся традиции такие обращения называют операторами. простые операторы Операторы, не содержащие в себе никаких других операторов, называются простыми. К ним относятся: • оператор присваивания; • оператор вызова процедуры; • оператор безусловного перехода; • пустой оператор. оператор присваивания С помощью этого оператора переменной или функции присваивается значение выражения. Для записи этого оператора используется знак (:=), слева от которого записывается идентификатор переменной или функции, которым присваивается выражение, а справа – выражение, значение которого вычисляется перед присваиванием. Переменная (функция) и выражение должны иметь один и тот же тип. Исключение составляет случай, когда переменная имеет вещественный тип, а выражение – целочисленный, или переменная имеет строковый тип, а выражение символьный. Допустимо присваивание любых типов данных, кроме файловых.
Формат записи. < идентификатор > := < выражение >;[u]
Пример. argum1:= 34; argum2:= 87.7; z:= a + b; result:=sin(a) + cos(b); оператор вызова процедуры Этот оператор служит для активизации предварительно определенной пользователем или стандартной процедуры.
Формат записи. < имя процедуры > {(список параметров)}; Пример. Program _ttt; procedure yyy; begin ... {тело процедуры yyy} end; procedure xxx; begin ... {тело процедуры xxx} end; Begin ... yyy; {вызов процедуры yyy} ... xxx {вызов процедуры xxx} ... End. оператор безусловного перехода (goto). Оператор goto позволяет изменить естественный порядок выполнения операторов и перейти к выполнению программы, начиная с оператора, отмеченного меткой. Метка может содержать как цифровые, так и буквенные символы. Формат записи. goto < метка >;
Пример. ... label 44, Metka; ... 44: goto Metka; ... Metka: goto 44; ... Помни: • Метка, на которую передается управление, должна быть описана в разделе Label того блока процедуры, функции, основной программы, в котором эта метка используется. • Областью действия метки является тот блок, в котором она описана; переход возможен только в пределах блока. • Попытка выйти за пределы блока или передать управление внутрь другого блока вызывает программное прерывание. В соответствии с правилами структурного программирования оператор goto рекомендуется применять как можно реже, т.к. считается, что его частое употребление резко усложняет понимание логики программы. В крайнем случае, он может использоваться для преждевременного выхода из операторов повтора. Если все же используется оператор goto, то необходимо придерживаться следующих правил: • Применять оператор для передачи управления только вниз (вперед) по тексту программы; при необходимости передачи управления назад следует использовать операторы цикла; • Расстояние между меткой и оператором перехода на нее не должно превышать одной страницы текста (или высоты экрана дисплея). пустой оператор. Пустой оператор не содержит никаких символов и не выполняет никаких действий. Он может быть расположен в любом месте программы, где синтаксис языка допускает наличие оператора. Как и другие операторы, он может быть помечен меткой. Чаще всего этот оператор применяют для организации выхода из середины программы или составного оператора.
структурированные операторы Структурированные (структурные) операторы представляют собой структуры, построенные из других операторов по строго определенным правилам. Все структурированные операторы делятся на три группы: • составные; • условные; • повтора.
составной оператор. Составной оператор представляет собой группу из произвольного числа операторов, отделенных друг от друга точкой с запятой, и ограниченную операторными скобками begin и end.
Формат записи. begin < оператор >; < оператор > end; Пример. begin A:= A*B-C*D; writeln ('результат=', A); end;
Составной оператор воспринимается, как единое целое и может находиться в любом месте программы, где синтаксис языка допускает наличие оператора. Обычно составной оператор используется при написании условных операторов и операторов повтора. В составном операторе могут быть другие составные операторы произвольной глубины вложенности. Например, Begin … Begin … - вложенный составной End; … оператор End;
условные операторы. Условные операторы обеспечивают выполнение или невыполнение некоторого оператора, группы операторов или блока в зависимости от заданных условий. ТР допускает использование двух условных операторов: if и case. Оператор условия if является одним из самых популярных средств, изменяющих естественный порядок выполнения операторов программы. Оператор If реализует алгоритмическую конструкцию развилка или неполную ее конструкцию - коррекцию. Он может принимать одну из следующих форм:
1. if < условие > then < оператор1 > {полная развилка} else < оператор2 >; 2. if < условие > then < оператор >; {укороченная развилка - коррекция}
Здесь служебные слова if, then, else означают "если", "то", "иначе". <условие>- это выражение булевского типа. Оно может быть простым или сложным. Сложные условия образуются при помощи логических операций and, or, not. При записи условий можно использовать все возможные операции отношения. Результат выражения всегда имеет булевский тип. <оператор1>, <оператор2> - один выполняемый оператор – простой или составной. В первом случае, если значение выражения истинно, выполняется <оператор1>, если ложно - <оператор2>. Пример. read(a, b); if a > b then writeln('А больше В') else writeln('В больше А'); Помни: Перед служебным словом else точка с запятой не ставится.
Во втором случае, если значение выражения истинно, выполняется <оператор>, если значение выражения ложно, выполняется оператор, следующий сразу за оператором if. Пример. if a > b then c:= - a; writeln('А меньше В'); Пример.
Ввести целое число и вывести символ, соответствующий этому числу по коду ASCII, если он существует, в противном случае вывести сообщение, что такого символа нет (управляющие символы не учитывать). program Symbol; var x: integer; begin write(' Введите целое число: '); readln(x); if (x>31) and (x<256) then writeln('соответствующий символ - Chr(x)) else writeln('такого символа нет'); end.
Помни: • Один оператор if может входить в состав другого оператора if. В таком случае говорят о вложенности операторов, при этом каждое служебное слово else соответствует тому then, которое ему непосредственно предшествует. Конструкции со степенью вложенности 2-3 лучше избегать из-за сложности их анализа при отладке программ.
Оператор выбора (условный оператор) case. Этот оператор является обобщением оператора if и позволяет сделать выбор из произвольного числа имеющихся вариантов. Он состоит из выражения, называемого селектором, и списка параметров, каждому из которых предшествует список констант выбора (список может состоять и из одной константы). Как и в операторе if, здесь может присутствовать слово else, имеющее тот же смысл.
Формат записи: case <выражение-селектор> of <список1>: <оператор1;> <список2>: <оператор2;> . . . <списокN>: <операторN> else <оператор> end;
1. Вычисляется значение выражения-селектора. 2. Обеспечивается выполнение того оператора, константа выбора которого равна текущему значению селектора. 3. Если ни одна из констант не равна текущему значению селектора, выполняется оператор, стоящий за словом else. 4. Если слово else отсутствует, выполняется оператор, находящийся за словом end, т.е. первый оператор за границей case.
Помни: • Селектор должен относится к одному из целочисленных (т.е. находящихся в диапазоне – 32768 .. 32767), булевскому или пользовательскому типов. Вещественные и строковые типы в качестве селектора запрещены. • Список констант выбора состоит из произвольного количества значений или диапазонов, разделенных запятыми. • В отличие от оператора if перед словом else можно ставить точку с запятой. • Если для нескольких констант необходимо выполнить один и тот же оператор, их можно перечислить через запятую (или даже указать диапазон, если возможно), сопроводив их одним оператором. • Все метки вариантов оператора должны быть различны, т. е. каждая из них должна быть в списке одного CASE только один раз. • На метку вариантов нельзя переходить с помощью оператора goto.
Пример. 1. Селектор целочисленного типа:
write('Введите целое число'); read(i); case i of 1: Z:= I+10; 2: Z:= I+100; 3: Z:= I+1000 end;
case i of 1..10 : writeln('число',i:4, 'в диапазоне 1 -10'); 11..20 : writeln('число',i:4, 'в диапазоне 11 -20'); 21..30 : writeln('число',i:4, 'в диапазоне 21 -30') else writeln('число',i:4, 'вне пределов контроля') end;
3. Селектор перечисляемого типа:
Var Season: (Winter, Spring, Summer, Autum); Begin . . . case Season of Winter: writeln('Зима'); Spring: writeln('Весна'); Summer: writeln('Лето'); Autum: writeln('Осень') end; Аналогичным образом можно организовать ввод и вывод данных перечисляемого типа пользователя и обойти соответствующие ограничения языка ТР. операторы повтора Операторы повтора используются при организации циклов. Цикл - средство многократного повторения однотипных операторов. Если количество повторов известно, используется оператор for, если количество повторов неизвестно применяются операторы repeat или while.
оператор цикла FOR (с параметром). Оператор цикла For состоит из заголовка и тела цикла. Формат записи: Оператор for может быть представлен в двух форматах:
1. for < параметр цикла >:= <S1> to <S2> do < оператор>; 2. for < параметр цикла > := <S1> downto <S2> do < оператор >; где S1,S2 - выражения, определяющие соответственно начальное и конечное значения параметра цикла. В первом случае S1<S2, во втором - S1>S2. for . . . do - заголовок цикла; < оператор > - тело цикла. Тело цикла может быть простым или составным оператором. Оператор цикла for обеспечивает выполнение тела цикла до тех пор, пока не будут перебраны все значения параметра цикла от начального до конечного. Пример. Оператор результат 1. for i:=15 to 20 do write(i: 3); 15 16 17 18 19 20 2. for i:=20 downto 15 do write(i: 3); 20 19 18 17 16 15 3. for Chr:='a' to 'e' write(Chr: 2) a b c d e 4. for Chr:='e' downto 'a' write(Chr: 2) e d c b a 5. Параметр цикла - переменная перечисляемого типа: var Sort: (s1, s2, s3); . . . for Sort:=s1 to s2 do < оператор>;
Помни: • Параметр цикла, его начальное и конечное значения должны принадлежать к одному и тому же типу данных. При этом допускается любой скалярный тип, кроме вещественного. • После служебного слова do может находиться составной оператор, в теле которого запрещены операторы, меняющие значение параметра цикла. • Если используются типы integer, byte и интервальный, то значение параметра цикла последовательно увеличивается (при for ... to) или уменьшается (при for ...downto) на единицу при каждом повторе.
• После нормального завершения оператора for значение параметра равно конечному значению. Если оператор for не выполнялся, значение параметра не определено. • Для выхода из цикла до его завершения можно использовать оператор goto. Но в случаях, когда возможен преждевременный выход из цикла, следует использовать операторы repeat и while. Оператор цикла Repeat (оператор цикла с постусловием). Оператор цикла Repeat состоит из заголовка (repeat) тела и условия окончания (until).
Формат записи: repeat <оператор;> <оператор;> {тело цикла} . . . <оператор> until <условие> ; <условие> - выражение булевского типа. При написании условия допустимы булевские операции и операции отношения. тело цикла - операторы, заключенные между словами repeat и until. Действие оператора: Вначале выполняется тело цикла, затем проверяется условие выхода из цикла. Если результат булевского выражения False, тело цикла выполняется еще раз, если результат True - происходит выход из цикла. Особенности оператора repeat: 1. Выполняется по крайней мере хотя бы один раз. 2. Тело цикла выполняется, пока значение выражения, стоящего в условии есть False. 3. В теле цикла может находиться произвольное число операторов без операторных скобок begin...end.
Помни: • По крайней мере, один из операторов тела цикла должен влиять на значение условия, иначе цикл будет выполняться бесконечно. • Для преждевременного выхода из цикла можно использовать оператор goto.
Пример. d:=1; s:=0 repeat s:= s + d until (d < 100);
бесконечный цикл d:=1; s:=0 repeat s:= s + d; d:=d+1; until (d < 100); цикл имеет завершение
оператор цикла While (оператор цикла с предусловием) Оператор цикла с While аналогичен оператору repeat, но проверка условия выполнения тела цикла производится в самом начале оператора.
Формат записи: while < условие > do < тело цикла >; где <условие> - выражение булевского типа. тело цикла - простой или составной оператор. Перед каждым выполнением тела цикла вычисляется значение выражения условия. Если результат - True, тело цикла выполняется и снова вычисляется значение выражения условия. Если результат - False, происходит выход из цикла и переход к первому после while оператору. Если перед первым выполнением цикла значение выражения было False, тело цикла вообще не выполняется и происходит переход на оператор, следующий за оператором цикла. Как и в операторе repeat, программист сам должен позаботиться об изменении переменных, определяющих условие выхода, в противном случае цикл получится бесконечным. Пример. i:=45; while i< 90 do begin write(i); i:= i+1; end; Иногда цикл изначально предполагается как бесконечный. Тогда в условии записывается константа True.
Пример. i:=45; while True do begin write(i); i:= i+1; end;
Оператор while, как и другие операторы организации циклов, может быть вложенным. На начальной стадии изучения языка ТР использование оператора while вызывает гораздо меньше ошибок, чем применение оператора repeat, поэтому начинающим программистам лучше пользоваться оператором while. использование стандартных процедур Break и Continue в операторах циклов repeat, while и for В версии 7.0 в циклах Repeat, While и For можно использовать две новые процедуры Break и Continue. Процедура Break позволяет досрочно выйти из цикла, не дожидаясь выполнения условия выхода. Процедура Continue позволяет начать новую итерацию цикла, даже если предыдущая не завершена. Пример. В массиве целых чисел найти первое отрицательное число и вывести его на экран. Program Example; Const N:=10; Var Mas: array[1..10] of integer; { массив целых чисел } i: byte; Yes : boolean; Begin Writeln ('Введите элементы массива'); {ввод чисел} For i:=1 to N do begin Write( 'Mas[ ' ,i, ']= '); readln (Mas[i]);
end; Yes := False; { не найдено число } For i:=1 to N do { поиск отрицательного числа } begin if Mas[i] >= 0 then Continue; {не отрицательное - переход к новой итерации} writeln (' первое отрицательное число =' , Mas[i], ' номер = ', i ); Yes := True; Break { выход из цикла } end; if not Yes then Writeln(' Отрицательных чисел нет '); Readln END.
Если нужно разместить вашу информацию на множестве ресурсах, то этот инструмент поможет вам решить эту задачу... Forum Poster - гарантированный постинг на тысячах форумам (Россия, Украина, Казахстан, Белорусия).