Borland C++ Builder Grafy


(Wilczyca) #1

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ć:

1) Możliwość zdefiniowania dowolnego grafu (skarowery)

2) Sprawdzenie spójności grafu (metodę wszerz i wgłąb)

3) Obliczenie stopnia grafu

4) Rysowanie grafu

5) Drag & Drop (zmiana postaci grafu.

Bardzo proszę o pomoc.


([alex]) #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).


(Wilczyca) #3

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;

}


(Sawyer47) #4

Zasadniczo język jest jeden - C++, który ma swój standard. Borland C++ Builder to jedynie program, narzędzie.


([alex]) #5

Czy ty z tymi skarower'ami na serio?


(Wilczyca) #6

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.


(Sawyer47) #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).


(Wilczyca) #8

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]