Реферат: Процедуры в Паскале

Министерство образования Российской Федерации.

Северо-Кавказский Горно-Металлургический Институт  (СКГТУ)

кафедра                          промышленной электроники        .                       

 

факультет       электроннойтехники, ПЭ-04-1                    .      

 

 

 

 

К У Р С О В А Я    Р А Б О Т А

                         «                                                                  »

(вариант №9)

Выполнил <span Comic Sans MS"">Дзотцоев Лев Казгериевич

Преподаватель <span Comic Sans MS"">Яровой Иван Федорович

«___»  «______________»  200__

Г. Владикавказ 2004 год

 

Задание

 

 

1.<span Times New Roman"">    

Приведитесинтаксис описания и вызова процедуры. Опишите виды, назначение формальных ифактических параметров. Приведите пример описания процедуры, её вызова ипоясните его.

2.<span Times New Roman"">    

Даны целые mи n. Составитьпрограмму вычисления 

    x= (m! +n!)/(m+n)!, где k=1x2x3x4x..xK

В программе предусмотреть:

·<span Times New Roman"">       

Ввод m и n

·<span Times New Roman"">       

Описание процедуры-функции для вычисления значенияфакториала: f(k) = k! =1x2x3x..xK

·<span Times New Roman"">       

Отображение на экране дисплея значения Х

·<span Times New Roman"">       

Комментарии в основных местах программы

2.1 Отладить и провести счет попрограмме.

2.2 Привести в пояснительной записке:

·<span Times New Roman"">       

Текст программы с пояснениями

·<span Times New Roman"">       

Исходные данные и результатысчета

СОДЕРЖАНИЕ

 

 

 

Задание                                                                                                                    1

 

Содержание                                                                                                            2

 

Синтаксис описания ивызова процедуры                                                           3

 

Параметры                                                                                                               4

 

Пример описания и вызовапроцедуры                                                               5

 

Виды параметров                                                                                                   6

 

Программа                                                                                                             12

 

Пояснительная записка                                                                                        13

 

Заключение                                                                                                            15

 

Литература                                                                                                             16

 

Приложение                                                                                                          17

 

 

Синтаксис описания и вызова процедуры.

Программаобъемом до 10000 операторов считается малой, до 100000 операторов – средней.Понятно, что строить такие программы непосредственно из элементарных операциипрактически невозможно. Для упрощения разработки программ в Pascal-е можно использовать подпрограммы — процедуры ифункции. Они  представляют собойинструмент, с помощью которого любая программа может быть разбита на ряд визвестной степени независимых друг от друга частей. Такое разбиение необходимопо двум причинам.

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

  Вторая причина заключается в применениисовременных методов нисходящего проектирования программ. В результатеприменение этих методов алгоритм представляется в виде последовательностиотносительно крупных подпрограмм, реализующих более или менее самостоятельныесмысловые части алгоритма. Подпрограммы в свою очередь могут разбиваться наменее крупные подпрограммы, те — на подпрограммы нижнего уровня и т.д. Последовательноеструктурирование программы продолжается до тех пор, пока реализуемыеподпрограммами алгоритмы не станут настолько простыми, чтобы их можно былолегко запрограммировать.

Pascalдаже в сравнении с промышленными системамипрограммирования обладает очень мощными средствами работы с подпрограммами.

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

         В структуре Pascalпрограмм существует специальный раздел для описанияпроцедур и функций. Как известно, любое имя в программе должно быть обязательноописано перед тем, как оно появится среди исполняемых операторов. Не делаетсяисключения и в отношении процедур: каждую необходимо описать в разделеописаний.

 Описать подпрограмму — это значит указать еезаголовок и тело. В  заголовкеобъявляются имя процедуры  и формальныепараметры, если они есть. За заголовком следует тело подпрограммы, которое состоитиз раздела описаний и раздела исполняемых операторов. В разделе описаний процедурмогут встретиться описания процедур низшего уровня, в тех — описания другихподпрограмм и т.д.

 Синтаксис и вызов (в общем) процедур:

Procedure <имя процедуры>

         Uses <имена модулей>

         Label<имена меток>

         Const<имена констант>

         Type<имена типов>

         Var<имена локальных переменных>

<раздел объявления подпрограмм>

         Begin

<операторы>

         End;

Длявыполнения процедуры необходим её вызов. Вызов осуществляется по имени даннойпроцедуры в теле программы. Имя процедуры воспринимается как оператор. При еговыполнении выполняется вся подпрограмма.

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

Заголовок

Заголовокпроцедуры имеет вид:

PROCEDURE <имя> (<сп.ф.п.>);

Здесь<имя> — имя подпрограммы <сп.ф.п.> — список формальных параметров;

{Сразу за заголовком подпрограммы может следовать одна изстандартных директив ASSEMBLER, EXTERNAL, FAR, FORWARD, INLINE, INTERRUPT, NEAR}

Параметры

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

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

   Если же он есть, то в нем должны бытьперечислены имена формальных параметров и их тип, например:

Procedure YZ (a:real; b: integer: с:char)

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

Procedure Z (а: integer; b:integer)

можнонаписатьпроще:

Procedure Z (a, b: integer)

   Операторы тела подпрограммы рассматриваютсписок формальных параметров как своеобразное расширение раздела описаний: всепеременные из этого списка могут использоваться в любых выражениях внутриподпрограммы. Таким способом осуществляется настройка алгоритма подпрограммы наконкретную задачу.

Первыйформальный параметр заменяется первым фактическим, второй-вторым и т. д.

   Механизм замены формальных параметров нафактические позволяет нужным образом настроить алгоритм, реализованный вподпрограмме. Турбо Паскаль следит за тем, чтобы количество и тип формальныпараметров строго соответствовали количеству и типам фактических параметров вмомент обращения к подпрограмме. Напомним: смысл используемых фактическихпараметров зависит от того, в каком порядке они перечислены при вызовеподпрограммы. Пользователь должен сам следить за правильным порядкомперечисления фактических параметров при обращении к подпрограмме. Приведемпример. рассмотрим интересующую нас часть программы (не самой удачной, но этопока неважно) для  вычисления x= (5! + 2!)/(5+2)!  

Programfactorial(input,output);

……

{далее нас интересует описание процедуры:}

ProcedureFL(L:integer, varz: integer); {объявление процедуры, её имя, список формальных параметров}

Begin

Z:=1;

WhileL>1 do

       Begin

       Z:=ZxL;{тело процедуры, которая также предусматривает, что 0! и 1! =1}

       L:=l-1;

       end;

end;

……..

begin

……..

{теперь рассмотрим вызов процедуры}

FL(5,a);

FL(2,b);

FL(2+5,c);

..........

end.

Вданном случае l, z  формальныепараметры. К слову, их не надо описывать в разделе глобальных переменных.

Фактическиепараметры: 5, а, 2, b, 2+5, c. В “основном” разделе VAR должны быть описаны а, b, c

Припервом вызове процедуры фактический параметр 5 заменит формальный L, фактический aзаменит формальный z, во втором 2 заменит L, bзаменит z.

Втретьем соответственно 2+5 заменит L, cзаменитz. Для того, чтобы окончательно разобраться впрограмме, необходимо пояснить, какими бывают виды формальных и фактическихпараметров, их назначение.

Виды параметров.

Поспособу передачи данных параметры можно разделить на несколько категорий.

   Любой из формальных параметров подпрограммыможет быть либо параметром-значением, либо параметром-переменной, либопараметром-константой. Если параметры определяются как параметры-переменные,перед ними необходимо ставить зарезервированное слово VAR, например:

Proceduretide(vara: real)   Здесь параметр А — параметр-переменная.Заголовок процедуры может быть устроен так, что некоторые группы формальныхпараметров не содержат слова VAR. Например:

Procedureqwerty(a,b,c:real; var s:real);

Формальныепараметры, которые входят в группы, не содержащие слова VAR, называются формальными параметрами-значениями. 

 Определение формального параметра тем или инымспособом существенно только для вызывающей программы: если формальный параметробъявлен как параметр-переменная, то при вызове подпрограммы ему долженсоответствовать фактический параметр в виде переменной определенного  типа; если формальный параметр объявлен как параметр-значение,то при вызове ему может соответствовать произвольное выражение. Контроль занеукоснительным соблюдением этого правила осуществляет компилятором ТурбоПаскаля.

Длятого чтобы понять, в каких случаях использовать параметры значения, а в каких — параметры-переменные, рассмотрим, как осуществляется замена формальныхпараметров на фактические в момент обращения к подпрограмме.

  Еслипараметр определен как параметр-значение, то перед вызовом подпрограммы этозначение вычисляется, полученный результат копируется во временную память ипередается подпрограмме. Важно учесть, что даже если в качестве фактическогопараметра указано простейшее выражение в виде переменной или константы, всеравно подпрограмме будет передана лишь копия переменной (константы). Такимобразом, назначение параметра-значения – передачаданных из программы в подпрограмму. Если же параметр определен какпараметр-переменная, то при вызове подпрограммы передается сама переменная, ане ее копия. Любые возможные изменения в подпрограмме параметра-значения никакне воспринимаются вызывающей программой, так как в этом случае изменяется копияфактического параметра, в то время как изменение параметра-переменной приводитк изменению самого фактического параметра в вызывающей программе. Параметр-константа схож с параметром-переменной: вподпрограмму передается сама константа, но изменениееё невозможно. Назначение такого параметра совпадаетс назначением параметра-значения . Формальные параметры-константыуказываются в заголовке программы после служебного слова const. Его действие распространяется до ближайшей точки сзапятой.

Пояснимизложенное.

.....

var

a, b: integer;

......

proceduresquar(a: integer; var b: integer);

begin

a:=sqr(a);

b:=sqr(b);

writeln(‘в квадрате они выглядят так: ’,a,’, ’,b);

end;

........

begin

a:=4; b:=6;

writeln(‘внимательно посмотрите на эти числа:  ’, a,’, ’, b);

squar(a,b);

writeln(‘а так а не в квадрате: ’,a, ’, ’,b);

end.

