Лабораторная работа 6 (часть 2)

Разработка программ с разветвленной структурой

2.1. Цель работы

Приобретение навыков в составлении и отладке программ на языке Turbo Pascal с использованием операторов: условного перехода if, разветвления case, безусловного перехода goto.

2.2. Задание на лабораторную работу

1. Освоить функции системы Turbo Pascal по отладке программы (п. 2.5).

2. Составить программу, работающую в диалоговом режиме (диалог организовать с помощью оператора Case).

2.3. Требования к программе

Программа должна выполнять следующие действия:

– вывод меню;

– вывод сообщения о назначении программы;

– ввод данных;

– вычисления и вывод результатов.

Результаты работы выводятся в отформатированном виде.

2.4. Порядок выполнения работы

1. Получить вариант задания (п. 2.8).

2. Изучить функции Turbo Pascal по отладке программы (п. 2.5).

3. Подготовить текст программы и отладить её с использованием интегрированной среды программирования Turbo Pascal (п. 2.5, 2.6, 2.7).

4. Во время отладки использовать не менее двух контрольных точек останова (п. 2.5). Проверить работу программы при различных значениях исходных данных, требующих использования разветвленного алгоритма.

5. Ответить на контрольные вопросы (п. 2.10).

6. Оформить отчёт (см. п. 1.10)

2.5. Технология отладки программы в интегрированной среде программирования Turbo Pascal

При выполнении лабораторной работы описание этапов подготовки текста программы, компиляции и запуска на выполнение смотрите в лабораторной работе №1 (п. 1.5, 1.7, 1.8).

Если программа успешно откомпилирована и выполнена, но результаты работы не будут правильными, это значит, что программа содержит одну или несколько логических ошибок, то есть полученные после выполнения программы результаты не совпали с ожидаемыми.

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

Отладка в интегрированной среде программирования заключается в просмотре промежуточных результатов и анализе их, просмотре промежуточных значений переменных во время останова программы.

С этой целью в Turbo Pascal обеспечивается возможность трассировки, то есть выполнение программы «по шагам».

Чтобы начать сеанс отладки, выберете команду Run\ Trace Info или нажмите F7. Первое утверждение begin в теле исполняемой программы будет выделено на экране подсвеченной строкой зеленого цвета. С этого момента мы будем называть эту полосу полосой запуска. Первое нажатие F7 запускает сеанс отладки. Отладчик выполнит невидимый код запуска. Следующая выполняемая строка программы – первый оператор из блока программы. Каждое нажатие F7 вызывает выполнение подсвеченного оператора.

Примечание. Для выполнения оператора Readln необходимо ввести запрашиваемые данные в соответствии с их объявлением.

Использование окна Watch (окна наблюдения). Чтобы посмотреть значение переменных, необходимо выполнить следующие действия:

– нажать Ctr+- F7 или выбрать пункт меню Debug\ Add watch;

– ввести имя просматриваемой переменной.

В окне Watch заданная переменная появится со своим текущим значением.

Добавление других переменных или выражений выполняется аналогично.

Для выполнения следующего шага программы нажмите F7 или выберите Run\ Trace Info.

Прервать пошаговое выполнение программы можно нажатием Ctrl+ F2 или выбором команды Run\ Program reset.

Контрольные точки останова. Для отладки больших программ, чтобы не просматривать весь текст в поиске нужного места, можно установить контрольную точку – точку останова. Она похожа на сигнал «стоп» для программы. Для задания точки останова нужно выполнить следующие действия:

– установить курсор в нужной строке,

– нажать Ctrl+ F8 или выбрать пункт меню Debug\ Add breakpoint. После этого выбранная строка становится красной – в ней устанавливается точка останова. Если там уже имеется точка останова, то она отменяется.

После того как вы установите все контрольные точки останова, запустите программу на выполнение. Программа будет выполняться до первой точки останова. После останова программы вы можете просмотреть текущие значения переменных и продолжить выполнение программы нажатием F7 или F8.

По окончании отладки необходимо удалить все точки останова. Для этого нужно выбрать Debug\ Breakpoints. На экране будет выведено окно списка точек останова. Для удаления всех точек нужно выбрать Clear All.

Часто просмотр значений переменных в конкретном месте программы осуществляется следующим образом:

– установить курсор в нужную строку,

– нажать F4 или выбрать команду Run\Go to.

Произойдет запуск программы на выполнение с остановом в строке, на которой установлен курсор.

Чтобы закрыть окно просмотра, необходимо сделать его текущим (переход из одного окна в другое выполняется при помощи F6) и нажать Alt+ F3.

2.6. Справки по операторам для разработки программ с разветвленной структурой

2.6.1. Оператор IF

Основным средством разработки разветвленных структур алгоритмов в Turbo Pascal являются условные операторы if и case. С их помощью можно влиять на последовательность выполнения операторов программы.

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

В качестве условия выбора должно быть логическое выражение; Например, A>B; (A+X)<>N; (A>B) and (B>C).

Оператор if может принимать одну из следующих форм:

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

{если <условие> то <оператор 1> иначе <оператор 2>;}

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

{если <условие> то <оператор 1>;}

Оператор if выполняется следующим образом. Сначала вычисляется выражение, записанное в условии. В результате его вычисления получается значение булевского типа. В первом случае, если значение есть true (истина), то выполняется <оператор 1>, указанный после ключевого слова then, иначе выполняется <оператор 2>, указанный после ключевого слова else. Во втором случае, если результат вычисления выражения есть false (ложь), то выполняется оператор, следующий за оператором if.

Например:

·····························

if x>y then max:=x else max:=y;

·····························

При x>y выполняется оператор max:=x, при x£y выполняется оператор max:=y

Пример оператора if без else:

·····························

if x>y then writeln(x);

·····························

При x>y выполняется оператор writeln( x), иначе выполняется оператор, следующий за оператором if.

Часто возникает необходимость выполнять в одной из ветвей (или в обеих ветвях) условного оператора несколько команд. В этом случае используется составной оператор.

Составной оператор – группа операторов, помещенных между ключевыми словами begin и end.

Например:

if x>y then

begin { начало составного оператора }

max:=x;

writeln(‘max=’, max);

end { конец составного оператора }

else

x:=x+1;

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

Например:

if x< -3 then y:=x+1 else

if x>3 then y:=x*x else y:=y*y;

Примечание. Служебное слово else всегда ассоциируется с ближайшим по тексту if.

 

2.6.2. Оператор выбора CASE

Оператор case позволяет сделать выбор из произвольного числа имеющихся вариантов. С его помощью можно сопоставить различным значениям некоторого выражения, называемого селектором (от selection – выбор), соответствующие им операторы.

Оператор case имеет следующий формат:

case <выражение-селектор> of

<список1> : <оператор1; >

<список2> : <оператор2; >

<списокN> : <операторN; >

else <оператор>

end;

Оператор case работает следующим образом. Сначала вычисляется значение выражения селектора, затем выполняется тот оператор, константа выбора которого равна текущему значению селектора. Если ни одна константа не равна значению селектора, то выполняется альтернативный оператор, стоящий за словом else. Альтернативный оператор можно не писать.

Например, селектор целочисленного типа:

write(‘Введите значение n =’);

readln(n);

case n of

1 : y:=x;

2 : y:=x*x;

3 : y:=x*x*x

else y:=0

end;

writeln(‘y=’, y);

При n=1 выполняется оператор y:=x. При n=2 выполняется оператор y:=x*x. При n=3 выполняется оператор y:=x*x*x. При любых других значениях n выполняется оператор y:=0. После завершения оператора case выполняется оператор writeln (‘y=’, y). Кроме одиночных констант могут быть заданы списки и/или диапазоны значений.

Например, селектор интервального типа:

case n of

0,1..4 : y:=x;

2,5 : y:=x*x;

3 : y:=x*x*x

end;

При использовании оператора case должны выполняться следующие правила:

– значение селектора должно принадлежать дискретному типу; для целого типа integer оно должно лежать в диапазоне -32768..32767;

– все константы, предшествующие операторам альтернатив, должны иметь тип, совместимый с типом селектора;

– все константы в альтернативах должны быть уникальны в пределах оператора case;

– диапазоны не должны пересекаться и не должны содержать констант, указанных в данной альтернативе или в других альтернативах.

2.6.3. Оператор GOTO

Оператор безусловного перехода goto означает «перейти к» и применяется в случаях, когда после выполнения некоторого оператора надо выполнить не следующий оператор, а какой-нибудь другой. Метка объявляется в разделе описания меток и может содержать как цифровые, так и буквенные символы. Метка отделяется от помеченного оператора двоеточием.

Например:

·····························

label M1;

var

n : integer;

x,y : real;

begin

readln(n,x);

·····························

goto M1;

·····························

M1:

y:=x*2-3/x;

writeln(‘y=’, y);.

2.7. Пример программ с разветвленной структурой

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

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

Блок-схема алгоритма показана на рисунке 1.

 

 

 

Рисунок 1 – Блок-схема алгоритма к примеру 1

 

Текст программы может выглядеть следующим образом:

program lab_2_1;

var

А,В: integer;

Rezult: real;

begin

Write('Введите значение делимого А =');

Readln(A) ;

Write('Введите значение делителя В =');

Readln(В);

if B=0 {Контроль ввода}

then Writeln('Ha нуль делить нельзя') {Условие выполнено}

else {Условие не выполнено}

begin {Начало составного оператора}

Rezult := А / В;

Writeln('Частное чисел', А,' и ',В,' = ', Rezult);

end; {Конец составного оператора}

end.

 

 

Пример 2. Разработать программу, имитирующую работу калькулятора.

Решение. Программа должна ввести два числа, знак арифметической операции, вычислить результат и вывести его на экран. Блок-схема алгоритма показана на рисунке 2.

 

 

Рисунок 2 – Блок-схема алгоритма к примеру 2

 

Текст программы может выглядеть следующим образом:

PROGRAM Calc1;

VAR

X,Y:REAL;

Op: CHAR;

BEGIN

WRITE(’Введите X и Y: ’); READLN(X,Y);

WRITE(’Введите знак операции: ’); READLN(Op);

CASE Op OF

’+’ : WRITELN(X+Y);

’-’ : WRITELN(X-Y);

’*’ : WRITELN(X*Y);

’/’ : WRITELN(X/Y);

ELSE WRITELN(’Такой операции нет’);

END;

END.

Пример 3. Разработать программу, имитирующую работу калькулятора, так, чтобы она завершалась только по указанию пользователя.

Решение. Программа должна ввести два числа, знак арифметической операции, вычислить результат, вывести его на экран и завершиться по указанию пользователя. Блок-схема алгоритма показана на рисунке 3.

 

Рисунок 3 – Блок-схема алгоритма к примеру 3

Текст программы может выглядеть следующим образом:

PROGRAM Calc2;

LABEL 1;

VAR X,Y:REAL;

Op:CHAR;

BEGIN

1:WRITE(’Введите X и Y: ’); READLN(X,Y);

WRITE(’Введите знак операции: ’); READLN(Op);

CASE Op OF

’+’ : BEGIN WRITELN(X+Y); GOTO 1; END;

’-’ : BEGIN WRITELN(X-Y); GOTO 1; END;

’*’ : BEGIN WRITELN(X*Y); GOTO 1; END;

’/’ : BEGIN WRITELN(X/Y); GOTO 1; END;

ELSE WRITELN(’Такой операции нет’);

END;

END.

Пример 4. Составить программу вычисления функции

Текст программы может выглядеть следующим образом:

Program Lab_2-1;

Uses CRT; { Раздел объявления внешних модулей }

Label M1,M2;

var

n : integer;

x,y : real;

p: byte; {Признак выполнения пунктаN1}

begin

clrscr; { Очистка экрана }

writeln(‘Программа вычисления функции...’);

 

{ Вывод на экран меню }

writeln(‘+--------------------------------------------+’);

writeln(‘| 1. Ввод данных |’);

writeln(‘| 2. Вычисление функции и вывод результатов |’);

writeln(‘| 3. Завершение работы программы |’);

writeln(‘+--------------------------------------------+’);

p:=0;

M1: writeln(‘введите пункт меню’);

readln(n); { Ввод номера пункта меню}

case n of

1: begin { Ввод данных }

M2: write(‘Введите значение аргумента x=’);

readln(x)

 

{ Проверка допустимого значения аргумента }

if x=0 then begin

writeln(‘x не может быть равным 0 по условию’) ;

goto M2; end;

p:=1; {Пункт N1 выполнен}

end;

2: { Вычисление значения функции }

begin

If p<>0 then

Writeln (‘Данные не введены, выполните пункт N1’);

else

begin

{ Операторы вычисления и вывода значения функции }

if x>0 then y:=1/x else y:=x*x;

writeln(‘при х=’, x:7:2, ‘ y=’, y:7:2)

end;

end;

3: Exit { Выход из программы }

end; { end case }

goto M1;

end. { Конец программы}

Варианты заданий

1. 1. 2.Даны три числа a, b, c (a ¹ 0), Определить имеет ли квадратное уравнение корни. Если да, то найти их, в противном случае выдать сообщение, что корней нет. Результат вывести на экран. 2. 1. 2. Дано два действительных числа X и Y. Определить, принадлежит ли точка с координатам (X,Y) окружности радиусом R. Результат вывести на экран.  
3. 1. 2. Определить, принадлежит ли точка с координатами (x, y) кольцу между двумя окружностями с радиусами R1 и R2 (R1>R2). Результат вывести на экран. 4. 1. 2. Можно ли построить треугольник с длинами сторон X, Y и Z? Результат вывести на экран.  
5. 1. 2. Вычислить площадь треугольника со сторонами А, В, С. Перед вычислением площади проверить условие существования треугольника с заданными сторонами. 6. 1. 2. Определить, является ли треугольник со сторонами A,B,C равнобедренным и вычислить его площадь.
7. 1. 2. Текущее показание электронных часов: m ч (0≤m ≤23) n мин (0≤n ≤59) k с (0≤k ≤59). Какое время будут показывать часы через p часов q минут r секунд? 8. 1. 2. Определить, можно ли сделать две квадратных заготовки со стороной А из листа железа прямоугольной формы со сторонами В и С.
9. 1. 2. Определить, во сколько раз площадь круга радиуса R больше площади сегмента, отсеченного хордой длины А. 10. 1. 2. Даны три прямоугольных треугольника, катеты которых равны а1,а2; в1,в2; с1,с2 соответственно. Определить номер треугольника с наибольшей гипотенузой. Результат вывести на экран.
11. 1. 2. Окружность вписана в квадрат заданной площади. Найти площадь квадрата, вписанного в эту окружность. Во сколько раз площадь вписанного квадрата меньше площади заданного? 12. 1. 2. Вычислить высоты треугольника со сторонами a , b , c .
13. 1. 2. Найти площадь круга, вписанного в треугольник с заданными сторонами. 14. 1. 2. Треугольник задан величинами своих углов и радиусом вписанной окружности. Найти стороны треугольника.
15. 1. 2. Составить программу вычисления пути, пройденного лодкой, если ее скорость в стоячей воде v км/ч, скорость течения реки v1 км/ч, время движения по течению t1 ч, а против течения t2 ч.   16. 1. 2. Составить программу, печатающую значение true, если указанное высказывание является истинным, и false – в противном случае. 3. График функции y = ax 2 + bx + c проходит через заданную точку с координатами ( m , n ).
17. 1. 2. Определить, поместится ли круг площадью R в квадрате площадью S. Результат вывести на экран.   18. 1. 2. Определить, поместится ли квадрат площадью S в круге радиусом R. Результат вывести на экран


Контрольные вопросы

1. Назначение, формы записи и порядок выполнения оператора условия if.

2. Какие правила должны выполняться при использовании оператора выбора case?

3. Каковы отличия оператора выбора case от оператора условия if?

4. Назначение и особенности оператора безусловного перехода.