Лабораторная работа № 6. Программирование с использованием подпрограмм
Цель работы:изучение соглашений о передаче параметров и средств организации передачи управления и данных
Объем работы:4 часа
Теоретическая часть
Подпрограмма – это относительно самостоятельный фрагмент алгоритма, соответствующим образом оформленный и снабженный именем.
В зависимости от способа описания и вызова, известны подпрограммы двух видов процедуры и функции.
Процедуры предназначены для выполнения некоторых действий (например, печать строки), а функция – позволяет получить некоторую величину, которую возвращает в качестве результата.
Однако, принципы программирования С++ основаны на понятии функции. Поэтому, в С++ нет процедур, как элементов языка, однако средства языка позволяют создавать функции, которые не возвращают значения и реализуют конструкцию, аналогичную процедурам
Данные для обработки процедуры и функции получают из вызвавшей их основной программы или подпрограммы. Для размещения рабочих полей подпрограммы могут объявлять новые типы и переменные в собственном разделе описаний. Результаты же они обычно должны возвращать вызвавшей программе или подпрограмме.
Описание функций:
1. Каждая программа обязательно должна включать единственную функцию с именем main (главная функция).
2.В программу может входить произвольное количество функций, выполнение которых прямо или косвенно инициируется функцией main.
3. Для доступности в программе, функция должна быть в ней определена или описана до первого вызова.
4. В определении функции указывается последовательность действий, выполняемых при ее вызове, имя функции, тип функции (тип возвращаемого ею результата ) и, если необходимо, список параметров (для обмена данными между подпрограммами.
<Тип результата> <Имя > ([<Список параметров>])
{ [< Объявление локальных переменных и констант >]
<Операторы> }
По правилам С++ подпрограмму можно описывать в любом месте программы и даже в другом файле, но только не внутри другой функции.
При описании функции после функции main или другой функции, в которой она используется, необходимо в начале программы описать прототип этой функции или подключить файл с описанием прототипа. Прототип представляет собой заголовок функции, завершающийся точкой с запятой. Обычно все прототипы функций собирают в начале программы.
Подпрограмма может получать данные двумя способами:
а) неявно – с использованием глобальных переменных;
б) явно – через параметры.
Неявная передача:
1) приводит к большому количеству ошибок;
2) жестко связывает подпрограмму и данные.
При использовании явной передаче данных через параметры существует два способа передачи аргументов в подпрограммы. Первый из них известен как передача параметров по значению. В этом случае в подпрограмму передаются копии фактическихпараметров, и никакие изменения этих копий не возвращаются в вызывающую программу.
Второй способ называют передачей параметров по ссылке. При использовании этого метода в подпрограмму передаются адреса фактических параметров, соответственно, все изменения этих параметров в подпрограмме происходят с переменными основной программы. По умолчанию в языке С++ применяется передача по значению.
Формальныминазываются параметры, определенные в заголовке функции при ее описании.
Каждый формальный параметр не только перечисляется (именуется), но и специфицируется (для него задается тип).
Совокупность формальных параметров определяет сигнатуру функции.
Сигнатура функции зависит от количества параметров, их типа и порядка размещения в спецификации формальных параметров.
Спецификация формальных параметров это либо пусто, либо void либо список отдельных параметров.
Примеры:
float max(float a,float b){….}
int fun1() {…..}
char F2(void) {…..}
Фактическиминазываются параметры, задаваемые при вызове функции.
Формальные и фактические параметры должны совпадать:
- по количеству;
- по типу;
- по порядку следования.
Однако, имена формальных и фактических параметров могут не совпадать.
Пример:
int k,l,n=6; float d=567.5,m=90.45
void fun2(int a,float c,float b){….} // описание функции fun2
fun2(n,d,m); // Правильный вызов
fun2(4,8.7); // Ошибка в количестве параметров
fun2(4.67, 5,7); // ошибка в типах параметров
fun2(3,m,d); // ошибка в порядке следования контролируется пользователем
Если в качестве параметров передаются параметры значения, то в качестве фактических можно передавать переменные, константы и выражения.
Существует два способа завершить выполнение подпрограммы и вернуть управление вызывающей подпрограмме. В первом случае функция полностью выполняет свои операторы и достигает закрывающей скобки, после чего управление автоматически передается в точку вызова. Такая подпрограмма должна либо не возвращать никаких данных либо должна возвращать результаты через параметры. В этом случае необходимо использовать ссылки или указатели.
Пример.Разработать программу, которая определяет площадь четырехугольника по заданным длинам сторон и диагонали.
Будем считать площадь четырехугольника как сумму площадей двух треугольников, определенных по формуле Герона. Вычисление площади треугольника оформим как подпрограмму. Исходные данные такой подпрограммы – длины сторон треугольника. Подпрограмма не должна менять значения параметров, поэтому их можно передать как параметры-значения или параметры-константы. Результат работы этой подпрограммы – скалярное значение, значит, она может быть реализована как функция. Однако ее также можно реализовать как процедуру, которая возвращает результат через параметр-переменную. Схемы алгоритма данной программы с использованием подпрограмм обоих типов приведены на рис. 11.
Рисунок 11 – Схемы алгоритмов программы определения площади четырехугольника с использованием функции (а) и процедуры (б)
Ниже приведены тексты соответствующих программ.
Вариант с и с п о л ь з о в а н и е м ф у н к ц и и:
#include <locale.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>
//описание функции
float Stf(const float x,y,z)
//раздел операторов функции
{float p; //локальная переменная
p=(x+y+z)/2;
Result=sqrt(p*(p-X)*(p-Y)*(p-Z)); }
//основная программа
int main(int argc, char* argv[])
{ float a,b,c,d,e;
puts("Enter a,b,c,d,e: ");
scanf("%f %f %f %f %f",&a, &b, &c, &d, &e);
printf(“S = %7.3f”, Stf(a,b,e)+Stf(c,d,e));
return 0; }
Вариант с и с п о л ь з о в а н и е м п р о ц е д у р ы:
#include <locale.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>
//описание процедуры
void Stp(const float X,Y,Z; float &S)
//раздел операторов процедуры
{float p; //локальная переменная
p=(X+Y+Z)/2;
S=sqrt(p*(p-X)*(p-Y)*(p-Z));}
//основная программа
int main(int argc, char* argv[])
{ float a,b,c,d,e;
float S1,S2;
puts("Enter a,b,c,d,e: ");
scanf("%f %f %f %f %f",&a, &b, &c, &d, &e);
Stp(a,b,e,S1); //вызов процедуры
Stp(c,d,e,S2); //вызов процедуры
printf(“S = %7.3f”, S1+S2);
return 0; }
Другие примеры программ, содержащих ветвления приведены в [1].
Порядок выполнения работы
1. Прочитать и проанализировать задание в соответствии со своим вариантом.
2. Разработать схему алгоритма решения задачи.
3. Написать программу.
4. Вызвать среду программирования Turbo Delphi, создать новый проект консольного приложения и ввести текст программы в среду программирования.
5. Подобрать тестовые данные (не менее 3-х вариантов).
6. Отладить программу на выбранных тестовых данных.
7. Продемонстрировать работу программы преподавателю.
8. Составить отчет по лабораторной.
9. Защитить лабораторную работу преподавателю.
Требования к отчету
Отчет должен быть выполнен на бумаге формата А4 или А5 в том числе в тетрадях или на тетрадных листах. Если отчет выполняется на отдельных тетрадных листах, то они должны быть аккуратно обрезаны по линии подшивки и скреплены. Неаккуратно выполненные, оборванные или грязные отчеты не принимаются.
Все записи в отчете должны быть либо напечатаны на принтере, либо разборчиво выполнены от руки синей или черной ручкой (карандаш – не допускается). Схемы также должны быть напечатаны при помощи компьютера или нарисованы с использованием чертежных инструментов в том числе карандаша.
Каждый отчет должен иметь титульный лист, на котором указывается:
а) наименование факультета и кафедры;
б) название дисциплины;
в) номер и тема лабораторной работы;
г) фамилия преподавателя, ведущего занятия;
д) фамилия, имя и номер группы студента;
е) номер варианта задания.
Кроме того отчет по лабораторной работе должен содержать:
1) схемы алгоритма основной программы и подпрограмм, выполненные вручную или в соответствующем пакете;
2) текст программы;
3) результаты тестирования, которые должны быть оформлены в виде таблицы вида:
Исходные данные | Ожидаемый результат | Полученный результат |
4) выводы.
5.4. Контрольные вопросы
1. Что такое «подпрограмма»? Чем различаются подпрограммы процедуры и функции?
2. Как показать подпрограммы и их вызовы в схеме алгоритма?
3. Какие способы передачи параметров в подпрограмму существуют?
4. Какой синтаксис используется для описания формальных параметров? Чем формальные параметры отличаются от фактических?
5. Какие особенности существуют при описании параметров структурных типов?
6. Как выполняется отладка программ с подпрограммами?