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

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

Содержание:

ВВЕДЕНИЕ

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

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

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

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

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

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

При достижении цели курсовой работы поставлены следующие задачи:

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

При подготовке курсовой работы использованы учебники и учебные пособия по языку Турбо Паскаль таких авторов, как В.В. Фаронов, Ю.А. Шпак, С.А. Немнюгин и многих других, учебно-методическое пособие по модульному программированию авторов С.Б. Сидорова и Е.Н. Приблудовой, учебник для вузов Фаронова В.В. «Delphi. Программирование на языках высокого уровня», книга Осипова Д. «Delphi. Программирование для Windows, OSX, iOS и Android» и другие, а также Интернет-статьи по данным темам.

ГЛАВА 1. ЯЗЫКИ ПРОГРАММИРОВАНИЯ ВЫСОКОГО УРОВНЯ. МОДУЛЬНОЕ ПРОГРАММИРОВАНИЕ

1.1. Языки программирования низкого и высокого уровня

Со времени появления первых программируемых компьютеров было создано больше двух с половиной тысяч языков программирования, ежегодно их число увеличивается. Некоторые языки использует только небольшое число их собственных разработчиков, другими пользуются миллионы людей. Профессиональными программистами обычно применяется в своей работе несколько языков программирования. [16]

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

Трансляторы подразделяются на: [27]

  • компиляторы, превращающие текст программы в машинный код, сохраняемый и затем используемый уже без компилятора (к примеру, исполняемые файлы с расширением *. exe).
  • интерпретаторы, превращающие часть программы в машинный код, выполняющие его и затем переходящие к следующей части. Причем использование интерпретатора осуществляется каждый раз при выполнении программы. [28]

Пример языка низкого уровня - ассемблер. Языки низкого уровня ориентируются на конкретный тип процессора с учетом его особенностей, поэтому при переносе программы на ассемблере на другую аппаратную платформу ее нужно почти полностью переписывать. Синтаксис программ для разных компиляторов также различается. Правда, существует практическая совместимость центральных процессоров для компьютеров фирм AMD и Intel, отличия лишь в некоторых специфических командах. А вот специализированные процессоры для других устройств, например, видеокарт, телефонов существенно различаются. [16]

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

Недостатки проявляются в том, что: [27]

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

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

К языкам программирования высокого уровня относят: Фортран; Кобол; Алгол; Pascal; Basic; Java; DC, C++, C#; Objective C; Smalltalk; Delphi и другие. Перечислим достоинства языков высокого уровня:

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

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

Недостаток ЯВУ в большом размере программ по сравнению с программами на языках низкого уровня. Поэтому в основном ЯВУ используют при разработках программного обеспечения компьютеров и устройств, имеющих большой объем памяти. А различные подвиды ассемблера применяют для программирования иных устройств, где имеет значение размер программ. [19]

1.2. Обзор некоторых языков программирования высокого уровня

Язык программирования Паскаль разработал профессор кафедры вычислительной техники Швейцарского Федерального института технологии Николас Вирт в 1968г. как альтернативу существующим и все усложняющимся языкам программирования, таким, как PL/1, Algol, Fortran. Интенсивное развитие Паскаля привело к появлению уже в 1973г. его стандарта, а число трансляторов с этого языка в 1979г. превышало 80. В начале 80-х годов позиции Паскаля еще более упрочились с появлением трансляторов MS-Pascal и Turbo-Pascal для ПЭВМ. С этих времен Паскаль - один из наиболее важных и широко используемых языков программирования. [11]

Существенным является факт выхода языка за рамки академического и узко профессионального интереса и использование его в большинстве университетов высокоразвитых стран не только в качестве рабочего инструмента пользователя. Важнейшая особенность Паскаля в воплощенной идее структурного программирования. Другая существенная особенность в концепции структуры данных как одного из фундаментальных понятий. [13]

Основные причины популярности Паскаля заключаются в следующем:

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

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

- наличием специальных методик создания трансляторов с Паскаля упрощена их разработка и вызвано широкое распространение языка;

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

- реализация в языке Паскаль идей структурного программирования, что придает программе наглядность и хорошие возможности для разработки и отладки. [10]

