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

Центр орграфа, классы - C++

Восстановить пароль Регистрация
 
DREADREAD
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 12
19.07.2012, 11:09     Центр орграфа, классы #1
помогите с конструктором и деструктором)
Дан файл, первой строкой в файле является размерность матрицы, остальное является самой матрицей.
Считать в буфер размерность и матрицу из файла, и найти центр орграфа(матрица смежностей задана весами дуг).
ну и если есть идеи, мож как по проще сделать)
================================================================================
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
#include <conio.h>
#include <iostream>
#include <fstream>
#include <locale.h>
using namespace std;
class Graph
{
      int n;
      public:
             void Read(void);
             Graph();
             ~Graph();
 
}g;
Graph::Graph()
{
int d[n];
}
 
Graph::~Graph()
{
int d;int i;        
for (i=0;i<n*n;i++)
delete d[i];
}
              
int Graph::Read() //fstream.h
{
     int max[255];
     int min=0;
     int k=0;
     int b=0;
     char r[255];
     FILE *graph;
     if(graph=fopen("Graph.txt","r"))
     else {cout<<"ГЋГёГЁГЎГЄГ* Г·ГІГҐГ*ГЁГї"<<endl;return 0;}
     fsscanf(graph,"%d",r[0]);
     if (r[0])n=r[0]-48;//Ñ÷èòûâГ*ГҐГ¬ êîëè÷åñòâî ñòðîê ГЁ ñòîëáöîâ
     else {cout<<"Г”Г*éë ïóñòîé"<<endl;return 0;}
     int **d = new int*[n];//ÄèГ*Г*ìè÷åñêè âûäåëÿåì ГЇГ*ìÿòü ГіГЄГ*Г§Г*òåëü->ГіГЄГ*Г§Г*òåëü(äëÿ Г¬Г*òðèöû)
     for(int i=0; i<n; i++)
     d[i] = new int[n];//Âûäåëèëè ÀÒËÈ××ÍÀ
     
     for(int i=0;i<n;i++)
     for(int j=0;j<n;j++)
     {
             fscanf(graph,"%d",&d[i][j];//Ñ÷èòûâГ*ГҐГ¬ Г¬Г*òðèöó Гў ГЎГіГґГҐГ°
     }
     graph.close("Graph.txt");
     for(i=0;i<n;i++)
     for(j=0;j<n;j++)
     for(l=0;l<n;l++)
     if ((d[i][l]>d[i][j]+d[j][l]||d[i][l]<0)&&d[i][j]>=0&&d[j][l]>=0)
     d[i][l]=d[i][j]+d[j][l];//Àëãîðèòì ôëîéäГ* äëÿ Г*Г*õîæäåГ*ГЁГї ГЄГ°Г*ГІГ·Г*éøèõ ГЇГіГІГҐГ© Гµ_Гµ
     for(j=0;j<n;j++)//ÏÎëó÷èëè âåðøèГ*Г» Г± Г¬Г*ГЄГ±ГЁГ¬Г*ëüГ*ûì ГЅ., Г*Г*õîäèì ìèГ*ГЁГ¬Г*ëüГ*ГіГѕ ГЁГ§ Г*ГЁГµ, Г®Г*Г* ГЁ áóäåò ÿâëÿòñÿ öåГ*òðîì îðãðГ*ГґГ*
     for(i=0;i<n;i++)
     {
      p++;
         if(d[i][j]>max[b])      max[b]=d[i][j];
         if(p==n)                {b++;p=0;}
     }
     for(int i=0;i<b;i++)
     if(max[b]<min)
     min=max[b];
     cout<<"Г–ГҐГ*ГІГ° îðãðГ*ГґГ* >"<<min<<endl;
}
     
 
//==========================================ГЊГҐГ*Гѕ=======================================//
int main(void)
{
    setlocale(LC_ALL,"rus");
    int key = 0;
    do {
        cout<<"1-Read\n esp for exit"<<endl;
        key = getch();
        switch (key)
        {     
               case 49: g.Read;break;
               
        }}
        while (key!=27);
        
        return 0;
}
//=====================================================================================//
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5950 / 5555 / 1786
Регистрация: 18.12.2011
Сообщений: 14,195
Завершенные тесты: 1
19.07.2012, 15:29     Центр орграфа, классы #2
Примерно так (исправил синтаксические ошибки,
правильность алгоритма не проверял):
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
#include <conio.h>
#include <iostream>
#include <fstream>
#include <locale.h>
using namespace std;
class Graph
{
    int** d;
    int n;
public:
    void Read();
    Graph(int size);
    ~Graph();
 
};
Graph::Graph(int size)
{
    n=size;
// по хорошему надо сюда перенести создание массива
//    d = new int*[n];//Динамически выделяем память указатель->указатель(для матрицы)
//    for(int i=0; i<n; i++)
//        d[i] = new int[n];//Выделили АТЛИЧЧНА
}
 
Graph::~Graph()
{
    for(int i=0; i<n; i++)
        delete[] d[i];
    delete[] d;
}
              
void Graph::Read() //fstream.h
{
     int max[255];
     int min=0;
     int k=0;
     int b=0;
     char r[255];
     FILE *graph;
     if((graph=fopen("Graph.txt","r"))==NULL)
     {cout<<"Ошибка чтения"<<endl;return;}
     fscanf(graph,"%c",&r[0]);// Читаем один символ
     if (r[0]>='0' && r[0]<='9')n=r[0]-'0';//преобразуем его в число
     else {cout<<"Файл пустой"<<endl;return;}
      
    d = new int*[n];//Динамически выделяем память указатель->указатель(для матрицы)
    for(int i=0; i<n; i++)
        d[i] = new int[n];//Выделили АТЛИЧЧНА
    for(int i=0;i<n;i++)
     for(int j=0;j<n;j++)
     {
             fscanf(graph,"%d",&d[i][j]);//Считываем матрицу в буфер
     }
     fclose(graph);
     int i,j,l;
     for(i=0;i<n;i++)
     for(j=0;j<n;j++)
     for(l=0;l<n;l++)
     if ((d[i][l]>d[i][j]+d[j][l]||d[i][l]<0)&&d[i][j]>=0&&d[j][l]>=0)
     d[i][l]=d[i][j]+d[j][l];//Алгоритм флойда для нахождения кратчайших путей х_х
     int p=0;
     for(j=0;j<n;j++)//ПОлучили вершины с максимальным э., находим минимальную из них, она и будет являтся центром орграфа
     for(i=0;i<n;i++)
     {
      p++;
         if(d[i][j]>max[b])      max[b]=d[i][j];
         if(p==n)                {b++;p=0;}
     }
     for(int i=0;i<b;i++)
     if(max[b]<min)
     min=max[b];
     cout<<"Центр орграфа >"<<min<<endl;
}
     
 
//==========================================Меню=======================================//
int main(void)
{
    int Size;
    cout<<"Enter size";
    cin>>Size;
    Graph g(0);
    int key = 0;
    do 
    {
        cout<<"1-Read\n esp for exit"<<endl;
        key = getch();
        switch (key)
        {     
               case 49: g.Read();break;
               
        }
    }while (key!=27);
    return 0;
}
DREADREAD
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 12
20.07.2012, 22:22  [ТС]     Центр орграфа, классы #3
zss, вы в каком компиляторе работаете? у меня в деве выдает
16 C:\Users\DreaD\Documents\fasdjk.cpp no matching function for call to `Graph::Graph()'
note C:\Users\DreaD\Documents\fasdjk.cpp:7 candidates are: Graph::Graph(const Graph&)
note C:\Users\DreaD\Documents\fasdjk.cpp:7 Graph::Graph(int)
zss
Модератор
Эксперт С++
 Аватар для zss
5950 / 5555 / 1786
Регистрация: 18.12.2011
Сообщений: 14,195
Завершенные тесты: 1
20.07.2012, 22:35     Центр орграфа, классы #4
Почему-то Ваш компилятор требует конструктора без параметров.
Попробуйте в 16 строчке добавить значение по умолчанию:
Graph::Graph(int size=0)
DREADREAD
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 12
20.07.2012, 23:10  [ТС]     Центр орграфа, классы #5
zss,
спасибо, еще интересует такой вопрос, как происходит построение объекта?
при компилировании сначала вызывается конструктор? и он построит мне матрицу размерностью n*n, и это n хранится в файле, в общем можно сначала считать с файла первую строку а потом уже строить объект?
zss
Модератор
Эксперт С++
 Аватар для zss
5950 / 5555 / 1786
Регистрация: 18.12.2011
Сообщений: 14,195
Завершенные тесты: 1
21.07.2012, 08:29     Центр орграфа, классы #6
Если объект объявлен обычным образом Graph g(0);
то он создается (и вызывается конструктор)
в том месте где объявлен и удаляется (деструктор)при выходе из
соответствующего блока {....}.
DREADREAD
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 12
21.07.2012, 12:28  [ТС]     Центр орграфа, классы #7
zss, а можно в конструктор запихать метод класса?
C
1
2
3
4
5
6
7
8
9
10
11
int Graph::Support()
{
     FILE *graph;
          if((graph=fopen("Graph.txt","r"))==NULL)
     {cout<<"Ошибка чтения"<<endl;return;}
     fscanf(graph,"%c",&r[0]);// Читаем один символ
     if (r[0]>='0' && r[0]<='9')n=r[0]-'0';//преобразуем его в число
     else {cout<<"Файл пустой"<<endl;return 0;}
    fclose(graph);
     return n;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.07.2012, 12:34     Центр орграфа, классы
Еще ссылки по теме:

Вывести на экран вершины орграфа, смежные с данной C++
C++ Существует ли путь из a в b через одну вершину орграфа?
Определение радиуса и соответствующего радиусу пути взвешенного орграфа на основе алгоритма Дейкстры C++

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

Или воспользуйтесь поиском по форуму:
zss
Модератор
Эксперт С++
 Аватар для zss
5950 / 5555 / 1786
Регистрация: 18.12.2011
Сообщений: 14,195
Завершенные тесты: 1
21.07.2012, 12:34     Центр орграфа, классы #8
Конечно.
Если этот метод нужно вызывать только из других методов класса,
то сделайте его приватным
Yandex
Объявления
21.07.2012, 12:34     Центр орграфа, классы
Ответ Создать тему
Опции темы

Текущее время: 02:48. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru