
- •Оглавление
- •Введение………………………………………………………..……
- •I. Теоретический раздел работы………………………………………….….
- •I. Теоретический раздел работы…………………………………………….
- •I. Теоретический раздел работы……………………………………………..
- •Работа 1
- •1.Введение.
- •2. Начало работы в среде Turbo Pascal.
- •2.1. Вызов Turbo Pascal.
- •2.2. Использование меню.
- •2.3. Работа с окнами. Использование мыши.
- •2.4. Первая программа.
- •2.5. Работа с файлами
- •2.6. Основные приемы работы с текстовым редактором.
- •2.7. Меню Edit
- •3. В конце работы Вы должны уметь
- •Работа 2 ввод и вывод информации
- •I. Теоретический раздел работы
- •1. Введение.
- •2. Структура программы на языке Паскаль
- •3. Типы данных в языке Turbo Pascal.
- •4. Ввод и вывод данных.
- •II. Экспериментальный раздел работы
- •III. Дополнительный материал.
- •IV. Раздел заданий для самостоятельной работы.
- •Работа 3 расчет по формулам
- •I.Теоретический раздел работы
- •1. Некоторые понятия лексика языка Turbo Pascal.
- •2. Представление вещественных чисел на эвм.
- •3. Оператор присваивания
- •4. Алгебраические выражения.
- •5. Описание пользовательских подпрограмм-функций.
- •II.Экспериментальный раздел работы
- •III. Раздел заданий для самостоятельной работы.
- •Работа 4
- •I.Теоретический раздел работы
- •1. Некоторые сведения о целых типах данных.
- •2. Операции над целыми типами данных.
- •3. Представление целых чисел в компьютере.
- •4. Некоторые стандартные подпрограммы для работы с целыми числами.
- •II.Экспериментальный раздел работы
- •III. Раздел заданий для самостоятельной работы
- •Работа 5 Логический тип данных
- •I.Теоретический раздел работы
- •1. Некоторые сведения о логическом типе данных.
- •2. Логические выражения.
- •3. Основные законы алгебры логики.
- •4. Побитовые операции над целыми числами.
- •Работа 6
- •I.Теоретический раздел работы
- •1. Введение.
- •2. Оператор условного перехода if ... Then...Else
- •3. Условный оператор case...Of
- •II. Экспериментальный раздел работы
- •Работа 7
- •I. Теоретический раздел работы
- •1.Введение.
- •2. Оператор цикла while… do.
- •II. Экспериментальный раздел работы.
- •2. Оператор цикла repeat … until.
- •3. Суммирование рядов.
- •II. Экспериментальный раздел работы Пример 1. Пусть требуется найти сумму ряда:
- •III. Раздел заданий для самостоятельной работы
- •Работа 9 оператор цикла с параметром
- •I. Теоретический раздел работы
- •1. Введение
- •2. Оператор цикла for …do
- •3. Операторы завершения цикла
- •4. Алгоритм Горнера.
- •II. Экспериментальный раздел работы
- •III. Раздел заданий для самостоятельной работы
- •Список литературы
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));
Реализуйте программно другие способы решения возникшей проблемы.