Автор Анна Евкова
Преподаватель который помогает студентам и школьникам в учёбе.

Основы программирования на языке Pascal (Общие сведения о реализации подпрограмм)

Содержание:

ВВЕДЕНИЕ

Если в программе имеется несколько одинаковых (или очень похожих) фраг­ментов, то возникает естественный вопрос: нельзя ли оформить повторяю­щийся фрагмент в виде отдельного блока, а затем обращаться к нему в программе столько раз, сколько требуется. Аналогичная идея возникает и при отладке больших программ — если разделить программу на отдельные самостоятельные фрагменты, то отладить ее по частям будет проще. Эти ра­зумные мысли имеют поддержку во всех языках высокого уровня, которые предоставляют программисту такое удобное средство разбиения программы на части, как подпрограммы.

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

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

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

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

Целью данной работы является исследование программирования на языке Pasсal, для достижения поставленной цели, были выделены следующие задачи:

- рассмотреть теоретические аспекты программирования на языке Паскаль;

- разработать программу на языке Паскаль.

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

Предмет исследования - программирования на языке Pasсal.

Структура работы состоит из введения, основной части, заключения и списка литературы.

Теоретической и методологической базой данной работы послужили труды российских и зарубежных авторов в области информационных технологий и программирования.

ГЛАВА 1 ТЕОРЕТИЧЕСКИЕ АСПЕКТЫ ПРОГРАММИРОВАНИЯ НА ЯЗЫКЕ PASCAL

1.1 Общие сведения о реализации подпрограмм

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

Все процедуры и функции, в свою очередь, подразделяются на две группы:

- стандартные (встроенные);

- определенные пользователем.

Встроенные (стандартные) процедуры и функции входят в стандартные биб­лиотеки и могут вызываться по имени без предварительного описания (напри­мер, процедуры ввода и вывода read и write). Наличие стандартных процедур существенно облегчает разработку программ, и этот инструмент широко используется при программировании на языке высокого уровня.

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

Процедуры и функции пользователя разрабатываются самим программистом и поме­щаются в раздел описаний процедур и функций. Их вызов для выполнения записывается в разделе операторов основной программы или другой подпрограммы[6;15].

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

В общем случае подпрограмма имеет ту же структуру, что и программа.

Объявление процедуры:

procedure ИмяПроцедуры (ФормальныеПараметры) ;

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

Begin

{ Инструкции исполнительной части процедуры }

end;

Объявление функции:

Function ИмяФункции (ФормальныеПараметры) : ТипРезультата;

{ описательная часть функции }

Begin

{ Инструкции исполнительной части функции }

ИмяФункции := Результат;

end;

1.2 Использование процедур в языке Pascal

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

Структура процедуры повторяет структуру программы, это "программа в ми­ниатюре", состоящая из заголовка и тела. В отличие от программы, для про­цедур и функций наличие заголовка обязательно.

Заголовок состоит из зарезервированного слова procedure, идентификатора (имени) процедуры и необязательного списка формальных параметров. Тело процедуры по своей структуре аналогично обычной программе:

procedure ИмяПроцедуры(ФормальныеПараметры) ;

{ Описательная часть процедуры }

begin

{ Инструкции исполнительной части процедуры }

end;

В конце тела процедуры, как и в конце программы, стоит end, однако после end ставится точка с запятой, а не точка[7;31].

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

ИмяПроцедуры(ФактическиеПараметры);

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

Для принудительного выхода из процедуры в ее теле записывается оператор завершения exit, который обеспечивает выход во внешний блок (обычно — в основную программу).

Эти несложные правила позволяют сформировать выводы об использовании процедур.

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

2. При использовании осмысленных и понятных имен процедур текст ос­новной программы становится не только более коротким, но и более по­нятным и выразительным.

3.Использование процедур позволяет упростить процесс внесения измене­ний в повторяющиеся фрагменты, т. к. исправления делаются один раз в процедуре, а не несколько раз в программе.

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

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

1.3 Механизм передачи параметров

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

Соответствие между формальными и фактическими параметрами обеспечи­вается выполнением следующих требований:

- формальных и фактических параметров должно быть одинаковое количество;

- порядок следования фактических и формальных параметров должен быть один и тот же;

- тип фактического параметра должен быть совместим с типом соответст­вующего ему формального параметра.

В языке Pascal типом любого параметра в списке формальных параметров может быть только стандартный или ранее объяв­ленный тип.

Например, нельзя объявить процедуру с заголовком:

procedure proc(m,n: integer; k: 1..5);

Для передачи в процедуру параметра к необходимо предварительно описать его тип в разделе описаний основной программы.

