Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
TP_Ch_I_izm.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.27 Mб
Скачать

5. Описание пользовательских подпрограмм-функций.

Несмотря на то, что в языке Turbo Pascal имеется много стандартных функций, часто возникает необходимость создавать свои собственные. Функцией называется фрагмент программы, в который передаются ПАРАМЕТРЫ, и который ВОЗВРАЩАЕТ значение. Прелесть функции в том, что ее можно выполнить много раз из разных точек программы. Функции дают удобный способ заключения некоторой части вычислений в черный ящик, который в дальнейшем можно использовать, не интересуясь его внутренним содержанием. Использование функций является фактически единственным способом справиться с потенциальной сложностью больших программ. Если функции организованы должным образом, то можно игнорировать то, как делается работа; достаточно знание того, что делается. Язык Turbo Pascal разработан таким образом, чтобы сделать использование функций легким, удобным и эффективным. Вам будут часто встречаться функции длиной всего в несколько строчек, вызываемые только один раз, и они используются только потому, что это проясняет некоторую часть программы. До сих пор мы использовали только предоставленные нам функции типа abs, sqrt, sin; теперь пора написать несколько наших собственных.

Функции оформляются подобно программе, т.е. содержат заголовок, раздел описаний и блок операторов, заключенный в скобки begin ... end. Только после служебного слова end ставится точка с запятой.

Заголовок функции имеет вид:

function Name (p1: type1; ... ; pm: typem) : typeN;

где Name – имя функции, составляемое по правилам написания идентификаторов;

p1,p2,...pm – формальные параметры;

type1, type2,...typem – тип формальных параметров;

typeN – тип результата;

function – служебное слово.

Значение, вычисленное функцией, передаются в точку вызова с помощью оператора присваивания. Следовательно, в блоке операторов имя функции должно хотя бы один раз присутствовать в левой части оператора присваивания:

Name:=результат;

Имена, использованные для формальных параметров функций, являются чисто локальными и недоступны никаким другим функциям: другие процедуры могут использовать те же самые имена без возникновения конфликта. Формальные параметры – это наименование переменных, с помощью которых резервируются ячейки памяти, и передается информация.

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

II.Экспериментальный раздел работы

Пример 1. Решим простую задачу финансовых операций со сложными процентами. Пусть вкладчик внес в банк единовременный вклад в размере . Ответ на вопрос, сколько лет понадобиться ждать, чтобы этот начальный вклад увеличился до желаемой суммы S при P% годовых начислений, сводится к вычислению по следующей формуле: . Напишем программу

program Example_31;{ программа финансовых операций }

function Lg (z:real) : real;

begin

Lg:=ln(z)/ln(10.0)

end;

var S,S0,P : real;

begin

{Ввод данных}

writeln('Введите значение единовременного денежного вклада S0= ? '); readln(S0);

writeln('Введите значение ожидаемой суммы S=? '); readln(S);

writeln('Введите значение годового процента начислений P=? '); readln(P);

{Вывод данных}

writeln(' Вам необходимо ждать', Lg(S/S0)/Lg(1+0.01*P):6:2,’ лет’);

readln

end.

Разберитесь с текстом программы. Проведите отладку и тестирование. Как получить вывод в виде целого числа?

Пример 2. Рассмотрим пример, связанный с сравнением двух вещественных чисел.

Program example_32a;

Var x : real;

y : real;

begin

x:=0.3;y:=0.3;

WriteLn(x=y);

ReadLn;

end.

В результате работы программы на экран будет выведено TRUE, что в переводе с английского означает "Истина". Измените значение переменной х. В случае несовпадения значений x и y на экран будет выведено False – "Ложь".

В исходной программе измените описание переменной у на y : single.

Примечание :

Если в среде не установлена опция меню: Options|Compiler|8087/80287 ($N:Математический сопроцессор) при запуске программы возникнет ошибка:

Error 116 : Must be in 8087 mode to compile this. Установите указанную опцию или в начале программы добавьте директиву {$N+}.

Суть в том что реализация операций над вещественными числами требует больших затрат процессорного времени. Поэтому созданы специальные быстродействующие сопроцессоры. В состоянии $N+, компилятор генерирует код для выполнения всех вещественных вычислений с использованием математического сопроцессора 80x87 и дает вам доступ к четырем дополнительным вещественным типам: Single, Double, Extended и Comp.

Теперь в результате сравнения мы получаем значение False. Это происходит потому, что для хранения значений х и у выделяется разное количество разрядов.

Отметим еще один момент. При работе в режиме {$N+} стандартная процедура Write осуществляет вывод в формате extended. Рассмотренные нами ранее функции также возвращают значения типа Extended. Сравните работу следующих фрагментов программ

( Sin(0.5236… ) = 0.5 )

{$N-}

Program Example3_2b;

