1

Тема: Розділити програму на модулі.

Будь ласка, допоможіть мені розділити цю програму на модулі.
Дуже потрібно))

2

Re: Розділити програму на модулі.

Тут програма

Post's attachments

розділити на модулі.cpp 9.08 kb, 242 downloads since 2017-06-06 

3

Re: Розділити програму на модулі.

Дурним студентам, що не читають правила тут не раді

Подякували: LoganRoss, koala, ostap34PHP3

4

Re: Розділити програму на модулі.

А чому не раді в даному випадку? Технічно, власні напрацювання в дівчини є (див. код — хто б іще дав таке ім'я змінній? :) ), тож пункт 3.5 не порушено.

Поділ програми на модулі — питання більш філософське, ніж алгоритмічне. Технічно, звичайно, функції можна порозкидати по модулях як-завгодно (наприклад, усі службові функції — в один модуль, main — у другий, і не забути зробити спільний інклуд-файл з описами типів та заголовками функцій), але чому саме так, а не інакше... По ідеї, в модулі виноситься функціонал, який можна буде використати в іншій програмі (але в якій?).

Подякували: NaharD, /KIT\, ostap34PHP3

5

Re: Розділити програму на модулі.

Просто для мене було легше написати такий код,аніж розділений на модулі. А викладач вимагає розділити.
Чесно, вже передивилась купу відео,перечитала багато літератури. Пробувала розділяти, але вибиває помилку.
Тому прошу у вас допомоги, бо дійсно не знаю як зробити це((

P.Y. написав:

А чому не раді в даному випадку? Технічно, власні напрацювання в дівчини є (див. код — хто б іще дав таке ім'я змінній? :) ), тож пункт 3.5 не порушено.

Поділ програми на модулі — питання більш філософське, ніж алгоритмічне. Технічно, звичайно, функції можна порозкидати по модулях як-завгодно (наприклад, усі службові функції — в один модуль, main — у другий, і не забути зробити спільний інклуд-файл з описами типів та заголовками функцій), але чому саме так, а не інакше... По ідеї, в модулі виноситься функціонал, який можна буде використати в іншій програмі (але в якій?).

6

Re: Розділити програму на модулі.

Покажіть як розділяли

Подякували: koala1

7

Re: Розділити програму на модулі.

:D З нервів все повидаляла. Зараз тільки ту програму на компі маю і все.

/KIT\ написав:

Покажіть як розділяли

8

Re: Розділити програму на модулі.

В нормі, у вас має бути мінімум три файли: модуль головної програми (назвімо його main.cpp), модуль з функціями (module.cpp) та заголовний файл (module.h). (Назви можуть бути будь-якими іншими).

Що має бути в заголовному файлі: заголовки функцій без тіла і з ключовим словом extern. Наприклад:

extern void write();
extern void read();
// і т.д.

У модулі з функціями (module.cpp) має бути все, крім функції main.

У головній програмі (main.cpp), відповідно, треба не описувати функції, які є в module.cpp, а замість того включити заголовний файл:

#include "module.h"

Також у ньому має бути функція main і всі інклуди, які потрібні для її безпосередньої роботи.

Якщо все зробити правильно, то, по ідеї, має працювати. (Якщо не працюватиме, скидайте результат розділення сюди. І текст помилки не забудьте :) ).

(Хоча, я б сказав, такій програмі в такому вигляді поділ на модулі нічого не дає: і main, і функції взаємодіють з користувачем через консоль, і використати їх в іншій програмі, мабуть, проблематично. А ось, наприклад, якби на main лягала вся взаємодія з користувачем, а дані, отримані від нього, передавались функціям через параметри, й дані, які функції читають з файлу, повертались як їх результат і далі виводились головною програмою, то виділення таких функцій у модуль дозволило б, наприклад, написати потім програму з графічним інтерфейсом, яка використовує цей же модуль з цими ж функціями).

9

Re: Розділити програму на модулі.

По вашому питанню напрацювань таки немає. Вам треба було поділити на модулі, ви цього не зробили (чи принаймні нам не показали).
Що ж до модулів, то особливого сенсу їх виділяти тут дійсно немає; якщо ж викладачеві вже так кортить їх робити, то винесіть все, що стосується вашої структури (фактично - все, крім main) до окремої пари файлів structura.hpp і structura.cpp, і включіть цю structura.hpp в основний файл перед main.
А якщо викладач хоче модулів у множині - то зробіть так само із кожною структурою і функцією, а потім включіть їхні заголовкові файли до structura.hpp; тоді легше робити це в окремій папці, десь так:
structura.hpp:

#ifndef __STRUCTURA_HPP__
#define __STRUCTURA_HPP__

//не містить коду, об'єднує інші модулі
#include<structura/read.hpp>
#include<structura/write.hpp>
...
#endif

structura/read.hpp:

#ifndef __STRUCTURA_READ_HPP__
#define __STRUCTURA_READ_HPP__
#include<struct.hpp>
void read();   //підпрограма яка виводить на екран всі дані
#endif

structura/struct.hpp:

#ifndef __STRUCTURA_STRUCT_HPP__
#define __STRUCTURA_STRUCT_HPP__
struct structura{...};
#endif

і т.д.

10 Востаннє редагувалося LoganRoss (07.06.2017 19:55:26)

Re: Розділити програму на модулі.

Насмілюся припустити, що цей код робили не ви, оскільки там є кілька дрібних помилок і код не компілюється.
Але я сьогодні маю трохи вільного часу, тому...

Structura.h
// Structura.h > struct declaration
#ifndef STRUCTURA_H
#define STRUCTURA_H
#include <iostream>

struct structura
{                       
    char namemark[124]; 
    char namephone[124];
    int price;          
};

#endif // !STRUCTURA_H
IO_operation.h
// IO_Operation.h > functions declaration
#ifndef IO_OPERATION_H
#define IO_OPERATION_H
#include <iostream>
#include "Structura.h"

using namespace std;

void write(structura& telephone, char* filename);
void read(structura& telephone, char* filename);
void rewrite(structura& telephone, char* filename);
void searh(structura& telephone, char* filename);
void delet(structura& telephone, char* filename);
void sort(structura& telephone, char* filename);

#endif // !IO_OPERATION_H
IO_Operation.cpp
// IO_Operation.cpp > definition of functions placed in IO_Operation.h
#include <iostream>
#include <fstream>
#include <iomanip>
#include <cstring>
#include "IO_operation.h"

using namespace std;


void write(structura& telephone, char* filename)
{
    int n;
    cout << "Enter quality records : ";   //питаємося скільки телефонів вписати за 1 раз
    cin >> n;                              //вписуємо число
    ofstream diana(filename, ios::app | ios::binary);  //створюємо об'єкт для запису в файл
    for (int i = 0; i<n; i++) {         //цикл
        cout << "Enter namemark ";        //вписуємо назву марки телефону
        cin >> telephone.namemark;
        cout << "Enter namephone ";       //назву телефону
        cin >> telephone.namephone;
        cout << "Enter price ";      //його ціна
        cin >> telephone.price;
        diana.write((char*)&telephone, sizeof(structura));    //записує дані в кінець файлу як структуру
    }
    diana.close();  //закриває файл
}

void read(structura& telephone, char* filename)
{
    ifstream diana(filename, ios::binary);   //створюємо об'єкт для читання з нього
    int p = 0;
    while (diana.read((char*)&telephone, sizeof(structura))) {        //поки є дані в файлі працює цикл який виводить ці дані
        cout << p + 1 << ") " << setiosflags(ios::left) << setw(15) << telephone.namemark << setw(15) << telephone.namephone << setw(15) << telephone.price << endl;
        p++;
    }
    diana.close(); //закриваємо файл
}

void rewrite(structura& telephone, char* filename)
{
    int n = 0;
    int change;
    structura buff;
    ifstream diana(filename, ios::binary); //з нашого файлу ми будем зчитувати дані 
    ofstream dianaNew("prom.txt", ios::binary | ios::app); //і створюємо новий файл куди перепишемо всі дані з першого, але з відредагуванням
    cout << "Vvedit nomer dlya zminu : ";
    cin >> change;
    while (diana.read((char*)&telephone, sizeof(structura))) {     //то саме шо і в підпрограмі для запису телефону, просто заново вводимо дані
        if (change - 1 == n) {
            cout << "New namemark : ";
            cin >> buff.namemark;
            cout << "New namephone : ";
            cin >> buff.namephone;
            cout << "New price : ";
            cin >> buff.price;
            dianaNew.write((char*)&buff, sizeof(structura));
            n++;
        }
        else {
            dianaNew.write((char*)&telephone, sizeof(structura));
            n++;
        }
    }
    diana.close();       //закриваємо наші файли
    dianaNew.close();
    std::remove(filename);    //старий видаляємо
    std::rename("prom.txt", filename);   //новий переіменовуємо як старий
}

void searh(structura& telephone, char* filename)
{
    char enternamemark[124];
    char enternamephone[124];
    int number;
    int enterprice;
    cout << "On what criteria you want to search\n\t1. namemark\n\t2. namephone\n\t3. price\n\t\tEnter number : ";
    cin >> number;   //вибираємо по чому ми хочемо шукати
    switch (number) {   //далі вводимо те що вибрали
    case 1: {
        cout << "Enter namemark : ";
        cin >> enternamemark;
        break;
    }
    case 2: {
        cout << "Enter namephone : ";
        cin >> enternamephone;
        break;
    }
    case 3: {
        cout << "Enter price : ";
        cin >> enterprice;
        break;
    }
    default: {      //якщо ми щось погано ввели то вибиває - помилка
        cout << "Error enter !!!";
        break;
    }
    }
    ifstream diana(filename, ios::binary);
    while (diana.read((char *)&telephone, sizeof(telephone))) {  //відкриваємо файл і проводимо пошук
        switch (number) {
        case 1: {
            if (strcmp(enternamemark, telephone.namemark) == 0) {  //якщо є співпадіння то виводимо на екран
                cout << setiosflags(ios::left) << setw(15) << telephone.namemark << setw(15) << telephone.namephone << setw(15) << telephone.price << endl;
            }
            break;
        }
        case 2: {
            if (strcmp(enternamephone, telephone.namephone) == 0) {
                cout << setiosflags(ios::left) << setw(15) << telephone.namemark << setw(15) << telephone.namephone << setw(15) << telephone.price << endl;
            }
            break;
        }
        case 3: {
            if (enterprice == telephone.price) {
                cout << setiosflags(ios::left) << setw(15) << telephone.namemark << setw(15) << telephone.namephone << setw(15) << telephone.price << endl;
            }
            break;
        }
        default: {
            cout << "Error !!!" << endl;
            break;
        }
        }
    }
    diana.close();
}

void delet(structura& telephone, char* filename)
{
    int n = 0;    //працює так само як і редагування тільки записує в новий файл всі дані крім видаленого елементу
    int change;
    ifstream diana(filename, ios::binary);
    ofstream dianaNew("prom.txt", ios::binary | ios::app);
    cout << "Vvedit nomer dlya zminu : ";
    cin >> change;
    while (diana.read((char*)&telephone, sizeof(structura))) {
        if (change - 1 == n) {
            cout << setiosflags(ios::left) << setw(15) << telephone.namemark << setw(15) << telephone.namephone << setw(15) << telephone.price << endl;
            n++;
        }
        else {
            dianaNew.write((char*)&telephone, sizeof(structura));
            n++;
        }
    }
    diana.close();
    dianaNew.close();
    std::remove(filename);
    std::rename("prom.txt", filename);
}

void sort(structura& telephone, char* filename)
{
    int choice;
    int n = 0;
    structura peo[124];
    cout << "Sort : \n\t1. namemark\n\t2. namephone\n\t3. price\n\t\tEnter choice : ";
    cin >> choice;   //вибираємо по чому сортуємо
    ifstream diana(filename, ios::binary);
    ofstream dianaNew("prom.txt", ios::binary | ios::app);
    while (diana.read((char*)&peo[n], sizeof(structura))) {
        n++;
    }
    switch (choice) {   //в залежності що вибрали по тому і сортуємо
    case 1: for (int i = 0; i<n; i++) {   //тут марка
        for (int j = 0; j<n - 1; j++) {
            if (strcmp(peo[j].namemark, peo[j + 1].namemark) >0) {  //strcmp порівнює числові коди строк
                telephone = peo[j + 1];                                 //класичне сортування методом бульбашки
                peo[j + 1] = peo[j];
                peo[j] = telephone;
            }
        }
    }
            for (int i = 0; i<n; i++) {
                dianaNew.write((char*)&peo[i], sizeof(structura));
            }
            break;
    case 2: for (int i = 0; i<n; i++) {           //тут то саме для назви телефону
        for (int j = 0; j<n - 1; j++) {
            if (strcmp(peo[j].namephone, peo[j + 1].namephone) >0) {
                telephone = peo[j + 1];
                peo[j + 1] = peo[j];
                peo[j] = telephone;
            }
        }
    }
            for (int i = 0; i<n; i++) {
                dianaNew.write((char*)&peo[i], sizeof(structura));
            }
            break;
    case 3:
        for (int i = 0; i<n; i++) {           //а тут для його ціни
            for (int j = 0; j<n - 1; j++) {
                if (peo[j].price > peo[j + 1].price) {
                    telephone = peo[j + 1];
                    peo[j + 1] = peo[j];
                    peo[j] = telephone;
                }
            }
        }
        for (int i = 0; i<n; i++) {
            dianaNew.write((char*)&peo[i], sizeof(structura));
        }
        break;
    default: cout << "Error !!!";
    }
    diana.close();
    dianaNew.close();
    std::remove(filename);
    std::rename("prom.txt", filename);
}
main
#include <iostream>
#include "IO_operation.h"

using namespace std;



int main() {
    int choice;
    structura telephone;
    char* filename = new char[25];
    cout << "Enter the name of file to work: ";
    cin >> filename;
    while (true) {
        cout << "1. Write\n2. Read\n3. Rewrite\n4. Search\n5. Delete record\n6. Sort file\n\tEnter your choice : ";  //наше меню
        cin >> choice;                       //тут ми вводим з клавіатури номер який хочемо
        switch (choice) {
        case 1:   write(telephone, filename);                        break;   //тут перечисляються можливі варіанти
        case 2:   read(telephone, filename);                         break;
        case 3:   rewrite(telephone, filename);                      break;
        case 4:   searh(telephone, filename);                        break;
        case 5:   delet(telephone, filename);                        break;
        case 6:   sort(telephone, filename);                         break;
        default:   cout << "Error !!! " << endl;   break;
        }
    }
    delete[] filename;
    filename = 0;
    return 0;
}

11

Re: Розділити програму на модулі.

Що може означати ця помилка?)

LoganRoss написав:

Насмілюся припустити, що цей код робили не ви, оскільки там є кілька дрібних помилок і код не компілюється.
Але я сьогодні маю трохи вільного часу, тому...

Structura.h
// Structura.h > struct declaration
#ifndef STRUCTURA_H
#define STRUCTURA_H
#include <iostream>

struct structura
{                       
    char namemark[124]; 
    char namephone[124];
    int price;          
};

#endif // !STRUCTURA_H
IO_operation.h
// IO_Operation.h > functions declaration
#ifndef IO_OPERATION_H
#define IO_OPERATION_H
#include <iostream>
#include "Structura.h"

using namespace std;

void write(structura& telephone, char* filename);
void read(structura& telephone, char* filename);
void rewrite(structura& telephone, char* filename);
void searh(structura& telephone, char* filename);
void delet(structura& telephone, char* filename);
void sort(structura& telephone, char* filename);

#endif // !IO_OPERATION_H
IO_Operation.cpp
// IO_Operation.cpp > definition of functions placed in IO_Operation.h
#include <iostream>
#include <fstream>
#include <iomanip>
#include <cstring>
#include "IO_operation.h"

using namespace std;


void write(structura& telephone, char* filename)
{
    int n;
    cout << "Enter quality records : ";   //питаємося скільки телефонів вписати за 1 раз
    cin >> n;                              //вписуємо число
    ofstream diana(filename, ios::app | ios::binary);  //створюємо об'єкт для запису в файл
    for (int i = 0; i<n; i++) {         //цикл
        cout << "Enter namemark ";        //вписуємо назву марки телефону
        cin >> telephone.namemark;
        cout << "Enter namephone ";       //назву телефону
        cin >> telephone.namephone;
        cout << "Enter price ";      //його ціна
        cin >> telephone.price;
        diana.write((char*)&telephone, sizeof(structura));    //записує дані в кінець файлу як структуру
    }
    diana.close();  //закриває файл
}

void read(structura& telephone, char* filename)
{
    ifstream diana(filename, ios::binary);   //створюємо об'єкт для читання з нього
    int p = 0;
    while (diana.read((char*)&telephone, sizeof(structura))) {        //поки є дані в файлі працює цикл який виводить ці дані
        cout << p + 1 << ") " << setiosflags(ios::left) << setw(15) << telephone.namemark << setw(15) << telephone.namephone << setw(15) << telephone.price << endl;
        p++;
    }
    diana.close(); //закриваємо файл
}

void rewrite(structura& telephone, char* filename)
{
    int n = 0;
    int change;
    structura buff;
    ifstream diana(filename, ios::binary); //з нашого файлу ми будем зчитувати дані 
    ofstream dianaNew("prom.txt", ios::binary | ios::app); //і створюємо новий файл куди перепишемо всі дані з першого, але з відредагуванням
    cout << "Vvedit nomer dlya zminu : ";
    cin >> change;
    while (diana.read((char*)&telephone, sizeof(structura))) {     //то саме шо і в підпрограмі для запису телефону, просто заново вводимо дані
        if (change - 1 == n) {
            cout << "New namemark : ";
            cin >> buff.namemark;
            cout << "New namephone : ";
            cin >> buff.namephone;
            cout << "New price : ";
            cin >> buff.price;
            dianaNew.write((char*)&buff, sizeof(structura));
            n++;
        }
        else {
            dianaNew.write((char*)&telephone, sizeof(structura));
            n++;
        }
    }
    diana.close();       //закриваємо наші файли
    dianaNew.close();
    std::remove(filename);    //старий видаляємо
    std::rename("prom.txt", filename);   //новий переіменовуємо як старий
}

void searh(structura& telephone, char* filename)
{
    char enternamemark[124];
    char enternamephone[124];
    int number;
    int enterprice;
    cout << "On what criteria you want to search\n\t1. namemark\n\t2. namephone\n\t3. price\n\t\tEnter number : ";
    cin >> number;   //вибираємо по чому ми хочемо шукати
    switch (number) {   //далі вводимо те що вибрали
    case 1: {
        cout << "Enter namemark : ";
        cin >> enternamemark;
        break;
    }
    case 2: {
        cout << "Enter namephone : ";
        cin >> enternamephone;
        break;
    }
    case 3: {
        cout << "Enter price : ";
        cin >> enterprice;
        break;
    }
    default: {      //якщо ми щось погано ввели то вибиває - помилка
        cout << "Error enter !!!";
        break;
    }
    }
    ifstream diana(filename, ios::binary);
    while (diana.read((char *)&telephone, sizeof(telephone))) {  //відкриваємо файл і проводимо пошук
        switch (number) {
        case 1: {
            if (strcmp(enternamemark, telephone.namemark) == 0) {  //якщо є співпадіння то виводимо на екран
                cout << setiosflags(ios::left) << setw(15) << telephone.namemark << setw(15) << telephone.namephone << setw(15) << telephone.price << endl;
            }
            break;
        }
        case 2: {
            if (strcmp(enternamephone, telephone.namephone) == 0) {
                cout << setiosflags(ios::left) << setw(15) << telephone.namemark << setw(15) << telephone.namephone << setw(15) << telephone.price << endl;
            }
            break;
        }
        case 3: {
            if (enterprice == telephone.price) {
                cout << setiosflags(ios::left) << setw(15) << telephone.namemark << setw(15) << telephone.namephone << setw(15) << telephone.price << endl;
            }
            break;
        }
        default: {
            cout << "Error !!!" << endl;
            break;
        }
        }
    }
    diana.close();
}

void delet(structura& telephone, char* filename)
{
    int n = 0;    //працює так само як і редагування тільки записує в новий файл всі дані крім видаленого елементу
    int change;
    ifstream diana(filename, ios::binary);
    ofstream dianaNew("prom.txt", ios::binary | ios::app);
    cout << "Vvedit nomer dlya zminu : ";
    cin >> change;
    while (diana.read((char*)&telephone, sizeof(structura))) {
        if (change - 1 == n) {
            cout << setiosflags(ios::left) << setw(15) << telephone.namemark << setw(15) << telephone.namephone << setw(15) << telephone.price << endl;
            n++;
        }
        else {
            dianaNew.write((char*)&telephone, sizeof(structura));
            n++;
        }
    }
    diana.close();
    dianaNew.close();
    std::remove(filename);
    std::rename("prom.txt", filename);
}

void sort(structura& telephone, char* filename)
{
    int choice;
    int n = 0;
    structura peo[124];
    cout << "Sort : \n\t1. namemark\n\t2. namephone\n\t3. price\n\t\tEnter choice : ";
    cin >> choice;   //вибираємо по чому сортуємо
    ifstream diana(filename, ios::binary);
    ofstream dianaNew("prom.txt", ios::binary | ios::app);
    while (diana.read((char*)&peo[n], sizeof(structura))) {
        n++;
    }
    switch (choice) {   //в залежності що вибрали по тому і сортуємо
    case 1: for (int i = 0; i<n; i++) {   //тут марка
        for (int j = 0; j<n - 1; j++) {
            if (strcmp(peo[j].namemark, peo[j + 1].namemark) >0) {  //strcmp порівнює числові коди строк
                telephone = peo[j + 1];                                 //класичне сортування методом бульбашки
                peo[j + 1] = peo[j];
                peo[j] = telephone;
            }
        }
    }
            for (int i = 0; i<n; i++) {
                dianaNew.write((char*)&peo[i], sizeof(structura));
            }
            break;
    case 2: for (int i = 0; i<n; i++) {           //тут то саме для назви телефону
        for (int j = 0; j<n - 1; j++) {
            if (strcmp(peo[j].namephone, peo[j + 1].namephone) >0) {
                telephone = peo[j + 1];
                peo[j + 1] = peo[j];
                peo[j] = telephone;
            }
        }
    }
            for (int i = 0; i<n; i++) {
                dianaNew.write((char*)&peo[i], sizeof(structura));
            }
            break;
    case 3:
        for (int i = 0; i<n; i++) {           //а тут для його ціни
            for (int j = 0; j<n - 1; j++) {
                if (peo[j].price > peo[j + 1].price) {
                    telephone = peo[j + 1];
                    peo[j + 1] = peo[j];
                    peo[j] = telephone;
                }
            }
        }
        for (int i = 0; i<n; i++) {
            dianaNew.write((char*)&peo[i], sizeof(structura));
        }
        break;
    default: cout << "Error !!!";
    }
    diana.close();
    dianaNew.close();
    std::remove(filename);
    std::rename("prom.txt", filename);
}
main
#include <iostream>
#include "IO_operation.h"

using namespace std;



int main() {
    int choice;
    structura telephone;
    char* filename = new char[25];
    cout << "Enter the name of file to work: ";
    cin >> filename;
    while (true) {
        cout << "1. Write\n2. Read\n3. Rewrite\n4. Search\n5. Delete record\n6. Sort file\n\tEnter your choice : ";  //наше меню
        cin >> choice;                       //тут ми вводим з клавіатури номер який хочемо
        switch (choice) {
        case 1:   write(telephone, filename);                        break;   //тут перечисляються можливі варіанти
        case 2:   read(telephone, filename);                         break;
        case 3:   rewrite(telephone, filename);                      break;
        case 4:   searh(telephone, filename);                        break;
        case 5:   delet(telephone, filename);                        break;
        case 6:   sort(telephone, filename);                         break;
        default:   cout << "Error !!! " << endl;   break;
        }
    }
    delete[] filename;
    filename = 0;
    return 0;
}
Post's attachments

помилка.png 64.71 kb, 160 downloads since 2017-06-07 

12

Re: Розділити програму на модулі.

diana.ma3007 написав:

Що може означати ця помилка?)

Ця помилка означає, що ви не вмієте створювати проекти і підключати існуючі файли.

Код правильний

https://s8.hostingkartinok.com/uploads/images/2017/06/3b3e96c50067c11307c0094fbfe37d35.png

13

Re: Розділити програму на модулі.

Я зрозуміла в чому діло. Просто я компілювала в Dev C++. А ви в Visual Studio. Тому в мене вибиває помилку. Дуже дякую за допомогу!!!

LoganRoss написав:
diana.ma3007 написав:

Що може означати ця помилка?)

