Система программирования Турбо Паскаль

Автор работы: Пользователь скрыл имя, 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 Привести в пояснительной записке:
• Текст программы с пояснениями
• Исходные данные и результаты счета

Содержание работы

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

Файлы: 1 файл

Курсовая работа .docx

— 29.02 Кб (Скачать файл)

Существует одно обстоятельство, которое следует учитывать при выборе вида формальных параметров. Как уже говорилось, при объявлении параметра-значения осуществляется копирование фактического параметра во временную память. Если этим параметром будет массив большой размерности, то существенные затраты времени и памяти на копирование при многократных обращениях к подпрограмме могут стать решающим доводом в пользу объявления такого параметра параметром-переменной или передачи его в качестве глобальной переменной.

 

Параметры массивы и параметры строки

 

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

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+n); {вычисляется значение данного выражения}

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; необходимо присвоить переменной значение, равное единице, по крайней мере по двум причинам:

  1. при умножении числа на 1 получается это же число, поэтому при у=1 исключены ошибки в начале вычисления факториала.
  2. известно, что 0!=1, поэтому при m или n = 0 цикл не запускается, а значение 0! Оказывается равным 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+n); вычисляем значение (m!+n!)/(m+n)!

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 - компилятор  должен создавать код подпрограммы, рассчитанный на дальнюю модель  вызова. Директива NEAR заставит компилятор  создать код, рассчитанный на  ближнюю модель памяти. По умолчанию  все стандартные подпрограммы  генерируются с расчетом на  дальнюю модель вызова, а все  остальные подпрограммы - на ближнюю  модель.

 В  соответствии с архитектурой  микропроцессора ПК, в программах  могут использоваться две модели  памяти: ближняя и дальняя. Модель  памяти определяет возможность  вызова процедуры из различных  частей программы: если используется  ближняя модель, вызов возможен  только в пределах 64 Кбайт (в пределах  одного сегмента кода, который  выделяется основной программе  и каждому используемому в  ней модулю); при дальней модели  вызов возможен из любого сегмента. Ближняя модель экономит один  байт и несколько микросекунд  на каждом вызове подпрограммы, поэтому стандартный режим компиляции  предполагает эту модель памяти. Однако при передаче процедурных  параметров соответствующие подпрограммы  должны компилироваться с расчетом  на универсальную - дальнюю модель  памяти, одинаково пригодную при  любом расположении процедуры  и вызывающей ее программы  в памяти.

Явное объявление модели памяти стандартными директивами имеет более высокий приоритет по сравнению с настройкой среды.

FORWARD - используется  при опережающем описании для  сообщения компилятору, что описание  подпрограммы следует где-то дальше  по тексту программы (но в пределах  текущего программного модуля).

INLINE - указывает  на то, что тело подпрограммы  реализуется с помощью встроенных  машинных инструкций.

INTERRUPT - используется  при создании процедур обработки  прерываний

опережающее описание:

Procedure В (j : byte);

forward;

Procedure A (i : byte);

begin

B(i);

End;

Информация о работе Система программирования Турбо Паскаль