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

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

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

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

Program Diophant;

var х, у: byte;

begin

x:=1;y:=1;

repeat

if(5*x-3*y)>1theny:=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, и ввод будет повторяться до тех пор, пока он не будет сделан правильно.

Операторы Break и Continue

В последних версиях языка Borland Pascal введены два новых оператора, Break и Continue, применяемые внутри циклов. Они расширяют возможности использова­ния циклов и улучшают структуру программ. В процессе выполнения тела цикла до его завершения могут возникнуть дополнительные условия, требующие завер­шения цикла. В этом случае цикл может быть прекращен оператором Break.

Пример. Игра с ЭВМ в кости. Условия игры. Компьютер выдает себе или Вам случайные числа от 1 до 6. Задача — набрать максимальную сум­му очков. Набравший больше 21 очка проигрывает, в любой момент один из игроков может отказаться от набора очков (спасовать).

Program Bones;

Const MaxSum = 1; {максимальное число очков}

var SumYour, {сумма очков игрока}

SumComp, {сумма очков компьютера}

count: byte; {очередные выпавшие очки}

reply: string; {ответ на запрос ЭВМ}

begin

SumYour := 0;

SumComp:=12; {начальное количество очков}

Randomize; {установка датчика случайных чисел}

repeat {начало общего цикла, организующего игру}

write ('Бросить кость для Вас? (у/n)');

repeat {Начало цикла для ввода корректного ответа} readln(reply) {ввод ответа}

{выход из цикла — при корректном ответе}

until (reply = 'у') or (reply = 'Y') or (reply ='n') or (reply = 'N');

{метание кости для игрока при положительном ответе}

if (reply = 'у') or (reply = 'Y') then {если ответ »да»}

begin Count := Random(6) + 1; {число очков игрока}

{Random(6) дает случайные числа от 0 до 5}

WriteLn( вам выпало ', count,' очков.'); {вывод выпавшего количества очков} SumYour := SumYour + count; {подсчет суммы очков игрока}

Writeln('y Вас всего ', SumYour,' очков.'); {вывод суммы очков}

if SumYour >= MaxSum then Вгеаk{прекращение игры при переборе} end;

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

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

if SumComp < 18 then {если компьютер продолжает игру}

begin Count := Random(6) + 1; {число очков компьютера} WriteLn('мнe выпало ', count,' очков.'); {вывод количества очков} SumComp := SumComp + count; {подсчет суммы очков компьютера} Writeln('y меня всего ', SumComp,' очков.'); {вывод суммы очков}

if SumYour >= 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 < SumComp then writeln('Я выиграл!')

{сравнение очков}

else if SumYour = SumComp then writeln ('Ничья!')

{равенство очков}

else writeln('Вы выиграли!');

ReadLn

end.

Программа разбита на две основные части: метание костей и подведе­ние итогов.

Первая часть реализует бесконечный цикл метания костей, ограничен­ный оператором repeat . until false. Выбор оператора repeat мотивирован тем, что должен быть сделан, по крайней мере, один ход игры. Цикл может быть прерван оператором Break при переборе очков любым из игроков и при отказе обоих партнеров от продолжения игры. Объединение трех усло­вий в одно и использование его как завершающего условия цикла re­peat . until усложнит алгоритм, а применение для прекращения игры опера­тора Break алгоритм упрощает.

Цикл repeat . until с завершающим условием

(reply = 'у') or (reply = 'Y') or (reply ='n') or (reply = 'N');

продолжается до тех пор, пока не будет введен допустимый символ ('у', 'Y', 'п' или 'N') при ответе на вопрос о продолжении игры.

Для имитации метания костей применена функция Random с парамет­ром — целым числом, равным 6. При таком использовании она дает случайные целые числа в диапазоне от 0 до 5 включительно.

Подведение итогов игры выполняют вложенные друг в друга операто­ры if. Возможные итоги игры прове­ряются последовательно. Если возможен вывод, выполняется часть then оператора. Если не возможен, выполняется часть else, в которой стоит опе­ратор дальнейшего ветвления if.

Средства среды программирования для отладки программ

Среда Borland Pascal имеет несколько встроенных инструментальных средств отладки программ. С некоторыми из них мы уже познакомились. Механизм пошагового выполнения программы, вызываемый функци­ональной клавишей F7, и его варианты: пошаговое выполнение без входа в процедуры, вызываемое клавишей F8, и исполнение до заданной строки (клавиша F4) позволяют проверить, соответствует ли последовательность выполнения команд Вашим требованиям к алгоритму.


Страница: