Кафедра прикладной математики
ПРАКТИКУМ № 5.
ТЕМА: РЕАЛИЗАЦИЯ В ИНТЕГРИРОВАННОЙ СРЕДЕ ПРОГРАММИРОВАНИЯ TURBO PASCAL АЛГОРИТМОВ РАЗВЕТВЛЯЮЩЕЙСЯ СТРУКТУРЫ.
Цель работы: приобретение навыков работы в интегрированной среде программирования TURBO PASCAL; получить навыки программирования алгоритмов разветвляющейся структуры и реализации их на ЭВМ.
В линейной программе все операторы выполняются последовательно, один за другим. Таким способом можно записывать только очень простые алгоритмы. Для того чтобы в зависимости от конкретных значений исходных данных обеспечить выполнение разных последовательностей операторов, применяются операторы ветвления if и case.
Оператор if обеспечивает передачу управления на одну из двух ветвей вычислений, а оператор case – на одну из произвольного числа ветвей.
Индивидуальные задания
ЗАДАНИЕ № 1.
Составить алгоритм и написать программу, которая по введенному значению аргумента вычисляет значение функции, заданной в виде графика. Параметр R вводится с клавиатуры. (Теоретический материал по данной теме изложен в лекциях № 6, 15).
Номер варианта |
ЗАДАНИЕ |
1. |
|
2. |
|
3. |
|
4. |
|
5. |
|
6. |
|
7. |
|
8. |
|
9. |
|
10. |
|
11. |
|
12. |
|
13. |
|
14. |
|
15. |
|
16. |
|
17. |
|
18. |
|
19. |
|
20. |
|
21. |
|
22. |
|
23. |
|
24. |
|
25. |
|
ЗАДАНИЕ № 2.
Составить алгоритм и написать программу, которая определяет, попадет ли точка с заданными координатами в область, закрашенную на рисунке серым цветом. Результат работы программы вывести в виде текстового сообщения. (Теоретический материал по данной теме изложен в лекциях № 6, 15).
Номер варианта |
ЗАДАНИЕ |
|
Номер варианта |
ЗАДАНИЕ |
1. |
|
2. |
|
3. |
|
4. |
|
5. |
|
6. |
|
7. |
|
8. |
|
9. |
|
10. |
|
11. |
|
12. |
|
13. |
|
14. |
|
15. |
|
16. |
|
17. |
|
18. |
|
19. |
|
20. |
|
21. |
|
22. |
|
23. |
|
24. |
|
25. |
|
После выполнения данного практикума студент должен знать:
Если в одном условном операторе требуется проверить выполнение нескольких условий, они записываются после ключевого слова if и объединяются с помощью логических операций and, or, xor и not. Получившееся выражение вычисляется в соответствии с приоритетами операций.
Если в какой-либо ветви вычислений условного оператора if требуется выполнить более одного оператора, то они объединяются в блок с помощью ключевых слов begin и end.
Проверка вещественных величин на равенство опасна.
В операторе варианта выражение, стоящее после ключевого слова case, и константы, помечающие ветви, должны быть одного и того же порядкового типа.
Рекомендуется всегда описывать в операторе case ветвь else.
Оператор case предпочтительнее оператора if в тех случаях, когда количество направлений вычисления в программе больше двух, а выражение, по значению которого производится переход на ту или иную ветвь, имеет порядковый тип. Часто это справедливо даже для двух ветвей, поскольку повышает наглядность программы.
Приложение № 1.
ВЫЧИСЛЕНИЕ ЗНАЧЕНИЯ ФУНКЦИИ
Написать программу, которая по введенному значению аргумента вычисляет значение функции, заданной в виде графика на интервале [-3, 3]:
Начинать решение даже простейшей задачи необходимо с четкого описания ее исходных данных и результатов. В данном случае это очевидно: исходными данными является вещественное значение аргумента x, который определен на интервале [-3, 3], а результатом – вещественное значение функции y. Поэтому для представления этих величин в программе следует выбирать тип real.
П еред написанием программы следует составить алгоритм ее решения – сначала в общем виде, а затем постепенно детализируя каждый шаг. Такой способ, называемый нисходящей разработкой, позволяет создавать простые по структуре программы. Сначала запишем функцию в виде формул (сделаем математическую постановку задачи):
Далее приведем описание алгоритма в неформальной словесной форме:
Ввести значение аргумента x.
Проверить, принадлежит ли оно области определения функции.
Если не принадлежит, вывести диагностическое сообщение и завершить программу.
Определить, какому интервалу из области определения функции принадлежит введенное значение, и вычислить значение функции y по соответствующей формуле.
Вывести значение y.
Опишем четвертый пункт алгоритма более подробно:
Если аргумент x принадлежит интервалу [-3; -2), то .
Если аргумент x принадлежит интервалу [-2; 0), то .
Если аргумент x принадлежит интервалу [0; 1), то .
Если аргумент x принадлежит интервалу [1; 3], то .
Рис. 1.
Структурная схема вычисления значения функции в виде блок-схемы
По такому алгоритму можно практически «один в один» написать программу:
{***************************************************}
{Программа: FUNC. }
{Цель: вычисление значения функции. }
{Программист: Иванов И.И. }
{Дата выполнения: 10 апреля 2006 г. }
{***************************************************}
Program FUNC;
Var X, Y : real;
Begin
Writeln(‘Введите значение аргумента’);
Read(X);
Wriyeln(‘X=’, X);
If (x<-3) or (x>3) then begin
Writeln(‘Значение должно принадлежать интервалу [-3; 3]’);
exit
end;
If x<-2 then y:=-2*x-5;
If (x>=-2) and (x<0) then y:=-sqrt(1-sqr(x+1))-1;
If (x>=0) and (x<1) then y:=x-1;
If x>=1 then y:=sqrt(1-sqr(x-2));
Writeln(‘Для x= ’, x:6:2, ‘значение функции y= ’, y:6:2)
End. {FUNC}
Следует обратить внимание на запись условий, содержащих два сравнения. Начинающие часто записывают такие условия, просто воспроизводя математическую формулу, т.е. как a<x<b. Ошибка состоит в том, что операции отношения являются бинарными, т.е. должны иметь два операнда. И если надо проверить два условия (a<x и x<b), то и операций должно быть две. Поскольку необходимо, чтобы эти условия выполнялись одновременно, они объединены с помощью операции логического умножения И (and), т.е. выражение принимает вид (a<x) and (x<b). Заключать каждое условие в круглые скобки необходимо потому, что логические операции имеют более высокий приоритет, чем операции отношения. При отсутствии скобок сначала будет предпринята попытка выполнить операцию x and x2, что вряд ли соответствует замыслу.
Первый и последний условные операторы записаны без двойных условий, потому что проверка того, что аргумент находится в диапазоне [-3; 3], выполнена раньше. Стандартная процедура exit обеспечивает выход из программной единицы, в которой она записана. Тестовые примеры для этой программы должны включать, по крайней мере, по одному значению аргумента из каждого интервала, а для проверки граничных условий – еще и все точки перегиба.
При работе приведенной выше программы всегда выполняется один за другим все четыре условных оператора, при этом истинным оказывается только одно условное выражение и, соответственно, присваивание значения переменной y выполняется один раз. Запишем условные операторы так, чтобы уменьшить количество проверок:
If x<-2 then y:=-2*x-5
else if x<0 then y:=-sqrt(1-sqr(x+1))-1
else if x<1 then y:=x-1
else y:=sqrt(1-sqr(x-2));
Этот вариант вычисления значения функции иллюстрирует следующая блок-схема:
Рис. 2. Второй вариант вычисления значения функции.
Во втором варианте проверка на принадлежность аргумента очередному интервалу выполняется только в том случае, если x не входит в предыдущий интервал. Программа получилась более компактной, более эффективной, но, возможно, менее наглядной. В отличие от предыдущей версии, порядок следования условных операторов имеет здесь большое значение. Какой же вариант лучше? Для решения данной задачи разница между ними несущественна, но цель состоит в том, чтобы на простых примерах продемонстрировать общие принципы, следование которым позволит впоследствии создавать надежные и красивые программы. Наиболее наглядным является первый вариант программы, поскольку по нему проще проследить логику ее работы.
В современной иерархии критериев качества программы на первом месте стоят надежность, простота поддержки и модификации, а эффективность и компактность отходят на второй план. Поэтому если нет специальных требований к быстродействию, следует выбирать наиболее наглядный вариант.
Приложение № 2.
ВЫСТРЕЛ ПО МИШЕНИ
Дана заштрихованная область и точка с координатами (x, y). Написать программу, определяющую, попадает ли точка в область. Результат вывести в виде текстового сообщения.
Запишем условия попадания точки в область в виде формул. Область можно описать как круг, пересекающийся с треугольником. Точка может попадать либо в круг, либо в треугольник, либо в их общую часть:
Первое условие задает попадание точки в круг, второе – в треугольник. Переменные x и y – вещественного типа. Программа для решения задачи выглядит следующим образом:
{***************************************************}
{Программа: SHOT. }
{Цель: определить попадет ли точка }
{в заштрихованную область. }
{Программист: Иванов И.И. }
{Дата выполнения: 10 апреля 2006 г. }
{***************************************************}
Program SHOT;
Var X, Y : real;
Begin
Writeln(‘Введите значения x и y’);
Read(X, Y);
Wriyeln(‘X=’, X, ‘Y=’, Y);
If (sqr(x)+sqr(y)<=1) or (x<=0) and (y<=0) and (y>=-x-2)
then writeln(‘Точка попадает в область’)
else writeln(‘Точка не попадает в область’);
End. {SHOT}
Приоритет операций отношения самый низкий, поэтому они заключаются в скобки. Три условия попадания точки в треугольник должны выполняться одновременно, поэтому они объединяются с помощью операции and. Ее приоритет выше, чем or, поэтому дополнительных скобок не требуется.
Для удобочитаемости программы можно ставить скобки даже в тех местах, где они не обязательны, например, для визуальной группировки условий.
Приложение № 3.
Написать программу, которая по номеру месяца выводит время года.
Эта программа не нуждается в дополнительных комментариях:
{***************************************************}
{Программа: SEASON. }
{Цель: определение времени года. }
{Программист: Иванов И.И. }
{Дата выполнения: 10 апреля 2006 г. }
{***************************************************}
Program SEASON;
Var month : word;
Begin
Writeln(‘Введите номер месяца’);
Read(month);
Wriyeln(‘X=’, X);
Case month of
1, 2, 12 : writeln(‘ Зима ’);
3 . . 5 : writeln(‘ Весна ‘);
6 . . 8 : writeln(‘ Лето ‘);
9 . . 11: writeln(‘ Осень ‘);
else writeln( ‘ Такие месяцы встречаются редко ‘)
end
End.
Приложение № 4.
Написать программу, реализующую калькулятор на четыре арифметических действия.
Исходными данными для этой программы являются два вещественных операнда и знак операции, представляющий собой символ. Алгоритм работы программы очевиден: в зависимости от значения введенного знака операции выполнить соответствующее действие над операндами:
{***************************************************}
{Программа: CALCULATOR. }
{Программист: Иванов И.И. }
{Дата выполнения: 10 апреля 2006 г. }
{***************************************************}
Program CALCULATOR;
Var A, B, RES : real;
OP : char;
Begin
Writeln(‘Введите первый операнд:’);
Read(A);
Writeln(‘Введите второй операнд: ‘);
Read(B);
Writeln(‘Введите операцию: ‘);
Read(OP);
Case OP of
‘ + ’ : RES := A + B;
‘ – ‘ : RES := A – B;
‘ * ‘ : RES := A * B;
‘ / ‘ : RES := A / B;
else begin
writeln( ‘ Недопустимая операция ‘);
exit
end;
writeln(‘ RES= ‘, RES:6:2)
End.
Следует обратить внимание на то, что если по какой-либо ветви требуется записать не один, а несколько операторов, они заключаются в блок с помощью операторных скобок begin и end.