Лабораторная работа № 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.

Лабораторная работа № 6. Программирование с использованием подпрограмм - student2.ru

Рисунок 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. Как выполняется отладка программ с подпрограммами?


Наши рекомендации