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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Даны кординаты вершин двоих треугольников. Определить, какой из них имеет большую площадь http://www.cyberforum.ru/cpp-beginners/thread1304890.html
Даны кординаты вершин двоих треугольников. Определить, какой из них имеет большую площину.
C++ Хранение данных на внешних носителях Постановка задачи 1.Используя ввод-вывод в стиле С создать файл и записать в него структурированные данные. 2.Вывести созданный файл на экран. 3.Удалить из файла данные в соответствии с вариантом. 4.Добавить в файл данные в соответствии с вариантом. 5.Вывести измененный файл на экран. 6.Используя ввод-вывод в стиле С++ создать файл и записать в него структурированные данные. 7.Вывести... http://www.cyberforum.ru/cpp-beginners/thread1304889.html
C++ Чтение бинарного файла в поток std::ifstream и вывод в другой бинарный файл std::ofstream (создание копии)
Проверил работу программы на маленькой картинке(744 байт). Все работает. С несколько бОльшими файлами(512КБ) нет. Суть задачи в том, чтобы считать бинарный файл(например *.exe) в поток, сохранить эту информацию в объект-строку типа std::string и оттуда вывести информацию в новый бинарный файл(фактичекски копию). P.S. Эта строка будет передаваться в составе HTTP ответа на запрос в качестве...
Вызов деструктора для класса в векторе C++
Уважаемые знатоки, подскажите по-поводу деструктора класса, а то я совсем запутался вот в такой ситуации: - есть класс - Ship; - от него унаследовано два класса - BigShip, SmallShip; - затем я создаю глобальный вектор указателей на базовый класс - vector<Ship*> Ships(10); - по указателям выделяю память Ships = new BigShip; Ships = new SmallShip;... Ships = new BigShip; И вот нужно ли в...
C++ Дано два одномерных массива размерностью n, сложить сумму этих массивов и найти наибольшее значение http://www.cyberforum.ru/cpp-beginners/thread1304875.html
Дано два одномерных массива размерностью n, сложить сумму этих массивов и найти наибольшее значение. Решите пожалуйста :)
C++ Вывести список всех файлов из указанной директории Помогите сделать , в задание нужно Вывести список всех файлов из указанной директории, имена которых не соответствуют шаблону имени 8.3. подробнее

Показать сообщение отдельно
jackiebgood
0 / 0 / 0
Регистрация: 19.11.2014
Сообщений: 15
19.11.2014, 12:48     Модульное программирование и классы C++ (проблема слияния)
Добрый день! Есть задание сделать алгоритм нахождения минимального пути из точек. Задание кое как сделал в мейн.цпп, все работало прекрасно, но преподавателю нужно чтобы я его сделал в виде модулей. Я создал .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);

Пробовал сделать функции методами, не получилось. На более неговенный код пока что не хватает знаний, но пока смог написать только так. Расскажите как можно модульно завернуть этот код. Заранее спасибо!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 06:57. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru