<<Назад

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


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

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

Полный оператор.
Формат команды
IF условие THEN оператор_1 ELSE оператор_2;

Неполный оператор.
Формат команды
IF условие THEN оператор;

 

  Если перевести на русский язык английские слова то получим:

  ЕСЛИ условие ТО оператор_1 ИНАЧЕ оператор_2; или ЕСЛИ условие ТО оператор;

  В качестве условия применяют операции сравнения: =, <>, <=, >=, <, >. Слева и справа от знака сравнения записывают арифметические выражения.

  Например, оператор
            If x<>0 then z:=y/x
                еlse write('Ошибка!');
  присвоит переменной Z значение частного y/x, если x<>0, в противном случае высветит на экране слово "Ошибка!".

7.2. Составной оператор.
  В некоторых случаях после слов THEN и ELSE надо выполнить не один оператор, а несколько. Тогда эти операторы заключаются в так называемые операторные скобки, где BEGIN - открывающая скобка, END - закрывающая скобка. Все операторы находящиеся внутри операторных скобок называются составным оператором. Перед словом ELSE точка с запятой никогда не ставится.

  Формат команды: BEGIN оператор; оператор; ... оператор END;

  Например:
        If a<b then
        begin
          R:=a;
          A:=b
          B:=r
        End

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

  В качестве выполняемого в условном операторе действия может быть другой условный оператор. Например:
    If sqr(x)+sqr(y)>1 then
       If x>y then z:=0
          Else z:=1;

  При такой форме записи со сдвигом вправо для каждого внутреннего действия, легко понять, к какому из двух слов IF относится слово ELSE. Рассмотрим пример программы с использованием условного оператора. Пусть для двух целых чисел надо определить, являются они четными или нет. Для проверки четности используем условие: остаток от деления на 2 четного числа равен 0.

Program prim_7;
Var a,b:integer;
Begin
  Write('введите два целых числа');
  Readln(a,b);
  If a mod 2 = 0 then Writeln (' а - четное ')
  Else Writeln (' a - нечетное ');
  If b mod 2 = 0 then Writeln (' b - четное ')
  Else Writeln (' b -нечетное ');
Readln
End

Задания для тренировки.
2. Ввести два числа. Напечатать сначала меньшее, затем большее из них.
3. Даны числа x и y. Вычислите число z, равное x+y, если x<=y, и 1 - х + y в противном случае
4. Даны два числа. Выведите первое из них, если оно больше второго, и оба числа, если это не так.
5. Если данное число х меньше нуля, то z присвойте значение большего из двух чисел х и у, иначе z присвойте значение полусуммы этих чисел.
6. *Даны два числа. Меньшее из них замените полусуммой этих чисел, а большее - их произведением.
7. Даны радиус круга и сторона квадрата. У какой фигуры площадь больше?
8. Дано целое число. Определить:
   a. Является ли оно четным;
   b. Оканчивается ли оно цифрой 7;
   c. Делится ли оно на 13.

Разбор тренировочного задания урока 6.

8. *Дано вещественное число А, содержащее два знака до запятой и два после. Получить новое число, поменяв в числе А целую и дробную части.

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

Program prim_8;
Var a,b,x1,x2:real;
Begin
  Write('введите число');
  Readln(a);
  X1:=int(a) ;    {целая часть}
  X2:=frac(a);    {дробная часть}
  b:=x1/100+x2*100;    {новое число}
  Writeln(b);
  Readln
End.

9. *В кассе имеются купюры достоинством в К рублей и в 1 рубль. Выдать N рублей минимальным набором купюр заданного достоинства.

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

Program prim_6;
Var k,n,m,p:integer;
Begin
  Write('введите число рублей');
  Readln(n);
  Write('введите достоинство купюры');
  Readln(k);
  m:=n div k;   
  p:=n mod k;   
  Writeln(p,' купюр по 1 рублю, ', m,' купюр по ',k,'руб. Итого=',p+m);
  Readln
End.

 Логические операции и выражения


6.*Даны два числа. Меньшее из них замените полусуммой этих чисел, а большее - их произведением.

  На первый взгляд задача решается просто:

  If a>b then begin b:=(a+b)/2; a:=a*b end
        else begin a:=(a+b)/2; b:=a*b end;

  Но если выполнить эту команду, то ответ получится неверным, почему?
  Предположим a=10, B=20. Что же получится в результате выполнения оператора. Так как a<b, то условие, указанное в операторе не выполнено, следовательно, выполнится

  else begin a:=(a+b)/2; b:=a*b end;

  подставим значения и получим:

  a:=(a+b)/2=(10+20)/2=15
  b:=a*b =15*20=300 вместо 10*20=200 потому, что к этому моменту первоначальное значение а=10 изменилось и стало равно 15.

  Следовательно надо как то сохранить первоначальные значения. Можно запомнить их в дополнительных переменных:

  х:=а;
  у:=b;
  If a>b then begin b:=(x+y)/2; a:=x*y end
        else begin a:=(x+y)/2; b:=x*y end;

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

  Program prim_6;
  Var a,b,x,y:real;
  Begin
    Write('введите два числа');
    Readln(a,b);
    X:=a*b;        {запомним значение произведения}
    Y:=(x+y)/2;    {запомним значение полусуммы}
    If a>b then begin b:=y; a:=x end
      else begin a:=y; b:=x end;
    Writeln (' a= ',a:0:2,' b=',b:0:2);
    Readln
  End