begin

writeln(sin(0.5236));

writeln(pi)

end.

{$N+}

Program Example3_2c;

begin

writeln(sin(0.5236));

writeln(pi)

end.

Продолжим наши эксперименты. Известно, что (x / a) * a = x. Проверим это утверждение с помощью следующей программы.

{$N+}

Program Example3_2;

var x1,x2 : extended;

begin

x1:=20002;

x2:=(x1/10000)*10000;

writeln('x1=',x1,' x2=',x2);

writeln('Совпали ? ',x1=x2);

end.

При выводе числа кажутся равными, но они различаются в разрядах, которые не используются при выводе значений переменных на экран. Поэкспериментируйте. Измените начальные значения х1. Присвойте х1 значения 20000, 20017, …

Пример 3. Составим программу, в которой по двум заданным сторонам треугольника a=4.1 , b=5.6 и углу между ними =0.32 вычисляется значение стороны c:

program Example_33;

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

{ рассчитывается значение третьей стороны}

var a,b,c,gamma:real;

begin

a:=4.1; b:=5.6; gamma:=0.32; {Ввод данных}

c:=sqrt(sqr(a)+sqr(b)-2*a*b*cos(gamma)); { Расчет}

writeln(' c=',c); {Вывод}

readln

end.

Введите текст программы и проведите расчет. Измените оператор вывода результата, записав, например, так: writeln(' c= ',c:6:2). Попробуйте изменить ширину поля выводимой информации.

Измените тип вещественной переменной. Что произойдет? Попробуйте ввести директиву {$N+}. Поэкспериментируйте. Для помощи используйте Help. Объясните полученные результаты.

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

program Example_33a;

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

{ рассчитывается значение третьей стороны}

function ArcCos(x:real):real;

begin

ArcCos:= 0.5*pi - arctan(x/sqrt(1-sqr(x)))

end;

var x,a,b,c,gamma,betta,alfa:real;

begin

{Ввод данных}

write('Введите длины сторон треугольника a,b= ? '); readln(a,b);

writeln('сторона а=',a:6:2,' сторона в=',b:6:2);

write('Введите значение угла в градусах =? '); readln(gamma);

writeln('угол gamma=',gamma:6:2);

{Расчет}

gamma:=gamma*pi/180;

c:=sqrt(sqr(a)+sqr(b)-2*a*b*cos(gamma));

x:=(sqr(b)+sqr(c)-sqr(a))/(2*b*c);

alfa:= ArcCos(x);

betta:=pi-(alfa+gamma);

{Вывод данных}

writeln(' c=',c:6:2);

writeln(' alfa=',alfa*180/pi:8:4,' градусов');

writeln(' betta=',betta*180/pi:8:4, ' градусов');

readln

end.

Разберитесь с программой и проведите её отладку. Обратить внимание на пользовательскую подпрограмму-функцию для вычисления арккосинуса.

Пример 4. Составить программу, вычисляющую значение следующего выражения:

,

где a=0.721; b=0.324; x=0.976.

Если в выражении некоторая конструкция повторяется, то удобно ввести новую переменную:

и сделать следующие преобразования

где . Эти преобразования позволяют упростить выражения и избавиться от операции возведения в степень. Запишем программу:

program Example_34;

{ Программа вычисляет значение выражения }

var x,a,b,c,x,y,z,u:real;

begin

{Ввод исходной информации}

a:=0.721; b:=0.324; x:=0.976;

{Расчет}

z:=a/(2*x+b); u:=sqr(z);

y:=z*(1+u*(1/3.0+u*(1/5.0+u/7.0));

{Вывод результатов}

writeln(‘y=’, y:8:4);

readln

end.

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

Пример 5. Рассмотрим формулу вычисления энергии электрона, находящегося на n – й орбите в атоме водорода:

и составим программу вычисления значения энергии электрона.

Здесь :

кг - масса электрона;

Дж*с - постоянная Планка;

Кл – заряд электрона;

-электрическая постоянная.

program Example_35;

{ Программа вычисления значений энергии электрона в атоме водорода}

const e=1.60219e-19;

hs=1.0545887e-34;

me=0.910953e-30;

e0=8.8541878e-12;

var En:real; n:integer;

begin

n:=2;

Еn:=-me*sqr(sqr(e))/(32*sqr(pi*e0*hs*n));

writeln('n=', n:5,' En=', En);

readln

end.

При запуске программы на выполнение возникнет сообщение division by zero (деление на нуль), которое связано с переполнением ячеек памяти, содержащих вещественный тип real. Один из способов обойти возникшие трудности – записать последовательность действий в формуле таким образом, чтобы результаты после каждой операции не превосходили значения 10-39, например

En:=- me/hs*sqr(e)/hs*sqr(e)/(32*sqr(pi*e0*n));

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]