Тема 1

Подпрограммы
Источник информации:


Учебный материал
Вопросы:
1. Понятие, задачи и принципы подпрограмм.
2. Виды подпрограмм. Отличительные особенности.
3. Виды параметров.
4. Особенности описания подпрограммы процедур и функций
5. Понятие блока в программе ЯП. Виды и части блоков.
6. Блочная структура программы, правила блочной структуры.
7. Понятие области видимости.

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

Вспомогательный алгоритм, записанный на языке программирования, называется подпрограммой.

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

Язык программирования  позволяет раз­делять программу на отдельные части, которые называются под­программами. Сам термин подпрограмма говорит о том, что она подобна и подчинена основной программе. При создании программы для решения сложной задачи программисты выполняют разделение этой задачи на подзадачи, под­задачи - на еще меньшие подзадачи и так далее, до легко програм­мируемых элементарных задач. Со временем у каждого программиста через некоторое время появляется большой набор собственных заготовок, неординарных решений и т. д., которые он хотел бы использовать во всех своих творениях.
Подпрограммы решают три важные задачи, значительно облегчающие программирование:
1)избавляют от необходимости многократно повторять в тексте программы аналогичные фрагменты, т. е. сократить объем про­граммы;
2)улучшают структуру программы, облегчая понимание при разборе;
3)уменьшают вероятность появления ошибок, повышают устойчивость к ошибкам программирования и непредвиденным по­следствиям при модификации.
Таким образом, подпрограмма  -  это повторяющаяся группа операторов, оформленная в виде самостоятельной программной единицы. Она записывается однократно, а в соответствующих мес­тах программы обеспечивается лишь обращение к ней по имени. Программа, содержащая подпрограммы, называется главной (головной). Каждая подпрограмма определяется уникальным именем.

Общие принципы выделения подпрограмм:
1.      если в программе необходимо переписывать одни и те же последовательности команд, то стоит эту последовательность ко­манд оформить в виде подпрограммы;
2.      слишком длинную программу полезно разбить на составные части — подобно тому, как книгу разбивают на главы. При этом ос­новная программа становится похожей на оглавление;
3.      при решении задачи могут возникать слишком сложные под­задачи. Целесообразней отладить их отдельно в небольших про­граммах. Добавление этих программ в основную задачу будет лег­ким, если они оформлены как подпрограммы;
4.      все, что вы сделали хорошо в одной программе, вам захочет­ся перенести в новые программы.

Подпрограммы бывают двух типов ПРОЦЕДУРЫ и ФУНКЦИИ

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

Работа с процедурами и функциями состоит из двух частей:
1)описания процедуры или функции в разделе описаний процедур и функций программы;
2) вызова ее на исполнение (передача управления компьютером) с одновременной передачей исходных данных, необходимых для работы процедуры или функции.

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

Описания двух различных подпрограмм не могут пересекаться: каждый блок должен быть логически законченным. Однако внутри любой подпрограммы (она ведь тоже является программой) могут быть описаны другие процедуры или функции - вложенные. На них распространяются все те же правила объявления и описания подпрограмм.
    Параметр - это переменная, от значения которой зависит работа подпрограммы. Имена параметров перечисляются через запятую в заголовке подпрограммы. Перед параметром записывается его тип.
Параметры бывают следующих видов:
Ø Глобальные – параметры описываются в основной программе, доступны любой подпрограмме. Глобальными параметрами могут быть и параметры во внешней подпрограмме.
Ø Локальные – используются только в подпрограмме, они могут быть или не быть, описываются после слова VAR, с указанием типа. Локальные параметры не существуют, пока не вызвана подпрограмма, в которой они объявлены, а также после завершения ее работы.
Ø Формальные – описываются в заголовке процедуры, к ним относятся входные и выходные параметры.
Ø Фактические – эти параметры описываются в круглых скобках после имени процедуры в основной программе при вызове процедуры.

При вызове (обращении) формальные параметры заменяются на фактические.

Формальные и фактические должны совпадать по трём признакам:
1)      по количеству
2)      по типу
3)      по порядку следования.

Подпрограммы-процедуры выполняют некоторые действия, например, выводят результат на экран в определенном виде (простой пример, оператор printf() - это стандартная подпрограмма-процедура, которая выводит на экран информацию)

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

Давайте попробуем написать простую процедуру:
Предположим, что нам нужно выводить на экран строку "Error" каждый раз, когда в коде может возникнуть ошибка по вине пользователя (например, когда он вводит неверные данные)
Это можно сделать, написав операторcout << "Error";
А теперь представим, что такую строчку нужно вставить во многих местах программы. Конечно, можно везде ее просто написать. Но это решение имеет два недостатка.
1) данная строка будет храниться в памяти много раз
2) если мы захотим изменить вывод при ошибке, то придется менять эту строку по всей программе, что достаточно неудобно

Для таких случаев процедуры и нужны.
Программа с процедурой может выглядеть следующим образом:
#include<iostream> 
using namespace std; 
 void printError() // описание процедуры 
 cout << "Error"; // тело процедуры - команды, которые будет выполнять процедура 
 main() 
{ ... 
 printError() // запуск процедуры на выполнение. 
Просто указываем имя процедуры, которую хотим выполнить 
... 
 printError() ... 
}

Процедура начинается со слова void. После имени процедуры записаны пустые скобки.
Все операторы, которые выполняются в процедуре, записываются с отступом.

Процедуры записываются до главной функции main()

Чтобы выполнить процедуру, в основной программе необходимо вызвать ее по имени и не забыть написать скобки!
Вызывать процедуру в программе можно сколько угодно раз.

Подпрограмма–функция наиболее проста для использования, так как обязательно возвращает в вызывающую программу значение, присвоенное её имени. Ее использование аналогично работе со встроенными функциями языка, такими как sin(x), cos(x) и другие. 

Функция - это подпрограмма, которая возвращает результат (число, символьную строку и др.)

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

Функция, которая возвращает среднее арифметическое двух целых чисел, будет выглядеть таким образом:
float average(int a, int b) 
 float avg = (a + b) / 2.; 
 return avg; 
}

Осталось понять как вызвать эту функцию в основной программе:
Не следует вызывать функцию также как, и процедуру:
average(10, 5);
З
начение, которое вернет функция, потеряется. Это как будто бы товар из Интернет-магазина никому не вручили, а выбросили. Вряд ли это понравится заказчику.

Правильнее сохранить результат в переменной (или вывести его на экран):a = average(10, 5);
cout << average(10, 5);

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

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

Глобальный блок – это основная программа, он должен присутствовать в любом случае.

Локальные блоки – это процедуры и функции, их присутствие необязательно.


Объекты программы (типы, переменные, константы и т.д.) тоже называются глобальными и локальными. Областью действия объектов является блок, в котором они описаны, и все вложенные в него блоки.

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

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


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

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

Для составления сложных программ рекомендуется:
  • Связь функций с основной программой осуществлять посредством передачи данных в функцию через формальные параметры-значения, возврат единственного результата – через её имя.
  • Связь процедур с основной программой осуществлять посредством передачи данных в процедуру через формальные параметры-значения или параметры-переменные, а возврат результатов – через формальные параметры-переменные.
  • Глобальные переменные можно использовать для передачи данных в подпрограмме, однако внутри подпрограммы их значения не должны меняться.

Комментариев нет:

Отправить комментарий