Ця помилка означає, що ви не вмієте створювати проекти і підключати існуючі файли.

Код правильний

https://s8.hostingkartinok.com/uploads/images/2017/06/3b3e96c50067c11307c0094fbfe37d35.png

14

Re: Розділити програму на модулі.

diana.ma3007 написав:

Я зрозуміла в чому діло. Просто я компілювала в Dev C++. А ви в Visual Studio. Тому в мене вибиває помилку. Дуже дякую за допомогу!!!

Нема різниці.

Подякували: koala, 0xDADA11C7, /KIT\, ostap34PHP4

15

Re: Розділити програму на модулі.

LoganRoss написав:

Ця помилка означає, що ви не вмієте створювати проекти і підключати існуючі файли.

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

Сам для себе я проектик такої складності скомпілив би через gcc (MinGW) i не морочився:

gcc main.cpp IO_Operation.cpp -o moja_prohrama.exe

Але, по-перше, на C/C++ я практично нічого не пишу і, по-друге, це незовсім мейнстрімно — без IDE через командний рядок, та ще й компілятор незовсім віндузяцький. Як цивілізовані програмісти таке роблять?

16 Востаннє редагувалося LoganRoss (09.06.2017 18:07:09)

Re: Розділити програму на модулі.

P.Y. написав:

До речі, а як це робиться?
...

Варіантів є багато і залежить від середовища. Наведу кілька прикладів на основі популярних IDE:

1. Linux

  • Makefile

Перший варіант, виходячи з вашого прикладу - консоль. І gcc - це для C, для C++ використовуйте g++.
Для того щоби не компілювати окремо кожен виконуваний файл, можна використати Makefile. Для цього в каталозі проекту створюємо документ з назвою Makefile. В даному випадку вмістиме Makefile буде мати вигляд:

Вміст Makefile
all: test

test: main.o IO_Operation.o
    g++ -o test main.o IO_Operation.o

main.o: main.cpp
    g++ -c main.cpp

IO_Operation.o: IO_Operation.cpp
    g++ -c IO_Operation.cpp

clean:
    rm -f *.o test

Потім просто робимо такі дії:
http://savepic.ru/14337772.png
Можна написати, наприклад,  $ make main.o, якщо потрібно обновити чи скомпілювати окремий файл.
Компілятор сам підключить хедери де потрібно. В результаті маємо бінарник test, який можна запускати.
Є навіть програми, які створюють makefile.

  • Code::Blocks

Тут простіше нікуди. Створюємо проект, добавляємо файли і програма сама поділить хедери і виконувані файли, вам хіба треба натиснути кнопочку Run.
http://savepic.ru/14315247.png


2. Windows

  • Visual Studio

В проектах VS автоматично створюються фільтри Header Files, Resources. Source Files. Це зроблено для того, щоби програмістові було зручніше орієнтуватися і ці фільтри є суто абстрактними, не плутайте з каталогами. Фактично, файли *.h і *.cpp можна скинути в один фільтр (до речі, їх можна створювати самому, ті що надає VS - дефолтні). Компілятор і так проводить пошук в проекті в цілому, за умови що ви не вказуєте свій шлях.
http://savepic.ru/14346977.png

  • Qt Creator

Той самий принцип, що і у VS.
*в Linux те саме
(скрін з нету, лінь створювати новий проект)
http://savepic.ru/14315233.png

  • Dev C++

Найпростіше. Тут все підряд:
(скрін з нету)
http://savepic.ru/14293729.png
В Dev C++ також можна робити фільтри, навіть треба. Хоча Dev C++ зараз не "модно".


*При великих проектах варто робити свої фільтри, наприклад:
http://savepic.ru/14339810.png

Подякували: P.Y., ostap34PHP, 0xDADA11C7, 0x9111A4