Advertisement
kubpica

Generacja grafów r-mat FINAL

Mar 26th, 2017
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.37 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <ctime>
  4. #include <cmath>
  5. #include <fstream>
  6.  
  7. using namespace std;
  8. bool czydopliku = false;
  9. ofstream wynik;
  10.  
  11. int main()
  12. {
  13.     wynik.open("wynik.txt");
  14.     srand( time( NULL ) );
  15.     int a = 0; int b = 0; int c = 0; int d = 0; int n = 0; double gestosc = 0; bool czySkierowany = false; int rozmiar = 0;  int ilosc = 0; bool czyWazony = false;
  16.  
  17.     cout << "Program generuje graf o wymiarach n^2 i podanej przez uzytkownika gestosci." << endl;
  18.  
  19.     cout << "Gdzie wypisac wyniki? 1 - na ekran 2 - do pliku" << endl;
  20.     cin >> n;
  21.     if(n==2) czydopliku = true;
  22.     n = 0;
  23.  
  24.     while(1){
  25.         cout << "Podaj w % prawdopodobienstwo a: ";
  26.         cin >> a;
  27.         if(a>100 || a<0){
  28.             cout << "Podano bledne dane. Sprobuj jeszcze raz." << endl;
  29.             continue;
  30.         }
  31.         cout << "Podaj w % prawdopodobienstwo b: ";
  32.         cin >> b;
  33.         if((a+b)>100 || (a+b)<0){
  34.             cout << "Podano bledne dane. Sprobuj jeszcze raz." << endl;
  35.             continue;
  36.         }
  37.         cout << "Podaj w % prawdopodobienstwo c: ";
  38.         cin >> c;
  39.         if((a+b+c)>100 || (a+b+c)<0){
  40.             cout << "Podano bledne dane. Sprobuj jeszcze raz." << endl;
  41.             continue;
  42.         }
  43.         d = 100 - a - b - c;
  44.         cout << "Przyjmuje, ze prawdopodobienstwo d wynosi: " << d << "%" << endl;
  45.  
  46.         cout << "Czy graf ma byc skierowany? (1-tak 0-nie) ";
  47.         cin >> n;
  48.         if(n==1) czySkierowany = true;
  49.         else if (n==0) czySkierowany = false;
  50.         else{
  51.             cout << "Podano bledne dane. Sprobuj jeszcze raz." << endl;
  52.             continue;
  53.         }
  54.  
  55.         cout << "Czy graf ma byc wazony? (1-tak 0-nie) ";
  56.         cin >> n;
  57.         if(n==1) czyWazony = true;
  58.         else if (n==0) czyWazony = false;
  59.         else{
  60.             cout << "Podano bledne dane. Sprobuj jeszcze raz." << endl;
  61.             continue;
  62.         }
  63.  
  64.         cout << "Rozmiar grafu wynosi 2 do n-tej (n^2). Podaj n: <1,9> ";
  65.         cin >> n;
  66.         if(n<1 || n>9){
  67.             cout << "Podano bledne dane. Sprobuj jeszcze raz." << endl;
  68.             continue;
  69.         }
  70.         rozmiar = pow( 2, n );
  71.  
  72.         if(a==0 || b==0 || c==0 || d==0){
  73.             cout << endl;
  74.             cout << "Uwaga!! Gdy co najmniej jedno z prawdopodobienstw zostalo podane jako zero, to niemozliwe jest wylosowanie wielu punktow grafu przez co nie kazda gestosc bedzie poprawna. Podawaj w takim przypadku gestosc rozsadnie. W przypadku podania niemozliwej do osiagniecia gestosci, program bedzie wykonywal sie w nieskonczonosc" << endl;
  75.         }
  76.         cout << "Podaj gestosc grafu w %: ";
  77.         cin >> gestosc;
  78.         if(gestosc>100 || gestosc<0){
  79.             cout << "Podano bledne dane. Sprobuj jeszcze raz." << endl;
  80.             continue;
  81.         }
  82.         gestosc = gestosc/100;
  83.         ilosc = gestosc*rozmiar*rozmiar;
  84.  
  85.         break;
  86.     }
  87.  
  88.     cout << "Rozpoczeto generacje grafu - prosze czekac" << endl;
  89.  
  90.     int ktory = 0;
  91.     int rozmiarAktualnejCw = rozmiar;
  92.     int x = rozmiar;
  93.     int y = rozmiar;
  94.     int graf[y][x];
  95.  
  96.     for(int i = 0; i<y; i++){
  97.         for(int j = 0; j<x; j++){
  98.             graf[i][j] = 0;
  99.         }
  100.     }
  101.  
  102.     do{
  103.         x=1;
  104.         y=1;
  105.         do{
  106.             int i =( std::rand() % 100 ) + 1;
  107.             //int i = 50; //losuje liczbe od 1 do 100. I sprawdzam w ktorej cwiartce wypadla
  108.             //cout << "Punkt i zostal wylosowany z wartoscia " << i << " wiec ";
  109.             //jezeli rozmiar wylosowanej cwiartki jest rowny 1 to wpisuje to miejsce liczbe 1 w przeciwnym wypadku:
  110.             //wybieram ten przedzial w ktorym wypadla i dziele go na kolejne cwiartki i powtarzam powyzszy krok (losowanie)
  111.             rozmiarAktualnejCw /= 2;
  112.             if(i>0 && i<=a){
  113.                 //Wylosowano ćwiartkę a. Więc nic nie rób.
  114.             }
  115.             else if(i>a && i<=a+b){
  116.                 //Wylosowano ćwiartkę b. Wykonaj więc działanie:
  117.                 x += rozmiarAktualnejCw;
  118.             }
  119.             else if(i>a+b && i<=a+b+c){
  120.                 //Wylosowano ćwiartkę c. Wykonaj więc działanie:
  121.                 y += rozmiarAktualnejCw;
  122.             }
  123.             else if(i>a+b+c && i<=100){
  124.                 //Wylosowano ćwiartkę d. Wykonaj więc działania:
  125.                 x += rozmiarAktualnejCw;
  126.                 y += rozmiarAktualnejCw;
  127.             }
  128.            // cout << "x: " << x << " y: " << y << endl;
  129.         }while(rozmiarAktualnejCw != 1);
  130.         if(graf[y-1][x-1]==0){
  131.             //cout << "Wstawiam 1 w wylosowany punkt grafu: graf[" << x-1 << "][" << y-1 << "]=1" << endl;
  132.             graf[y-1][x-1]=1;
  133.             ktory++;
  134.             if(!czySkierowany && x!=y){
  135.                 graf[x-1][y-1]=1;
  136.                 ktory++;
  137.             }
  138.         }else if(czyWazony){
  139.             graf[y-1][x-1]++;
  140.             if(!czySkierowany) graf[x-1][y-1]++;
  141.         }
  142.  
  143.         rozmiarAktualnejCw = rozmiar;
  144.     }while(ktory<ilosc);
  145.  
  146.     x = rozmiar;
  147.     y = rozmiar;
  148.     cout << endl;
  149.     if(czydopliku) wynik << "   "; else cout << "   ";
  150.     char litera = 'A';
  151.     for(int j = 0; j<x; j++){
  152.         if(j == x/2) if(czydopliku) wynik << "  "; else cout << "  ";
  153.         if(czydopliku) wynik << litera << " "; else cout << litera << " ";
  154.         litera++;
  155.         if(litera=='Z'+1) litera = 'a';
  156.         else if(litera=='z'+1 || litera=='?'+1) litera = '?';
  157.     }
  158.     litera = 'A';
  159.     if(czydopliku) wynik << endl; else cout << endl;
  160.     if(czydopliku) wynik << endl; else cout << endl;
  161.     for(int i = 0; i<y; i++){
  162.         if(i == y/2){
  163.             if(czydopliku) wynik << "   "; else cout << "   ";
  164.             for(int j = 0; j<=x; j++) if(czydopliku) wynik << "| "; else cout << "| ";
  165.             if(czydopliku) wynik << endl; else cout << endl;
  166.         }
  167.         if(czydopliku) wynik << litera << "  "; else cout << litera << "  ";
  168.         litera++;
  169.         if(litera=='Z'+1) litera = 'a';
  170.         else if(litera=='z'+1 || litera=='?'+1) litera = '?';
  171.         for(int j = 0; j<x; j++){
  172.             if(j == x/2) if(czydopliku) wynik << "| "; else cout << "| ";
  173.             if(czydopliku) wynik << graf[i][j] << " "; else cout << graf[i][j] << " ";
  174.         }
  175.         if(czydopliku) wynik << endl; else cout << endl;
  176.     }
  177.  
  178.     if(czydopliku) wynik << endl; else cout << endl;
  179.     if(czydopliku) wynik << "Wygenerowano graf "; else cout << "Wygenerowano graf ";
  180.     if(czySkierowany) {if(czydopliku)wynik << "skierowany"; else cout << "skierowany";}
  181.     else {if(czydopliku)wynik << "nieskierowany"; else cout << "nieskierowany";}
  182.     if(czyWazony) {if(czydopliku)wynik << " wazony"; else cout << " wazony";}
  183.     if(czydopliku) wynik << " o wymiarach 2^" << n << "=" << rozmiar << " z prawdopodobienstwami:" << endl; else cout << " o wymiarach 2^" << n << "=" << rozmiar << " z prawdopodobienstwami:" << endl;
  184.     if(czydopliku) wynik << "a=" << a << "% b=" << b << "% c=" << c << "% d=" << d << "%" << endl; else cout << "a=" << a << "% b=" << b << "% c=" << c << "% d=" << d << "%" << endl;
  185.     if(czydopliku) wynik << "Gestosc grafu: " << (double) gestosc << " (" << ilosc << "/" << rozmiar*rozmiar << ")" << endl; else cout << "Gestosc grafu: " << (double) gestosc << " (" << ilosc << "/" << rozmiar*rozmiar << ")" << endl;
  186.     if(czydopliku) cout << "Gotowe. Wyniki znajdziesz w pliku wynik.txt" << endl;
  187.     cin >> n;
  188. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement