Кафедра прикладной математики
ПРАКТИКУМ № 4.
ТЕМА: РЕАЛИЗАЦИЯ В ИНТЕГРИРОВАННОЙ СРЕДЕ ПРОГРАММИРОВАНИЯ TURBO PASCAL АЛГОРИТМОВ РАЗВЕТВЛЯЮЩЕЙСЯ СТРУКТУРЫ.
Цель работы: приобретение навыков работы в интегрированной среде программирования TURBO PASCAL; получить навыки программирования алгоритмов разветвляющейся структуры и реализации их на ЭВМ.
В линейной программе все операторы выполняются последовательно, один за другим. Таким способом можно записывать только очень простые алгоритмы. Для того чтобы в зависимости от конкретных значений исходных данных обеспечить выполнение разных последовательностей операторов, применяются операторы ветвления if и case.
Оператор if обеспечивает передачу управления на одну из двух ветвей вычислений, а оператор case – на одну из произвольного числа ветвей.
Индивидуальные задания
ЗАДАНИЕ № 1.
Составить алгоритм и написать программу, которая по введенному значению аргумента вычисляет значение функции, заданной в виде графика. Параметр R вводится с клавиатуры.
Номер варианта |
ЗАДАНИЕ |
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.
Составить алгоритм и написать программу, которая определяет, попадет ли точка с заданными координатами в область, закрашенную на рисунке серым цветом. Результат работы программы вывести в виде текстового сообщения.
Номер варианта |
ЗАДАНИЕ |
|
Номер варианта |
ЗАДАНИЕ |
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. |
ЗАДАНИЕ № 3.
Составить алгоритм и написать программу с использованием оператора варианта.
Номер варианта |
ЗАДАНИЕ |
||||||||||||||||||
1. |
Разработать программу, которая вычисляет одну из функций в указанной точке. Вид простейшего меню: введите номер функции: 1) y=x 2) y=sqrt(x) 3) y=exp(1/3*ln(x)) 4) y=sqrt(sqrt(x)) |
||||||||||||||||||
2. |
Разработать программу, которая выводит на экран дисплея значения функции sin(t) при различных значениях аргумента t.
|
||||||||||||||||||
3. |
Разработать программу, которая вычисляет значение одной из заданных функций в указанной точке. Вид простейшего меню: введите номер функции: 1) y=exp(1) 2) y=exp(2) 3) y=exp(3) 4) y=exp(4)
|
||||||||||||||||||
4. |
Разработать программу, которая выводит на экран дисплея значения функции cos(t) при различных значениях аргумента t.
|
||||||||||||||||||
5. |
Разработать программу, которая вычисляет значение одной из заданных функций в указанной точке. Вид простейшего меню: введите номер функции: 1) y=sqrt(2) 3) y=sqrt(3) 5) y=sqrt(5)
|
||||||||||||||||||
6. |
Разработать программу, которая выводит на экран дисплея значения функции tg (t) при различных значениях аргумента t.
|
||||||||||||||||||
7. |
Разработать программу, которая вычисляет значение одной из заданных функций в указанной точке. Вид простейшего меню: введите номер функции: 11) y=sqrt(11) 12) y=sqrt(12) 13) y=sqrt(13) 14) y=sqrt(14)
|
||||||||||||||||||
8. |
Разработать программу, которая выводит на экран дисплея название ансамбля из некоторого числа исполнителей. Вид простейшего меню: введите номер ансамбля: 1) 2 человека ‘ дуэт’ 2) 3 человека ‘трио’ 3) 4 человека ‘квартет’ 4) 5 человек ‘квинтет’
|
||||||||||||||||||
9. |
Разработать программу, которая выводит на экран дисплея значения функции ctg (t) при различных значениях аргумента t.
|
||||||||||||||||||
10. |
Разработать программу, которая выводит на экран дисплея соотношение между старыми русскими мерами длины и современными. Вид простейшего меню: введите номер меры длины: 1) миля ‘7,4676 км’ 2) верста ‘1,068 км’ 3) сажень ‘2,1336 м’ 4) аршин ‘0,7112 м’ 5) фунт ’30,48 см’ 6) дюйм ‘2,54 см’
|
||||||||||||||||||
11. |
Разработать программу, которая вычисляет значение одной из заданных функций в указанной точке. Вид простейшего меню: введите номер функции: 1) y=x+1 2) y=x*x+1 3) y=x*x*x+1
|
||||||||||||||||||
12. |
Разработать программу, которая выводит на экран дисплея сообщения о значениях функции при различных значениях аргумента. Вид простейшего меню: введите номер функции: 2) y=sin(pi/2) 3) y=sin(pi/3) 4) y=sin(pi/4)
|
||||||||||||||||||
13. |
Разработать программу, которая вычисляет число байтов в килобайте, мегабайте и гигабайте (соответственно 210, 220, 230). Вид простейшего меню: введите степень двойки: 10) килобайт 20) мегабайт 30) гигабайт
|
||||||||||||||||||
14. |
Разработать программу, которая выводит на экран дисплея сообщения о значении кратной приставки, используемой в метрической системе. Вид простейшего меню: введите номер приставки: 1) дека 1Е+1 2) гекто 1Е+2 3) кило 1Е+3 6) мега 1Е+6 9) гига 1Е+9
|
||||||||||||||||||
15. |
Разработать программу, которая вычисляет значения одной из заданных функций при указанных значениях. Вид простейшего меню: введите номер функции: 1) y=x 2) y=x*x 3) y=x*x*x 4) y=x*x*x*x
|
||||||||||||||||||
16. |
Разработать программу, которая выводит на экран дисплея сообщение о значении дольной приставки, используемой в метрической системе. Вид простейшего меню: введите пункт меню: выводимое значение: 1) деци 1Е-1 2) санти 1Е-2 3) милли 1Е-3 6) микро 1Е-6 9) нано 1Е-9
|
||||||||||||||||||
17. |
Разработать программу, которая выводит на экран дисплея значение единицы длины метрической системы, выбранной с помощью простейшего меню. Вид простейшего меню: введите пункт меню: выводимое значение: 1) декаметр декаметр = 10 м 2) гектометр гектометр = 100 м 3) километр километр = 1000 м 4) мириаметр мириаметр = 10000 м 5) мегаметр мегаметр = 1000000 м
|
||||||||||||||||||
18. |
Разработать программу, которая вычисляет значение одной из заданных функций в указанной точке. Вид простейшего меню: введите номер функции: 1) y=1/x 2) y=1/(x*x) 3) y=1/(x*x*x)
|
||||||||||||||||||
19. |
Разработать программу, которая выводит на экран дисплея значения функции cos(t) при различных значениях аргумента t.
|
||||||||||||||||||
20. |
Разработать программу, которая вычисляет значение одной из заданных функций в указанной точке. Вид простейшего меню: введите номер функции: 1) y=sin(x) 2) y=cos(x) 3) y=tg(x) 4) y=ctg(x) 5) y=1/sin(x)
|
||||||||||||||||||
21. |
Разработать программу, которая выводит на экран дисплея значение одной из выбранных единиц веса. Вид простейшего меню: введите номер пункта меню: выводимое значение: 1) дециграмм дг = 0,1 г 2) миллиграмм мг = 0,001 г 3) микрограмм мкг = 0,000001 г 4) карат к = 0,2 г
|
||||||||||||||||||
22. |
Разработать программу, которая вычисляет значение одной из заданных функций в указанной точке. Вид простейшего меню: введите номер функции: 1) y=x 2) y=2*x+1 3) y=3*x2+2*x+1
|
||||||||||||||||||
23. |
Разработать программу, которая вычисляет значение стороны правильного n-угольника, вписанного в круг радиусом R. Вид простейшего меню: введите номер пункта меню: 3) A3=R*sqrt(3) 4) A4=R*sqrt(2) 5) A5= sqrt((5-sqrt(5)/2) 6) A6=R
|
||||||||||||||||||
24. |
Разработать программу, которая вычисляет значение числа Архимеда с помощью различных приближений, используемых в математике. Вид простейшего меню: введите номер приближения: 1) pi=sqrt(10) (Китай) 2) pi=((3+10/71)+(3+1/7))/2 (Архимед) 3) pi=3,1415926535… (Транслятор Паскаля) |
||||||||||||||||||
25. |
Разработать программу, которая вычисляет значение одной из заданных функций в указанной точке. Вид простейшего меню: введите номер функции: 1) y=sin x 2) y=cos x 3) y=tg x 4) y=ctg x |
После выполнения данного практикума студент должен знать:
-
Если в одном условном операторе требуется проверить выполнение нескольких условий, они записываются после ключевого слова if и объединяются с помощью логических операций and, or, xor и not. Получившееся выражение вычисляется в соответствии с приоритетами операций.
-
Если в какой-либо ветви вычислений условного оператора if требуется выполнить более одного оператора, то они объединяются в блок с помощью ключевых слов begin и end.
-
Проверка вещественных величин на равенство опасна.
-
В операторе варианта выражение, стоящее после ключевого слова case, и константы, помечающие ветви, должны быть одного и того же порядкового типа.
-
Рекомендуется всегда описывать в операторе case ветвь else.
-
Оператор case предпочтительнее оператора if в тех случаях, когда количество направлений вычисления в программе больше двух, а выражение, по значению которого производится переход на ту или иную ветвь, имеет порядковый тип. Часто это справедливо даже для двух ветвей, поскольку повышает наглядность программы.
Приложение № 1.
ВЫЧИСЛЕНИЕ ЗНАЧЕНИЯ ФУНКЦИИ
Написать программу, которая по введенному значению аргумента вычисляет значение функции, заданной в виде графика на интервале
[-3, 3]:
Начинать решение даже простейшей задачи необходимо с четкого описания ее исходных данных и результатов. В данном случае это очевидно: исходными данными является вещественное значение аргумента x, который определен на интервале [-3, 3], а результатом – вещественное значение функции y. Поэтому для представления этих величин в программе следует выбирать тип real.
Перед написанием программы следует составить алгоритм ее решения – сначала в общем виде, а затем постепенно детализируя каждый шаг. Такой способ, называемый нисходящей разработкой, позволяет создавать простые по структуре программы. Сначала запишем функцию в виде формул (сделаем математическую постановку задачи):
Далее приведем описание алгоритма в неформальной словесной форме:
-
Ввести значение аргумента x.
-
Проверить, принадлежит ли оно области определения функции.
-
Если не принадлежит, вывести диагностическое сообщение и завершить программу.
-
Определить, какому интервалу из области определения функции принадлежит введенное значение, и вычислить значение функции y по соответствующей формуле.
-
Вывести значение y.
Рис. 1.
Структурная схема вычисления значения функции в виде блок-схемы
Опишем четвертый пункт алгоритма более подробно:
-
Если аргумент x принадлежит интервалу [-3; -2), то .
-
Если аргумент x принадлежит интервалу [-2; 0), то .
-
Если аргумент x принадлежит интервалу [0; 1), то .
-
Если аргумент x принадлежит интервалу [1; 3], то .
По такому алгоритму можно практически «один в один» написать программу:
{***************************************************}
{Программа: 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.