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

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

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

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

19.11.2014, 12:48. Просмотров 407. Ответов 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++
Прошу помощи в решении моей задачи.Заранее благодарен. &quot;Модульное программирование&quot; Примечание. Разместить определение данных в...

Модульное программирование в с++ - C++
Привет всем. Проблема такая.. Есть модуль данных. Так вот надо мне использовать эти переменные (или константы) в других модулях. В...

Модульное программирование - C++
Привет форумчане! В общем, решил сделать модуль с 3-мя ф-циями: mod.h void ChangeNumber(sport * obj, int n); void...

Модульное программирование. Не получается разбить на модули - C++
Всем привет! Скажу сразу, знание в программирование ниже среднего, но для выполнения выданного задания я кое-как программу написал, то...

Шаблоны функциональных классов, модульное программирование - C++
Пишу лабораторную по C++. Суть состоит в том, что нужно описать шаблоны функциональных классов, методы которых должны быть описаны вне...

Идентификатор не определён (работа с файлами заголовка, модульное программирование) - C++
У меня есть класс в файле имя_класса.h Есть реализация методов, конструктора и деструктора в файле имя_класса.cpp Другой файл 3.cpp...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.11.2014, 12:48
Привет! Вот еще темы с ответами:

Классы. Программирование линейных алгоритмов - C++
Помогите плиз решить задачку. Пользовательский класс должен содержать необходимые элементы-данные, метод установки их начальных...

Классы. Программирование линейных алгоритмов с использованием конструктора, деструктора, - C++
Классы. Программирование линейных алгоритмов с использованием конструктора, деструктора, friend - функции инициализации set() и функции...

Классы. Программирование алгоритмов с использованием конструктора, деструктора, friend - функции инициализации set() и функции вывода результатов prin - C++
Братаны, выручайте!:help: Общая постановка. Пользовательский класс Х должен содержать необходимые элементы-данные, которые создаются в...

Классы. Программирование алгоритмов с использованием конструктора, деструктора, friend - функции инициализации set() и функции вывода результатов pri - C++
Братаны, выручайте! Общая постановка. Пользовательский класс Х должен содержать необходимые элементы-данные, которые создаются в...


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

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

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