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

ТурбоПаскаль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 if (12 : < оператор 1>;

< альтернатива 2>:< оператор 2 >;

< альтернатива N >: < оператор N > else < оператор части 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 < 12 заменена проверкой принадлежности диапазону 0..11.

В заключение подчеркнем, что оператор case имеет существенные отличия от оператора if. Используемые для выбора альтернатив метки должны быть количественно определены до начала вычислений, поэтому в них могут применяться только константы, приведенные непосредственно или описанные в разделе описаний. Кроме того, оператор ограничен порядковыми типами данных, используемых для выбора альтернатив.

If Ready then Exam_ok := true;

Идеальная логика эквивалентности:

If Ready then Exam_ok := true else Exam_ok := false;

Управление вычислительным процессом, цикл for

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

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

(1) обозначим искомую сумму S и присвоим ей значение, равное нулю;

(2) последовательно N раз вычислим слагаемые ряда и прибавим их к переменной S.

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

for < счетчик цикла> := < первое значение> 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

;

< оператор 2>;

< оператор М> 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 * у) < 1 then х := х + 1 until(5*x-3*y)=1;

writeln('x= ',x, 'y=',y) end.

В результате на экране получим х=2у=3.

Пример. С помощью цикла repeat...until можно организовать процедуру ввода данных с защитой программы от завершения при ошибочном наборе. Если тип данных не соответствует инициализируемой при стандартном вводе переменной (например, требуется ввести целое число, а набрано дробное), то возникает ошибка в выполнении программы, и мы должны снова запускать программу, и, естественно, повторить набор. Чтобы защититься от последствий таких ошибок, можно использовать собственную процедуру ввода. Такая процедура должна отключить автоматическую проверку правильности ввода и проводить ее самостоятельно, причем при ошибке требовать повторного набора. Отключение проверки правильности ввода производится директивой компилятора {$!-} (Input/Output checking в окне настройки опций компилятора). После каждого действия по вводу-выводу специальная функция lOResult возвращает целое значение, соответствующее ошибкам ввода-вывода. Правильной работе ввода-вывода соответствует нулевое значение, возвращаемое этой функцией. Надежный ввод целого числа i выполняет фрагмент программы:

{$!-} {отключение проверки ввода-вывода} repeat

Write ('Введите i = '); {вывод на экран предложения для ввода}

ReadLn (i) {ввод целого числа}

until lOResult = 0; {lOResult — функция, равная 0, если нет ошибки} {$!+} {восстановление проверки ввода-вывода}

По крайней мере один раз вводится число; если при вводе была сделана ошибка, условие lOResult = 0 имеет значение false, и ввод будет повторяться до тех пор, пока

Если Вам нужна помощь с академической работой (курсовая, контрольная, диплом, реферат и т.д.), обратитесь к нашим специалистам. Более 90000 специалистов готовы Вам помочь.
Бесплатные корректировки и доработки. Бесплатная оценка стоимости работы.

Поможем написать работу на аналогичную тему

Получить выполненную работу или консультацию специалиста по вашему учебному проекту
Нужна помощь в написании работы?
Мы - биржа профессиональных авторов (преподавателей и доцентов вузов). Пишем статьи РИНЦ, ВАК, Scopus. Помогаем в публикации. Правки вносим бесплатно.

Похожие рефераты: