Здавалка
Главная | Обратная связь

Истина (да) ложь (нет)



 

 

ЕСЛИ (условие)

ТО цепочка-1

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

 

Действие альтернативы:

1. проверяется выполнение условия,

2. если условие истинно, то выполняется следующая за ним цепочка-1, а цепочка-2, если она имеется, не выполняется,

3. если условие ложно, то выполняется цепочка-2, если она имеется.

В Паскале альтернатива реализуется условным оператором:

If (условие)

Then оператор-1

Else оператор-2;

где условие – это любое логическое выражение.

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

Примеры:

1. определить значения переменной z после выполнения операторов:

x := 1;

z := 3;

If (x – z > 0) в данном случае условие ложно, поэтому

Then z := z – 1 будетвыполняться ветвь Else, и, значит,

Else z := z + 1; z = 4

2. определить наибольшую из двух переменных a и b, присвоив ее значение переменной с:

данет

 

Словесное описание алгоритма:

ЕСЛИ (a > b)

ТО c = a

ИНАЧЕ c = b;

Реализуем этот алгоритм на Паскале:

If (a > b)

Then c: = a

Else c: = b;

3. решить эту же задачу сокращенной альтернативой:

а)двумя сокращенными альтернативами:

If (a > b)

Then c := a;

If (b > a)

Then c := b;

 

 

б)одной сокращенной альтернативой:

 

c := b;

If (a > b) Then c := a;

 

 

Реализация альтернативы усложняется, если в каждой ее ветви имеется не по одному оператору, а по цепочке операторов. В этом случае цепочки заключаются в операторные скобки: BEGIN … END. Получается составной оператор:

sin c,если c < 2,5

a =

cos c,если c ≥ 2,5

| c |,если c < 2,5

b =

1/c, если c ≥ 2,5

На Паскале:

If (c < 2.5) Внимание! Перед служебными словами

Then Then и Else , а также после них точка с

Begin запятой не ставятся!

a:=Sin(c);

b:=Abs(c) Перед End точку с запятой можно не ставить!

End

Else

Begin

a:=Cos(c);

b:=1.0/c

End;

В условном операторе If после слов Then и Else могут в свою очередь следовать новые операторы If , что дает возможность использовать вложение операторов If до любого уровня:

Примеры:

1. определить наибольшую из трех переменных x, y,z и присвоить ее значение переменной s:

а) с использованием полной альтернативы:

ЕСЛИ (x > y) If (x > y)

ТО ЕСЛИ (x > z) Then If (x > z)

ТО s = x Then s:=x

ИНАЧЕ s = z Else s:=z

ИНАЧЕ ЕСЛИ (y > z) Else If (y > z)

ТО s = y Then s:=y

ИНАЧЕ s = z; Else s:=z;

Внимание! В этом вложенном операторе точка с запятой только одна – в конце всего оператора.

б) с использованием усеченной альтернативы: вариант 1

 

 

s = z; s := z;

ЕСЛИ (x > y) If (x > y)

ТО ЕСЛИ (x > z) Then If (x > z)

ТО s = x; Then s:=x;

ЕСЛИ (y > x) If (y >x)

ТО ЕСЛИ (y > z) Then If (y > z)

ТО s = y; Then s:=y

вариант 2 – с использованием операции конъюнкция

s = z; s := z;

ЕСЛИ (x > y) & (x > z) If (x > y) And (x > z)

ТО s = x; Then s:=x;

ЕСЛИ (y > x) & (y > z) If (y >x) And (y > z)

ТО s = y; Then s:=y;

По принятому в Паскале соглашению, Else всегда относится к ближайшему предшествующему ему незанятому If:

If (n>0)

Then If (m Mod n > n)

Then m := m – n

Else m := m + n

Else m := m Mod n;

В данном случае ветвь Else m := m + n относится к If (m Mod n > n), а ветвь Else m := m Mod n относится к If (n > 0).

 

Часто встречающиеся ошибки программирования:

1. Использование в качестве условия выражения не логического типа:

If (n + m)

Then . . .

 

2. Использование Else без Then:

If (n > m)

Else . . .

3. Использование в операторных скобках, стоящих после Else или Then, слова Begin без End или наоборот:

If (n > m)

Then

Begin

a:=1;

b:=0;

Else . . .

4. Использование точки с запятой перед словами Else или Then:

If (n > m);

Then a:=1;

Else a:=0;

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

If n > m And n <= k

Then . . .

6. Использование лишних проверок условий:

If (n > m)

Then a:=1

Else If (n <= m)

Then a:=0

Else a:=2;

 

Пример

Задан график функции f(x) – полуокружность радиуса R=1:

Определить:

1. Значение функции y при заданном значении аргумента x.

2. Площади фигур слева и справа от линии разреза.

По теореме Пифагора:

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

s1 = 0,5 x y

и сегмента:

s2 = 0,5 R2 (α – sin α), где α – центральный угол в радианах,

причем

α = arcsin(y/R).

Площадь всей фигуры (полукруга) определяется выражением:

S = π R2/2.

Программа решения задачи:

Program Primer;

Uses CRT;

Var x, y, s_left, s_right, alfa, sin_alfa, segment : Real;

Begin

ClrScr;

Write(‘x=’);

ReadLn(x);

If (x<=1.0) Then первый участок

Begin

y:=Sqrt(1.0 - (x - 1.0 ) * (x - 1.0 ));

If (x<=0.0)

Then y:=0.0;

End

Else

Begin второй участок

y:=Sqrt(1.0 - (x- Trunc(x)) * (x- Trunc(x)));

If (x>=2.0)

Then y:=0.0;

End;

If (x=1.0) Then

Begin

s_left:=0.7854;

s_right:=0.7854;

End;

If (x<1.0) Then первый участок

Begin

sin_alfa:=y;

If (sin_alfa<>1.0)

Then alfa:=Arctan(sin_alfa/Sqrt(1.0 - sin_alfa*sin_alfa))

Else alfa:=Pi/2.0;

segment:=0.5*(alfa - sin_alfa);

s_left:=segment + 0.5*x*y;

s_right:=Pi/2.0 - s_left;

End; x<=1.0

If (x>1.0) Then второй участок

Begin

x:=2.0-x;

sin_alfa:=y;

If (sin_alfa<>1.0)

Then alfa:=Arctan(sin_alfa/Sqrt(1.0 - sin_alfa*sin_alfa))

Else alfa:=Pi/2.0;

segment:=0.5*(alfa - sin_alfa);

s_right:=segment + 0.5*x*y;

s_left:=Pi/2.0 - s_right;

End; x>=1.0

WriteLn(‘y=’, y:6:4);

WriteLn(‘s_left=’, s_left:6:4);

WriteLn(‘s_right=’, s_right:6:4);

End.

 

Переключатель

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

 

Такую ситуацию называют переключателем.

Структура переключателя предусматривает выполнение i-ой цепочки операторов, если селектор принимает значение-i.

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

Case (селектор) Of

значение-1: оператор-1;

значение-2: оператор-2;

значение-3: оператор-3;

…………………………

значение-n: оператор-n;

Else оператор-n+1;

End;

 

 

где Case - служебное слово “вариант”,

селектор - переменная или выражение любого порядкового или перечисляемого типа,

значение-1, значение-2,… - метки вариантов – конкретные значения или диапазоны значений селектора,

Else - служебное слово “иначе” (не обязательно).

Внимание! Перед словом Else можно ставить точку с запятой.

Действия оператора:

1. вычисляется значение селектора,

2. среди меток вариантов отыскивается это значение,

3. выполняется оператор, стоящий за найденной меткой,

4. осуществляется выход из переключателя,

5. если вычисленное значение селектора не найдено среди меток вариантов, то выполняется оператор, стоящий после слова Else, если оно есть.

Внимание! Переключатель всегда заканчивается служебным словом End, причем слова Begin для него нет.

Пример: чему будут равны значения переменных k и d после выполнения следующих операторов:

d := 5;

k := 4;

Case (k Mod d ) Of

2,3,5..8: d := k; метки вариантов могут перечисляться через запятую

1: ; это пустой оператор – программа ничего не выполняет

4,9: Begin если в одной ветви переключателя несколько операторов,

k := 0; то они заключаются в операторные скобки

d := 2;

End; перед Else ставится точка с запятой

Else d := 1; если значение селектора не совпадает ни с одной из меток

End;

В этом случае значение селектора 4 Mod 5 = 4 , поэтому переходим на ветвь с меткой варианта, равной 4, отсюда k = 0 и d = 2.

Таким образом,

· в каждой ветви могут стоять по нескольку меток вариантов, разделенных запятыми: 2,3,

· можно использовать интервалы данных: 5..8

· в качестве оператора можно использовать пустой оператор

· если после метки вариантов следует несколько операторов, то необходимо заключать в операторные скобки Begin…End

· метки вариантов не должны повторяться.

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

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

1. для месяцев с 30 днями

2. для месяцев с 31 днем

3. для месяца с 28 днями (вариант високосного года рассматривать не будем).

Program Mesjac;

Uses Crt;

Var Month: 1..12;

Begin

ClrScr;

Write(‘Введите номер месяца:’);

ReadLn(Month);

Case (Month) Of

4,6,9,11: WriteLn(’30 дней’);

1,3,5,7,8,10,12: WriteLn(’31 день’);

2: WriteLn(’28 дней’);

Else WriteLn(‘Такого месяца нет’);

End;

ReadLn;

End.

Часто встречающиеся ошибки программирования:

1. Использование в качестве селектора выражения логического типа:

Case (n > m) Of. . .

2. Использование в качестве селектора выражения вещественного типа:

Case (n + 2.5) Of. . .

3. Использование в качестве меток вещественных чисел:

Case (n + m) Of

0.5 : n:=1;

1.5 : n:=2;

Else n:=3;

End;

4. Использование двоеточия или точки с запятой после слова Of:

Case (n + m) Of:

. . . . . . . . .

5. Повторение меток:

Case (n + m) Of

0..3 : n:=1;

3, 4 : n:=2;

Else n:=3;

End;

6. Отсутствие в конце оператора слова End:

Case (n + m) Of

0..2 : n:=1;

3, 4 : n:=2;

Else n:=3;

7. Отсутствие точки с запятой в конце каждой ветви переключателя:

Case (n + m) Of

0..3 : n:=1

3, 4 : n:=2;

Else n:=3;

End;

Внимание! Перед веткой Else точка с запятой может ставиться, а может и не ставиться.

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

Case (n + m) Of

0...3 : n:=1;

3, 4 : n:=2

Else n:=3;

End;

Внимание! Перед словом End точка с запятой может ставиться, а может и не ставиться.

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

Case (n + m) Of

0...3 : n:=1;

3; 4 : n:=2

Else n:=3;

End;

 

 

Циклы

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

1. бесконечные циклы,

2. циклы с предусловием (циклы типа ПОКА),

3. циклы с постусловием (циклы типа ДО),

4. циклы с параметром (циклы типа ДЛЯ).

 

Бесконечные циклы

Бесконечный цикл может быть представлен следующей схемой:

 

 

i :=0;

5: i := i + 1; эти три оператора образуют бесконечный цикл

i := i -1;

GoTo 5;

Как правило, появление в программе бесконечных циклов вызвано логическими ошибками, допущенными программистом при разработке алгоритма и кодировании (написании операторов программы) и использовании оператора безусловного перехода GoTo. Поэтому в современных алгоритмических языках этот оператор практически не используется, а заменяется циклами. Бесконечные циклы не выявляются транслятором при синтаксическом контроле и проявляются только после запуска программы на выполнение следующим образом:

1. длительное время (десятки секунд) программа не выводит на устройство вывода никакой информации – программа зависает,

2. на устройство вывода постоянно выводится одна и та же информация.

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

 







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.