Реферат по предмету "Программирование, Базы данных"


Процедуры в Паскале

Министерство образования Российской Федерации.
Северо-Кавказский Горно-Металлургический Институт  (СКГТУ)
кафедра                          промышленной электроники        .                       
 
факультет       электроннойтехники, ПЭ-04-1                    .      
 
 
 
 
К У Р С О В А Я    Р А Б О Т А
                         «                                                                  »
(вариант №9)
Выполнил Дзотцоев Лев Казгериевич
Преподаватель Яровой Иван Федорович
«___»  «______________»  200__
Г. Владикавказ 2004 год
 
Задание
 
 
1.     Приведитесинтаксис описания и вызова процедуры. Опишите виды, назначение формальных ифактических параметров. Приведите пример описания процедуры, её вызова ипоясните его.
2.     Даны целые mи n. Составитьпрограмму вычисления 
    x= (m! +n!)/(m+n)!, где k=1x2x3x4x..xK
В программе предусмотреть:
·       Ввод m и n
·       Описание процедуры-функции для вычисления значенияфакториала: f(k) = k! =1x2x3x..xK
·       Отображение на экране дисплея значения Х
·       Комментарии в основных местах программы
2.1 Отладить и провести счет попрограмме.
2.2 Привести в пояснительной записке:
·       Текст программы с пояснениями
·       Исходные данные и результатысчета
СОДЕРЖАНИЕ
 
 
 
Задание                                                                                                                    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
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)    при умножении числа на 1 получается это же число,поэтому при у=1 исключены ошибки в начале вычисления факториала. 
2)    известно, что 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
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
ЗАКЛЮЧЕНИЕ
Системапрограммирования Турбо Паскаль содержит мощный инструмент разработки программ –подпрограммы. В данной курсовой приведены синтаксис процедур, виды и назначениепараметров. Как мы увидели,  программавычисления факториала с использованием функции гораздо более компактна, чем таже программа без процедур-функций. Использование процедур-функций отнюдь  не является дурным тоном в программировании,поэтому каждый изучающий язык программирования Паскаль должен обязательно иметьпредставление о процедурах-функциях и уметь ими пользоваться.
Литература
А. Масюков. Краткий конспект лекций по информатике.
Интерактивныйучебник Turbo Pascal 7.0
С. А. Абрамов. Начала программирования наязыке паскаль
             
Приложение
  ASSEMBLER — эта директива отменяетстандартную последовательность машинных инструкций, вырабатываемых при входе впроцедуру и перед выходом из нее.


Не сдавайте скачаную работу преподавателю!
Данный реферат Вы можете использовать для подготовки курсовых проектов.

Поделись с друзьями, за репост + 100 мильонов к студенческой карме :

Пишем реферат самостоятельно:
! Как писать рефераты
Практические рекомендации по написанию студенческих рефератов.
! План реферата Краткий список разделов, отражающий структура и порядок работы над будующим рефератом.
! Введение реферата Вводная часть работы, в которой отражается цель и обозначается список задач.
! Заключение реферата В заключении подводятся итоги, описывается была ли достигнута поставленная цель, каковы результаты.
! Оформление рефератов Методические рекомендации по грамотному оформлению работы по ГОСТ.

Читайте также:
Виды рефератов Какими бывают рефераты по своему назначению и структуре.