Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.56
margarin
36 / 36 / 0
Регистрация: 02.06.2012
Сообщений: 332
#1

Разбить main.cpp на файлы - C++

24.11.2012, 23:15. Просмотров 1187. Ответов 15
Метки нет (Все метки)

Есть вот такой main.cpp:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
#include <stdlib.h>
#include <iostream>
#include <string.h>
//#include <stdint.h>
//#include <limits.h>
#include <vector>
//#include <iomanip>
#include <math.h>
#include <time.h>
 
using namespace std;
 
vector<int> xarray_int; // мутим супер, пупер векторный массив
char separator;
 
// прототипы
// функций методов сортировки
int met_0();
int met_1();
int met_2();
int met_3();
void heir_met_3(int, int); // доп. функция для "Быстрой сортировки"
 
 
// ввод массива
void enter_array();
 
// вывод массива
void print_array();
 
int main(){
    int swit;
    bool exit = false;
    
    // вводим массив цифр
    enter_array();
    
    // вводим разделитель символов
    cout << "Введите символ-разделитель: ";
    cin >> separator;
    
    
    do{
        // выбор метода сортировки
        cout << "Выберите один из трёх методов сортировки:" << endl;
        cout << "1. Метод пузырьковой сортировки (лучший, для небольшого набора чисел)" << endl;
        cout << "2. Метод Дональда Шелла (для больших массивов чисел)" << endl;
        cout << "3. Метод Хоара (он же метод \"Быстрой сортировки\")" << endl;
        cin >> swit;
        switch(swit){
            case 0: met_0(); // временная мера
                break;
            case 1: met_1();
                break;
            case 2: met_2();
                break;
            case 3: met_3();
                break;
            default :
                cout << "..." << endl;
                exit = true;
                break;
        }
    }while(exit == false);
    return 0;
}
 
void enter_array(){
    int number=1, amount=0, temp;
    
    cout << "Сколько чисел Вы хотите отсортировать?" << endl;
    cin >> amount;
    
    if(amount > 0){
        do{
            amount--;
            // ввод строки, по одному числу
            cout << "Пожалуйста, введите " << number << " число строки: ";
            cin >> temp;
            xarray_int.push_back(temp);
            number++;
        }while(amount != 0);
    }
    number--;
    cout << "Переменная number: " << number << endl;
    cout << "Переменная amount: " << amount << endl;
    cout << xarray_int.size() << endl;
}
 
// вывод массива
void print_array(){
    for(int i=0; i<xarray_int.size(); i++){
        cout << xarray_int[i];
        (i != xarray_int.size()-1) ? cout << separator : cout << endl; // если это не последний элемент - ставим после него "_"
    }
}
 
// не реализовано
int met_0(){
    
    return 0;
}
 
// Метод пузырьковой сортировки
int met_1(){
    print_array();
    
    for (int i = xarray_int.size() - 1; i > 0; --i){
        for (int j = 0; j < i; ++j){
          if (xarray_int[j] > xarray_int[j + 1]){
        //xarray_int[j] = xarray_int[j + 1];
        xarray_int[j] ^= xarray_int[j+1] ^= xarray_int[j] ^= xarray_int[j+1];
          }
        }
    }
    
    print_array();
    return 0;
}
 
// Метод Дональда Шелла
int met_2(){
    cout << "Принял:" << endl;
    print_array();
    int j,p;
    double min;
    for(int m=xarray_int.size()/2; m; m=m/2){ //постоянно уменьшаем шаг от count/2 до 1(разбиваем массив на группы)
        for(int k=0; k<m; k++) //двигаемся внутри группы
        for(int i=m+k; i<xarray_int.size(); i+=m){ //сортировка вставками с учётом шага
            min=xarray_int[i];
            for(j=k;j<i;j+=m)
            if(xarray_int[j]>min) break;
            for(p=i-m; p>=j; p-=m)
            xarray_int[p+m] = xarray_int[p];
            xarray_int[j] = min;
        }
    }
    cout << "Выдал:" << endl;
    print_array();
    return 0;
}
 
// Метод Хоара
int met_3(){
    cout << "Было:" << endl;
    print_array();
    heir_met_3(0, xarray_int.size()-1);
    cout << "Стало:" << endl;
    print_array();  
    return 0;
}
 
void heir_met_3(int left, int right){
    int i = left, j = right, temp;
    int pivot = xarray_int[(left + right) / 2];
 
    // разделение
    while (i <= j) {
        while (xarray_int[i] < pivot)
        i++;
        while (xarray_int[j] > pivot)
        j--;
        if (i <= j) {
            temp = xarray_int[i];
            xarray_int[i] = xarray_int[j];
            xarray_int[j] = temp;
            i++;
            j--;
        }
    };
 
    // рекурсия
    if (left < j)
    heir_met_3(left, j);
    if (i < right)
    heir_met_3(i, right);
}
// (метод Хоара или "Быстрая сортировка" - использует стратегию «разделяй и властвуй».)


Примерное разбитие на файлы (мои предположения):
* header.h - тут что то интересное))))
* main - начало программы
* enter_array - тут вводим массив
* print_array - тут выводим массив
* met_0-3 - файл, с методами сортировки (или стоит разделить?)

Очень прошу помочь, буду использовать в дальнейшем, в качестве шаблона...

Советам и комментариям по коду так же буду рад!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.11.2012, 23:15     Разбить main.cpp на файлы
Посмотрите здесь:

Разбить исходный код на main.cpp и my.h - C++
#include &lt;windows.h&gt; #include &lt;iostream&gt; using namespace std; class vremya { public: int vvod(); int vivod(); ...

Main.cpp In file included from main.cpp - C++
//class.cpp #include &quot;class.h&quot; Ticket::Ticket() { prise = 0; marshrut = &quot;none&quot;; time = &quot;none&quot;; ...

Использование указателя AP в main.cpp крашит приложение - C++
System.h class System {...}; static LRESULT CALLBACK MainWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); ...

Ошыбка File1.cpp(29): E2467 'main()' cannot return a value - C++
#include&lt;stdio.h&gt; #include&lt;conio.h&gt; #include&lt;math.h&gt; #define pi 3.14159 //Прототип функцій: float BitshPoverhnja (float rc,...

Разбить на два файла .h и .cpp - C++
Ребят, подскажите, как правильно разбить эту программу на два файла .h и .cpp #include &lt;math.h&gt; #include &lt;iostream&gt; class...

Как разбить код на несколько *.CPP* - C++
Как разбить код на несколько *.CPP* Добрый вечер - при изучении языка С где то в литературе видемо упустил такую информацию и не где...

Надо поменять файл main.cpp, подстроив его под другие - C++
помогите, пожалуйста, надо исправить файл main.cpp под остальные 3 файла, что бы все нормально работало. Заголовочные файлы ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
24.11.2012, 23:19     Разбить main.cpp на файлы #2
margarin, прототипы в хидер файлы, реализацию в сипипи

Добавлено через 1 минуту
Цитата Сообщение от margarin Посмотреть сообщение
vector<int> xarray_int; // мутим супер, пупер векторный массив
А для начало избавьтесь от глобальных переменных.
margarin
36 / 36 / 0
Регистрация: 02.06.2012
Сообщений: 332
24.11.2012, 23:25  [ТС]     Разбить main.cpp на файлы #3
Хорошо, сейчас займусь этим процессом...

Не по теме:

Цитата Сообщение от go Посмотреть сообщение
избавьтесь от глобальных переменных
скажу так, было желание от них избавится - очень часто рекомендуют на всех форумах. Но, до сих пор не смог понять почему...)

go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
24.11.2012, 23:26     Разбить main.cpp на файлы #4
Цитата Сообщение от margarin Посмотреть сообщение
скажу так, было желание от них избавится - очень часто рекомендуют на всех форумах. Но, до сих пор не смог понять почему...)
Вашы функции не становятся не универсальными.

Добавлено через 18 секунд
Цитата Сообщение от margarin Посмотреть сообщение
буду использовать в дальнейшем, в качестве шаблона...
Тогда лучше их сделать шаблонными.
margarin
36 / 36 / 0
Регистрация: 02.06.2012
Сообщений: 332
24.11.2012, 23:26  [ТС]     Разбить main.cpp на файлы #5
Цитата Сообщение от go Посмотреть сообщение
прототипы в хидер файлы, реализацию в сипипи
дык я так делал...

Не по теме:

что то не сошлось, решил что лучше покажу мастерам)

go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
24.11.2012, 23:27     Разбить main.cpp на файлы #6
Цитата Сообщение от margarin Посмотреть сообщение
что то не сошлось, решил что лучше покажу мастерам)
Цитата Сообщение от go Посмотреть сообщение
А для начало избавьтесь от глобальных переменных.
Вот почему так нельзя. Сами на эти грабли наступили.
margarin
36 / 36 / 0
Регистрация: 02.06.2012
Сообщений: 332
26.11.2012, 12:57  [ТС]     Разбить main.cpp на файлы #7
go, что то я не пойму, а на векторный массив "int *xarray_int" не прокатит?
как правильно указатель на вектор поставить?

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
#include <stdlib.h>
#include <iostream>
#include <string.h>
#include <stdint.h>
#include <limits.h>
#include <vector>
#include <iomanip>
#include <math.h>
#include <time.h>
 
using namespace std;
 
int met_0(int *);
int met_1(int *);
int met_2(int *);
int met_3(int *);
void heir_met_3(int *, int, int); // доп. функция для "Быстрой сортировки"
 
 
int enter_array(int *);
void print_array(int *);
 
int main(){
    int swit;
    bool exit = false;
    
    vector<int> xarray_int; // мутим супер, пупер векторный массив
    char separator;
    enter_array(xarray_int);
    cout << "Введите символ-разделитель: ";
    cin >> separator;
    do{
        cout << "Выберите один из трёх методов сортировки:" << endl;
        cout << "1. Метод пузырьковой сортировки (лучший, для небольшого набора чисел)" << endl;
        cout << "2. Метод Дональда Шелла (для больших массивов чисел)" << endl;
        cout << "3. Метод Хоара (он же метод \"Быстрой сортировки\")" << endl;
        cin >> swit;
        cout << "До:" << endl;
        print_array(xarray_int, separator);
        switch(swit){
            case 0:
                met_0(xarray_int); // временная мера
                break;
 
            case 1: 
                met_1(xarray_int); // метод пузырька
                break;
 
            case 2: 
                met_2(xarray_int); // метод Шелла
                break;
 
            case 3: 
                met_3(xarray_int); // метод Хоара
                break;
 
            default :
                cout << "Зря Вы так..." << endl;
                exit = true;
                break;
        }
        cout << "После:" << endl;
        print_array(xarray_int, separator);
    }while(exit == false);
    return 0;
}
 
int enter_array(int *xarray_int){
    int number=1, amount=0, temp;
    
    cout << "Сколько чисел Вы хотите отсортировать?" << endl;
    cin >> amount;
    
    if(amount > 0){
        do{
            amount--;
            // ввод строки, по одному числу
            cout << "Пожалуйста, введите " << number << " число строки: ";
            cin >> temp;
            xarray_int.push_back(temp);
            number++;
        }while(amount != 0);
    }
    number--;
    cout << "Переменная number: " << number << endl;
    cout << "Переменная amount: " << amount << endl;
    cout << xarray_int.size() << endl;
    
    return xarray_int;
}
 
// вывод массива
void print_array(int *xarray_int, char separator){
    for(int i=0; i<xarray_int.size(); i++){
        cout << xarray_int[i];
        (i != xarray_int.size()-1) ? cout << separator : cout << endl; // если это не последний элемент - ставим после него separator
    }
}
 
// не реализовано
int met_0(int *xarray_int){
    
    return 0;
}
 
// Метод пузырьковой сортировки
int met_1(int *xarray_int){
    //print_array();
    //cout << "результат:\n" << endl;
    
    for (int i = xarray_int.size() - 1; i > 0; --i){
        for (int j = 0; j < i; ++j){
          if (xarray_int[j] > xarray_int[j + 1]){
        //xarray_int[j] = xarray_int[j + 1];
        xarray_int[j] ^= xarray_int[j+1] ^= xarray_int[j] ^= xarray_int[j+1];
          }
        }
    }
    
    //print_array();
    return 0;
}
 
// Метод Дональда Шелла
int met_2(int *xarray_int){
    int j,p;
    double min;
    for(int m=xarray_int.size()/2; m; m=m/2){//постоянно уменьшаем шаг от count/2 до 1(разбиваем массив на группы)
        for(int k=0; k<m; k++)//двигаемся внутри группы
        for(int i=m+k; i<xarray_int.size(); i+=m){//сортировка вставками с учётом шага
            min=xarray_int[i];
            for(j=k;j<i;j+=m)
            if(xarray_int[j]>min) break;
            for(p=i-m; p>=j; p-=m)
            xarray_int[p+m] = xarray_int[p];
            xarray_int[j] = min;
        }
    }
    //cout << "...:" << endl;
    //print_array();
    return 0;
}
 
// Метод Хоара
int met_3(int *xarray_int){
    heir_met_3(xarray_int, 0, xarray_int.size()-1);
    return 0;
}
 
void heir_met_3(int *xarray_int, int left, int right){
    int i = left, j = right, temp;
    int pivot = xarray_int[(left + right) / 2];
 
    // разделение
    while (i <= j) {
        while (xarray_int[i] < pivot)
        i++;
        while (xarray_int[j] > pivot)
        j--;
        if (i <= j) {
            temp = xarray_int[i];
            xarray_int[i] = xarray_int[j];
            xarray_int[j] = temp;
            i++;
            j--;
        }
    };
 
    // рекурсия
    if (left < j)
    heir_met_3(xarray_int, left, j);
    if (i < right)
    heir_met_3(xarray_int, i, right);
}

...
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
26.11.2012, 16:27     Разбить main.cpp на файлы #8
margarin,
C++
1
2
3
4
5
6
template<typename T>
void MyFun(std::vector<T> &vec);
 
 
std::vector<int> vec;
MyFun(vec);
margarin
36 / 36 / 0
Регистрация: 02.06.2012
Сообщений: 332
27.11.2012, 13:07  [ТС]     Разбить main.cpp на файлы #9
Работает, только есть проблема, выручай))
Вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
template<typename T>
void MyFun(std::vector<T> &vec){
    for(int i=0; i<vec.size(); i++){
        std::cout << vec[i] << std::endl;
    }
    int temp2;
    std::cin >> temp2;
    vec.push_back(temp2);
    std::cout << "MyFun: " << vec.size() << std::endl;
};
 
int main(){
    int temp;
    std::vector<int> vec;
    std::cin >> temp;
    vec.push_back(temp);
    std::cout << "Main1: " << vec.size() << std::endl;
    MyFun(vec);
    std::cout << "Main2: " << vec.size() << std::endl;
    
    return 0;
}
Это конечно же замечательно, но мне то нужно прототип в h файл пихать? а его сделать не получается, так как не очень понял, какой тип писать в прототип (попробовал несколько вариантов - не подошли)?
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
28.11.2012, 00:05     Разбить main.cpp на файлы #10
margarin, протип в h. Покажите как у Вас.
margarin
36 / 36 / 0
Регистрация: 02.06.2012
Сообщений: 332
28.11.2012, 01:40  [ТС]     Разбить main.cpp на файлы #11
go, мы наверное друг друга не поняли...
Я привел этот кусочек кода для примера и последующих тестов над этой проблемой.
И прототип у меня не получилось создать даже в этом куске. Я уверен, что если получится всё сделать в этом (простом) коде - то я как минимум пойму и смогу уже проводить такое в будущем...
Если требуется более точно поставить вопрос,
C++
1
2
3
4
void MyFun(std::vector<T> &vec); //прототип
...
void MyFun(std::vector<T> &vec){
}
как правильно?
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
28.11.2012, 22:37     Разбить main.cpp на файлы #12
margarin, весь шаблон пихайте в .h файл. Так лучше.
margarin
36 / 36 / 0
Регистрация: 02.06.2012
Сообщений: 332
28.11.2012, 23:21  [ТС]     Разбить main.cpp на файлы #13
go, хорошо, так и сделаю...
А нет, не хорошо. У меня же не один прототип...

Может лучше класс сделать в хедере?

Добавлено через 3 минуты
или не поможет?
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
28.11.2012, 23:32     Разбить main.cpp на файлы #14
Цитата Сообщение от margarin Посмотреть сообщение
Может лучше класс сделать в хедере? Добавлено через 3 минуты
или не поможет?
Целесообразнее сделать так
Цитата Сообщение от go Посмотреть сообщение
весь шаблон пихайте в .h файл. Так лучше.
Цитата Сообщение от margarin Посмотреть сообщение
А нет, не хорошо. У меня же не один прототип...
Сразу реализацию в h файл. Я бы так сделал, зачем здесь сильно углубляться. Все ведь еще и от компилятора зависит.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.11.2012, 01:10     Разбить main.cpp на файлы
Еще ссылки по теме:

как разбить программу на 2 файла main и solution? - C++
Не понимаю, как разбить данную программу так, чтобы в одном файле задавались переменные, а в другом было само решение? #include...

Файлы .cpp и .h - C++
Добрый день! Подскажите, пожалуйста, как в программу добавить файлы .cpp и .h? Эти файлы уже написаны и их осталось только подключить к...

.h и .cpp файлы - C++
Если я объявляю в одном .h файле 3 класса, то могу ли я сделать полное определение методов для 3 классов в одном .cpp файле?

Файлы .h и .cpp - C++
Мне надо подключить несколько файлов к проекту. Какие надо использовать .h или .cpp ? И вообще какая между ними разница???

Заголовочные файлы .h и .cpp - C++
Создаю библиотеку для работы с матрицами (функции): matrix.cpp: namespace MatrixFuncs { double...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
margarin
36 / 36 / 0
Регистрация: 02.06.2012
Сообщений: 332
29.11.2012, 01:10  [ТС]     Разбить main.cpp на файлы #15
Цитата Сообщение от go Посмотреть сообщение
Целесообразнее сделать так
ну значит начну копать в эту сторону)
Я так понимаю это будет небольшой класс...

Не по теме:

А вот вопрос, переменные в привате или паблике будут?
честно говоря с классами ещё не очень подружился...

Yandex
Объявления
29.11.2012, 01:10     Разбить main.cpp на файлы
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru