Pascal: занятие №2. часть 1: условный оператор в паскале (if)

Пустой оператор

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

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

1. Для использования символа «;» после последней команды (оператора) в блоке:

begin
  c = 8;
  g = c;
end

Поскольку в языке Паскаль символ «;» разделяет операторы, то в приведенном выше коде считается, что после последней «;» находится пустой оператор. Таким образом, «;» перед end в блоке можно либо ставить, либо нет.

2. Можно использовать для отметки места, следующего за последней командой (оператором) в блоке:

label m;
begin
goto m;
  y = 10;
m
end

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

Сравнение строк

Как вы видите,
сравнение двух числовых значений выполняется вполне очевидным образом. Но можно
ли, например, сравнивать строки между собой? Оказывается да, можно. Чтобы
определить, что одна строка больше другой, Python использует
«алфавитный» или «лексикографический» порядок. Другими словами, строки сравниваются
посимвольно. Например:

print('Я' > 'А' )
print( 'Кот' > 'Код' )
print( 'Сонный' > 'Сон' )

Алгоритм
сравнения двух строк довольно прост:

  1. Сначала
    сравниваются первые символы строк.

  2. Если первый
    символ первой строки больше (меньше), чем первый символ второй, то первая
    строка больше (меньше) второй.

  3. Если первые
    символы равны, то таким же образом сравниваются уже вторые символы строк.

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

В примерах выше
сравнение ‘Я’ > ‘А’ завершится на первом шаге, тогда как строки
«Кот» и «Код» будут сравниваться посимвольно:

  1. К равна К.
  2. о равна о.
  3. т больше чем д.

СинтаксисSyntax

compound-statement:compound-statement:     { declaration-listoptstatement-listopt}    { declaration-listoptstatement-listopt}

declaration-list:declaration-list:    declaration    declaration    declaration-list declaration    declaration-list declaration

statement-list:statement-list:    statement    statement    statement-list statement    statement-list statement

Если используются объявления, они должны задаваться до всех операторов.If there are declarations, they must come before any statements. Область видимости каждого идентификатора, объявленного в начале составной инструкции, начинается в точке его объявления и завершается в конце блока.The scope of each identifier declared at the beginning of a compound statement extends from its declaration point to the end of the block. Она распространяется на весь блок, за исключением случаев, когда во внутреннем блоке объявлен такой же идентификатор.It is visible throughout the block unless a declaration of the same identifier exists in an inner block.

Предполагается, что идентификаторы в составном операторе имеют модификатор , если иное явно не объявлено при помощи ключевых слов , или . Это не относится к функциям, которые могут быть только .Identifiers in a compound statement are presumed unless explicitly declared otherwise with , , or , except functions, which can only be . В объявлении функции можно опустить описатель , и функция все равно будет .You can leave off the specifier in function declarations and the function will still be .

Если переменная или функция объявлена в составном операторе с классом хранения , то область памяти не выделяется и инициализация не допускается.Storage is not allocated and initialization is not permitted if a variable or function is declared in a compound statement with storage class . Такое объявление относится к внешней переменной или функции, которая определена в другом месте.The declaration refers to an external variable or function defined elsewhere.

При каждом входе в составной оператор выполняется повторное выделение памяти, а если нужно, то и повторная инициализация, для переменных, объявленных в блоке с ключевым словом или .Variables declared in a block with the or keyword are reallocated and, if necessary, initialized each time the compound statement is entered. Эти переменные не определяются после выхода из составного оператора.These variables are not defined after the compound statement is exited. Если внутри блока объявлена переменная с атрибутом , то она инициализируется один раз в начале выполнения программы и сохраняет значение на протяжении всего выполнения программы.If a variable declared inside a block has the attribute, the variable is initialized when program execution begins and keeps its value throughout the program. Дополнительные сведения о ключевом слове можно найти в статье Классы хранения.See Storage Classes for information about .

Ниже показан пример составного оператора:This example illustrates a compound statement:

Если в этом примере больше 0, то все инструкции внутри составного оператора выполняются в порядке их расположения.In this example, if is greater than 0, all statements inside the compound statement are executed in order.

1.4.9. Оператор do while

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

do тело while (выражение);

Схема выполнения оператора do while :

1. Выполняется тело цикла (которое может быть составным оператором).

2. Вычисляется выражение.

3. Если выражение ложно, то выполнение оператора do while заканчивается и
выполняется следующий по порядку оператор. Если выражение истинно, то выполнение
оператора продолжается с пункта 1.

Чтобы прервать выполнение цикла до того, как условие станет ложным, можно
использовать оператор break.

Операторы while и do while могут быть вложенными.

Пример:

Условный оператор в Паскале

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

Блок-схема условного оператора:Pascal: занятие №2. часть 1: условный оператор в паскале (if)Условный оператор в Паскале имеет следующий синтаксис:

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

Pascal: занятие №2. часть 1: условный оператор в паскале (if)

Составной оператор

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

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

IF THEN ELSE
ЕСЛИ ТО ИНАЧЕ

Pascal: занятие №2. часть 1: условный оператор в паскале (if)
В условии (в логическом выражении) используются операторы отношения.Рассмотрим список операторов отношения Паскаля:

  • больше
  • меньше
  • больше или равно в Pascal
  • меньше либо равно в Pascal
  • сравнение в Pascal
  • не равно в Pascal

Пример: найти наибольшее из двух чисел

Вариант 1 Вариант 2
Pascal: занятие №2. часть 1: условный оператор в паскале (if) Pascal: занятие №2. часть 1: условный оператор в паскале (if)

Подробно разобраться в работе условного оператора в Паскале можно, просмотрев видеоурок:

Пример: вычислить значение переменной по одной из двух ветвей

Pascal: занятие №2. часть 1: условный оператор в паскале (if)

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

1
2
3
4
5
6
7
8
9
10
11
var
 x,yreal;
begin
writeln ('введите х');
read(x);
if x> then
 y=ln(x)
else
 y=exp(x);
writeln ('y=', y62) {итоговое число будет занимать 6 позиций, и в нем будет 2 знака после запятой}
end.

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

Задача 0. Вычислить значение переменной по одной из двух ветвей:

Задача 1. В компьютер вводятся два числа. Если первое больше второго, то вычислить их сумму, иначе — произведение. После этого компьютер должен напечатать результат и текст ЗАДАЧА РЕШЕНА

Задача 2. Дракон каждый год отращивает по три головы, но после того, как ему исполнится 100 лет — только по две. Сколько голов и глаз у дракона, которому N лет?

Логические операции в Паскале (в логическом выражении)

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

Важно: Каждое из простых условий обязательно заключать в скобки.

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

1
2
3
4
5
6
7
8
var ninteger;
begin
n=6;
if (n>5) and (n<10) then writeln('истина');
if (n>7) or (n<10) then writeln('истина');
if (n>7) xor (n<10) then writeln('истина');
if not(n>7) then writeln('истина');
end.

Пример: Компания набирает сотрудников от 25 до 40 лет включительно. Ввести возраст человека и определить, подходит ли он для данной компании (вывести ответ «подходит» или «не подходит»).Особенность: надо проверить, выполняются ли два условия одновременно.

Вариант 1 Вариант 2
Pascal: занятие №2. часть 1: условный оператор в паскале (if) Pascal: занятие №2. часть 1: условный оператор в паскале (if)

Пример: Дано целое число A. Проверить истинность высказывания: «Число A является нечетным».

Открыть решение:

1
2
3
4
5
6
7
8
9
10
11
var
  a,b integer;
begin
  write('Введите A: ');
  read(a);
  b = a mod 2;
  if b> then
     writeln('true')
  else
      writeln ('false')
end.

Задача 3. Дано целое число A. Проверить истинность высказывания: «Число A является положительным».

Задача 4. Человек вводит в компьютер число. Если оно находится в интервале от 28 до 30, то нужно напечатать текст ПОПАЛ, если оно больше или равно 30 — то ПЕРЕЛЕТ, если оно находится на отрезке от 0 до 28, то НЕДОЛЕТ, если число меньше нуля — НЕ БЕЙ ПО СВОИМ

Примеры решения задач

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

Решение:
Введем обозначения переменных для квадратного уравнения ax2+bx+c=0:

  • a, b, c — коэффициенты уравнения;
  • d — дискриминант;
  • x, x1, x2 — корни уравнения.
program kvur;
  var a, b, c, d, x, x1, x2,: real;{описание переменных}
begin
  writeln ('Решение квадратного уравнения');
  write ('Введите коэффициенты a, b, c через пробел');
  readln (a, b, c);{ввод значений коэффициентов}
    d=b*b-4*a*c; {вычисление дискриминанта}
  if d< then writeln ('Корней нет'); {вывод результата}
  if d= then 
           begin x=-b2*a; {вычисление единственного корня}
           writeln ('Корень уравнения x=', x93) {вывод результата}
           end; 
  if d> then
           begin
             x1=(-b+sqrt(d))(2*a);{вычисление первого корня}
             x2=(-b-sqrt(d))(2*a);{вычисление второго корня}
             writeln ('Корни уравнения:');
             writeln ('x1=', x193);{вывод результата}
             writeln ('x2=', x293) {вывод результата}
           end
end.

Решение:
Введем обозначения переменных для квадратного уравнения ax+b=0:

  • a, b — коэффициенты уравнения;
  • x — корень уравнения.
program lin_uravnenie;
var
a,b,xreal; {описание переменных}
begin
  writeln('Решение линейного уравнения');
  write('Введите коэффициенты a и b через пробел');
  readln(a,b); {ввод значений коэффициентов}
if a<> then
          begin
            x=-ba; {вычисление корня}
            writeln('Корень уравнения x=',x93);{вывод результата}
          end
          else if b<> then writeln ('Корней нет') {вывод результата}
                        else writeln(' x - любое число'); {вывод результата}
end.

Построение блок-схем по коду Паскаль

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

следование Pascal: занятие №2. часть 1: условный оператор в паскале (if)ветвление Pascal: занятие №2. часть 1: условный оператор в паскале (if)повторение или цикл

Две из трех представленных структур блок-схемы мы уже можем перевести в код Pascal.

Пример: Составить блок-схему вычисления значения величины , определяемое по формулам: , если

Результат:

Задача 5. Составить блок-схему решения задачи 3

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

Открыть решение:

Задача 6. По составленной выше блок-схеме решить задачу на Pascal

Задача 7. Дано двузначное целое число. Вывести сумму и произведение его цифр. Проверьте правильность вашей программы. Для нахождения цифр числа использовать операцию взятия остатка и операцию целочисленного деления . Модуль числа — функция .

Пример результата:

Введите двузначное число: -12
Сумма цифр = 3
Произведение цифр = 2

Задача 8. Дано трёхзначное целое число. Вывести все его цифры (порядок не имеет значения). Проверьте правильность вашей программы. Для нахождения цифр числа использовать операцию взятия остатка и операцию целочисленного деления .

Пример результата:

Введите трёхзначное число: -123
Разряд сотен: 1
Разряд десяток: 2
Разряд единиц: 3

1.4. Операторы

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

— условные операторы, к которым относятся оператор условия if и оператор
выбора switch;

— операторы цикла (for,while,do while);

— операторы перехода (break, continue, return, goto);

— другие операторы (оператор «выражение», пустой оператор).

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

Все операторы языка СИ, кроме составных операторов, заканчиваются точкой с
запятой «;».

Оператор if-else

Когда выполнение основной ветки программы доходит до условного оператора if-else, то в зависимости от результата логического выражения в его заголовке выполняются разные блоки кода. Если логическое выражение вернуло true, то выполняется один блок (в Паскале начинается со слова then), если false – то другой (начинается со слова else). После выполнения одного из вложенных блоков кода, ход программы возвращается в основную ветку. Другой вложенный блок не выполняется.

Например, программа должна определять, ввел пользователь четное или нечетное число, и выводить на экран сообщение. Тогда программный код на языке Pascal может быть таким:

var n integer;
begin
    write ('Введите целое число: ');
    readln (n);
 
    if n mod 2 =  then
        write ('Оно четное.')
    else
        write ('Оно нечетное.');
 
readln
end.

Бывают неполные формы условных операторов. В таком случае вложенный в if блок кода выполняется только в случая true логическом выражении заголовка. В случае false выполнение программы сразу передается в основной блок. Понятно, что ветка else в таком случае отсутствует.

В примере ниже, если переменная имеет значение меньше нуля, то ее значение изменяется (находится модуль числа). Если же значение переменной изначально больше нуля, то блок кода при операторе if вообще не выполняется, т.к. не соблюдено условие (n<0).

var n integer;
begin
    write ('Введите целое число: ');
    readln (n);
 
    if n <  then
        n = abs (n);
 
    write (n);
 
readln
end.

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

Непосредственно после then может стоять только один оператор. При необходимости выполнения нескольких операторов они должны быть заключены в операторные скобки begin-end. Пример программы, которая меняет значения переменных местами, только если эти значения различны. Блок if содержит четыре выражения, поэтому заключен в begin-end.

var
    a,b,c integer;
 
begin
    write('a=');
    readln(a);
    write('b=');
    readln(b);
 
    if a <> b then begin
        c = a;
        a = b;
        b = c;
        writeln('a=',a,'; b=',b);
    end
    else
        writeln('Введены одинаковые числа');
 
readln;
end.

Допустимо вложение одного оператора if (или if-else) в другой

При этом следует соблюдать осторожность, т.е. бывает трудно определить какому if (внешнему или внутреннему) принадлежит ветка else

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

Оператор case (оператор выбора)

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

case селектор of 
	значение1 оператор1;
	значение2 оператор2;
	значение3 оператор3;
	...
	else операторN
end;

В заголовке оператора case вместо логического выражения фигурирует переменная, которую называют селектором. До этого в программе ей присваивается какое-либо значение. Эта переменная может иметь только перечисляемый тип (например, она не может быть вещественного типа). По ходу выполнения оператора case, значение переменной-селектора сравнивается с различными, описанными в нем альтернативами (метками-значениями). Как только совпадение будет найдено, то выполняется блок кода при данной метке и происходит выход в основную ветку программы. Значения-метки являются константами, которые может принимать селектор. Их тип и тип селектора должны быть совместимы по присваиванию.

Если совпадений не будет, то выполняется блок else. Если блок else отсутствует (он является не обязательным), то никакой блок кода в операторе case не выполняется.

var n integer;
begin
    write ('Введите класс школы: ');
    readln (n);
 
    case n of
        1..4 writeln ('Младшие классы.');
        5..8 writeln ('Средняя школа.');
        9,11 writeln ('Старшие классы. Выпускной.');
        10 writeln ('Старшие классы.');
        else writeln ('Error')
    end;
 
readln
end.

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

1.4.5. Оператор switch

Оператор switch предназначен для организации выбора из множества различных
вариантов. Формат оператора следующий:

     switch ( выражение )
     {   
              :
           : 
           : 
              :
              :
           ]
     }

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

Значение этого выражения является ключевым для выбора из нескольких
вариантов. Тело оператора smitch состоит из нескольких операторов, помеченных
ключевым словом case с последующим константным-выражением. Следует отметить,
что использование целого константного выражения является существенным
недостатком, присущим рассмотренному оператору.

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

Все константные выражения в операторе switch должны быть уникальны. Кроме
операторов, помеченных ключевым словом case, может быть, но обязательно один,
фрагмент помеченный ключевым словом default.

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

Отметим также, что в операторе switch можно использовать свои локальные
переменные, объявления которых находятся перед первым ключевым словом case,
однако в объявлениях не должна использоваться инициализация.

Схема выполнения оператора switch следующая:

— вычисляется выражение в круглых скобках;

— вычисленные значения последовательно сравниваются с константными
выражениями, следующими за ключевыми словами case;

— если одно из константных выражений совпадает со значением выражения, то
управление передается на оператор, помеченный соответствующим ключевым словом
case;

