Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
Affteron
7 / 0 / 1
Регистрация: 14.09.2013
Сообщений: 19
1

Проект из нескольких файлов

20.12.2014, 21:30. Просмотров 526. Ответов 8
Метки нет (Все метки)

Здравствуйте. Решая задачу на нахождение количества связных компонент графа решил вынести алгоритм поиска в ширину в отдельный файл. Программа работает, но очень интересно правильно ли я это сделал?

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
#define _CRT_SECURE_NO_WARNINGS
#include "BFS.H"
#include "iostream"
#include "queue"
#include "vector"
#include "fstream"
 
using namespace std;
 
int main(){
    int V; //Кол-во вершин
    int E; //Кол-во рёбер
    int start = 0; //Начальная вершина
    int k = 1; //Счётчик компонент связности графа
    ifstream in("input.txt");
    ofstream out("output.txt");
    in >> V >> E;
    vector <bool> used(V); // Вектор посещённых вершин
    vector <vector <int>> graph(V); //Граф в виде списка смежности
    for (int i = 0; i < E; i++){ //Заполнение вектора векторов
        int a, b;
        in >> a >> b;
        graph[a].push_back(b);
        graph[b].push_back(a); //В случае орграфа или смешанного графа данная строка не нужна
    }
    bfs(start, used, graph);
    for (int i = 0; i < used.size(); i++){
        if (!used[i]){
            bfs(i, used, graph);
            k++;
        }
    }
    out << "Заданный граф:" << endl;
    for (int i = 0; i < used.size(); i++){ //Вывод графа в формате "номер вершины": "номера смежных вершин"
        out << i << ": ";
        for (int j = 0; j < graph[i].size(); j++){
            out << graph[i][j] << " ";
        }
        out << endl;
    }
    out << endl << endl;
    out << "Количество связных компонент графа: " << k; 
    return 0;
}


BFS.h:
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
#ifndef BFS_H
#define BFS_H
#include "vector"
 
using namespace std;
 
void bfs(int start, vector <bool> &used, vector <vector <int>> &graph);
 
#endif BFS_H


bfs.cpp:
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include "BFS.h"
#include "queue"
#include "vector"
 
using namespace std;
 
void bfs(int start, vector <bool> &used, vector <vector <int>> &graph){ //Функция выполняющая поиск в ширину 
    queue<int> q;
    q.push(start);
    used[start] = true;
    while (!q.empty()){
        int v = q.front();
        q.pop();
        for (int i = 0; i < graph[v].size(); i++){
            int to = graph[v][i];
            if (!used[to]){
                q.push(to);
                used[to] = true;
            }
        }
    }
}


Заранее спасибо!

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.12.2014, 21:30
Ответы с готовыми решениями:

Проект из нескольких файлов
Выдает ошибку: error C3861: test: идентификатор не найден. и warning C4627:...

Проект из нескольких файлов
Всем привет. Столкнулся с проблемой. Использую codeblocks, совсем тривиальный...

Как скомпилировать проект из нескольких файлов?
Интересует компиляция данного проекта. Извините, если что-то не так |: Пункт...

Как правильно организовывать проект из нескольких файлов?
В данный момент отрыл свой старый проект (и тогда был новичком и сейчас, два...

Подключение файлов в проект
Здравствуйте. Запутался немного с подключением файлов, подскажите как лучше...

8
Croessmah
++Ͻ
14776 / 8452 / 1605
Регистрация: 27.09.2012
Сообщений: 20,800
Записей в блоге: 2
Завершенные тесты: 1
20.12.2014, 22:12 2
вот это
C++
1
using namespace std;
я бы убрал из заголовочного файла.
C++
1
2
3
    ifstream in("input.txt");
    ofstream out("output.txt");
    in >> V >> E;
а если какой косяк и файл не откроется? Проверяйте перед использованием
1
Affteron
7 / 0 / 1
Регистрация: 14.09.2013
Сообщений: 19
22.12.2014, 17:21  [ТС] 3
Спасибо за ответ)
Если убрать
C++
1
using namespace std;
из BFS.h, то появляются ошибки:
Кликните здесь для просмотра всего текста

