Mam zrobić w Borlandzie C++ Builderze 6 grafy, tyle, że w ogóle się na tym nie znam. Byłabym wdzięczna gdyby ktoś mi pomógł zrobić ten program. Podam też pliki które mam do tej pory
http://kurierplikow.pl/lite/paczka/6wfTg92iLeEe
Mam zrobić:
Możliwość zdefiniowania dowolnego grafu (skarowery)
Sprawdzenie spójności grafu (metodę wszerz i wgłąb)
Obliczenie stopnia grafu
Rysowanie grafu
Drag & Drop (zmiana postaci grafu.
Bardzo proszę o pomoc.
_alex
([alex])
6 Czerwiec 2011 11:36
#2
Albo próbujesz to zrobić sama, jak będą konkretne problemy to chętnie wyjaśnimy, albo zamów gotowca u fachowca (odpłatnie oczywiście).
Szczerzę mówiąc mam problem. Znalazłam kod sprawdzający spójność grafu do programu, ale w języku C++ a nie w buiderze C++ i nie wiem jak go przełożyć na buildera C++. (grafy skierowane, a nie skarowery)
#include
#include
#include
using namespace std;
vector > graf;
deque stos;
vector poprzednik, odwiedzenie, przetworzenie, c;
vector done;
int N, E, u, v, czas=0, C=0;
const int INF = 1000001;
int directed=0;
void ccdfs_visit(int u){
done=true;
odwiedzenie=++czas;
c=C;
for(vector::iterator it=graf.begin(); it!=graf.end(); it++){
int v=*it;
if(!done[v]){
poprzednik[v]=u;
ccdfs_visit(v);
}
}
przetworzenie=++czas;
}
void ccdfs(){
czas=0;
C=0; //numer aktualnej spojnej skladowej
if(directed==0){
for(int i=0; i
if(!done_){_
C++;
ccdfs_visit(i);
}
}
}
int main(){
ios_base::sync_with_stdio(0);
cin>>N>>E>>directed;
graf.resize(N);
done.resize(N);
poprzednik.resize(N, INF);
odwiedzenie.resize(N, INF);
przetworzenie.resize(N, INF);
c.resize(N);
for(int i=0; i
cin>>u>>v;
graf[u-1].push_back(v-1);
if(directed==0)graf[v-1].push_back(u-1);
}
ccdfs();
if(C==1)cout<<“Graf jest spojny.”<
else{
cout<<“Graf nie jest spojny.\n”;
for(int i=0; i
cout<<"Wierzcholek nr "<
}
cout<
}
system(“pause”);
return 0;
}
nr47
(Sawyer47)
6 Czerwiec 2011 15:50
#4
Zasadniczo język jest jeden - C++, który ma swój standard. Borland C++ Builder to jedynie program, narzędzie.
_alex
([alex])
6 Czerwiec 2011 18:39
#5
Czy ty z tymi skarower ’ami na serio?
Pisałam w drugim poście, że grafy skierowane, a nie grafy skarowery. Źle zapisałam nazwę, bo ktoś strasznie bazgrolił.
No dobra, ale język C++ nie zadziała w Borlandzie C++ i trzeba go trochę przerobić a nie wiem jak, bo się nie znam na tym i proszę o pomoc.
nr47
(Sawyer47)
7 Czerwiec 2011 14:35
#7
Nie znam Borland C++, ale wątpię aby ktoś wydał kompilator C++ który nie skompiluje tak podstawowego kodu (bo owszem, ogólnie kompilatory w różnym stopniu są zgodne ze standardem, ale bez przesady). Ewentualnie użyj jakiegoś nowocześniejszego kompilatora, w większej mierze zgodnego ze standardem. Np. u mnie na g++ i clang++ po domknięciu jednego nawiasu klamrowego i zakomentowaniu wywołania funkcji system kompiluje się - poza jednym nawiasem kod jest poprawny (pomijam koszmarne formatowanie).
Mam zrobiony kod, ale metody i stopień grafu zawiera błędy. Oczywiście w C++, bez Borlanda.
#include
#include
#include "graf.h"
using namespace std;
int main()
{
graf mojg;//robisz swoj graf
int n;//ilosc wiszcholkow wybranych przed kogos
bool tak = false;
while (tak == false)
{
system("CLS");
cout << "Ilosc wierzcholkow ? : ";
cin >> n;
cout << endl;
if(n > mojg.maxn)
{
cout << "ZA DUZO MAX 100 " << endl;
Sleep(1000);
}
else
{
mojg.n = n;
tak = true;
}
}
int zwN = n + 1;
mojg.Tworz(zwN);
system("CLS");
int wybor;
int x=1;
while(x ==1)
{
system("CLS");
cout << " _____________________________________" << endl;
cout << "|1.Przedstaw graf w postaci macierzy |" << endl;
cout << "|2.Sprawdz graf metoda wszerz |"<
cout << "|3.Sprawdz graf metoda w glab |"<
cout << "|4.Sprawdz stopien grafu |"<
cout << "|5.Dodaj krawedz |"<
cout << "|6.Usun krawedz |"<
cout << "|7.Dodaj wierzcholek |"<
cout << "|8.Usun OSTATNI wierzcholek |"<
cout << "|9.Rysuj graf |"<
cout << "|0.Wyjdz |"<< endl;
cout << "| _____________________________________ |"<
cout << "Wybor : " ;
cin >> wybor;
switch(wybor)
{
case 1:
/*
MACIERZ
*/
mojg.Pokaz();
break;
case 2:
system("CLS");
int pktw;
cout << "podaj punkt wyjscia : ";
cin >> pktw;
cout << endl;
mojg.sprWszerz(pktw);
cout << endl;
system("PAUSE");
break;
case 3:
system("CLS");
int pktw2;
cout << "podaj punkt wyjscia : ";
cin >> pktw2;
cout << endl;
mojg.sprWglab(pktw2);
cout << endl;
system("PAUSE");
break;
case 4:
system("CLS");
cout << endl;
mojg.stopien();
cout << endl;
system("PAUSE");
break;
case 5:
system("CLS");
cout << endl;
mojg.dodajKR();
cout << endl;
system("PAUSE");
break;
case 6:
system("CLS");
cout << endl;
mojg.usunKR();
cout << endl;
system("PAUSE");
break;
case 7:
system("CLS");
cout << endl;
mojg.dodajWI();
cout << endl;
system("PAUSE");
break;
case 8:
system("CLS");
cout << endl;
mojg.n--;
cout << endl;
system("PAUSE");
break;
case 9:
system("CLS");
cout << endl;
mojg.rysuj();
cout << endl;
system("PAUSE");
break;
case 0:
x++;
break;
default:
system("CLS");
break;
}//koniec switch wybor
}//while
return 0;
}
class graf
{
public:
void sprWszerz(int start);
void sprWglab(int start);
int n; // liczba wieszcholkow
int m; //liczba krawedzi
static const int maxn = 100;// max ilosc
bool g[maxn][maxn]; // talbica przedstawiajaca co sie dzieje wgrafie
void stopien();
int v[maxn];
void Tworz(int n);
void Pokaz();
void dodajKR();
void dodajWI();
void usunKR();
void rysuj();
};
#include "graf.h"
#include
#include
#include
#include
using namespace std;
void graf::sprWszerz(int start)// sprawdzanie spójności wszerz :)
{
for(int i = 1 ; i < n+1 ; i++)
{
v[i] = 0;
}//for i dla v
bool all= false;//bool na to czy wszystkie były sprawdzone
for(int i = 1 ; i < n+1 ; i++)
{
if(g[start][i] == true) v[i] = 1;//szukamy jakie punkty są od punktu zaczęcia
}//for i dla punktu zaczęcia
v[start] = 2;
while(!all)
{
// spr czy da się przejść dalej od punktu
int pkt = 0;
for(int i = 1 ; i < n+1 ; i++)//szukamy najbliższego punktu
{
if(v[i] == 1)
{
pkt = i;
i = n+2;
}
}//koniec szukania
for(int i = 1 ; i < n+1 ; i++)
{
if(g[pkt][i] == true) v[i] = 1;//dla kolejnych punktów szukamy
}
v[pkt]=2;
int ilosc = 0;// do spr czy są pkt bez krawędzi
for(int i = 1 ; i < n+1 ; i++)
{
if(v[i] != 2 && v[i] != 1) ilosc++;
if(i == n & ilosc == 0)
{
all = true;
cout << "jest spojnosc " << endl;
}
}
if(ilosc != 0)
{
all = true;
cout << "NIE MA SPOJNOSCI! " << endl;
}
}//while
}//całość
void graf::Tworz(int n)
{
int wybor;
for(int i = 1 ; i < n ; i++)
{
for(int j = 1 ; j < n ; j++)
{
if(i != j)
{
Sleep(1000);
system("CLS");
cout << "wierzcholek [" << i <<"] do wierzcholka [" << j << "] stworzyc krawedz (1) ? nie stworzyc(0) : ";
cin >> wybor;
switch(wybor)
{
case 1 :
g[i][j] = true;
break;
case 0 :
g[i][j] = false;
break ;
default:
cout << endl << "ZŁY WYBÓR!!!" << endl;
j--;
Sleep(1000);
break;
}//koniec switch wybór
}//koniec i != j
else
{
g[i][j] = false;
}
}//koniec for j
}//koniec for i
}// koniec TWÓRZ
void graf::Pokaz()
{
system("CLS");
cout <<"0 - brak krawedzi \t 1 - krawedz" << endl;
cout << " " ;
for(int i=0 ; i < n+1 ; i++)
{
for(int j=1 ; j < n+1 ; j++)
{
if(i == 0)
{
cout <<"|"<< j << "|" ;
}//wyjątek tworzenie liczb
else
{
if(j == 1)
{
cout << endl << "|" << i << "|";//nowa linijka
}
if(g[i][j] == true )
{
cout << " " << "1";
}
if(g[i][j] == false )
{
cout << " " << "0";
}
}//else
}//koniec for j
}//koniec for i
cout << endl;
system("PAUSE");
}//koniec pokaz
void graf::sprWglab(int start)// sprawdzanie spójności w głąb :)
{
for(int i = 1 ; i < n+1 ; i++)
{
v[i] = 0;
}//for i dla v
v[start] = 2;
bool all= false;//bool na to czy wszystkie były sprawdzone
for(int i = 1 ; i < n+1 ; i++)
{
if(g[start][i] == true) v[i] = 1;//szukamy jakie punkty sa od punktu zaczęcia
}//for i dla punktu zaczęcia
vector tab;//tablica z ostatnimi punktami
tab.push_back(start);
int pkt;
for(int i = 1 ; i < n+1 ; i++)//szukamy najbliszego punktu
{
if(v[i] == 1)
{
pkt = i;
i = n+2;
}
}//koniec szukania
while(!all)
{
// spr czy da się przejść dalej od punktu
for(int i = 1 ; i < n+1 ; i++)//szukamy najbliszego punktu
{
if(v[i] == 0 && g[pkt][i])
{
pkt = i;
v[i] =1;
i = n+2;
}
if(i == n)
{
v[pkt]=2;
tab.pop_back();
pkt = tab.back();
}
}//koniec szukania
int ilosc = 0;// do spr czy są pkt bez krawędzi
for(int i = 1 ; i < n+1 ; i++)
{
if(v[i] != 2 && v[i] != 1) ilosc++;
if(i == n & ilosc == 0)
{
all = true;
cout << "jest spojnosc" << endl;
}
}
if(ilosc != 0)
{
all = true;
cout << "NIE MA SPOJNOSCI" << endl;
}
}//while
}//koniec funkcji
void graf::stopien()
{
for(int i = 1 ; i < n+1 ; i++)
{
v[i] = 0;
}//for i dla v
v[1] = 2;
bool all= false;//bool na to czy wszystkie były sprawdzone
for(int i = 1 ; i < n+1 ; i++)
{
if(g[1][i] == true) v[i] = 1;//szukamy jakie punkty są od punktu zaczęcia
}//for i dla punktu zaczęcia
vector tab;//tablica z ostatnimi punktami
int jeden = 1;
tab.push_back(jeden);
int pkt ;
int szer = 2;
int calosc = 1;
for(int i = 1 ; i < n+1 ; i++)//szukamy najbliższego punktu
{
if(v[i] == 1)
{
pkt = i;
i = n+2;
}
}
while(!all)
{
for(int i = 1 ; i < n+1 ; i++)//szukamy najbliższego punktu
{
if(v[i] == 0 && g[pkt][i])
{
pkt = i;
v[i] =1;
szer++;
if(calosc < szer) calosc = szer;
i = n+2;
}
if(i == n)
{
v[pkt]=2;
szer--;
tab.pop_back();
pkt = tab.back();
}
}//koniec szukania
int ilosc = 0;// do spr czy są pkt bez krawędzi
for(int i = 1 ; i < n+1 ; i++)
{
if(v[i] != 2 && v[i] != 1) ilosc++;
if(i == n & ilosc == 0)
{
all = true;
cout << "najszerzej :" << calosc << endl;
}
}
}//while !all
}//koniec stopień
void graf::dodajKR()
{
system("CLS");
int a,b;
cout << "Wierzcholek A : " ;
cin >> a;
cout << endl << "Wierzcholek B : ";
cin>>b;
if(g[a][b] == true) cout << endl << "Krawedz już istnieje";
else
{
g[a][b] = true;
cout << endl << "Dodano krawedz" <
}
}
void graf::dodajWI()
{
system("CLS");
n++;
cout << endl <<"Dodano wierzcholek" << endl;
}
void graf::usunKR()
{
system("CLS");
int a,b;
cout << "Wierzcholek A : " ;
cin >> a;
cout << endl << "Wierzcholek B : ";
cin>>b;
if(g[a][b] ==false) cout << endl << "Krawedz nie istnieje";
else
{
g[a][b] = false;
cout << endl << "usunieto krawedz" <
}
}//koniec usuń kr
void graf::rysuj()
{
bool koniec = false;
for(int i = 1 ; i
{
cout << "wierzcholek " << i << " ma krawedzi z :" <
for(int j = 1 ; j
{
if(g[i][j] == true) cout <<"-"<< j << "- " ;
}//koniec for
cout << endl << endl;
}//koniec for i
}//koniec funkcji
[/code]