— если ни одно из константных выражений не равно выражению, то управление
передается на оператор, помеченный ключевым словом default, а в случае его
отсутствия управление передается на следующий после switch оператор.

Отметим интересную особенность использования оператора switch: конструкция
со словом default может быть не последней в теле оператора switch. Ключевые
слова case и default в теле оператора switch существенны только при начальной
проверке, когда определяется начальная точка выполнения тела оператора switch.
Все операторы, между начальным оператором и концом тела, выполняются вне
зависимости от ключевых слов, если только какой-то из операторов не передаст
управления из тела оператора switch. Таким образом, программист должен сам
позаботится о выходе из case, если это необходимо. Чаще всего для этого
используется оператор break.

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

Пример:

      int i=2;
      switch (i)
        {
         case 1: i += 2;
         case 2: i *= 3;
         case 0: i /= 2;
         case 4: i -= 5;
         default:      ;
     }

Выполнение оператора switch начинается с оператора, помеченного case 2.
Таким образом, переменная i получает значение, равное 6, далее выполняется
оператор, помеченный ключевым словом case 0, а затем case 4, переменная i
примет значение 3, а затем значение -2. Оператор, помеченный ключевым словом
default, не изменяет значения переменной.

Рассмотрим ранее приведенный пример, в котором иллюстрировалось
использование вложенных операторов if, переписанной теперь с использованием
оператора switch.

     char ZNAC;
     int x,y,z;
     switch (ZNAC)
     {
          case '+':  x = y + z;    break;
          case '-':  x = y - z;    break;
          case '*':  x = y * z;    break;
          case '/':  x = y / z;    break;
          default : ;
        }

Использование оператора break позволяет в необходимый момент прервать
последовательность выполняемых операторов в теле оператора switch, путем
передачи управления оператору, следующему за switch.

Отметим, что в теле оператора switch можно использовать вложенные операторы
switch, при этом в ключевых словах case можно использовать одинаковые
константные выражения.

Пример:

       :
     switch (a)
      {
        case 1: b=c; break;
        case 2:
            switch (d)
            {   case 0:  f=s;  break;
                case 1:  f=9;  break;
                case 2:  f-=9; break;
            }
         case 3: b-=c; break;
         :
      }

1.4.2. Пустой оператор

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

— в операторах do, for, while, if в строках, когда место оператора не
требуется, но по синтаксису требуется хотя бы один оператор;

— при необходимости пометить фигурную скобку.

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

Пример:

     int main ( )
     {
          :
           { if (...) goto a;    /* переход на скобку */
               { ...
               }
      a:;  }
           return 0;
       }

Полное ветвление

Формат записи условного оператора:

IF <УСЛОВИЕ> THEN <ДЕЙСТВИЕ 1> ELSE <ДЕЙСТВИЕ 2>

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

Pascal: занятие №2. часть 1: условный оператор в паскале (if)

Рис. 1. Фрагмент блок-схемы алгоритма с полным ветвлением.

Например, требуется определить, положительное или отрицательное число введено с клавиатуры. Число следует сравнить с нулем. Если оно больше нуля, то выводится на экран сообщение – число положительное, если меньше нуля, то оно отрицательное. Выражение для условия будет выглядеть так: x>0.

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

Program Chislo; {заголовок программы}

Var x : integer; {В разделе описания переменных задается переменная Х }

Begin

Writeln(’Введите целое число: ’); {Процедура вывода на экран сообщения для пользователя}

Readln(x); {Процедура для ввода числа с клавиатуры}

If x > 0 then writeln (‘Число положительное’) else writeln (‘Число отрицательное’); {Проверяется условие, если число больше нуля, то выводится сообщение, что число положительное, иначе сообщается, что число отрицательное}

End.

Как известно, в конце каждой строки программы, написанной на языке Паскаль, всегда ставится точка с запятой. Условный оператор не исключение, после него также ставится «;». Нельзя ставить разделитель «;» между словами IF .. THEN.. ELSE. Но если возникает ситуация, когда необходимо выполнить несколько действий по результатам условия, то они заключаются в операторные скобки Begin .. End и отделяются друг от друга точкой с запятой.