Результатывыглядят так:    внимательно посмотритена эти числа: 4, 6

                                             в квадрате они выглядят так: 16, 36

                                             а  так а не в квадрате: 4, 36

   Этот пример может служить еще и иллюстрациеймеханизма «закрывания» глобальной переменной а одноименной локальной: хотяпеременная объявлена как глобальная (она описана в вызывающей программе перед  описанием процедуры), в теле процедуры ее «закрыла»локальная переменная а, объявленная как параметр-значение.

   Итак,параметры-переменные используются как средство связи алгоритма, реализованногов подпрограмме, с «внешним миром»: с помощью этих параметров подпрограмма можетпередавать результаты своей работы вызывающей программе. Разумеется, враспоряжении программиста всегда есть и другой способ передачи результатов — через глобальные переменные. Однако злоупотребление глобальными связями делаетпрограмму, как правило, запутанной, трудной в понимании и сложной в отладке. Всоответствии с требованиями хорошего стиля программирования рекомендуется там,где это возможно, использовать передачу результатов через фактическиепараметры-переменные.

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

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

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

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

Procedure S (а: array (1..10] of real);

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

   Если мы хотим передать какой-то элементмассива, то проблем, как правило, не возникает, но если в подпрограммупередается весь массив, то следует первоначально описать его тип. Например:

…...

type

mas = array[1..10] of real;

PROCEDURES(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целые(неотрицательные)

programfactorial_(input,output);{названиепрограммы}

label 0;   {описываемметку}

var                                             

rez:real;

m,n:longint; {описали глобальные переменные, используемые в программе}

functionfact(z: longint): real; {заголовок функции сформальным параметром-значением, типом}

var

y: real; {описали локальную переменную}

begin

y:=1; {для получениярезультата необходимо присвоить у значение 1. также при помощи этогореализуется вычисление 0!  и 1!}

whilez>1 do{запускаем цикл в обратную сторону, дляупрощения опустим множитель 1}

begin

y:=y*z;

z:=z-1

end;

fact:=y{вычисляемфакториал, присваиваем его значение функции}

end; {конец функции}

begin{начало тела программы}

writeln('введите неотрицательные числа'); {для удобства пользователя просим ввести числа}

0:readln(m,n); {в память вводятсячисла}

ifm or n <0 thenbegin

writeln(‘вы ошиблись, вводите неотрицательные числа’);

goto0{при ошибкепользователя предотвращаем выдачу неверного результата}

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,   вы ошиблись, вводите неотрицательные числа

Пояснительная записка

Теперьпоясним нашу программу. programfactorial_(input,output) – с этимзатруднений не возникает, factorial– имя программы, input-файл, откуда происходит считывание данных, output-файл, куда происходит вывод данных. В нашем случае (input,output) показывает, что программа требует ввода данных и производитих вывод.

Label0; описываем метку, которая нам пригодиться позже

var                                             

rez:real;

m,n:longint; — описываем глобальные переменные.

functionfact(z: longint): real; объявляем функцию, даем ей имя fl, указываем формальные параметры. В данном случае этопараметр-значение z.

var

y: real; описываемлокальную переменную, т.е. она будет использоваться только в теле функции. Realиспользован потому, что уже 13!Выходит за рамки longint

begin

y:=1; необходимо присвоить переменной значение, равноеединице, по крайней мере по двум причинам:

1)<span Times New Roman"">   

при умножении числа на 1 получается это же число,поэтому при у=1 исключены ошибки в начале вычисления факториала. 

2)<span Times New Roman"">   

известно, что 0!=1, поэтому при  mили n= 0 цикл не запускается, а значение 0! Оказываетсяравным 1.

whilez>1 doзапускаем цикл в обратную сторону, т. к. результатполучается один и тот же, но при этом не приходится описывать дополнительнуюлокальную переменную для запуска цикла с параметром. 1 исключаем из вычисленияфакториала по вышеуказанным причинам.

begin

y:=y*z;

z:=z-1

end;

fact:=y  этим оператором присваиваем функции значениефакториала.

Точкус запятой перед endможно не ставить.

end; конецфункции

beginначало тела программы

writeln('введите неотрицательные числа'); данный операторвыводит на экран текст, заключенный между ‘’, помогает понять, чего же требуетпрограмма.

0:readln(m,n); при помощи этого оператора ввода информацииисходные данные заносятся в ячейки памяти.

ifm or n <0 thenbegin writeln(‘выошиблись, вводитенеотрицательныечисла’);

goto0

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

ЗАКЛЮЧЕНИЕ

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

Литература

А. Масюков. <span Comic Sans MS"">Краткий конспект лекций по информатике.

<span Comic Sans MS"">Интерактивныйучебник

<span Comic Sans MS"; mso-ansi-language:EN-US">Turbo<span Comic Sans MS""> <span Comic Sans MS";mso-ansi-language:EN-US">Pascal<span Comic Sans MS""> 7.0

С. А. Абрамов. <span Comic Sans MS"">Начала программирования наязыке паскаль

             

Приложение

  ASSEMBLER — эта директива отменяетстандартную последовательность машинных инструкций, вырабатываемых при входе впроцедуру и перед выходом из нее.

еще рефераты
Еще работы по программированию, базе данных