Язык Delphi — строго типизированный объектно-ориентированный язык, в основе которого лежит хорошо знакомый программистам Object Pascal. Слово Delphi – это название города в древней Греции, в котором пророчествовали оракулы. Такое название выбрано разработчиками Delphi для того, чтобы подчеркнуть способность программ, создаваемых в Delphi, взаимодействовать с базами данных Oracle. Имя приобрело популярность, и коммерческий продукт под этим же названием был выпущен на рынок. [29]

Версия Delphi 1 была выпущена в феврале 1995 г., Delphi 2 – в марте 1996г., а Delphi 3 – в мае 1997г. затем было решено интегрировать эту платформу программирования с CORBA (Common Object Request Broker Architecture – технология построения объектных приложений, предложенная компанией IBM), быстро развивающейся технологией создания распределенных приложений. Версия Delphi 4 со встроенными средствами CORBA появились на рынке в июне 1998г. Версия Delphi 5 была выпущена в августе 1999г., версия Delphi 6 выпущена в мае 2001г. и обновленная версия Delphi 7 выпущена в 2002 году. Система Delphi – ключевой программный продукт компании Borland. [28]

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

Главное окно всегда присутствует на экране и предназначено для управления процессом создания программы. Основное меню содержит все необходимые средства для управления проектом. Пиктограммы облегчают доступ к наиболее часто применяемым командам основного меню. [25]

Модульное программирование

Модульным программированием называют организацию программы в виде совокупности небольших независимых блоков, модулей, структура и поведение которых подчинены определенным правилам. Она должна представлять простую, замкнутую (независимую) программную единицу (процедуру или функцию), обозримую, реализующую только одну функцию. Модулем выполняется только одна логическая функция, иначе говоря, им должна решаться самостоятельная задача своего уровня по принципу: один программный модуль - одна функция. [15]

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

Как правило, модуль представляется совокупностью функций и данных, используемых для решения задач определенного класса или реализующих набор операций над некоторым понятием. К примеру, один модуль может обеспечивать ввод-вывод. Другой модуль может содержать функции, выполняющие операции над строками. Третьим модулем поддерживается выполнение операций над геометрическими объектами. А еще одним, к примеру, обеспечивается доступ к информации в некоторой базе данных. [18]

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

Каждым модулем, входящим в состав программы, решаются задачи из своей области. Поэтому модули должны разрабатываться отдельно друг от друга, что позволяет коллективно разрабатывать программные системы. Отдельными программистами или небольшими коллективами независимо от других разрабатываются свои части программной системы. Таким подходом обеспечена возможность модульной отладки, при которой отлаживается не вся программная система в целом, а отдельные ее компоненты. Такой технологией обеспечивается быстрая локализация и устранение ошибок, что ускоряет разработку программного продукта. [17]

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

Для того, чтобы пользоваться средствами, предоставляемыми модулем, нам нужна некая дополнительная информация по этому модулю. Во- первых, мы должны знать, какими подпрограммами какие действия выполняются. Во- вторых, нам нужно знать, какую информацию нужно передать этим подпрограммам для решения задачи, и как ее нужно передать. Таким образом, важный момент при использовании модульного программирования - в обеспечении взаимодействия между модулями, или как говорят, определении интерфейса. Описание интерфейса, как правило, приводится в специальном заголовочном файле. [15]

Передачу информации между подпрограммами модулей осуществляют посредством списков параметров при вызове соответствующей подпрограммы. Иногда допустимо использовать глобальные переменные, но их использование должно быть обосновано. [1, с. 4-6]

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

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

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

Объект вместе с операциями, связанными с ним, - это некий исполнитель с определенной системой предписаний (действий). Выполнение любой программы - это проведение каких-либо действий над какими-либо объектами, то есть использование исполнителей. [15]

При использовании исполнителя интересны его внешние свойства, а именно, его предписания, что получается в результате их выполнения и пр. Описание этих свойств - это внешнее описание исполнителя, позволяющее им пользоваться, но ничего не говорящее о его внутреннем устройстве, о его реализации. Но для использования исполнителя необходимо иметь его реализацию, причем может быть на базе других исполнителей. [18]

Таким образом, при реализации исполнитель рассматривается с внутренней точки зрения. Нас интересует его структура и как им выполняются те или иные действия. При этом реализацию каждого из исполнителей можно рассматривать как отдельную подзадачу в рамках исходной задачи. При проектировании программной системы разработчик имеет в распоряжении несколько реализованных ранее исполнителей, или поддерживаемых самой системой программирования. Такие исполнители называются базовыми. К примеру, базовыми исполнителями могут быть библиотека файлового ввода-вывода, математическая библиотека, понятие массива с определенными над ним операциями, либо некий исполнитель, реализованный пользователем ранее. [15]

Удобно решение исходной задачи разбиением ее на подзадачи, используя промежуточные исполнители. Технологией программирования «сверху вниз» предлагается такое разбиение от исполнителя A (сверху) к базовым исполнителям E1 , E2 ,.., Ek (вниз). Согласно указанному подходу сначала происходит выделение и реализация общей идеи алгоритма, и только потом его детализация. При этом каждый раз, при очередном шаге вниз, формулируются уточнения. Схема этого процесса представлена на рис. 1:

А

В1

Е2

С1

С2

Е3

Е4

Е5

Е1

Рисунок 1 – Результат проведения декомпозиции [1, с. 15]

Таким образом, модульная структура программы имеет вид графа (в данном случае - древовидную структуру). Узлы этого дерева являются программными модулями, а направленными стрелками показывается статическая подчиненность модулей, т.е. каждой дугой показывается, что в тексте модуля, из которого она исходит, есть ссылка на модуль, в который она входит. [17]

Процесс разбиения задачи на ряд подзадач называется декомпозицией.

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

При декомпозиции задачи, нужно руководствоваться скорее тем, что надо сделать, чем тем, на какой базе. То есть, используя технологию проектирования «сверху-вниз», реализовывается некий исполнитель в удобном, естественном виде без жесткой привязки к уже существующим исполнителям. [1, с. 12-16]

Определим общие принципы модульного программирования: [17]

  • Работа программного модуля не должна быть зависима: от входных данных; от программного модуля, которому предназначены его выходные данные; от предыдущих вызовов программного модуля;
  • Желательный размер программного модуля - одна-две страницы исходного листинга (50-100 строк исходного кода);
  • У модуля должна быть только одна входная и одна выходная точка;
  • Установление взаимосвязей между модулями по иерархической структуре;
  • У каждого модуля должен быть комментарий, объясняющий его назначение, назначение переменных, передаваемых в модуль и из него, модулей, его вызывающих, и модулей, вызываемых из него;
  • При создании модуля возможно использование только стандартных управляющих конструкций: выбора, цикла, блока (последовательности операторов); [18]
  • Оператором безусловного перехода лучше вообще не пользоваться или применять в исключительных случаях только для перехода на выходную точку модуля;
  • В тексте модуля необходимо использование комментариев, особенно в сложных местах алгоритма;
  • Идентификаторы переменных и модулей должны быть смысловыми, т.е. отражающими смысл переменных и модулей;
  • В одной строке должно быть записано не больше одного оператора. Если оператор записывается больше, чем на одной строке, то все последующие операторы записываются с отступами;
  • Желательна вложенность не более, чем трех уровней.
  • Напомним, что все эти меры повышают качество разрабатываемого программного обеспечения. [18]

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

1) используя циклы;

2) применяя процедуры и функции.

Процедуры и функции — это законченные программные модули, выполняемые в программе многократно. [15]

Достоинства модульного программирования в:

1) упрощении процесса написания и отладки программ;

2) сокращении объема программ.

Недостаток — в некотором увеличении затрат времени и памяти на оформление модулей и обращение к ним. [17]

Вывод: Языки программирования делятся на языки низкого уровня и языки высокого уровня ЯВУ. Среди ЯВУ рассмотрены языки Паскаль и Дельфи. Поскольку функции наряду с процедурами являются стержнем модульного программирования, рассмотрены основные принципы модульного программирования.

Модульным программированием называют организацию программы в виде совокупности небольших независимых блоков, модулей, структура и поведение которых подчинены определенным правилам. При создании сложных программных систем важная задача - в правильной организации процесса проектирования системы. Один из самых распространенных методов решения этой задачи - технология проектирования «сверху вниз», напрямую связанная с технологией модульного программирования.

ГЛАВА 2. РАБОТА С ФУНКЦИЯМИ В TURBO PASCAL И DELPHI

2.1. Использование функций в Turbo Pascal и Delphi

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

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

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

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

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

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

Любое имя в программе должно быть обязательно описано перед его использованием в операторах программы. То же касается и подпрограмм: каждая своя процедура и функция должна быть описана программистом в разделе описаний. [11]

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

