Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по программированию..pdf
Скачиваний:
10
Добавлен:
15.11.2022
Размер:
12.2 Mб
Скачать

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

1)d := true;

2)b := (х > у) and (k <> 0);

3)с := d or b and not(odd(k) and d).

5.2.Функции, связывающие различные типы данных

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

Обращение

 

 

Таблица 5.2

Тип аргумента

Тип результата

Действие

ord(z)

любой поряд­

I

Порядковый номер зна­

pred(x)

ковый

 

чения х в его типе

любой поряд­

тот же, что

Предыдущее к х зна­

succ(z)

ковый

для X

чение в его типе

любой поряд­

тот же, что

Следующее к х зна­

chr(x)

ковый

для X

чение в его типе

I

char

Символ с порядко-

 

 

 

ковым номером х

odd(x)

I

boolean

True, если х — нечетное;

 

 

 

false, если х — четное

Функции ord, pred и succ применимы только к порядковым типам. Из простых типов это все, кроме вещественного.

Функция ord, применяемая к целому числу, дает его собственное значение. Например, ord(-35y = -35, ord(128) = 128.

Если аргумент целый, то, например, оператор у := pred(x) экви­ валентен: у := х - 1, а у := succ(x) эквивалентен: у := х + 1.

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

кодам, т.е. o rd O a ') < ordC'b’ )

<

< ordC’ z ') , то, например,

predC’ b O ^ a ', a s u cc(,b , ) =>c\

То же относится и к цифровым ли­

терам: рте<1(,5>) =,4:>; s u cc(,5 , ) = ,6\

Функция сЬг(х) является обратной к функции ord(x), если х — сим­ вольная величина. Например, для кода ASCII справедливо:

ord (,a, )=97; chr(97)=, a\

Эту их “взаимообратность” можно выразить формулой

chr(ord(x)) = х,

где х — символьная величина.

В некоторых случаях возникает задача преобразования символь­ ного представления числа в числовой тип. Например, нужно получить из литеры ’5’ целое число 5. Это делается так:

N:= o rd (’ 5’ ) - огсК’ О’ ),

где N — целая переменная. Здесь использован тот факт, что код литеры ’5’ на пять единиц больше кода ’О’.

Булевский тип также является порядковым. Порядок расположения двух его значений таков: false, true. Отсюда справедливы следующие

отношения:

 

 

ord (fa lse)

= 0, su cc(fa lse)

= true,

ord(true)

= 1, pred(true)

= fa lse .

Вот интересный пример. Пусть х,у, z — вещественные переменные. Как вы думаете, какую задачу решает следующий оператор:

z := х * ord(x >= у) + у * ord(у > х ) ?

Ответ такой: z = max(x, у). Как видите, эту задачу можно решить, не используя условного оператора if..then..else.

Задания

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

 

а) К

mod 7 = К div 5 - 1

при К = 15;

 

б) odd(trunc(lO * Р))

при Р = 0.182;

 

в) not

odd(n)

при п = 0;

 

г) t and (Р

mod 3 = 0)

при t = true, Р = 10101;

 

д) * у О

0) and (у > х)

при х = 2, у = 1;

 

е) a or {not b)

при а = false, Ъ= true.

2.

Если а =

true и х = 1, то какое значение получит логическая

переменная d после выполнения оператора присваивания:

a) d := х < 2;

б) d := not a or odd(x);

в) d := ord{a) <> xl

3.

Написать оператор присваивания, в результате выполнения ко­

торого логическая переменная t получит значение true, если выполня­ ется указанное условие, и значение false в противном случае:

а) из чисел х, у, z только два равны между собой; б) х — положительное число;

Лекция 6

6.1. Л огические выражения в управляющих операторах

Алгоритмическая структура ветвление программируется в Паскале с помощью условного оператора. Раньше мы его описывали в таком виде:

if <условие> then соператор 1> else <оператор 2>

Кроме того, возможно использование неполной формы условного опе­ ратора:

if <условие> then <оператор>

Теперь дадим строгое описание условного оператора в форме син­ таксической диаграммы:

< условный оператор>

.

--------------------

► if— ► Слогическое выражение>---

■•then

-< оператор>-

 

else

— ► < оператор>

 

То, что мы называли раньше условием, есть логическое вы раж е­ ние, которое вычисляется в первую очередь. Если его значение равно true, то будет выполняться Соператор 1> (после then), если — false, то Соператор 2> (после else) для полной формы или сразу следующий оператор после условного для неполной формы (без else).

