Лабораторная работа №9

Программирование с использованием
подпрограмм и модулей

Цель лабораторной работы: изучить возможности C++ Builder для написания подпрограмм и создания модулей. Составить и отладить программу, использующую внешний модуль с подпрограммой.

9.1. Использование подпрограмм

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

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

В языке С++ в качестве подпрограмм используют функции. Функция должна быть объявлена (декларирована) до ее первого использования. Предварительное описание функции называется прототипом. Прототип обычно размещается в начале программы на С++ (расширение .cpp) либо в заголовочном файле (расширение .h) и сообщает компилятору о том, что далее в программе будет приведен полный текст функции.

Прототип имеет следующую структуру:

<тип_результата> <имя_функции> (<список параметров>);

Полное определение функции имеет следующий вид:   <тип_результата><имя_функции>(<список параметров>)

{

         <тело функции>  

           return <результат>

}

Результат возвращается функцией в точку ее вызова при помощи оператора возврата return и соответствует типу, указанному в определении функции. Если тип функции не указан (void), то по умолчанию предполагается тип int. Список параметров состоит из перечня типов и имени параметров, разделенных запятыми. В том случае, если функция не имеет параметров, после имени располагаются только круглые скобки.

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

Функции могут быть использованы в качестве формальных параметров подпрограмм. Для этого определяется тип-указатель на функцию: typedef <тип_результата> (*<имя_указателя на функцию>)(<список типов>);

9.2.Использование модулей

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

Модуль - программная единица, включающая в себя файл программы с расширением (.cpp), где находится определение функций, и заголовочный файл с расширением (.h), где находятся прототипы функций, описание классов, объявления глобальных переменных.

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

9.3.Порядок выполнения задания

Задание: написать программу вывода на экран таблицы функции, которую оформить в виде процедуры. В качестве функции использовать по выбору Tg(x), ch(x) и sin (x).

9.3.1. Создание модуля

Для создания модуля в меню File выбрать New - Unit. В результате будет создан файл с заголовком Unit Unit1. Имя модуля можно сменить на другое, отвечающее внутреннему содержанию модуля, например MyUnit.

9.3.2.Подключение модуля

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

Панель диалога будет иметь вид рис. 9.1.

Тексты модуля и вызывающей программы приведены ниже.

Текст заголовочного файла модуля:

//--------------------------------------------------------------------

 #ifndef MyUnitH   

 #defineMyUnitH  

 #include <StdCtrls.hpp>

//--------------------------------------------------------------------------- 

typedef double (*TFun)(double);

void Tab(TMemo *mem,TFun f,double xn,double xk,double h);

#endif

Текст файла модуля:

#pragma hdrstop

#include "MyUnit.h"

#pragma package(smart_init)

void Tab(TMemo *mem,TFun f,double xn,double xk,double h)

 {

double x,y; x=xn;

while(x<xk)

{

y=(*f)(x);

mem->Lines->Add("x="+FloatToStrF(x,ffFixed,8,3)+

" y="+FloatToStrF(y,ffFixed,8,3));

x+=h;

}

}

Текст вызывающей программы:

//--------------------------------------------------------------------------

#include <vcl.h>

#include <Math.h>

#include "MyUnit.h"

#pragma hdrstop #include "lr9.h"

#pragma package(smart_init)

#pragma resource "*dfm"

TForm1 *Form1;

//---------------------------------------------------------------------

double cTg( double x); // Функция для вычисления котангенса

double Ch(double x); // Функция для вычисления гиперболического синуса

double Sin2(double x); // Функция для вычисления квадрата синуса

 //--------------------------------------------------------------------

__ fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

void___ fastcall TForm1::FormCreate(TObject *Sender)

{

Edit1->Text="0,1";

Edit2->Text="3";

Edit3->Text="0,3";

Memo1->Clear();

RadioGroup1->ItemIndex=0;

}

//-----------------------------------------------------------------------------

void___ fastcall TForm1::Button1Click(TObject *Sender)

{

Memo1->Clear();

double xn=StrToFloat(Edit1->Text);

double xk=StrToFloat(Edit2->Text);

double h=StrToFloat(Edit3->Text); switch(RadioGroup1-

>ItemIndex)

{

case 0:Tab(Memo1,cTg,xn,xk,h);

break; case 1:Tab(Memo1,Ch,xn,xk,h);

break; case 2:Tab(Memo1,Sin2,xn,xk,h); break;

}

}

double cTg( double x)

{

return cos(x)/sin(x);

}

double Ch(double x)

{

return (exp(x)-exp(-x))/2; }

double Sin2(double x)

{

return pow(sin (x(2),);

}

 

Рис. 9.1

 

9.1.Выполнение индивидуального задания

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