Вот какая иерархия описаний получится для программы, структура которой дана на рис. 2 (для простоты будем считать, что все подпрограммы - процедуры без параметров): [6, с. 152]

http://www.rtfm.4hack.com/dat/books_2_4_8.1.jpg

Рисунок 2 – Пример структуры программы [6, с. 152]

Program ...;

Procedure A;

Procedure Al;

begin

end {Al};

Procedure A2 ;

begin

end {A2};

begin {A}

end {A};

Procedure В ;

Procedure B1;

begin

• • •

end {B1}; [6, с. 153]

Procedure B2;

Procedure B21;

и т.д. [6, с. 153]

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

К примеру, в рассмотренном примере из основной программы возможен вызов процедур А и В, но невозможен вызов ни одной из вложенных в них процедур А1, А2, В1 и т.п.

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

Подпрограмме доступны только те объекты верхнего уровня, которые описаны до описания данной подпрограммы, они являются глобальными по отношению к подпрограмме. [6, с. 153-156]

2.2. Использование функций в Turbo Pascal

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

  1. Укрупненный алгоритм сортировки двумерного массива целых чисел по возрастанию, определения минимального и максимального положительного элементов.
  2. Сначала вводится размерность двумерного массива;
  3. Затем вводятся элементы двумерного массива целых чисел, причем числа могут быть и положительными и отрицательными;
  4. После сортировки массива распечатаем отсортированный массив;
  5. Находим минимальный положительный элемент массива. Поиск минимального элемента оформим в виде процедуры-функции;
  6. Находим максимальный положительный элемент массива, поиск его оформим также в виде функции;
  7. Распечатаем минимальный и максимальный положительные элементы массива. [5]
  8. Приведем алгоритм определения минимального положительного числа двумерного массива целых чисел, оформленного в виде функции MinM, параметрами которой является размерность квадратной матрицы и сам двумерный массив. [7]
  9. В цикле по всем строкам и столбцам массива проверяется, является ли элемент массива положительным числом;
  10. Если элемент массива является положительным числом, то проверяется, присваивалось ли переменной М3 (минимальный элемент) какое-то значение элемента массива с помощью переменной – переключателя ll.

Значение ll = 1 говорит о том, что присвоение было, тогда М3 (минимальный элемент) сравнивается со всеми остальными положительными элементами массива. Если какой-то элемент массива оказывается меньше М3, то М3 присваивается это значение.

  1. Функция передает в основную программу значение минимального положительного элемента массива.
  2. Приведем теперь алгоритм определения максимального положительного числа двумерного массива целых чисел, оформленного в виде функции MахM, параметрами которой является размерность квадратной матрицы и сам двумерный массив.
  3. В цикле по всем строкам и столбцам массива проверяется, является ли элемент массива положительным числом;
  4. Если элемент массива является положительным числом, то проверяется, присваивалось ли переменной М3 (максимальный элемент) какое-то значение элемента массива с помощью переменной – переключателя ll. Значение ll = 1 говорит о том, что присвоение было, тогда М3 сравнивается со всеми остальными положительными элементами массива. Если какой-то элемент массива оказывается больше М3, то М3 присваивается это значение.
  5. Функция передает в основную программу значение максимального положительного элемента массива. [4]

Приведем сначала укрупненную блок-схему алгоритма (рис. 3).

начало

Ввод n

Ввод массива M[n.n]

Печать введ. массива

Определение минимального элемента

Определение максимального элемента

Печать min max элементов

конец

Рисунок 3 - Укрупненная блок-схема алгоритма [5]

Теперь приведем более детальную блок-схему сортировки массива (рис. 4).

начало

Ll=0;

I=1;

j=1;

M3>Mij

Ll=1

Mi,j>0

да да

да

Ll=1; M3=Mij

M3=Mij

j=j+1;

j<=k

да

i=i+1;

I<=k

да

MINM=M3

конец

Рисунок 4 – Блок-схема алгоритма нахождения минимального положительного элемента массива [4]

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

PROGRAM MAXMINV;

CONST

n=10; { максимальный размер массива }

type

Ind = 1 .. 10;

MM = array [ind] of Integer;

Matr = array [ind] of MM;

var

ii,jj,n : Ind;

M : Matr;

MN, MX: Integer; [12]

FUNCTION MINM (K:INTEGER;M:Matr):Integer;