Логические операции и выражения.

  Если условие выполняется, то говорят, что соответствующее выражение истинно, если не выполняется - выражение ложно. Для построения сложных условий в Паскале имеются четыре логических операции:
  NOT - отрицание (НЕТ),
  AND - логическое умножение (И),
  OR  - логическое сложение (ИЛИ),
  XOR - исключающее "или".

  Результаты логических операций для различных значений операндов приведены в таблице, где использованы обозначения: Т- true (истина), F - false (ложь).

A

B

Not A

A and B

A or B

A xor B

T

T

F

T

T

F

T

F

F

F

T

T

F

F

T

F

F

F

F

T

T

F

T

T

  где А и В результат операции отношения.

  Приоритеты логических операций: 1) not; 2) and; 3) or; 4) xor.

  Примеры логических выражений:
  a) (0<x) AND (x<=1)
  b) (a=0) OR (abs(x)<5)
  c) NOT (x=y)

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

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

  Рассмотрим следующую задачу:
  Имеется прямоугольное отверстие со сторонами а и b и кирпич с ребрами х, у, z. Требуется определить пройдет ли кирпич в отверстие.

  Решение.
  Кирпич имеет три грани, каждую из которых мы можем повернуть на 90 градусов, т.е. для каждой грани надо проверит два случая. Итого шесть. Получаем условие:

  (a>x)and(b>y) or (b>x) and (a>y) or
  (a>x) and(z>y) or (z>x) and(a>y) or
  (b>x) and(z>y) or (z>x) and(b>y)

  Код программы:
  Program prim_8;
  Var a,b,x,y,z:integer;
      F:boolean;
  Begin
    Write('введите размеры отверстия');
    Readln(a,b);
    Write('введите размеры кирпича');
    Readln(x,y,z);
    If (a>x)and(b>y) or (b>x)and(a>y) or (a>x)and(z>y) or
       (z>x)and(a>y) or (b>x)and(z>y) or (z>x)and(b>y)
    then Writeln ('Кирпич пролезет в отверстие')
      Else Writeln ('Кирпич не пролезет в отверстие');
    Readln
  End

Тренировочные задания к уроку.
1. Установить, истинны или ложны следующие условия:
   (A=0) and not (B=0) or not (a=0) and (B=0) при
  a) А=0, В=0
  b) А=0, В=1

2. Ввести три числа. Выбрать и напечатать наибольшее из них.

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

4. Даны три числа. Найдите наибольшее значение их суммы и произведения.

5. Даны три числа а, b, с. удвойте эти числа, если они являются упорядоченными по возрастанию.

6. Проверьте, есть ли среди трех заданных чисел равные.

7. Дано двузначное число. Определить:
  a) какая из его цифр больше, первая или вторая;
  b) одинаковы ли его цифры.

8. Известны площади круга и квадрата. Определить:
  a) Уместится ли круг в квадрате;
  b) Уместится ли квадрат в круге.

9. Дано трехзначное число. Выяснить, является ли оно палиндромом ("перевертышем"), т.е. таким числом, десятичная запись которого читается одинаково слева направо и справа налево.

 

Целочисленная арифметика и условный оператор


 Задача.
Дано трехзначное число. Определить:
  a) Является ли сумма его цифр двузначным числом;
  b) Является ли произведение его цифр трехзначным числом;
  c) Больше ли числа А произведение его цифр;
  d) Кратна ли пяти сумма его цифр;
  e) Кратна ли сумма его цифр числу А.

Код программы.

Program prim;
Var a,x1,x2,x3:integer;
    x,s,p:longint;   
Begin
    Write('введите трехзначное число');
    Readln(a);
    X1:=x div 100;
    X2:=(x div 10) mod 10;
    X3:= x mod 10;
    S:=x1+x2+x3;
    If (s>9) and (s<100) then writeln (' Сумма двузначное число ')    {a}
      Else Writeln('Сумма не двузначное число ');
    P:=x1*x2*x3;   
    If (p>99) and (p<1000) then writeln (' Произведение трехзначное число ')    {b}
      Else Writeln('Произведение не трехзначное число ');
    Write('Введите число А');
    Readln(a);
    If (p<a) then writeln (' произведение больше ', a)         {c}
      Else Writeln('произведение не больше ', a);
    If s mod 5 = 0 then writeln (' сумма цифр кратна 5')         {d}
      Else Writeln('сумма цифр не кратна 5 ');
    If s mod а = 0 then writeln (' сумма цифр кратна ',a)         {e}
      Else Writeln('сумма цифр не кратна ', a);
    Readln
End.

Тренировочные упражнения.
1. Дано трехзначное число.
   a. Верно ли, что все его цифры одинаковы?
   b. Определить, есть ли среди его цифр одинаковые.
2. Дано четырехзначное число. Определить:
   a. Равна ли сумма двух первых его цифр сумме двух его последних цифр;
   b. Кратна ли трем сумма его цифр;
   c. Кратно ли четырем произведение его цифр;
   d. Кратно ли произведение его цифр числу А.
3. Дано натуральное число.
   a. Верно ли, что оно заканчивается нечетной цифрой?
   b. Верно ли, что оно заканчивается четной цифрой?
4. Является ли число А делителем числа В? А наоборот?
5. Дано четырехзначное число N. Выяснить:
   a. Является ли число палиндромом?
   b. Верно ли, что все 4 цифры этого числа различны.
6. Трамвайный билет имеет шестизначный номер. Выяснить, является ли билет "счастливым". Билет назовем "счастливым", если сумма первых трех цифр равна сумме последних трех цифр. Примечание. Так как шестизначное число больше 32767(тип Integer), необходимо номер билета определит как тип Longint( до 10 знаков).
7. Выяснить пройдет ли кирпич в круглое отверстие.

 <<Назад

Hosted by uCoz