type range : 1. .5;

procedure proc(m,n: integer; к: range);

Имеются два основных вида параметров, которые отличаются способом их передачи в подпрограмму:

- параметры-значения;

- параметры-переменные.

Начиная с версии Turbo Pascal 7.0, появилась еще одна разновидность пара­метров — параметры-константы. В Delphi они также используются.

Параметры-значения используются только для передачи исходных данных из основной программы в процедуру или функцию. По умолчанию парамет­ры подпрограммы считаются именно параметрами-значениями.

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

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

Зато фактическим параметром-значением может быть не только константа или переменная с заданным значением, но и произвольное выражение. Перед вызовом подпрограммы фактические параметры вычисляются, и полученное значение передается в подпрограмму — выполняется подстановка значений.

Параметры-переменные необходимо использовать, прежде всего, для воз­врата результатов работы подпрограммы в основную программу.

В списке формальных параметров перед ними ставится ключевое слово var[14;15].

Каждому формальному параметру-переменной должен соответствовать фак­тический параметр обязательно в виде переменной. Выражение здесь недо­пустимо, т. к. результаты подпрограммы могут быть сохранены только в пе­ременных.

В этом случае при вызове подпрограммы ей передается адрес фактического параметра в памяти и в дальнейшем подпрограмма работает именно с этой ячейкой памяти, а не с копией, как при использовании параметра-значения.

Параметры-константы передаются по адресу, как параметры-переменные, но значения их запрещено изменять в подпро­грамме. За этим строго следит компилятор, при нарушении запрета он вы­дает сообщение об ошибке Invalid variable reference (Недопустимое обраще­ние к переменной).

При описании подпрограммы перед параметрами-константами добавляется служебное слово const, например:

procedure proc (const p: integer) ;.

Параметры-константы — это очень хороший способ передачи исходных данных в подпрограмму, т. к. он не требует дополнительных затрат памяти для хранения копий (во многих случаях для хранения адреса требуется меньше памяти, чем для хранения самого значения). При этом сами исход­ные данные в своих ячейках памяти остаются в неприкосновенности.

1.4 Использование функций

Если результатом подпрограммы является только одно значение, то имеет смысл оформить такую подпрограмму не в виде процедуры, а в виде функ­ции. Функция пользователя во всем аналогична процедуре, за исключением двух отличий:

- функция передает в программу результат своей работы — единственное значение, носителем которого является имя самой функции;

- имя функции может входить в выражение как операнд.

Функция, определенная пользователем, состоит из заголовка и тела функ­ции. Заголовок содержит зарезервированное слово function, имя функции, необязательный список формальных параметров и, в отличие от процедуры, тип возвращаемого функцией значения. Тело функ­ции по своей структуре аналогично обычной программе:

function ИмяФункции (ФормальныеПараметры) : ТипРезультата;

{ Описательная часть функции }

begin

{ Инструкции исполнительной части функции }

ИмяФункции := Результат;

end;

В разделе операторов функции должен находиться по крайней мере один оператор, который присваивает ее имени значение результата работы функции. Если таких присваиваний несколько, то резуль­татом функции будет значение последнего выполненного оператора присваи­вания. Если же такой оператор отсутствует, то значение, возвращаемое функ­цией, не определено (компилятор не выдает сообщения об ошибке, но результат программы, скорее всего, будет неверным).

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

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

Схематическое изображение структуры блоков некоторой программы на Pascal приведено на рис. 1.1

Рис.1.1 Иллюстрация вложенных процедур

Для доступа к объектам, описанным в различных блоках, требуется соблю­дать следующие правила[8;63]:

- имена объектов, описанных в некотором блоке, считаются известными в пределах данного блока, включая и все вложенные блоки;

- имена объектов, описанных в блоке, должны быть уникальны в пределах данного блока и могут совпадать с именами объектов из других блоков;

- если в некотором блоке описан объект, имя которого совпадает с именем объекта, описанного в вышестоящем блоке, то это последнее имя стано­вится недоступным в данном блоке.

Если применить эти правила к схеме на рис. 1.1, можно сказать, что объек­ты, описанные в блоке В, известны (видимы), кроме самого блока В, еще и в блоках С и D, но невидимы в блоке А. Объекты, описанные в блоке F, ви­димы только в пределах этого блока.

ГЛАВА 2 ПРОЕКТНАЯ ЧАСТЬ

2.1 Условие задачи

Дан массив целых чисел. Необходимо отсортировать заданный массив, по возрастанию элементов.

Наиболее простым методом решения этой задачи, является метод простого обмена или метод «пузырька».

