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

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

Войти
Регистрация
Восстановить пароль
 
jackiebgood
0 / 0 / 0
Регистрация: 19.11.2014
Сообщений: 15
#1

Модульное программирование и классы C++ (проблема слияния) - C++

19.11.2014, 12:48. Просмотров 395. Ответов 0
Метки нет (Все метки)

Добрый день! Есть задание сделать алгоритм нахождения минимального пути из точек. Задание кое как сделал в мейн.цпп, все работало прекрасно, но преподавателю нужно чтобы я его сделал в виде модулей. Я создал .h и .cpp, в h я закинул сам класс и его описание, прототипы функций. В срр закинул описание функций и конструктора. Компилятор много жалуется
Error 5 error LNK1120: 2 unresolved externals otrabotka klass1
Error 4 error LNK2019: unresolved external symbol "bool __cdecl cmp(class edge const &,class edge const &)" (?cmp@@YA_NABVedge@@0@Z) referenced in function _main otrabotka klass1
Error 3 error LNK2019: unresolved external symbol "bool __cdecl unite(int &,int &)" (?unite@@YA_NAAH0@Z) referenced in function _main otrabotka klass1
7 IntelliSense: more than one instance of overloaded function "unite" matches the argument list:
function "unite(int &x, int &y)"
function "unite(int x, int y)"
argument types are: (int, int) otrabotka klass1
итд
Пробовал закинуть класс и описание его конструктора в отдельный модуль там тоже куча проблем, искал в интернете там вроде с #indef как то решается.

main

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
#include "stdafx.h"
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include "Header2.h"
 
using namespace std;
    vector <int> leader;//вспомогательный вектор
 
 
int main()
{
    int n, m;// устанавливаем количество вершин и ребер
    while (true)// бесконечный цикл
    {
    cout << "Enter number of tops --> ";//вывод на экран
    cin >> n;//ввод количества вершин                 
    m = n*(n-1)/2;//вычисление количества ребер
    cout << "Enter number of edges is "<< m <<endl ;//вывод на экран
    if (n <= 3)// рассматривать менее 4 вершин в данном алгоритме бессмысленно
    {
        cout << "\nERROR, Value is incorrect\n";//вывод на экран
        continue;//следующая итерация
    }
    break;//выход из цикла
    }
    int j = 1;//вспомогательные
    int i1 = 1;//переменные
    
    vector <edge> e(m);//вектор класса ребер,в который заносим исходные значения
 
    int x=1,y,w;// вспомогательные переменные
    cout<< "\n Enter graph: \n";//вывод на экран
    int num=0;//вспомогательная переменная
    for (int i = 0; i < m; i++)//цикл 
    {
        num++;//ноомер связи
        cout<<"--------------< "<< num << " >---------------\n";//вывод
        x=j;//для 
        y = j + i1;//выбора
        if ( j+i1 == n) { j++;i1=1;}//определенных 
        else i1++;//вершин
        cout << "From "<<x<<endl;//ВЫ
        cout << "TO " << y<<endl;//ВО
        cout << "Lenght is ";//Д
        cin >> w;//ввод вес
        e[i].set_w(w);//занесение в объект значение веса
        x--;//уменьшение на 
        y--;//единицу х и у
        e[i].set_x(x);//занесение в объект х
        e[i].set_y(y);//-//- в у
        x=0,y=0,w=0;//обнуление переменных
    }
 
    sort(e.begin(), e.end(), cmp);// сортируем значения вектора по его ребрам
 
    leader.resize(n);//изменение размера глобального вектора
    for (int i = 0; i < n; i++)//заносим числа
        leader[i] = i; //по порядку
 
    vector <edge> ans;//результирующий вектор
    
    for (int i = 0; i < m; i++)//заносим отсортированные значения в результирующий вектор
    {
        int x = e[i].get_x(), y = e[i].get_y();//значения исходного в переменные
 
        if (unite(x, y))//если ребра в разных подмножествах объединяем
            ans.push_back(e[i]);//заносим в значения исходного в результирующий
    }
    int sum = 0;//сумма минимального пути
    for (int i = 0; i < ans.size(); i++)//складываем
        sum+=ans[i].get_w();//вес минимального пути
    cout << " Minimum Summa is " << sum;;//вы
    cout << endl;                       //во
    cout<< "The shortest way is :\n";  //д
    for (int i = 0; i < ans.size(); i++)//вывод самого короткого пути
    {
        cout << " FROM " <<ans[i].get_x() + 1;//из какого
        cout << " To " <<ans[i].get_y() + 1;//в какой
        cout <<endl;//на след строку
    }
    system ("pause");//стоп
    return 0;// конец мейн
}
 
