.

Турбо Паскаль 7.0

Язык: русский
Формат: реферат
Тип документа: Word Doc
0 798
Скачать документ

ТЕМА: ТурбоПаскаль7.0

Логические операторы и операторы цикла.

Отладка программ.

Укороченная форма оператора if

В операторе if часть, начинающаяся словом else, может отсутствовать.
Часть, следующая за словом then, выполняется, если логическое условие,
стоящее после слова if, имеет значение true. Если это логическое
выражение имеет значение false, непосредственно выполняется оператор,
следующий за if.

Наша программа может быть переписана с применением укороченной формы
оператора if. Алгоритм сводится к последовательности проверок попадания
переменной Аде в различные диапазоны значений. Приведем измененный текст
программы:

Program Dialog; {расширенный диалог — второй вариант)
const

Question =’ What is your name?’;

Rep(y1 =

‘Паскаль — прост, но первый компилятор Паскаля был написан на Паскале’;

Reply21 = ‘Вас ждет удивительное путешествие’;

Reply22 = ‘сквозь джунгли особенностей и возможностей языка’;

Reply3 =

‘Паскаль — разумный компромисс между желательным и эффективным’;

Reply4 = ‘Паскаль академически элегантен’;

var

Name: string;

Age: byte;

begin

WriteLn(Question); ReadLn(Name); {Ввод имени} WriteLn(‘Hello,’,
Name,’!’); {Вывод приветствия} WriteLn(‘How old are you?’);
{Вопрос о возрасте} ReadLn(Age); {Ввод возраста}
if 12 = 40 then WriteLn(Reply4) end.

Алгоритмически этот вариант решения задачи с использованием сокращенной
формы оператора if существенно слабее первого варианта, в котором
использовалась полная форма. При исполнении программы будут проверены
все четыре условия, даже если при первой проверке найдено окончательное
решение. Однако этот алгоритм не имеет вложенных друг в друга операторов
и поэтому проще для понимания.

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

Оператор if — один из наиболее часто используемых структурных элементов
языка — обеспечивает ветвление алгоритма только на два направления.
Вместе с тем ясно, что первый алгоритм решения задачи удачнее выражает
ее сущность. Для реализации подобных алгоритмов необходим оператор
множественного ветвления (выбора из нескольких ветвей команд). Таким
оператором в Паскале является оператор выбора case.

Общий вид этого оператора:

case of : ;

:;

: else end;

Case и of — зарезервированные слова, которые являются отличительным
признаком оператора множественного ветвления. Селектор — это переменная
или выражение порядкового типа. В зависимости от значения данного
выражения или переменной происходит ветвление программы. После заголовка
оператора идет перечисление различных альтернатив, по которым может
выполняться программа. Альтернативы отделяются друг от друга точкой с
запятой. Альтернатива состоит из метки, двоеточия и исполняемого
оператора данной альтернативы. Используемая в операторе case метка может
состоять из констант и диапазонов. Диапазоны значений в Паскале — это
два крайних значения, написанные через двоеточие. Такая запись
эквивалентна перечислению всех целых чисел в данном диапазоне. В общем
случае метка может состоять из различных констант и диапазонов,
разделенных запятыми, например, допустима такая метка: 4, 8..10, 12,
14.. 16. В качестве селектора нельзя использовать логические результаты
сравнения чисел (условия), поэтому использованные в операторах if
неравенства здесь неприменимы.

Часть оператора case, состоящая из слова else и последнего
альтернативного варианта, является необязательной, она выполняется в том
случае, если вычисленный в программе селектор не соответствует ни одной
из перечисленных выше альтернатив. Если эта часть оператора case
отсутствует, а селектор не подходит ни под одну из альтернатив, то
оператор case не выполнит никаких действий. Завершается оператор case
обязательным словом end;

Пример. С использованием оператора case наша программа приобретает
следующий вид

Program Dialog;

const

Question =’ What is your name?’;

Replyl =

‘Паскаль — прост, но первый компилятор Паскаля был написан на Паскале’;

Reply21 = ‘Вас ждет удивительное путешествие’;

Reply22 = ‘сквозь джунгли особенностей и возможностей языка’;

ReplyS =

‘Паскаль — разумный компромисс между желательным и эффективным’;

Reply4 = ‘Паскаль академически элегантен’;

var

Name: string;

Age: byte;

begin

WriteLn(Question); ReadLn(Name);

WriteLn(‘Hello,’, Name,’!’);

WriteLn(‘Howold are you?’); ReadLn(Age);

case Age of

0..11 :WriteLn(Reply1);

12..19 : begin WriteLn (Reply21); WriteLn (Reply22) end;

20..39: WriteLn(Reply3);

40..150:WriteLn(Reply4)

else WriteLn(‘Bbi ошиблись при вводе’)

end

end.

Переменная Age играет роль селектора. В зависимости от значения данной
переменной происходит дальнейшее ветвление программы. В нашем примере в
качестве альтернатив применяются диапазоны значений, поскольку нельзя
использовать результаты сравнения чисел, как в предыдущей программе.
Исходные неравенства заменены диапазонами. Например, проверка
логического условия Age := to do

;

for :=

downto do ;

Счетчик цикла — это переменная одного из порядковых типов (из порядковых
типов мы пока знаем только целые и логический тип, в главе 7 понятие
порядкового типа будет расширено). Назначение этой переменной очевидное
— она хранит число повторений операторов тела цикла, следующего за
словом do. Значение счетчика цикла изменяется автоматически от первого
до последнего значения и увеличивается на единицу для первой формы
записи (с оператором to) или уменьшается на единицу для второй формы
записи (с оператором downto). Дополнительные изменения значения счетчика
цикла в части, обозначенной здесь как , запрещены. В
качестве первого и последнего значения могут использоваться конкретные
числа, другие переменные целого типа, вычисленные ранее, и выражения,
имеющие значения целого типа.

Операторы тела цикла выполняются только один раз, если верхнее и нижнее
значения счетчика совпадают. Если в операторе for .. to последнее
значение счетчика цикла меньше первого, то тело цикла не выполняется ни
одного раза. В операторе for.. downto цикл не выполняется, если
последнее значение счетчика больше первого.

Программа с циклом for, которая вычисляет сумму N членов гармонического
ряда1:

Program Sum; {сумма N членов
гармонического ряда}

var x: byte;
{счетчик цикла}

s : real;
{сумма ряда}

N : byte;
{число членов ряда}

begin

Write(‘N = ‘); ReadLn(N); {ввод числа
членов ряда}

s := 0;
{начальное значение суммы}

тогх:= 1 toNdos:=s+ 1/х;
{подсчет суммы}

WriteLn( ‘S = ‘, s);
{вывод результата}

ReadLn {ожидание нажатия
клавиши Enter}

end.

Оператор, следующий после слова do, может быть составным (представлять
собой группу операторов).

Пример. Найти нечетные и кратные трем числа в диапазоне от 30 до 60
включительно. Распечатать их в порядке убывания.

Условие нечетности целого числа — Odd(J). Условие кратности трем —
равенство нулю остатка от деления i mod 3=0. Нас интересуют числа,
удовлетворяющие обоим условиям, то есть числа, для которых истинно
Odd(i) and (i mod 3 = 0). Убывающий порядок следования чисел
обеспечивает оператор for.. downto. Таким образом, программа будет иметь
вид

Program Sample;

var i: byte;

begin

for i := 60 downto 30 do {цикл по убывающей от 60 до 30}

if Odd(i) and (i mod 3=0) then WriteLn(i) end.

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

В приведенном примере многократно повторялся один оператор, однако во
многих случаях необходимо повторять группу операторов. Вспомним, что
говорилось в предыдущей главе о вложенности операторов друг в друга.
Чтобы использовать вместо одного оператора группу, нужно эту группу
превратить в один сложный оператор. Осуществляется это с помощью так
называемых «программных скобок» — операторов begin и end.

begin

;

;

end;

Любая группа операторов, начинающаяся со слова begin и кончающаяся
словом end в любой конструкции языка Паскаль может использоваться как
один сложный оператор. Сложный оператор, в свою очередь, может иметь в
своем составе сложные операторы следующего уровня вложенности и так
далее. Операторы begin и end подобны открывающим и закрывающим скобкам,
и на их употребление накладываются те же ограничения, что и на
обыкновенные скобки в арифметических выражениях: каждой «открывающей
скобке» begin должна соответствовать «закрывающая скобка» end. Слово end
не может предшествовать парному ему слову begin. При компиляции
программы проверяется правильность расстановки скобок и дается сообщение
об ошибке. Это сообщение не всегда попадает в то место, где
действительно нужна скобка, поэтому не спешите вставлять операторы туда,
куда предлагает компилятор, а тщательно проанализируйте Вашу программу.

Пример. Имеется логическое выражение not a and b xor с. Требуется
вывести на печать значения логических переменных а, Ь, с, при которых
данное выражение истинно. Мы предлагаем перебор всех возможных значений
а, b, с с проверкой выполнения условия для каждого сочетания значений.

Program Sample;

Vara, b, с : boolean;

begin

for a := false to true do

for b := false to true do

for с := false to true do

if not a and b xor с then

begin

Write(‘a=’,a);

Write(‘b=’,b);

WriteLn(‘c=’,c)

End

End.

В результате выполнения этой программы на экран будет выведено:

a =FALSE

b =FALSE

с =TRUE

a =FALSE

b =TRUE

с =FALSE

a =TRUE

b =FALSE

c =TRUE

a =TRUE

b =TRUE

с =TRUE

Программа состоит из одного сложного оператора for a := false to true
do, в который вложены последовательно еще два оператора for и оператор
if. Часть then последнего содержит сложный оператор, состоящий из трех
простых операторов, охваченных программными скобками begin и end.

Циклы с логическими условиями

Введенный в предыдущей главе оператор цикла for обеспечивает выполнение
цикла заданное количество раз, однако часто циклические действия
заканчиваются по условию, то есть выполняются до достижения
определенного результата. В Паскале есть два таких оператора цикла,
отличающиеся тем, что в одном из них условие проверяется в начале цикла
(while…do), а в другом — в конце цикла (repeat…until).

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

Оператор цикла while (пока, в то время как) имеет вид:

While do ;

Цикл While обеспечивает выполнение тела цикла, следующего за словом do
до тех пор, пока условие имеет значение true (истина). В качестве тела
цикла может использоваться простой или сложный оператор. Условие
проверяется перед началом каждого выполнения тела цикла, поэтому, если
до первого выполнения цикла условие имеет значение false (ложь),
оператор не выполняется ни одного раза (рис. 5.2).

Пример. Необходимо преобразовать значение угла в градусах к стандартному
диапазону ±180° путем исключения полных оборотов окружности ±360°. Эта
процедура может быть выполнена с помощью оператора цикла

While abs(Angle) > 180 do

if Angle > 0 then Angle := Angle — 360

else Angle := Angle + 360;

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

Цикл состоит из оператора if. Допустим, угол равен —700. Тогда условие
Angle > 0 в операторе if имеет значение false, при этом выполняется
часть else оператора if, и угол получит значение —340. Снова происходит
проверка условия выполнения цикла, и цикл выполняется второй раз, после
чего угол равен 20. При третьей проверке условия выполнения цикла он
заканчивается, поскольку условие его выполнения Abs(20)>180 приняло
значение false.

Оператор repeat… until…

Оператор цикла repeat… until… (повторять до тех пор, пока) имеет вид
Repeat until –;

Принципиальное отличие оператора repeat…until от оператора while…do
в том, что проверка условия производится не перед началом выполнения
оператора, а в его конце, когда решается вопрос, повторить ли еще раз
действия. Поэтому тело этого цикла всегда выполняется по крайней мере
один раз (рис. 5.3). Это важное отличие: приведенный для цикла while…
do пример реализовать с оператором цикла repeat… until невозможно без
дополнительных проверок и усложнений.

Второе отличие от оператора while…do — в логике завершения цикла. Цикл
оператора repeat…until выполняется до тех пор, пока не станет истинным
логическое выражение, следующее за словом until. Таким образом,
использование логического выражения здесь имеет противоположный
оператору while…do смысл. Здесь при истинности логического выражения
(условия) цикл прекращается, а у оператора while…do при истинности
логического выражения цикл продолжается.

Третье отличие в том, что оператор repeat…until имеет две части:

начальную и завершающую, которые охватывают группу операторов,
составляющих тело цикла. Оператор while…do не имеет завершающей части
и требует для организации тела цикла из нескольких операторов
программных скобок begin-end. Для оператора repeat…until таких скобок
не требуется — их роль выполняют составные части оператора.

Пример. Найти методом подбора целочисленное решение Диофантова уравнения
5x-3y=1. В качестве первой пробы берутся единичные значения. Далее, если
5x-3y>1, то у увеличивается на 1, если 5x-3y1theny:=y+1;

if (5 * x – 3 * у) = MaxSum then Вгеаk{прекращение игры при переборе} end;

{метание кости для компьютера — он играет,

если сумма очков меньше 18}

if SumComp = MaxSum then Break {прекращение игры при переборе} end

else begin {если компьютер пасует}

write(‘ пас. Будете продолжать? (у/п)’); {запрос о продолжении
игры}

repeat

read(reply) until (reply = ‘у’) or (reply = ‘Y’) or (reply = ‘n’) or
(reply = ‘N’);

if (reply = ‘n’) or (reply = ‘N’) then Break
{прекращение игры

по взаимному согласию}

end

until false; {замыкание цикла метания костей}
{подведение итогов}

if SumYour > MaxSum then writeln(‘Bы проиграли!’)

{перебор игрока}

else if SumComp > MaxSum then writeln(‘Я проиграл!’)

{перебор у компьютера}

else if SumYour

Нашли опечатку? Выделите и нажмите CTRL+Enter

Похожие документы
Обсуждение

Оставить комментарий

avatar
  Подписаться  
Уведомление о
Заказать реферат!
UkrReferat.com. Всі права захищені. 2000-2020