pekfos |
» 2015-05-10 15:53:45 Tu nawet nie widać, co ty usiłujesz osiągnąć. Ten kod prościej będzie napisać od nowa. |
|
KamilosD Temat założony przez niniejszego użytkownika |
» 2015-05-10 15:56:23 Nie mam czasu na pisanie tego od nowa. Od kilku dni nad tym siedzę. I nie widzę sensu pisać od nowa, wszystko działa oprócz tego. |
|
pekfos |
» 2015-05-10 16:04:13 Podaj aktualny kod. Co to ma być..? |
|
KamilosD Temat założony przez niniejszego użytkownika |
» 2015-05-10 16:06:35 krawedzie tab[ kraw ]; - tutaj tworzę tablicę struktury krawedzie. Jeden element składa się na wierzchołek początkowy, końcowy i wagę. EDIT: I pewnie tutaj leży problem. Źle odwołuję się do tego obiektu #include <iostream> #include <fstream> #include <cstdlib> #include <string> #include <stdlib.h> #include <iomanip> #include <ctime> #include <conio.h>
using namespace std;
struct krawedzie { int waga, wp, wk; };
struct listakraw { int wk, waga; listakraw * next; };
class klgraf { public: int wierz, kraw; float gest; krawedzie * tab; char ** macierz; void readfromfile( string nazwa ); void display(); void createrand(); };
class listgraf : public klgraf { public: friend class klgraf; listakraw * temp1, * temp2; listakraw * head; listakraw ** tablist; ~listgraf(); void readfromfile( string nazwa ); void display1(); };
void addedge( klgraf * obmacgraf, listakraw ** tablist, krawedzie * tab );
listgraf::~listgraf() { delete temp1, temp2; }
void klgraf::readfromfile( string nazwa ) { ifstream plik; plik.open( nazwa.c_str(), ios::in ); if( !plik ) cout << "\n\nBLAD WCZYTYWANIA PLIKU! Podano nieprawidlowa nazwe lub plik nie istnieje.\n\n" << endl; else { int i, j, wp1, wk1, waga1, w1, k1; plik >> k1; plik >> w1; wierz = w1; kraw = k1; macierz = new char *[ wierz ]; krawedzie tab[ kraw ]; for( i = 0; i < wierz; i++ ) macierz[ i ] = new char[ wierz ]; for( i = 0; i < wierz; i++ ) for( int j = 0; j < wierz; j++ ) macierz[ i ][ j ] = 0; cout << "\nLiczba krawedzi: " << kraw << "\nLiczba wierzcholkow: " << wierz << endl; for( i = 0; i < kraw; i++ ) { plik >> tab[ i ].wp; plik >> tab[ i ].wk; plik >> tab[ i ].waga; macierz[ tab[ i ].wp ][ tab[ i ].wk ] = tab[ i ].waga; macierz[ tab[ i ].wk ][ tab[ i ].wp ] = tab[ i ].waga; } display(); plik.close(); } }
void listgraf::readfromfile( string nazwa ) { ifstream plik; plik.open( nazwa.c_str(), ios::in ); int i, j, wp1, wk1, waga1, w1, k1; plik >> k1; plik >> w1; wierz = w1; kraw = k1; tablist = new listakraw *[ wierz ]; for( i = 0; i < wierz; i++ ) tablist[ i ] = NULL; for( i = 0; i < kraw; i++ ) { temp1 = new listakraw; temp2 = new listakraw; plik >> wp1; plik >> wk1; plik >> waga1; temp1->wk = wk1; temp1->waga = waga1; temp1->next = tablist[ wp1 ]; tablist[ wp1 ] = temp1; temp2->wk = wp1; temp2->waga = waga1; temp2->next = tablist[ wk1 ]; tablist[ wk1 ] = temp2; } display1(); plik.close(); }
void klgraf::display() { int i, j; cout << "\n\nWyswietlenie macierzowo:\n\n "; for( i = 0; i < wierz; i++ ) cout << setw( 3 ) << i; cout << endl << endl; for( i = 0; i < wierz; i++ ) { cout << setw( 3 ) << i; for( j = 0; j < wierz; j++ ) cout << setw( 3 ) <<( int ) macierz[ i ][ j ]; cout << endl; } int pomoc = 0; for( i = 0; i < wierz; i++ ) for( int j = 0; j < wierz; j++ ) if( macierz[ i ][ j ] == 1 ) pomoc++; cout << endl << endl; system( "pause" ); }
void listgraf::display1() { cout << "\n\nWyswietlenie listowo (np. 2w1 oznacza kolejny wierzcholek o indeksie 2 o wadze krawedzi 1):\n\n"; for( int i = 0; i < wierz; i++ ) { listakraw * temp = new listakraw; cout << "lista[" << i << "] = "; temp = tablist[ i ]; while( temp ) { cout << setw( 4 ) << temp->wk << "w" << temp->waga; temp = temp->next; } cout << endl; } cout << endl << endl; system( "pause" ); }
void klgraf::createrand() { int w1, k1, maxkraw, wp1, wk1, n, i, j, waga1; n = 0; int pomoc = 0; system( "cls" ); cout << "Ilu wierzcholkowy graf chcesz stworzyc?: "; cin >> w1; do { system( "cls" ); cout << "Liczba wierzcholkow: " << w1 << "\nPodaj gestosc grafu (podaj w %): "; cin >> gest; } while( gest < 1 && gest > 100 ); wierz = w1; system( "cls" ); cout << "Liczba wierzcholkow: " << wierz << "\nGestosc grafu: " << gest << "%"; gest = gest / 100; maxkraw =(( wierz *( wierz - 1 ) ) / 2 ); k1 = gest * maxkraw; kraw = k1; cout << "\nMaksymalna liczba krawedzi " << maxkraw << "\nLiczba krawedzi " << kraw << "\nGestosc " << gest << "\nLiczba wierzcholkow " << wierz << endl; macierz = new char *[ wierz ]; krawedzie tab[ kraw ]; for( i = 0; i < wierz; i++ ) macierz[ i ] = new char[ wierz ]; for( i = 0; i < wierz; i++ ) for( int j = 0; j < wierz; j++ ) macierz[ i ][ j ] = 0; for( i = 0; i < kraw; i++ ) { if( i < wierz - 1 || pomoc == 0 ) { if( i == wierz - 1 ) { pomoc = 1; continue; } waga1 =( rand() % 2 + 2 ); wk1 = n + 1; wp1 = n; if( wk1 == wp1 ) { i--; continue; } if( macierz[ wp1 ][ wk1 ] != 0 || macierz[ wk1 ][ wp1 ] != 0 ) { i--; continue; } tab[ i ].wp = wp1; tab[ i ].wk = wk1; tab[ i ].waga = waga1; macierz[ wp1 ][ wk1 ] = tab[ i ].waga; macierz[ wk1 ][ wp1 ] = tab[ i ].waga; n++; } else if( pomoc == 1 ) { waga1 =( rand() % 2 + 2 ); wk1 =( rand() %( wierz ) ); wp1 =( rand() %( wierz ) ); if( wk1 == wp1 ) { i--; continue; } if( macierz[ wp1 ][ wk1 ] != 0 || macierz[ wk1 ][ wp1 ] != 0 ) { i--; continue; } tab[ i ].wp = wp1; tab[ i ].wk = wk1; tab[ i ].waga = waga1; macierz[ wp1 ][ wk1 ] = tab[ i ].waga; macierz[ wk1 ][ wp1 ] = tab[ i ].waga; } } display(); }
void addedge( klgraf * obmacgraf, listakraw ** tablist, krawedzie * tab ) { int from, to, waga, ile; ile = obmacgraf->kraw; cout << "\n\nIle: " << ile << endl << endl; for( int i = 0; i < ile; i++ ) { from = tab[ i ].wp; to = tab[ i ].wk; waga = tab[ i ].waga; system( "pause" ); tablist[ from ]->wk = to; tablist[ to ]->wk = from; tablist[ from ]->waga = waga; tablist[ to ]->waga = waga; } }
int main( int argc, char ** argv ) { srand( time( 0 ) ); klgraf obmacgraf; klgraf(); listgraf obligraf; menuglowne: int wybor; do { system( "cls" ); cout << "Kamil Dzialek (209991) - SDIZO Projekt II\n\n" << "Wybierz problem, ktory chcesz rozwiazac:\n" << "1 - wyznaczanie minimalnego drzewa rozpinajacego\n" << "2 - wyznaczanie najkrotszej sciezki w grafie\n" << "3 - koniec programu\n\n" << "Podaj opcje: "; cin >> wybor; switch( wybor ) { case 1: { int wyb1; do { mstchoice: system( "cls" ); cout << "Co chcesz zrobic?:\n" << "1 - Wczytaj z pliku\n" << "2 - Wygeneruj losowo\n" << "3 - Wyswietl listowo i macierzowo na ekranie\n" << "4 - Algorytm Prima\n" << "5 - Algorytm Kruskala\n" << "0 - Powrot do poprzedniego menu\n\n" << "Podaj opcje: "; cin >> wyb1; system( "cls" ); switch( wyb1 ) { case 1: { system( "cls" ); string nazwa; cout << "Podaj nazwe pliku .txt do wczytania (pamietaj o dodaniu rozszerzenia '.txt'!):\n"; cin >> nazwa; obmacgraf.readfromfile( nazwa ); obligraf.readfromfile( nazwa ); break; } case 2: { system( "cls" ); obmacgraf.createrand(); obligraf.tablist = new listakraw *[ obmacgraf.wierz ]; for( int i = 0; i < obmacgraf.wierz; i++ ) obligraf.tablist[ i ] = NULL; addedge( & obmacgraf, obligraf.tablist, obmacgraf.tab ); break; } case 3: { obmacgraf.display(); obligraf.display1(); break; } } } while( wyb1 != 0 ); } } } while( wybor != 3 ); system( "cls" ); cout << "KONIEC PROGRAMU\n\n"; system( "pause" ); return 0; } |
|
pekfos |
» 2015-05-10 16:10:17 krawedzie tab[ kraw ]; - tutaj tworzę tablicę struktury krawedzie. |
A wskaźnik tab z klasy przypadkiem się tak samo nazywa i nigdy nie dostaje sensownej wartości? macierz = new char *[ wierz ]; krawedzie tab[ kraw ]; |
Przecież to nawet nie wygląda podobnie, a ma pełnić tę samą funkcję. listgraf::~listgraf() { delete temp1, temp2; }
|
Nie! |
|
KamilosD Temat założony przez niniejszego użytkownika |
» 2015-05-10 16:40:36 Nie rozumiem o co Ci tutaj chodzi z tym wskaźnikiem tab. Możesz dokładnie napisać co mam zmienić? macierz = new char *[ wierz ]; - samo wyświetlanie macierzy krawedzie tab[ kraw ]; - to przechowuje krawędzie EDIT: Ostatnia poprawiona wersja kodu. Wyświetla liste, ale zaraz po tym crash. #include <iostream> #include <fstream> #include <cstdlib> #include <string> #include <stdlib.h> #include <iomanip> #include <ctime> #include <conio.h>
using namespace std;
struct krawedzie { int waga, wp, wk; };
struct listakraw { int wk, waga; listakraw * next; };
class klgraf { public: int wierz, kraw; float gest; krawedzie * tab; char ** macierz; void readfromfile( string nazwa ); void display(); void createrand(); };
class listgraf : public klgraf { public: friend class klgraf; listakraw * temp1, * temp2; listakraw * head; listakraw ** tablist; ~listgraf(); void readfromfile( string nazwa ); void display1(); };
void addedge( klgraf * obmacgraf, listakraw ** tablist, krawedzie * tab );
listgraf::~listgraf() { delete temp1, temp2; }
void klgraf::readfromfile( string nazwa ) { ifstream plik; plik.open( nazwa.c_str(), ios::in ); if( !plik ) cout << "\n\nBLAD WCZYTYWANIA PLIKU! Podano nieprawidlowa nazwe lub plik nie istnieje.\n\n" << endl; else { int i, j, wp1, wk1, waga1, w1, k1; plik >> k1; plik >> w1; wierz = w1; kraw = k1; macierz = new char *[ wierz ]; tab = new krawedzie[ kraw ]; for( i = 0; i < wierz; i++ ) macierz[ i ] = new char[ wierz ]; for( i = 0; i < wierz; i++ ) for( int j = 0; j < wierz; j++ ) macierz[ i ][ j ] = 0; cout << "\nLiczba krawedzi: " << kraw << "\nLiczba wierzcholkow: " << wierz << endl; for( i = 0; i < kraw; i++ ) { plik >> tab[ i ].wp; plik >> tab[ i ].wk; plik >> tab[ i ].waga; macierz[ tab[ i ].wp ][ tab[ i ].wk ] = tab[ i ].waga; macierz[ tab[ i ].wk ][ tab[ i ].wp ] = tab[ i ].waga; } display(); plik.close(); } }
void listgraf::readfromfile( string nazwa ) { ifstream plik; plik.open( nazwa.c_str(), ios::in ); int i, j, wp1, wk1, waga1, w1, k1; plik >> k1; plik >> w1; wierz = w1; kraw = k1; tablist = new listakraw *[ wierz ]; for( i = 0; i < wierz; i++ ) tablist[ i ] = NULL; for( i = 0; i < kraw; i++ ) { temp1 = new listakraw; temp2 = new listakraw; plik >> wp1; plik >> wk1; plik >> waga1; temp1->wk = wk1; temp1->waga = waga1; temp1->next = tablist[ wp1 ]; tablist[ wp1 ] = temp1; temp2->wk = wp1; temp2->waga = waga1; temp2->next = tablist[ wk1 ]; tablist[ wk1 ] = temp2; } display1(); plik.close(); }
void klgraf::display() { int i, j; cout << "\n\nWyswietlenie macierzowo:\n\n "; for( i = 0; i < wierz; i++ ) cout << setw( 3 ) << i; cout << endl << endl; for( i = 0; i < wierz; i++ ) { cout << setw( 3 ) << i; for( j = 0; j < wierz; j++ ) cout << setw( 3 ) <<( int ) macierz[ i ][ j ]; cout << endl; } int pomoc = 0; for( i = 0; i < wierz; i++ ) for( int j = 0; j < wierz; j++ ) if( macierz[ i ][ j ] == 1 ) pomoc++; cout << endl << endl; system( "pause" ); }
void listgraf::display1() { cout << "\n\nWyswietlenie listowo (np. 2w1 oznacza kolejny wierzcholek o indeksie 2 o wadze krawedzi 1):\n\n"; for( int i = 0; i < wierz; i++ ) { listakraw * temp = new listakraw; cout << "lista[" << i << "] = "; temp = tablist[ i ]; while( temp ) { cout << setw( 4 ) << temp->wk << "w" << temp->waga; temp = temp->next; } cout << endl; } cout << endl << endl; system( "pause" ); }
void klgraf::createrand() { int w1, k1, maxkraw, wp1, wk1, n, i, j, waga1; n = 0; int pomoc = 0; system( "cls" ); cout << "Ilu wierzcholkowy graf chcesz stworzyc?: "; cin >> w1; do { system( "cls" ); cout << "Liczba wierzcholkow: " << w1 << "\nPodaj gestosc grafu (podaj w %): "; cin >> gest; } while( gest < 1 && gest > 100 ); wierz = w1; system( "cls" ); cout << "Liczba wierzcholkow: " << wierz << "\nGestosc grafu: " << gest << "%"; gest = gest / 100; maxkraw =(( wierz *( wierz - 1 ) ) / 2 ); k1 = gest * maxkraw; kraw = k1; cout << "\nMaksymalna liczba krawedzi " << maxkraw << "\nLiczba krawedzi " << kraw << "\nGestosc " << gest << "\nLiczba wierzcholkow " << wierz << endl; macierz = new char *[ wierz ]; tab = new krawedzie[ kraw ]; for( i = 0; i < wierz; i++ ) macierz[ i ] = new char[ wierz ]; for( i = 0; i < wierz; i++ ) for( int j = 0; j < wierz; j++ ) macierz[ i ][ j ] = 0; for( i = 0; i < kraw; i++ ) { if( i < wierz - 1 || pomoc == 0 ) { if( i == wierz - 1 ) { pomoc = 1; continue; } waga1 =( rand() % 2 + 2 ); wk1 = n + 1; wp1 = n; if( wk1 == wp1 ) { i--; continue; } if( macierz[ wp1 ][ wk1 ] != 0 || macierz[ wk1 ][ wp1 ] != 0 ) { i--; continue; } tab[ i ].wp = wp1; tab[ i ].wk = wk1; tab[ i ].waga = waga1; macierz[ wp1 ][ wk1 ] = tab[ i ].waga; macierz[ wk1 ][ wp1 ] = tab[ i ].waga; n++; } else if( pomoc == 1 ) { waga1 =( rand() % 2 + 2 ); wk1 =( rand() %( wierz ) ); wp1 =( rand() %( wierz ) ); if( wk1 == wp1 ) { i--; continue; } if( macierz[ wp1 ][ wk1 ] != 0 || macierz[ wk1 ][ wp1 ] != 0 ) { i--; continue; } tab[ i ].wp = wp1; tab[ i ].wk = wk1; tab[ i ].waga = waga1; macierz[ wp1 ][ wk1 ] = tab[ i ].waga; macierz[ wk1 ][ wp1 ] = tab[ i ].waga; } } display(); }
void addedge( klgraf * obmacgraf, listakraw ** tablist, krawedzie * tab ) { int from, to, waga, ile; ile = obmacgraf->kraw; cout << "\n\nIle: " << ile << endl << endl; listakraw * t1, * t2; for( int i = 0; i < ile; i++ ) { t1 = new listakraw; t2 = new listakraw; t1->waga = tab[ i ].waga; t1->wk = tab[ i ].wk; t2->waga = tab[ i ].waga; t2->wk = tab[ i ].wp; t1->next = tablist[ tab[ i ].wp ]; tablist[ tab[ i ].wp ] = t1; t2->next = tablist[ tab[ i ].wk ]; tablist[ tab[ i ].wk ] = t2; } }
int main( int argc, char ** argv ) { srand( time( 0 ) ); klgraf obmacgraf; klgraf(); listgraf obligraf; menuglowne: int wybor; do { system( "cls" ); cout << "Kamil Dzialek (209991) - SDIZO Projekt II\n\n" << "Wybierz problem, ktory chcesz rozwiazac:\n" << "1 - wyznaczanie minimalnego drzewa rozpinajacego\n" << "2 - wyznaczanie najkrotszej sciezki w grafie\n" << "3 - koniec programu\n\n" << "Podaj opcje: "; cin >> wybor; switch( wybor ) { case 1: { int wyb1; do { mstchoice: system( "cls" ); cout << "Co chcesz zrobic?:\n" << "1 - Wczytaj z pliku\n" << "2 - Wygeneruj losowo\n" << "3 - Wyswietl listowo i macierzowo na ekranie\n" << "4 - Algorytm Prima\n" << "5 - Algorytm Kruskala\n" << "0 - Powrot do poprzedniego menu\n\n" << "Podaj opcje: "; cin >> wyb1; system( "cls" ); switch( wyb1 ) { case 1: { system( "cls" ); string nazwa; cout << "Podaj nazwe pliku .txt do wczytania (pamietaj o dodaniu rozszerzenia '.txt'!):\n"; cin >> nazwa; obmacgraf.readfromfile( nazwa ); obligraf.readfromfile( nazwa ); break; } case 2: { system( "cls" ); obmacgraf.createrand(); obligraf.tablist = new listakraw *[ obmacgraf.wierz ]; for( int i = 0; i < obmacgraf.wierz; i++ ) obligraf.tablist[ i ] = NULL; addedge( & obmacgraf, obligraf.tablist, obmacgraf.tab ); obligraf.display1(); break; } case 3: { obmacgraf.display(); obligraf.display1(); break; } } } while( wyb1 != 0 ); } } } while( wybor != 3 ); system( "cls" ); cout << "KONIEC PROGRAMU\n\n"; system( "pause" ); return 0; } |
|
pekfos |
» 2015-05-10 18:15:38 Nie poprawiłeś nawet wszystkich wskazanych błędów. |
|
KamilosD Temat założony przez niniejszego użytkownika |
» 2015-05-10 18:19:10 Bo nie wiem jak :/ |
|
1 2 3 « 4 » 5 |