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

Предоплата всего

Подписываем
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Предоплата всего
Подписываем
екция: Условный оператор. Оператор выбора. Логические операции в Паскале. Страница 10 из 10
[1] Оглавление [2] Операторы языка Паскаль [2.1] Оператор присваивания [2.2] Оператор перехода [2.3] Пустой оператор [2.4] Составной оператор [2.5] Условный оператор [2.6] Оператор выбора [2.7] Операции отношения и логические операции [2.8] Контрольные вопросы [2.9] Примеры алгоритмов линейной и разветвляющейся структур |
Комбинированный урок №5
Тема: Условный оператор. Оператор выбора. Логические операции в Паскале.
Цель: формирование знаний о форматах операторов If, Case, навыков применения операторов. Примеры использования операторов.
Наиболее простым и часто используемым оператором языка является оператор присваивания:
<имя переменной> : = <выражение>;
Пример:
Y := Abs(x) -3.5;
Min := M Div N;
Y:=Sqrt(Exp(x)) + 2 * Sqr(x) * Sin(x/2) - Exp(5*Ln(x));
В операторах присваивания переменная и выражение должны иметь один и тот же тип, а для переменных интервального типа - одно и то же подмножество значений. Нельзя присваивать целочисленным переменным выражение типа Real. Однако разрешается присваивать переменной типа Real выражение целочисленного типа.
В логическом операторе присваивания слева от знака присваивания указывается переменная логического типа (boolean), а справа дается логическое выражение, имеющее значение True (правда) или False (ложь):
Пример:
D:=True;
B:=(A>C) AND (D<>0);
В символьном и строковом операторе присваивания слева от знака стоит переменная типа Char или String, а справа - символ, строка символов, либо символьное или строковое выражение:
Пример:
SYM:='A'; Alpha:=SUM;
Str1:='Turbo-'; Str2:='Pascal'; Str:=Str1+Str2.
Оператор безусловного перехода GOTO служит для прерывания естественного хода выполнения программы. Следующим выполняется оператор, помеченный меткой, которая использована в данном операторе перехода. Один оператор может помечаться несколькими метками.
GOTO <метка> ;
<метка> - это целое число без знака или идентификатор, обязательно описанный в разделе описания меток (LABEL).
Для того, чтобы пометить оператор, перед ним ставится метка, после которой записывается двоеточие.
< метка> :[<метка>: ...] <оператор>;
Оператор GOTO не рекомендуется использовать при программировании, так как это существенно усложняет отладку и тестирование программы, тем более что остальных управляющих операторов языка вполне достаточно для реализации любого алгоритма.
Пример:
Program Primer;
LABEL 25;
VAR N,S:Real;
Begin
Readln(S);
Readln(N);
IF N<0 THEN begin S:=N+2; GOTO 25 end;
25: Writeln('S= ',S:6:2)
End.
Пустой оператор не обозначается и не вызывает никаких действий в программе, представляет собой дополнительную точку с запятой.
Пример:
.................
GOTO 5;
.................
5:; End.
При написании программ на Паскале часто требуется, чтобы в определенном месте несколько операторов условно представлялись как один оператор. Для этого используется составной оператор, который объединяет последовательность (цепочку) операторов в единый оператор путем обрамления этой последовательности операторными скобками - словами "begin" и "end". Внутри операторных скобок операторы отделяются друг от друга знаком ";". Выполнение составного оператора сводится к последовательному - в порядке их написания - выполнению входящих в него операторов:
Пример:
begin i:=0; j:=0 end;
begin
y:=x/2;
x:=x+h;
begin
Sym:='A';Str:='Строка'
end
end;
Условный оператор используется для программирования развилки, если условие сформулировано как логическое выражение.
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 ;
Примеры полных условных операторов:
IF x<0 THEN i:=i+1 ELSE j:=j+1;
IF (x<y) AND (x<>0) THEN begin x:=y/x; y:=y+k end ELSE begin x:=x+0.01; y:=y-k end;
Примеры использования условного оператора в сокращенной форме:
IF x>y THEN Max:=x;
IF x<>0 THEN begin a:=y/x; Writeln('A= ', a:6:2) end;
Оператор выбора CASE может быть использован вместо условного оператора, если требуется сделать выбор более, чем из двух возможностей.
CASE <селекторное выражение> OF
<метка1> : <оператор 1> ;
<метка2> : <оператор 2> ;
…………..
<меткаN> : <операторN>
[ ELSE <оператор>]
END;
Селекторное выражение (селектор, переключатель) и метки-константы (метки варианта, метки выбора) должны иметь один и тот же простой тип (кроме вещественного). Метки-константы в отличие от меток программы не требуется описывать в разделе описания меток. Но на них нельзя ссылаться в операторе GOTO. Метки варианта могут быть перечисляемого и интервального типа.
Оператор выбора выполняется следующим образом. Сначала вычисляется селекторное выражение; затем выполняется оператор, метка варианта которого равна текущему значению селектора; после этого происходит выход из оператора CASE на следующий оператор. Если значение селектора не совпадает ни с одной из меток варианта, будет выполнен оператор после ELSE. Если ветвь ELSE отсутствует, то управление передается следующему за CASE оператору.
Пример:Вычислено значение К. Если К=0, то Z= ln x, при K=1 Z=ln x , при K=2 Z=sin x, при K=3 Z=cos x, в остальных случаях Z=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 значения, результатом сравнения являются данные логического (boolean) типа, а именно - правда или ложь (true или false).
В Паскале имеются следующие операции отношения:
= равно <> не равно < меньше > больше
<= меньше или равно >= больше или равно
Если сравнение справедливо, то результатом будет правда (true), в противном случае - ложь (false).
Построенные с помощью операций отношения простые пары сравнений типа A>B или С=3.14 могут объединяться в более сложные логические выражения с помощью логических операций: OR (или), AND (и), NOT (не), XOR (истинно либо то, либо другое, но не оба вместе).
Логические операции имеют приоритет (старшинство) над операциями отношения и выполняются в первую очередь, поэтому в сложных выражениях операции отношения заключаются в скобки:
A=B AND C>D |
неправильно |
(A=B) AND (C>D) |
правильно |
Пример 1.1. Простейший алгоритм, запрашивающий имя и затем приветствующий его обладателя.
Данные |
Результат |
Имя = "Тимур" |
"Привет, Тимур!" |
Program Hello;
Var Name: String; {Описание переменной Name строкового типа}
BEGIN
Write('Как тебя зовут ? '); {Вывод на экран текста вопроса}
ReadLn(Name); {Ввод c клавиатуры имени}
WriteLn('Привет, ', Name, '!'); {Вывод на экран приветствия}
ReadLn
END.
Здесь последний оператор ReadLn позволяет видеть на экране результаты работы программы, пока не будет нажата клавиша <Enter>.
Результаты работы Pascal-программы
Как тебя зовут ? Тимур <Enter> |
Пример 1.2. Определить объём и площадь боковой поверхности цилиндра с заданными радиусом основания R и высотой H.
Данные |
Результат |
||
R = 1 |
H = 1 |
V = 3.14 |
S = 6.28 |
Program Cylinder;
Uses Crt; {Подключение библиотеки Crt}
Var
R, {радиус основания цилиндра}
H, {высота цилиндра }
V, {объем цилиндра }
S: Real; {площадь боковой поверхности цилиндра}
BEGIN
ClrScr; {Вызов из библиотеки Crt процедуры очистки экрана}
Write('Введите высоту цилиндра : '); ReadLn(H);
Write('Введите радиус основания : '); ReadLn(R);
V := Pi * R * R * H;
S := 2 * Pi * R * H; WriteLn;
WriteLn('Объем цилиндра = ', V : 5 : 2); {Здесь 5 - общее
количество позиций, занимаемых переменной V при выводе,
а 2 - количество позиций в дробной части значения V}
WriteLn('Площадь боковой поверхности = ', S : 5 : 2);
ReadLn END.
Пример 1.3. Даны три точки на плоскости. Определить, какая из них ближе к началу координат.
Система тестов
Номер теста |
Данные |
Результат |
|||||
xA |
yA |
xB |
yB |
xC |
yC |
Otvet |
|
1 |
2 |
1 |
2 |
2 |
-1 |
3 |
"Это точка A" |
2 |
2 |
2 |
2 |
1 |
-1 |
3 |
"Это точка B" |
3 |
2 |
2 |
-1 |
3 |
2 |
1 |
"Это точка C"/TR> |
Program Points;
Uses Crt;
Var xA, yA, xB, yB, xC, yC, DistA, DistB, DistC : Real;
BEGIN ClrScr;
WriteLn('Введите координаты точки А:');
Write('x = '); ReadLn(xA); Write('y = '); ReadLn(yA);
WriteLn('Введите координаты точки B:');
Write('x = '); ReadLn(xB); Write('y = '); ReadLn(yB);
WriteLn('Введите координаты точки C:');
Write('x = '); ReadLn(xC); Write('y = '); ReadLn(yC);
DistA := sqrt(sqr(xA) + sqr(yA));
DistB := sqrt(sqr(xB) + sqr(yB));
DistC := sqrt(sqr(xC) + sqr(yC));
WriteLn; Write('Ответ : ');
If (DistA < DistB) and (DistA < DistC) then WriteLn( 'Это точка А.')
else If (DistB < DistC) then WriteLn('Это точка B.')
else WriteLn('Это точка C.');
ReadLn
END.
Пример 1.4. Найти произведение цифр заданного целого четырехзначного числа.
Система тестов
Номер теста |
Проверяемый случай |
Число |
Результат |
1 |
Число положительное |
2314 |
P = 24 |
2 |
Число отрицательное |
-1245 |
P = 40 |
Program DigitsProduct;
Uses Crt;
Var Number, {заданное число}
i, j, k, l, {цифры числа}
P : Integer; {произведение цифр}
BEGIN ClrScr;
Write( 'Введите четырехзначное число : ' ); ReadLn(Number);
Number:=Abs(Number);
Write( 'Цифры числа ' , Number , ' : ' );
i := Number div 1000; Write(i:3); {первая цифра}
j := Number div 100 mod 10; Write(j:3); {вторая цифра}
k := Number div 10 mod 10; Write(k:3); {третья цифра}
l := Number mod 10; WriteLn(l:3); {четвертая цифра}
P := i * j * k * l ;
WriteLn( 'О т в е т : произведение цифр равно ' , P );
ReadLn
END.
Пример 1.5. Решить квадратное уравнение ax2+ bx + c = 0.
Система тестов
Номер теста |
Проверяемый случай |
Коэффициенты |
Результаты |
||
a |
b |
c |
|||
1 |
d >0 |
1 |
1 |
-2 |
x1 = 1, x2 = - 2 |
2 |
d=0 |
1 |
2 |
1 |
Корни равны: x1 = - 1, x2 = - 1 |
3 |
d < 0 |
2 |
1 |
2 |
Действительных корней нет |
4 |
a=0, b=0, c=0 |
0 |
0 |
0 |
Все коэффициенты равны нулю. х любое число |
5 |
a=0, b=0, c<>0 |
0 |
0 |
2 |
Неправильное уравнение |
6 |
a=0, b<>0 |
0 |
2 |
1 |
Линейное уравнение. Один корень: x = - 0,5 |
7 |
a <> 0, b <> 0, с = 0 |
2 |
1 |
0 |
x1 = 0, x2 = - 0,5 |
Program QuadraticEquation;
Uses Crt; { подключение библиотеки Crt }
Var a, b, c : Real; {a, b, c - коэффициенты уравнения}
Discr : Real;
x1, x2 : Real; {x1, x2 - корни }
Test, NTest : Integer; {Ntest - количество тестов }
BEGIN
ClrScr;
Write('Введите количество тестов : ');
ReadLn(NTest);
For Test := 1 to NTest do {цикл по всем тестам задачи }
begin
Write('Тест ', Test, '. Введите коэффициенты a, b, c : '); ReadLn(a, b, c);
If (a=0) and (b=0) and (c=0) then begin Write('Все коэффициенты равны нулю.'); WriteLn('x - любое число ');end
else
If (a=0) and (b<>0) then WriteLn('Линейное уравнение. Oдин корень: x =', (-c/b):6:2)
else
If (a=0) and (b=0) and (c<>0) then WriteLn('Неправильное уравнение.')
else
begin Discr := b*b - 4*a*c;
If Discr > 0 then begin
x1:=(-b + Sqrt(Discr)) / (2*a); x2:=(-b - Sqrt(Discr)) / (2*a); WriteLn('x1=' , x1:6:2 , '; x2=' , x2:6:2) end
else
If Discr = 0 then begin x1 := -b/(2*a);
WriteLn('Корни равны: x1=', x1:6:2, ' x2=', x1:6:2); end
else WriteLn('Действительных корней нет.');
end;
WriteLn
end;
ReadLn
END.
Тест 1 . Введите коэффициенты a, b, c : ? 1, 1, 2 <Enter> Тест 2 . Введите коэффициенты a, b, c : ? 1, 2, 1 <Enter> Тест 3 . Введите коэффициенты a, b, c : ? 2, 1, 2 <Enter> |
Пример 1.6.
Две прямые описываются уравнениями
a1 x + b1 y + c1 = 0;
a2 x + b2 y + c2 = 0.
Напечатать координаты точки пересечения этих прямых, либо сообщить, что эти прямые совпадают, не пересекаются или вовсе не существуют.
Система тестов
Номер теста |
Проверяемый случай |
Коэффициенты прямых |
Результаты |
|||||
a1 |
b1 |
c1 |
a2 |
b2 |
c2 |
|||
1 |
Первая прямая не существует |
0 |
0 |
1 |
1 |
2 |
2 |
Это не прямая |
2 |
Вторая прямая не существует |
1 |
2 |
2 |
0 |
0 |
1 |
Это не прямая |
3 |
Все коэффициенты одной или обеих прямых равны нулю |
0 |
0 |
0 |
1 |
2 |
1 |
Это не прямая (прямые) |
4 |
Коэффициенты попарно равны |
1 |
2 |
1 |
1 |
2 |
1 |
Прямые совпадают |
5 |
Коэффициенты попарно пропорциональны |
1 |
2 |
1 |
2 |
4 |
2 |
Прямые совпадают |
6 |
Прямые параллельны |
2 |
3 |
-1 |
4 |
6 |
1 |
Прямые параллельны |
7 |
Прямые пересекаются |
1 |
2 |
-4 |
1 |
-2 |
1 |
x=1.50, y=1.25 |
Program Intersection;
Uses Crt; {подключение библиотеки Crt }
Var a1, b1, c1, {коэффициенты уравнения первой прямой}
a2, b2, c2, {коэффициенты уравнения второй прямой}
x, y : Real; {координаты точки пересечения }
Test, NTest : Integer;
BEGIN
ClrScr; {очистка экрана}
Write('Введите количество тестов : ');
ReadLn(NTest);
For Test := 1 to NTest do {цикл по всем тестам задачи}
begin
Write('Тест ', Test, '. Введите a1, b1, c1 : '); ReadLn( a1, b1, c1);
Write(' Введите a2, b2, c2 : '); ReadLn( a2, b2, c2);
WriteLn; Write('О т в е т : ');
If ( (a1=0) and (b1=0) ) or ( (a2=0) and (b2=0) ) then WriteLn( 'это не прямая (прямые). ' )
else
if (a1*b2=a2*b1) and (a1*c2=a2*c1) then WriteLn( 'прямые совпадают.' )
else
if a1*b2 = a2*b1 then WriteLn('прямые параллельны.')
else begin x:=(c1*b2-c2*b1)/(b1*a2-b2*a1); y:=(c2*a1-c1*a2)/(b1*a2-b2*a1);
WriteLn('координаты точки пересечения : x = ', x : 5 : 2 , ', y = ', y : 5 : 2); end; WriteLn
end;
ReadLn
END.
Результаты работы Pascal-программы:
Введите количество тестов : 7 Тест 2. Введите a1, b1, c1 : 1 2 2 <Enter> Тест 3. Введите a1, b1, c1 : 0 0 0 <Enter> Тест 4. Введите a1, b1, c1 : 1 2 1 <Enter> Тест 5. Введите a1, b1, c1 : 1 2 1 <Enter> Тест 6. Введите a1, b1, c1 : 2 3 -1 <Enter> Тест 7. Введите a1, b1, c1 : 1 2 -4 <Enter> |
Пример 1.7.
Вычисление даты следующего дня. Ввести данные о текущем дне, месяце и годе. Напечатать дату следующего дня. Если это последний день месяца, то напечатать об этом. Если это последний день года, то напечатать поздравление с наступающим годом.
Система тестов
Номер теста |
Проверяемый случай |
Результат |
1 |
11 12 2009 |
Завтра 12.12.2009 |
2 |
30 12 2009 |
C наступающим Новым годом! |
3 |
31 07 2009 |
Последний день месяца! |
Program primer_data;
var
day, month, year integer;
last : boolean; { TRUE, если текущий день последний день месяца }
r :integer; { если год високосный, то остаток от деления year на 4 равен нулю }
begin
write('Введите цифрами сегодняшнюю дату (число месяц год) > ');
readln(day,month,year);
last:=FALSE;
case month of
1,3,5,7,8,10,12 : if day=31 then last:=TRUE;
4,6,9,11 : if day=30 then last:=TRUE;
2 : if day = 28 then begin r:=year mod 4; if r <> 0 then last:=TRUE; end;
end; { case }
if last then
begin writeln('Последний день месяца!'); day:=1;
if month=12 then
begin month:=1; year:=year + 1; writeln('C наступающим Новым годом!'); end
else month:=month + 1;
end
else day:=day + 1;
writeln('Завтра ',day,'.',month,'.' ,year ); readln; end.
Результаты работы Pascal-программы:
Тест 1 . Введите цифрами сегодняшнюю дату (число месяц год) > 11 12 2009 <Enter>
Завтра 12.12.2009
Тест 2 . Введите цифрами сегодняшнюю дату (число месяц год) > 30 12 2009 <Enter>
C наступающим Новым годом!
Тест 3 . Введите цифрами сегодняшнюю дату (число месяц год) > 31 07 2009<Enter>
Последний день месяца!
Пример 1.8.
Вычисление результата арифметической операции. Ввести два числа в первой строке и один из знаков +, -, *, / - во второй и вывести на экран результат соответствующего арифметического действия.
Система тестов
Номер теста |
X |
Y |
Проверяемый случай |
Результат |
1 |
23 |
4 |
+ |
27 |
2 |
12 |
11 |
- |
1 |
3 |
45 |
15 |
/ |
3 |
4 |
2 |
33 |
* |
66 |
Program Calc;
var operation : Char; {Знак операции}
х, у, z : Real; {Операнды и результат}
stop : Boolean; {Признак ошибочной операции и останова}
begin
stop := false;
repeat
WriteLn; {Пустая строка-разделитель}
Write('x,y= ' ) ; ReadLn(x,y);
Write('операция: ') ; ReadLn(operation);
case operation of
' + ' : z : = x + y;
' - ' : z : = x - y;
' * ' : z : = x * y;
' / ' : z : = x / y;
else stop := true;
end;
if not stop then WriteLn('результат=',z)
until stop
end.
Результаты работы Pascal-программы:
Тест 1 . x,y= 23 4 <Enter>
операция: +<Enter>
результат=27
Тест 2 . x,y= 12 11 <Enter>
операция: -<Enter>
результат=11
Тест 3 . x,y= 45 15 <Enter>
операция: /<Enter>
результат=3
Тест 4 . x,y= 2 33 <Enter>
операция: *<Enter>
результат=66