Автор работы: Пользователь скрыл имя, 24 Февраля 2015 в 18:25, лабораторная работа
1. Приведите синтаксис описания и вызова процедуры. Опишите виды, назначение формальных и фактических параметров. Приведите пример описания процедуры, её вызова и поясните его.
2. Даны целые m и n. Составить программу вычисления
x = (m! +n!)/(m+n)!, где k=1x2x3x4x..xK
В программе предусмотреть:
• Ввод m и n
• Описание процедуры-функции для вычисления значения факториала : f(k) = k! = 1x2x3x..xK
• Отображение на экране дисплея значения Х
• Комментарии в основных местах программы
2.1 Отладить и провести счет по программе.
2.2 Привести в пояснительной записке:
• Текст программы с пояснениями
• Исходные данные и результаты счета
Система программирования Турбо Паскаль содержит мощный инструмент разработки программ – подпрограммы. В данной курсовой приведены синтаксис процедур, виды и назначение параметров. Как мы увидели, программа вычисления факториала с использованием функции гораздо более компактна, чем та же программа без процедур-функций. Использование процедур-функций отнюдь не является дурным тоном в программировании, поэтому каждый изучающий язык программирования Паскаль должен обязательно иметь представление о процедурах-функциях и уметь ими пользоваться.
Существует одно обстоятельство, которое следует учитывать при выборе вида формальных параметров. Как уже говорилось, при объявлении параметра-значения осуществляется копирование фактического параметра во временную память. Если этим параметром будет массив большой размерности, то существенные затраты времени и памяти на копирование при многократных обращениях к подпрограмме могут стать решающим доводом в пользу объявления такого параметра параметром-переменной или передачи его в качестве глобальной переменной.
Параметры массивы и параметры строки
Может сложиться впечатление, что объявление переменных в списке формальных параметров подпрограммы ничем не отличается от объявления их в разделе описания переменных. Действительно, в обоих случаях много общего, но есть одно существенное различие: типом любого параметра в списке формальных параметров может быть только стандартный или ранее объявленный тип. Поэтому нельзя, например, объявить следующую процедуру:
Procedure S (а : array (1..10] of real);
так как в списке формальных параметров фактически объявляется тип - диапазон, указывающий границы индексов массива.
Если мы хотим передать какой-то элемент массива, то проблем, как правило, не возникает, но если в подпрограмму передается весь массив, то следует первоначально описать его тип. Например:
…...
type
mas = array [1..10] of real;
.......
PROCEDURE S (a : mas);
…...
Поскольку строка является фактически своеобразным массивом, ее передача в подпрограмму осуществляется аналогичным образом:
.......
type
intype =string[15];
outype = string[30];
FUNCTION St (i : intype) : outype:
Требование описать любой тип-массив или тип-строку перед объявлением подпрограммы на первый взгляд кажется несущественным. Действительно, в рамках простейших вычислительных задач обычно заранее известна структура всех используемых в программе данных, поэтому статическое описание массивов не вызывает проблем. Однако разработка программных средств универсального назначения связана со значительными трудностями. По существу, речь идет о том, что в Турбо Паскале невозможно использовать в подпрограммах массивы с «плавающими» границами изменения индексов. Например, если разработана программа, обрабатывающая матрицу из 10 х 10 элементов, то для обработки матрицы из 9 х 11 элементов необходимо переопределить тип, т.е. перекомпилировать всю программу. Этот недостаток, как и отсутствие в языке средств обработки исключительных ситуаций (прерываний), унаследован из стандартного Паскаля и представляет собой объект постоянной и вполне заслуженной его критики. Разработчики Турбо Паскаля не рискнули кардинально изменить свойства базового языка, но, тем не менее, включили в него некоторые средства, позволяющие в известной степени смягчить отмеченные недостатки.
Прежде всего, в среде Турбо Паскаля можно установить режим компиляции, при котором отключается контроль над совпадением длины фактического и формального параметра-строки. Это позволяет легко решить вопрос о передаче подпрограмме строки произвольной длины. При передаче строки меньшего размера формальный параметр будет иметь ту же длину, что и параметр обращения; передача строки большего размера приведет к ее усечению до максимального размера формального параметра. Следует сказать, что контроль включается только при передаче строки, объявленной как формальный параметр-переменная. Если соответствующий параметр объявлен параметром-значением, эта опция игнорируется и длина не контролируется.
Значительно сложнее обстоит дело с передачей массивов произвольной длины. Решить эту проблему при помощи не типизированных параметров
Процедурные типы
Процедурные типы - это нововведение фирмы Borland (в стандартном Паскале таких типов нет). Основное назначение этих типов - дать программисту гибкие средства передачи функций и процедур в качестве фактических параметров обращения к другим процедурам и функциям.
Для объявления процедурного типа используется заголовок процедур, в котором опускается ее имя, например:
type
Proc = Procedure (a, b, с : real; Var d : real);
Proc2 = Procedure (var a, b);
РгосЗ = Procedure;
В программе могут быть объявлены переменные процедурных типов, например, так:
var
р1 : Proc;
ар : array [1..N] of Proc2;
Переменным процедурных типов допускается присваивать в качестве значений имена соответствующих подпрограмм. После такого присваивания имя переменной становится синонимом имени подпрограммы.
В отличие от стандартного Паскаля, в Турбо Паскале разрешается использовать в передаваемой процедуре как параметры-значения, так и параметры-переменные.
процедура паскаль параметр массив
Нетипизированные параметры-переменные
Еще одно и очень полезное нововведение фирмы Borland - возможность использования нетипизированных параметров. Параметр считается нетипизированным, если тип формального параметра-переменной в заголовке подпрограммы не указан, при этом соответствующий ему фактический параметр может быть переменной любого типа. Заметим, нетипизированными могут быть только параметры-переменные.
Нетипизированные параметры обычно используются в случае, когда тип данных несущественен. Такие ситуации чаще всего возникают разного рода копированиях одной области памяти в другую. Нетипизированные параметры очень удобно использовать для передачи подпрограмме одномерных массивов переменной длины.
Параметры - сложные типы данных
Рассмотрены прежде категории параметров не исчерпывают всех вопросов передачи информации в Pascal-e. Использование в качестве параметров сложных типов данных имеет свои особенности.
Рассмотрим массивы и строки открытого типа. Открытый массив (строка) – массив (строка) без указания типа индекса (размера массива(строки)).
Пример:
Procedure getfive (var massiv: array of real);
В данном случае вместо формального параметра может использоваться любой массив с элементами типа real. Индексация элементов открытого массива всегда начинается с нуля. Такие массивы введены для того, чтобы подпрограмма могла обрабатывать массивы любого размера.
Программа вычисления x=(m!+n!)/(m+n)!, где m, n целые (неотрицательные)
program factorial_(input,output); {название программы}
label 0; {описываем метку}
var
rez:real;
m,n:longint; {описали глобальные переменные, используемые в программе}
function fact(z: longint): real; {заголовок функции с формальным параметром-значением, типом}
var
y: real; {описали локальную переменную}
begin
y:=1; {для получения результата необходимо присвоить у значение 1. также при помощи этого реализуется вычисление 0! и 1!}
while z>1 do {запускаем цикл в обратную сторону, для упрощения опустим множитель 1}
begin
y:=y*z;
z:=z-1
end;
fact:=y{вычисляем факториал, присваиваем его значение функции}
end; {конец функции}
begin{начало тела программы}
writeln('введите неотрицательные числа'); {для удобства пользователя просим ввести числа}
0:readln(m,n); {в память вводятся числа}
if m or n <0 then begin
writeln(‘вы ошиблись, вводите неотрицательные числа’);
goto 0 {при ошибке пользователя предотвращаем выдачу неверного результата}
end;
rez:=(fact(m)+fact(n))/fact(m+
writeln('результат: ',rez) {выводим на экран результаты счета}
end.
Исходные данные и результаты счета:
m=0, n=0, x=2.0000000000E+00 (2)
m=3, n=5, x=3.1250000000E-03 (0,003125)
m=7, n=-3, вы ошиблись, вводите неотрицательные числа
Пояснительная записка
Теперь поясним нашу программу. program factorial_(input,output) – с этим затруднений не возникает, factorial – имя программы, input-файл, откуда происходит считывание данных, output-файл, куда происходит вывод данных. В нашем случае (input,output) показывает, что программа требует ввода данных и производит их вывод.
Label 0; описываем метку, которая нам пригодиться позже
var
rez:real;
m,n:longint; - описываем глобальные переменные.
function fact(z: longint): real; объявляем функцию, даем ей имя fl, указываем формальные параметры. В данном случае это параметр-значение z.
var
y: real; описываем локальную переменную, т.е. она будет использоваться только в теле функции. Real использован потому, что уже 13! Выходит за рамки longint
begin
y:=1; необходимо присвоить переменной значение, равное единице, по крайней мере по двум причинам:
while z>1 do запускаем цикл в обратную сторону, т. к. результат получается один и тот же, но при этом не приходится описывать дополнительную локальную переменную для запуска цикла с параметром. 1 исключаем из вычисления факториала по вышеуказанным причинам.
begin
y:=y*z;
z:=z-1
end;
fact:=y этим оператором присваиваем функции значение факториала.
Точку с запятой перед end можно не ставить.
end; конец функции
begin начало тела программы
writeln('введите неотрицательные числа'); данный оператор выводит на экран текст, заключенный между ‘’, помогает понять, чего же требует программа.
0:readln(m,n); при помощи этого оператора ввода информации исходные данные заносятся в ячейки памяти.
if m or n <0 then begin writeln(‘вы ошиблись, вводите неотрицательные числа’);
goto 0
end; если пользователь все же ввел отрицательные числа, то программа выдаст неверный результат, данная последовательность операторов выводит на экран сообщение об ошибке пользователя и возвращает к вводу чисел
rez:=(fact(m)+fact(n))/fact(m+
writeln('результат: ',rez) данный оператор вывода информации выводит на экран вычисленное значение.
end. конец программы
Приведем для пущей надежности еще несколько результатов счета
M=2 N=8 X=1.1111662257Е-02
M=4 N=4 X=1.1904761905Е-03
M=0 N=3 X=1.1666666667Е+00
M=3 N=15 X=2.0424836601Е-04
Заключение
Система программирования Турбо Паскаль содержит мощный инструмент разработки программ – подпрограммы. В данной курсовой приведены синтаксис процедур, виды и назначение параметров. Как мы увидели, программа вычисления факториала с использованием функции гораздо более компактна, чем та же программа без процедур-функций. Использование процедур-функций отнюдь не является дурным тоном в программировании, поэтому каждый изучающий язык программирования Паскаль должен обязательно иметь представление о процедурах-функциях и уметь ими пользоваться.
Литература
А. Масюков. Краткий конспект лекций по информатике.
Интерактивный учебник Turbo Pascal 7.0
С.А. Абрамов. Начала программирования на языке паскаль
Приложение
ASSEMBLER - эта
директива отменяет
EXTERNAL - с
помощью этой директивы
FAR - компилятор
должен создавать код
В
соответствии с архитектурой
микропроцессора ПК, в программах
могут использоваться две
Явное объявление модели памяти стандартными директивами имеет более высокий приоритет по сравнению с настройкой среды.
FORWARD - используется
при опережающем описании для
сообщения компилятору, что описание
подпрограммы следует где-то
INLINE - указывает
на то, что тело подпрограммы
реализуется с помощью
INTERRUPT - используется
при создании процедур
опережающее описание:
Procedure В (j : byte);
forward;
Procedure A (i : byte);
begin
B(i);
End;