Слева направо поочередно сравниваются два соседних элемента массива, и если их взаимное расположение не соответствует заданному условию упорядоченности, то они меняются местами. Далее берутся два следующих соседних элемента и так далее до конца массива.
После одного такого прохода на последней n-ой позиции массива будет стоять максимальный (или минимальный) элемент ("всплыл" первый "пузырек"). Поскольку максимальный (или минимальный) элемент уже стоит на своей последней позиции, то второй проход обменов выполняется до (n-1)-го элемента. И так далее. Всего требуется (n-1) проход.

2.2 Тестовые примеры

Тестовый примерами для проверки работы программы представлен на рис. 2.1 Демонстрация сортировки по неубыванию методом "пузырька"


Рис. 2.1.  Демонстрация сортировки по возрастанию методом "пузырька"

2.3 Схема алгоритма

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

Рис. 2.2.  Схема алгоритма метода «пузырька»

Рис.2.3 Алогритм процедуры ввода элементов массива

Рис.2.4 Алогритм процедуры вывода элементов массива

Рис.2.4 Алогритм функции перестановки элементов массива

ГЛАВА 3 ЭКСПЕРИМЕНТАЛЬНАЯ ЧАСТЬ

3.1 Листинг программы

Согласно разработанного алгоритма, в разделе 2.3, используя язык программирования Pascal, была разработана программа текст, которой представлен ниже

{программа сортирует по возрастанию массив из 100 целых элементов}

program sort;

{подключаем библиотеку, содержащую функции стирания экрана и ожидания нажатия клавиши}

uses crt;

{описываем тип массива}

type massive=array[1..100] of integer;

{описываем необходимые переменные}

var lb,ub:integer;

i,n,a0:integer;

flag:boolean;

A:massive;

procedure vvod(var A:massive);

{процедура ввода массива}

begin

for i:=1 to n do

begin

write('A[',i,']=');

read(A[i]);

end;

end;

procedure vuvod(var A:massive);

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

begin

for i:=1 to n do

writeln(A[i]);

writeln('<Enter>');

readkey;

end;

function swap:boolean;

{функция перестановки элементов массива}

begin

a0:=A[i+1];

A[i+1]:=A[i];

A[i]:=a0;

swap:=false;

end;

{начало главной программы }

Begin

{стирание экрана }

clrscr;

{ввод размера массива}

Writeln('Vvedite N');

readln(N);

lb:=1;

ub:=n-1;

{ввода массива}

vvod(A);

repeat

flag:=true;

for i:=1 to ub do

if A[i]>A[i+1] then

{перестановка элементов массива}

flag:=swap;

writeln('************');

{вывод промежуточных результатов}

vuvod(A);

{завершение цикла обработки }

until flag=true;

{ вывод результирующего массива}

writeln('Rezultat');

vuvod(A);

end.

3.2 Протокол работы программы

Vvedite N

7

A[1]=7

A[2]=0

A[3]=-4

A[4]=3

A[5]=1

A[6]=-2

A[7]=5

************

0

-4

3

1

-2

5

7

<Enter>

************

-4

0

1

-2

3

5

7

<Enter>

************

-4

0

-2

1

3

5

7

<Enter>

************

-4

-2

0

1

3

5

7

<Enter>

************

-4

0

1

-2

3

5

7

<Enter>

************

-4

0

-2

1

3

5

7

<Enter>

************

-4

-2

0

1

3

5

7

<Enter>

************

-4

-2

0

1

3

5

7

<Enter>

Rezultat

-4

-2

0

1

3

5

7

<Enter>

ЗАКЛЮЧЕНИЕ

Курсовая работа посвящена вопросам реализации подпрограмм на языке высокого уровня pascal. Первая часть работы является теоретическим исследованием рассматриваемых вопросов. Проанализированы методы описания процедур и функций в pascal, а так же проанализированы виды процедур, функций, а так же особенности описания и реализации. Рассмотрены вопросы, связанные с описанием параметров процедур и функций.

Во второй части работы разработка алгоритма решения задачи сортировки массива методом простого обмена с использованием средств процедур и функций.

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

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

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

Применение модифицированного метода сортировки пузырька (Шейк-сортировки) обычно приводит к повышению скорости и уменьшению операций при сортировке массива, особенно в тех случаях когда массив является частично упорядоченным. Листинг разработанной программы по методу Шейк сортировки и протокол работы программы приведены в приложении А. Результаты показывают, что результат сортировки по этому методу достигается быстрее. Как недостаток метода Шейк-сортировки необходимо отметить некоторую большую сложность по сравнению с методом пузырька.

СПИСОК ЛИТЕРАТУРЫ

  1. Абрамсон, И.. Oracle 10g: Первое знакомство/ И. Абрамсон, М. Кори, М. Эбби. - М.: Лори, 2017. - 348 с.
  2. Андон Ф. Язык запросов SQL / Ф. Андон, В. Резниченко. – СПб.: BHV, 2016. – 416 с.
  3. Аткинсон Л. MySQL Библиотека профессионала / Л. Аткинсон. – М. : Вильямс, 2013. – 624 с.
  4. Ахо А.Д. Хопкрофт Д.Є. Ульман Структуры данныхи алгоритмы. Москва, Санкт-Петербург, 2016
  5. Базы данных для небольших предприятий и Интернета; СПб: Символ-Плюс, 2015. - 560 c.
  6. Базы данных: Учебник для ВУЗов / Под ред.— СПб: Корона принт, 2014. - 416 с.
  7. Базы данных: Учебник для ВУЗов / Под ред.А.Д.Хомоненко — СПб: Корона принт, 2014. - 416 с.
  8. Виейра, Р. Программирование баз данных Microsoft SQL Server 2005 для профессионалов; Диалектика, 2016. - 301 c.
  9. Гайдамакин Н. А. Автоматизированные информационные системы, базы и банки данных. Вводный курс: Учебное пособие. — М.: Гелиос АРВ, 2012. — 368 с.
  10. Герасевич, Виталий Блоги и RSS: интернет-технологии нового поколения; СПб: BHV, 2016. - 256 c.
  11. Голицына О.Л. Попов И.И. основы алгоритмизации и программирования. Москва, 2016
  12. Грабер, Мартин SQL. Справочное руководство; М.: Лори; Издание 2-е, 2015. - 354 c.
  13. Иванов Б.Н. Дискретная математика алгоритмы. Алгоритмы и программы. Лаборатория базовых знаний 2013
  14. Окулов С. М. Программирование в алгоритмах. М.Бином: 2012.
  15. Рапаков Г. Г., Ржеуцкая С. Ю. Программирование на языке Pascal. — СПб.: БХВ-Петербург, 2014. - 480 с.
  16. MySQL Библиотека профессионала / Л. Аткинсон. – М. : Вильямс, 2012. – 624 с.
  17. MySQL руководство администратора; М.: Вильямс, 2015. - 621 c.
  18. SQL Server 2015 шаг за шагом. Практическое руководство; М.: ЭКОМ, 2017. - 463 c.
  19. Weinberg P. Groff J. SQL The Complete Reference, The McGraw-Hill Companies 2015.- 911c.

ПРИЛОЖЕНИЕ А

ЛИСТИНГ И ПРОТОКОЛ РАБОТЫ МОДИФИЦИРОВАННОЙ ПРОГРАММЫ

program sort;

uses crt;

type massive=array[1..100] of integer;

var lb,ub:integer;

i,n,a0:integer;

flag:boolean;

A:massive;

procedure vvod(var A:massive);

begin

for i:=1 to n do

begin

write('A[',i,']=');

read(A[i]);

end;

end;

procedure vuvod(var A:massive);

begin

for i:=1 to n do

writeln(A[i]);

writeln('<Enter>');

readkey;

end;

function swap:boolean;

begin

a0:=A[i+1];

A[i+1]:=A[i];

A[i]:=a0;

swap:=false;

end;

function swap1:boolean;

begin

a0:=A[i];

A[i]:=A[i-1];

A[i-1]:=a0;

swap1:=false;

end;

begin

clrscr;

Writeln('Vvedite N');

readln(N);

lb:=1;

ub:=n-1;

vvod(A);

repeat

flag:=true;

for i:=1 to ub do

if A[i]>A[i+1] then flag:=swap;

writeln('************');

vuvod(A);

if flag=true then break;

for i:=n downto 2 do

if A[i-1]>A[i] then flag:=swap1;

writeln('************');

vuvod(A);

until flag=true;

writeln('Rezultat');

vuvod(A);

end.

Протокол работы программы

Vvedite N

7

A[1]=7

A[2]=0

A[3]=-4

A[4]=3

A[5]=1

A[6]=-2

A[7]=5

************

0

-4

3

1

-2

5

7

<Enter>

************

-4

0

-2

3

1

5

7

<Enter>

************

-4

-2

0

1

3

5

7

<Enter>

************

-4

-2

0

1

3

5

7

<Enter>

************

-4

0

-2

3

1

5

7

<Enter>

************

-4

-2

0

1

3

5

7

<Enter>

************

-4

-2

0

1

3

5

7

<Enter>

************

-4

-2

0

1

3

5

7

<Enter>

Rezultat

-4

-2

0

1

3

5

7

<Enter>