1>c:\users\andrew\documents\visual studio 2013\projects\my_bfs\my_bfs\bfs.h(6): error C2061: синтаксическая ошибка: идентификатор "vector"
1>c:\users\andrew\documents\visual studio 2013\projects\my_bfs\my_bfs\main.cpp(26): error C2660: bfs: функция не принимает 3 аргументов
1>c:\users\andrew\documents\visual studio 2013\projects\my_bfs\my_bfs\main.cpp(27): warning C4018: <: несоответствие типов со знаком и без знака
1>c:\users\andrew\documents\visual studio 2013\projects\my_bfs\my_bfs\main.cpp(29): error C2660: bfs: функция не принимает 3 аргументов
1>c:\users\andrew\documents\visual studio 2013\projects\my_bfs\my_bfs\main.cpp(34): warning C4018: <: несоответствие типов со знаком и без знака
1>c:\users\andrew\documents\visual studio 2013\projects\my_bfs\my_bfs\main.cpp(36): warning C4018: <: несоответствие типов со знаком и без знака

Можно ли сделать проверку так?
C++
1
2
3
4
if (!in.is_open() || !out.is_open()){
        cout << "Error: file can't be opened!";
        return 0;
    }
0
lss
930 / 859 / 355
Регистрация: 10.10.2012
Сообщений: 2,705
22.12.2014, 17:39 4
Цитата Сообщение от Affteron Посмотреть сообщение
Если убрать
C++
1
using namespace std;
из BFS.h, то появляются ошибки:
std::, перед vector, в параметрах функции добавили?

Добавлено через 3 минуты
Цитата Сообщение от Affteron Посмотреть сообщение
Можно ли сделать проверку так?
Можно.
1
Affteron
7 / 0 / 1
Регистрация: 14.09.2013
Сообщений: 19
22.12.2014, 17:59  [ТС] 5
Сейчас BFS.h выглядит так:
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
#ifndef BFS_H
#define BFS_H
#include "vector"
 
 
void bfs(int start, std::vector <bool> &used, std::vector <vector <int>> &graph);
 
#endif BFS_H


После добавления std:: появилось 119 ошибок(Все в одно сообщение не влезают):
Кликните здесь для просмотра всего текста