П ример 1. По длинам трех сторон треугольника а, Ь, с вычислить его площадь.

Для решения задачи используется формула Герона

S =

> /р (р -а )(р - Ь)(р -

с),

й4- b+ с

__

тт

где р = ----- ^----- — полупериметр треугольника. Исходные данные дол­

жны удовлетворять основному соотношению для сторон треугольника: длина каждой стороны должна быть меньше длин двух других сторон.

Имея возможность в одном условном операторе записывать достаточно сложные логические выражения, мы можем сразу “отфильтровать” все варианты неверных исходных данных.

Program Geron;

{Example4.pas}

Var А, В, С, P,

S

Real;

Begin

 

 

WriteLn(’ Введите длины сторон треугольника:*);

WriteC’ a®’ ) ;

 

 

 

ReadLn(A);

 

 

 

WriteOb®’ );

 

 

 

ReadLn(B);

 

 

 

WriteC’ c®’ ) ;

 

 

 

ReadLn(C);

 

 

 

If (A > 0) And

(B >

0) And (C > 0) And

(A + В > C)

And (В + C > A) And (A + С > B)

 

Then Begin

 

 

 

 

P :« (A

+ В

+ C) / 2;

 

 

S :* Sqrt(P * (P - A) * (P - В) * (P - C));

 

WriteLnC Площадь®’ , S)

 

 

End

 

 

 

Else

WriteLnC’ Неверные исходные данные’ )

End.

 

 

 

 

Теперь

рассмотрим

синтаксическую

диаграмму оператора

“цикл-пока” или “цикл с предусловием” .

«шератор цикла с предусловием>

-------------------------------------------------------► while —► < логическое выражение> — 1-----►do —><оператор> ---- д»

Сначала вычисляется Слогическое выражение>. Пока его значение равно true, выполняется <оператор> — тело цикла. Здесь <оператор> может быть как простым, так и составным.

П ример 2. В следующем фрагменте программы на Паскале вычи­ сляется сумма гармонического ряда

1 + 5 + 3 + " ' + Т + " '

с заданной точностью е . Суммирование прекращается, когда очеред­ ное слагаемое становится меньше е или целая переменная г достигает значения Maxlnt.

S := 0; {Example5.pas}

I :® 1;

While (1 / I >= Eps) And (I < Maxlnt) Do

Begin

S := S + 1 / I;

I :« I + 1

End;

Синтаксическая

диаграмма

оператора

цикл-до

или

“цикл с постусловием” :

 

 

 

< оператор цикла с постусловием>

► repeat — > <оператор>

 

--------------------------------

 

 

1 > until — ** Слогическое выражение>-- >>

Исполнение цикла повторяется до того момента, когда Слогическое выражение> станет равным true.

Предыдущая задача с использованием цикла с постусловием реша­ ется так:

S := 0; {Examples.раз}

I := 1;

Repeat

S := S + 1 / I;

I := I + 1

Until (1 / I < Eps) Or (I >■ Maxlnt);

6.2.Цикл по параметру

Рассмотрим следующую простую задачу: требуется вычислить сумму целых чисел от М до N путем прямого суммирования. Здесь М и N — целые числа. Задачу можно сформулировать так:

Ягшгта = ( , ! / ’

е а и М ^ >

10,

если М > N.

Алгоритм и программа решения этой задачи с использованием структуры “цикл-пока” будут следующими:

Program

Adding;

Integer;

Var

I,

M,

N, Summa

Begin

 

’);

 

WriteC'M*

 

ReadLn(M) ;

 

Write(*N=

O;

 

ReadLn(N);

 

Summa

:= 0;

 

I

M;

 

 

While I <= N Do

 

Begin

 

Summa := Summa + I;

 

I :» Succ(I)

 

End;

Summa)

WriteLn(* Сумма равна

End.

 

А теперь введем новый тип циклической структуры, который будет называться “цикл по параметру” или “цикл-для” Ниже приведены блок-схема и алгоритм на Алгоритмическом языке для решения рас­ сматриваемой задачи с использованием этой структуры.

Здесь целая переменная I принимает последовательность всех зна­ чений в диапазоне от М до N. При каждом значении I выполняется тело цикла. После последнего выполнения цикла при / = N происходит выход из цикла на продолжение алгоритма. Цикл выполняется хотя бы один раз, если М < iV, и не выполняется ни разу при М > N.