Створення багатофайлової програми 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Створення багатофайлової програми



Створювати багатофайлові програми у середовищі розробки C++ Builder достатньо просто, оскільки воно саме й передбачає роботу відразу з цілим проектом, до складу якого входять файли різних типів. Але, поки ми не займаємося візуальним проектуванням, обмежимося файлами двох типів – модульними (.cpp) та заголовочними (.h).

До складу проекту входять всі файли, необхідні програмі, а також інструкції по їх компонуванню. Вони містяться у спеціальному файлі, що називається файлом проекту. Його розширення у C++ Builder -.bpr. Цей файл створюється і оновлюється автоматично.

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

Далі викладений приклад створення багатофайлового проекту у середовищі розробки C++ Builder.

1. Створюємо папку для зберігання файлів проекту.

2. Звичайним способом (з використанням команд New/Console Wizard…) створємо файл filea.cpp. За допомогою команди записуємо цей файл і файл всього проекту у попередньо створену папку.

3. Двічі виконуємо команду New/Text для створення файлів fileb.cpp та fileh.h.

 

4. Записуємо автоматично створені «заготовки» у папку, де зберігаються інші файли проекту.

 

5. Включаємо файл fileb.cpp до складу проекту. Це необхідно зробити, оскільки навіть тоді, коли він записаний у тій же папці, що й головний файл проекту, компілятор його автоматично не відшукає. З цією метою використовуємо команду Add to project…

6. Натомість, якщо заголовочний файл записаний у тій же папці, де й інші файли проекту, то якось спеціально повідомляти про нього компілятору не потрібно. Але, якщо він міститься в іншій папці, то показуємо його розміщення за допомогою команд Project/Options/Directories/Conditionals/Include Path.

7. Вводимо з клавіатури текст кожного з файлів проекту:

 

//filea.cpp

#include "Fileh.h"

 

int main()

{ someclass obj1;

int var1=obj1.memfunc(2,3);

cout<<var1;

getch();

   return 0;

}

 

//fileb.cpp

#include "Fileh.h"

int someclass::memfunc(int n1,int n2)

{return n1+n2;

};

 

//fileh.h

#include <iostream.h>

#include <conio.h>

using namespace std;

class someclass

{private:

int memvar;

public:

int memfunc(int,int);

};

 

Програма 16.1

 

8. Зберігаємо всі файли проекту (це зручно зробити за допомогою команди Save All) та компілюємо їх.

 

9. Запускаємо проект на виконання, переконуємося у коректності його роботи

 

 

Клас надвеликих чисел

Далі приведений вихідний код файлів програми, яка забезпечує роботу з багаторозрядними (значно більше 10) числами. Ми створимо клас, що може містити до 1000 десяткових розрядів. При цьому числа зберігаються у вигляді рядків.

 

//заголовочний файл для класу надвеликих чисел

//verylong.h

#include<iostream>

#include<string.h>

#include<stdlib.h>

using namespace std;

const int SZ=1000; //максимальне число розрядів

class verylong

{

private:

char vlstr[SZ];//число як рядок

int vlen;//довжина рядка

verylong multdigit(const int) const; //прототипи

verylong mult10(const verylong) const;//прихованих функцій

public:

verylong():vlen(0) //конструктор без аргументів

{vlstr[0]='\0';}

 

verylong(const char s[SZ]) //конструктор з 1 аргументом для рядка

{strcpy(vlstr,s); vlen=strlen(s);}

 

verylong(const unsigned long n) //конструктор з 1 аргументом для long int

{ltoa(n,vlstr,10); //перетворити в рядок

strrev(vlstr); //перевернути

vlen=strlen(vlstr); //знайти довжину

}

 

void putvl() const; //вивести число

void getvl(); //одержати число від користувача

verylong operator +(const verylong); //додати числа

verylong operator *(const verylong); //помножити числа

};

Програма 16.2

 

 

//verylong.cpp

//реалізація обробки даних

#include "verylong.h"

//////////

void verylong::putvl() const

{char temp[SZ];

strcpy(temp,vlstr); //створити копію

cout<<strrev(temp); //перевернути копію і вивести її

}

 

/////////

void verylong::getvl()

{cin>>vlstr;//одержати рядок від користувача

vlen=strlen(vlstr);//знайти її довжину

strrev(vlstr);//перевернути її

}

 

//////////////

verylong verylong::operator +(const verylong v)

{char temp[SZ];

int j,maxlen;

maxlen=(vlen>v.vlen)?vlen:v.vlen;//знайти довше число

int carry=0;

for(j=0;j<maxlen;j++)

{int d1=(j>vlen-1)?0:vlstr[j]-'0';

 int d2=(j>v.vlen-1)?0:v.vlstr[j]-'0';

 int digitsum=d1+d2+carry;

 if(digitsum>=10)

 {digitsum-=10;carry=1;}

 else

 carry=0;

 temp[j]=digitsum+'0';

 }

 if(carry==1)

 temp[j++]='1';

 temp[j]='\0';

 return verylong(temp);

}

 

////////////

 verylong verylong::operator *(const verylong v)

 {verylong pprod;

 verylong tempsum;

 int j,digit,k;

 for(j=0;j<v.vlen;j++) //для кожного розряду аргументу

 {digit=v.vlstr[j]-'0';

 pprod=multdigit(digit);

 for(int k=0;k<j;k++)

 pprod=mult10(pprod);

 tempsum=tempsum+pprod;

 }

 return tempsum;

 }

 

///////////

 verylong verylong::mult10(const verylong v)const //домноження аргументу на 10

{char temp[SZ];

int j;

for(j=v.vlen-1;j>=0;j--)//зсунутися на 1 розряд

temp[j+1]=v.vlstr[j];

temp[0]='0'; //обнулити молодший розряд

temp[v.vlen-1]='\0';//поставити обмежувач рядка

return verylong(temp);

}

 

/////////

 verylong verylong::multdigit(const int d2) const

 {char temp[SZ];

 int j,carry=0;

 for(j=0;j<vlen;j++)

 {int d1=vlstr[j]-'0';

 int digitprod=d1*d2;

 digitprod+=carry;

 if(digitprod>=10)

 {carry=digitprod/10;

 digitprod-=carry*10;}

 else

 carry=0;

 temp[j]=digitprod+'0';

 }

 if(carry!=0)

 temp[j++]=carry+'0';

 temp[j]='\0';

 return verylong(temp);

 }

Програма 16.3

 

 

//обчислення факторіалу великого числа

#include «verylong.h»

#include<conio.h>

int main()

{

unsigned long numb,j;

verylong fact=1;

 

cout<<”\n\nVvedit chyslo: “;

cin>>numb;

 

for(j=numb;j>0;j--)

fact=fact*j;

cout<<”Factorial=”;

fact.putvl();

cout<<endl;

getch();

   return 0;

}

Програма 16.4

 

Підсумок

Програмне забезпечення бібліотеки класів найчастіше складається з двох частин: загальнодоступного компоненту (інтерфейсу), що містить оголошення класів у заголовочному файлі, і прихованого компоненту (реалізації), що містить визначення методів в об’єктному (.obj) та бібліотечному (.lib) файлі.

Компілятори С++ дозволяють об’єднувати різноманітні вихідні та об’єктні файли в єдину виконувану програму. Завдяки цьому можна користуватися бібліотеками функцій навіть від різних розробників. Файл проекту дозволяє запам’ятовувати, що й коли було відкомпільовано. Можна компілювати тільки ті вихідні файли, які змінювалися з часу останньої збірки.

Міжфайлова комунікація передбачає, що змінні, функції і класи об’єктів визначені в одному файлі, а використовуються в інших. Оголошення класу повинне бути поміщене у всі файли, які до нього звертаються, найлегше це зробити за допомогою заголовочних файлів.

Питання по темі

1. Розбивати програму на декілька файлів бажано тому, що

а) деякі файли не потребують перекомпіляції при кожній збірці

б) програма може бути розділена на функціональні елементи

в) файли можна представити на ринку в об’єктному вигляді

д) різні програмісти можуть працювати з різними файлами

 

2. Заголовочний файл зв’язується з вихідним за допомогою директиви

а) #include

б) #define

в) #pragma

 

3. Чи істинним є твердження: відразу кілька файлів проекту потребують доступу до заголовочного файлу

а) так

б) ні

4. Чи істинне твердження: інтерфейс є прихованою частиною бібліотеки, а реалізація – загальнодоступною?

а) так

б) ні

 

5. Щоб оголосити об’єкти класу в різних файлах, в кожному з них необхідно

а) оголосити клас

б) визначити клас

в) оголосити клас за допомогою extern

г) визначити клас за допомогою extern

 



Поделиться:


Последнее изменение этой страницы: 2021-12-15; просмотров: 69; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.145.119.199 (0.019 с.)