1>c:\users\andrew\documents\visual studio 2013\projects\my_bfs\my_bfs\bfs.h(6): error C2065: vector: необъявленный идентификатор
1>c:\users\andrew\documents\visual studio 2013\projects\my_bfs\my_bfs\bfs.h(6): error C2062: тип "int" не требуется
1>c:\users\andrew\documents\visual studio 2013\projects\my_bfs\my_bfs\bfs.h(6): error C2976: std::vector: слишком мало аргументов шаблон
1> c:\program files (x86)\microsoft visual studio 12.0\vc\include\vector(650): см. объявление "std::vector"
1>c:\users\andrew\documents\visual studio 2013\projects\my_bfs\my_bfs\bfs.h(6): error C2143: синтаксическая ошибка: отсутствие ")" перед ">"
1>c:\users\andrew\documents\visual studio 2013\projects\my_bfs\my_bfs\bfs.h(6): error C2059: синтаксическая ошибка: >
1>c:\users\andrew\documents\visual studio 2013\projects\my_bfs\my_bfs\bfs.h(6): error C2059: синтаксическая ошибка: )
1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\typeinfo(37): fatal error C1903: не удается восстановить после предыдущих ошибок; остановка компиляции
1> bfs.cpp
1>c:\users\andrew\documents\visual studio 2013\projects\my_bfs\my_bfs\bfs.h(6): error C2065: vector: необъявленный идентификатор
1>c:\users\andrew\documents\visual studio 2013\projects\my_bfs\my_bfs\bfs.h(6): error C2062: тип "int" не требуется
1>c:\users\andrew\documents\visual studio 2013\projects\my_bfs\my_bfs\bfs.h(6): error C2976: std::vector: слишком мало аргументов шаблон
1> c:\program files (x86)\microsoft visual studio 12.0\vc\include\vector(650): см. объявление "std::vector"
1>c:\users\andrew\documents\visual studio 2013\projects\my_bfs\my_bfs\bfs.h(6): error C2143: синтаксическая ошибка: отсутствие ")" перед ">"
1>c:\users\andrew\documents\visual studio 2013\projects\my_bfs\my_bfs\bfs.h(6): error C2059: синтаксическая ошибка: >
1>c:\users\andrew\documents\visual studio 2013\projects\my_bfs\my_bfs\bfs.h(6): error C2059: синтаксическая ошибка: )
1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\algorithm(14): error C2870: std: определение пространства имен должно делаться на уровне файла или непосредственно в другом определении пространства имен
1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\algorithm(91): error C2143: синтаксическая ошибка: отсутствие ";" перед "<"
1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\algorithm(91): error C2433: iterator_traits: "inline" не разрешается для объявлений данных
1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\algorithm(91): error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию
1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\algorithm(91): error C2988: неопознанное объявление или определение шаблона
1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\algorithm(91): error C2059: синтаксическая ошибка: <
1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\algorithm(91): error C2039: difference_type: не является членом "`global namespace'"
0
lss
930 / 859 / 355
Регистрация: 10.10.2012
Сообщений: 2,705
22.12.2014, 18:46 6
Если так:
C++
1
#include <vector>
и так:
C++
1
std::vector <std::vector <int>> &graph
1
Affteron
7 / 0 / 1
Регистрация: 14.09.2013
Сообщений: 19
22.12.2014, 19:01  [ТС] 7
Заработало!) Спасибо!)
А в чём разница между #include "vector" и #include <vector>?
И почему лучше приписывать std::, а не просто написать using namespace std?
0
lss
930 / 859 / 355
Регистрация: 10.10.2012
Сообщений: 2,705
22.12.2014, 19:10 8
Цитата Сообщение от Affteron Посмотреть сообщение
А в чём разница между #include "vector" и #include <vector>?
Не знаю насколько строго разные компиляторы к этому относятся, но в кавычки помещают имена своих хедеров (которые находятся в папке проекта), а в угловые скобки - имена хедеров компилятора (библиотечных).
Цитата Сообщение от Affteron Посмотреть сообщение
И почему лучше приписывать std::, а не просто написать using namespace std?
В заголовочных файлах ктегорически (во избежание непонятных ошибок) не рекомендуется использовать ни директивы, ни объявления using, только std::. Почитать об этом можно в: Г.Саттер "Решение сложных задач на C++".
1
Croessmah
++Ͻ
14776 / 8452 / 1605
Регистрация: 27.09.2012
Сообщений: 20,800
Записей в блоге: 2
Завершенные тесты: 1
22.12.2014, 20:05 9
Цитата Сообщение от lss Посмотреть сообщение
Не знаю насколько строго разные компиляторы к этому относятся, но в кавычки помещают имена своих хедеров (которые находятся в папке проекта), а в угловые скобки - имена хедеров компилятора (библиотечных).
16.2 Source file inclusion
2.
A preprocessing directive of the form

#include <h-char-sequence> new-line

searches a sequence of implementation-defined places for a header identified uniquely by the specified sequence between the < and > delimiters, and causes the replacement of that directive by the entire contents of the header. How the places are specified or the header identified is implementation-defined.
3.
A preprocessing directive of the form

#include "q-char-sequence" new-line

causes the replacement of that directive by the entire contents of the source file identified by the specified sequence between the " delimiters. The named source file is searched for in an implementation-defined manner. If this search is not supported, or if the search fails, the directive is reprocessed as if it read

#include <h-char-sequence> new-line

with the identical contained sequence (including > characters, if any) from the original directive.
1
22.12.2014, 20:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.12.2014, 20:05

Чтение из нескольких файлов
Доброго времени суток. Подскажите как сделать чтобы программа считывала данные...

Компиляция нескольких файлов
Создал проект на wxDevC++ таким образом: потом создал три файла в проекте:...

Компиляция нескольких файлов
Здравствуйте, есть программа состоящая из 4 cpp, необходимо ее собрать,...


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

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

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