{ Нахождение минимального положительного числа в двумерном массиве }

var I,j.M3,ll: integer;

BEGIN

Ll:=0;

for i:=1 to k do

for j:=1 to k do

if M[I,j]>0 then

begin

if ll=1 then if M3>M[I,j] then M3:=M[I,j] else

else begin ll:=1; M3:=M[I,j]; end;

end;

MINM:=M3;

END; {Процедуры-функции MINM} [11]

FUNCTION MAXM (K:INTEGER;M:Matr):Integer;

{Нахождение максимального положительного числа в двумерном массиве целых чисел }

var I,j,M3,ll: integer;

BEGIN

Ll:=0;

for i:=1 to k do

for j:=1 to k do

if M[I,j]>0 then

begin

if ll=1 then

if M3<M[I,j] then M3:=M[I,j] else

else begin ll:=1; M3:=M[I,j]; end;

end;

END; [20]

BEGIN {основная программа}

writeln(` введите размер двумерного массива n`);

read(n);

writeln(`введите массив по строкам`);

for ii:=1 to n do

for jj :=1 to n do

Read (M[ii,jj]);

ReadLn;

{Печать введенного массива}

writeln (`Введенный массив`);

for ii: =1 to n do

begin

for jj:=1 to n do

write (‘ ’, M[ii,jj]);

writeln;

end;

{Определение минимального и максимального положительных элементов массива}

MN: = MINM (N,M);

MX: = MAXM (N,M);

Writeln('Минимальное положительное число массива - ',MN);

Writeln('Максимальное положительное число массива - ',MX);

readln;

END. [8, 4, 7]

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

Функции Delphi также могут выполнять всё перечисленное, но еще и возвращая результат в присвоенном ей самой значении. То есть вызов функции может быть в выражении справа от оператора присваивания. То есть, функция является более универсальным объектом. [9]

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

Параметры используют:

  • для передачи данных в подпрограмму;
  • для получения результата из подпрограммы.

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

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

Переменная:= Функция (Параметры);

где:

Переменная — имя переменной, которой присваивается значение, вычисляемое функцией; Функция — имя функции, значение которой присваивается переменной;

Параметры — список формальных параметров, применяемых для вычисления значения функции. В качестве параметров обычно используются переменные или константы. [24]

Обратим внимание на то, что:

  • каждой функцией возвращается значение определенного типа, и потому тип переменной, которой присваивается значение функции, должен соответствовать типу функции;
  • тип и количество параметров для каждой конкретной функции строго определены.

Объявление функции в общем виде выглядит так:

function Имя (параметр1: тип1, ..., параметрК: типК): Тип;

var // здесь объявления локальных переменных

begin // здесь инструкции функции

Имя:= Выражение;

end; [24]

где:

function — зарезервированное слово языка Delphi, обозначающее, что далее следуют операторы, реализующие функцию программиста;

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

Запись функции производится так:

function Имя_функции((*параметры*)): тип_результата;

begin

  //Код функции;

  Result := результат;

end;

Delphi содержит набор стандартных функций, приведенных в таблице А.1 приложения А. Таблица 2 содержит преобразования.

Таблица 2 - Преобразования [24]

Int( Выражение: real) :real

Целая часть

Trunc (Выражение: real) : longint

Целая часть

Round (Выражение: real) : longint

Округление к ближайшему целому

IntToStr (Выражение)

Преобразование числового выражения целого типа в строку

FloatToStr (Выражение)

Преобразование вещественного числа в строковую переменную

FloatToStrF ( Выражение, Формат, Точность, КоличествоЦифр)

Преобразование вещественного числа в его изображение с возможностью выбора способа изображения

StrToInt ( Строка : string)

Преобразование строки, изображающей целое или вещественное число, в число

StrToFloat ( Строка : string)

Преобразование строки, изображающей вещественное число, в число

При составлении и отладке программ использовались книга Осипова Д.Л. Программирование для Windows, OS X, iOS и Android [2] и многие другие учебники по Delphi 7.

Программа вычисления n!, в которой используется функция Fact с параметром n. Программа выводит окно, в котором нужно ввести значение числа, для которого нужно рассчитать факториал, и затем выводит результат. В программе есть еще процедура vichf, запускаемая по нажатию кнопки Вычислить.

Исходный модуль с именем factorial.pas, выполняемый модуль с именем Pfact.exe.

unit factorial;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type

TForm1 = class(TForm)

Label1: TLabel;

Edit1: TEdit;

Button1: TButton;

procedure vichf(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

function Fact(n: integer): int64;

begin

if (n=0)or(n=1) then Fact:=1

else Fact:=n*Fact(n-1);

end; [5, 9, 21]

procedure TForm1.vichf(Sender: TObject);

var

ms: string;

m,p: integer;

begin

ms:= Trim(Edit1.Text);

m:=StrToInt(ms);

p:=Fact(m);

ms:='m!='+ IntToStr(p);

ShowMessage(ms);

Application.Terminate;

Form1.Close;

end;

end. [21, 22]

На рисунке 5 приведен скриншот результата выполнения программы Pfact.exe.

Рисунок 5 – Скриншот программы расчета n! Pfact.exe

Программа работает правильно.

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

Все программы отлажены и работают правильно.

ЗАКЛЮЧЕНИЕ

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

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

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

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

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

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

Поиск минимального положительного элемента массива оформлен в виде функции MINM, поиск максимального положительного элемента массива оформлен в виде функции MAXM.

Функции Delphi также могут выполнять всё перечисленное, но еще и возвращая результат в присвоенном ей самой значении. То есть вызов функции может быть в выражении справа от оператора присваивания. Таким образом, функция является более универсальным объектом.

В ходе подготовки работы написана, отлажена программа и получены по ней результаты. Программа расчета n!, в которой используется функция Fact(n) для вычисления n факториала, имя исходного модуля factorial.pas, выполняемого модуля Pfact.exe. Программа выводит окно, в которое нужно ввести число и нажать кнопку Вычислить. После расчета программа выводит окно с результатом расчета.

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

СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ

Модульное программирование: учебно-методическое пособие / НГТУ им. Р.Е. Алексеева; сост.: С.Б. Сидоров, Е.Н. Приблудова. - Н. Новгород, 2015.– 85 с.

Осипов Д.Л. Delphi. Программирование для Windows, OS X, iOS и Android. – СПб.: БХВ-Петербург, 2014. – 464 с.

Паскаль и Дельфи. Самоучитель. В. Попов. – СПб.: Питер, 2014. – 135 с.

Программирование и основы алгоритмизации: Для инженерных специальностей технических университетов и вузов. /А.Г. Аузяк, Ю.А. Богомолов, А.И. Маликов, Б.А. Старостин. - Казань: Изд-во КНИТУ- КАИ, 2013, - 153 с.

Фаронов В.В. Delphi. Программирование на языках высокого уровня: учебник для вузов. – СПб.: Питер, 2010. – 640 с.

Фаронов В.В. Турбо Паскаль 7.0. Начальный курс. Учебное пособие. - М.: Издательство «ОМД Групп», 2013. - 616 с.

Фаронов В.В. Турбо Паскаль. Учебное пособие. – СПб.: БХВ-Петербург, 2014. - 1056 с.

Шпак Ю.А. Turbo Pascal 7.0 на примерах/Под ред. Ю.С. Ковтанюка. — К.: Издательство Юниор, 2013. — 496 с.

Delphi. Урок №9. Создание собственных процедур и функций Delphi. Учебник по Delphi 7. 2012.

Turbo Pascal в задачах и примерах. Н. Культин, 2012. – 256 с.

Turbo Pascal: первые шаги. Немнюгин С.А. – СПб.: Питер, 2015. - 544 с.

Turbo Pascal: решение сложных задач. – СПб.: БХВ-Петербург, 2013. – 208 с.

Turbo Pascal. Самоучитель. О.А. Меженный. 2012. – 336 с.

Лекции по Паскаль. Сортировка двумерного массива. 2013. URL: http://mojainformatika.ru/paskal/lekczii-po-pascal/sortirovka-dvumernogo-massiva.html (Дата обращения: 25.01.2019).

Модульное программирование. 23.12.2013. URL: http://life-prog.ru/1_3236_modulnoe-programmirovanie.html (Дата обращения: 23.01.2019).

Обзор языков программирования. 2016. URL: http://www.bourabai.kz/alg/classification04.htm (Дата обращения: 23.01.2019).

Основные принципы модульного программирования. 2017. URL: http://stydopedia.ru/4x76fb.html (Дата обращения: 24.01.2019).

Принципы модульного программирования. 2017. URL: https://docviewer.yandex.ru/view/ (Дата обращения: 24.01.2019).

Программирование на языке высокого уровня. 2016. URL: http://pandia.ru/text/78/221/44162.php (Дата обращения: 24.01.2019).

Процедуры и функции - Turbo Pascal. Turbo Pascal Developer Network. 2017. URL: http://tpdn.ru/guide/syntax/proc%26func/ (Дата обращения: 25.01.2019).

Процедуры и функции в Delphi. 2014. URL: http://delphicomponent.ru/108-procedury-i-funkcii-v-delphi.html (Дата обращения: 25.01.2019).

Процедуры и функции Delphi. 2013. URL: http://www.snkey.net/books/delphi/ch1-6.html (Дата обращения: 25.01.2019).

Самоучитель по Delphi 6. 2010. URL: http://www.rtfm.4hack.com/books.php?id1=2&id2=4&id3=3 (Дата обращения: 25.01.2019).

Стандартные функции и процедуры Delphi. 2016. URL: http://bourabai.ru/einf/Delphi/P1/Index15.htm (Дата обращения: 25.01.2019).

Учебник Delphi 7 для начинающих. URL: www.PowerBuilder.sbn.bz (Дата обращения: 25.01.2019).

Циклы в Delphi. Простейшие программы с циклами. 25.12.2012. URL: http://programmict.ru/cikly-v-delphi-prostejshie-programmy-s-ciklami/ (Дата обращения: 25.01.2019).

Чем отличаются языки низкого уровня от высокого? 2015. URL: http://bestanswer.ru/raznoe/chem-otlichayutsya-yazyki-programmirovaniya-nizkogo-urovnya-ot-yazykov-vysokogo-kakim-yavlyaetsya-delphi-a-kakim-c (Дата обращения: 23.01.2019).

Языки программирования. 2015. URL: http://life-prog.ru/ (Дата обращения: 23.01.2019).

Язык программирования Delphi (Object Pascal). Лекции. 2016. URL: http://works.doklad.ru/view/unh62qqQkM8/14.html (Дата обращения: 25.01.2019).

Приложение 1

Стандартные функции Delphi

function Abs(X);

возвращает абсолютное значение числа;

function Concat(s1 [, s2,..., sn]: string): string;

объединяет 2 и более строк в 1;

function Copy(S; Index, Count: Integer): string;

возвращает часть строки;

function Cos(X: Extended): Extended;

вычисляет косинус угла;

function Eof(var F): Boolean;

проверяет, достигнут ли конец файла;

function High(X);

возвращает максимальное значение из диапазона;

function Length(S): Integer;

возвращает длину строки или количество элементов массива$

function Ln(X: Real): Real;

возвращает натуральный логарифм числа (Ln(e) = 1);

function Low(X);

возвращает минимальное значение из диапазона;

function ParamCount: Integer;

возвращает количество параметров командной строки;

unction ParamStr(Index: Integer): string;

возвращает указанный параметр из командной строки;

function Pos(Substr: string; S: string): Integer;

ищет вхождение указанной подстроки в строку и возвращает порядковый номер первого совпавшего символа;

function Slice(var A: array; Count: Integer): array;

возвращает часть массива;

function UpCase(Ch: Char): Char;

преобразует символ в верхний регистр;

function LowerCase(const S: string): string;

строку в нижний регистр;

function CreateDir(const Dir: string): Boolean;

создает новый подкаталог;

function CurrentYear: Word;

возвращает текущий год;

function DeleteFile(const FileName: string): Boolean;

удаляет файл с диска;

function ExtractFileExt(const FileName: string): string;

возвращает расширение файла;

function FileExists(const FileName: string): Boolean;

проверяет файл на наличие;

function IntToHex(Value: Integer; Digits: Integer): string;

возвращает целое в шестнадцатеричном представлении;

function StrPCopy(Dest: PChar; const Source: string): PChar;

копирует Pascal строку в C строку (PChar);

function Trim(const S: string): string;

удаляет начальные и конечные пробелы в строке;

function ArcCos(const X: Extended): Extended;

вычисляет арккосинус угла;

function Log2(const X: Extended): Extended;

возвращает логарифм по основанию 2;

function Max(A,B: Integer): Integer;

возвращает большее из 2 чисел;

function Min(A,B: Integer): Integer;

возвращает меньшее из 2 чисел.