int getLeader(int x) //функция: узнаем в каком множестве находится вершина 
{  
    if (x == leader[x]) return x;       //если ребро соед вершины 
     leader[x] = getLeader(leader[x]);   //  в разных подмножествах берем,
    return leader[x];                    //если нет не берем
    }
 
bool unite(int x, int y) //функция объединение вершин
{
    x = getLeader(x);// х присваевается значение через функцию гетлидер
    y = getLeader(y);//у присваевается значение через функцию гетлидер
    if (x == y) // если равно
        return false;//возвращает 0
    if (rand() % 2 == 0)// если rand() % 2 == 0
        swap(x, y);//обмен значениями
    leader[x] = y;// присваивание значения вектора с индексом х значением у
    return true;//вовзрат 1
}
 
bool  cmp( edge& a,  edge& b)// функция пердиката
{
    return a.get_w() < b.get_w();// если вес объекта а меньше веса объекта б то 1, нет 0
}
Header2.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
#include "stdafx.h"
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include "Header2.h"
using namespace std;
 
edge :: edge(int x, int y, int w)
{
    this->x = x;
    this->y = y;
    this->w = w;
}
 
int getLeader(int x)
{    
    if (x == leader[x]) return x;
 
     leader[x] = getLeader(leader[x]);    
    return leader[x];
    }
 
bool unite(int &x, int &y)
{
    x = getLeader(x);
    y = getLeader(y);
    if (x == y)
        return false;
    if (rand() % 2 == 0)
        swap(x, y);
    leader[x] = y;
    return true;
}
 
    bool cmp(const edge& a,const  edge& b) {return a.w < b.w;}
header2.h

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
#include "stdafx.h"
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
 
 
class edge
{
        int x, y, w;//вес ребра и номера вершин
public:
 
    edge(){}//конструктор по умолч
    edge(int x1, int y1, int w1);//конструктор
    void set_x ( int x1) {x = x1;}//установка
    void set_y ( int y1) {y = y1;}//значений
    void set_w ( int w1) {w = w1;}//вершин и веса
    int get_x () { return x;}//получение
    int get_y () { return y;}//значений
    int get_w () { return w;}//вершин и веса
};
 
 
int getLeader(int x);
bool unite(int &x, int &y);
bool cmp(const edge& a,const  edge& b);

Пробовал сделать функции методами, не получилось. На более неговенный код пока что не хватает знаний, но пока смог написать только так. Расскажите как можно модульно завернуть этот код. Заранее спасибо!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.11.2014, 12:48     Модульное программирование и классы C++ (проблема слияния)
Посмотрите здесь:
Модульное программирование в с++ C++
Модульное программирование C++
Модульное программирование C++
C++ Шаблоны функциональных классов, модульное программирование
C++ Идентификатор не определён (работа с файлами заголовка, модульное программирование)
Классы. Программирование линейных алгоритмов C++
Классы. Программирование линейных алгоритмов с использованием конструктора, деструктора, C++
C++ Классы. Программирование алгоритмов с использованием конструктора, деструктора, friend - функции инициализации set() и функции вывода результатов pri
Классы. Программирование алгоритмов с использованием конструктора, деструктора, friend - функции инициализации set() и функции вывода результатов prin C++
Непонятна тема (Классы содержащие другие классы, как данные члены ) C++
C++ Модульное тестирование c++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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