Advertisement
Guest User

Untitled

a guest
Jan 27th, 2020
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.67 KB | None | 0 0
  1. /**** Szymon Wróblewski *******
  2.  **** Projekt zaliczeniowy ****
  3.  **** Informatyka 2019/20 *****/
  4.  
  5. #include <math.h>
  6. #include <stdio.h>
  7. #include <time.h>
  8.  
  9. #include "stdlib.h"
  10. #include "winbgi2.h"
  11.  
  12. int wczytaj_int()
  13. {
  14.     int wartosc;
  15.     scanf("%d", &wartosc);
  16.     return wartosc;
  17. }
  18.  
  19. float wczytaj_float()
  20. {
  21.     float wartosc;
  22.     scanf("%f", &wartosc);
  23.     return wartosc;
  24. }
  25.  
  26. void bledne_dane()
  27. {
  28.     printf("Wczytane dane sa ze zlego przedzialu.\n")
  29.     exit(1);
  30. }
  31.  
  32. int wczytaj_liczbe_osob()
  33. {
  34.     printf("Podaj liczbe osob [1, inf]:\n");
  35.     int liczba_osob = wczytaj_int();
  36.  
  37.     if (liczba_osob < 1)
  38.         bledne_dane();
  39.  
  40.     return liczba_osob;
  41. }
  42.  
  43. int wczytaj_liczbe_ruchow()
  44. {
  45.     printf("Podaj liczbe ruchow [0, 800]:\n");
  46.     int liczba_ruchow = wczytaj_int();
  47.  
  48.     if (liczba_ruchow < 0 || liczba_ruchow > 800)
  49.         bledne_dane();
  50.  
  51.     return liczba_ruchow;
  52. }
  53.  
  54. int wczytaj_prog()
  55. {
  56.     printf("Podaj prawdopodobienstwo ruchu w lewo [0 - 1]:\n");
  57.     float prog = wczytaj_float();
  58.  
  59.     if (wartosc < 0 || wartosc > 1)
  60.         bledne_dane();
  61.  
  62.     return prog;
  63. }
  64.  
  65. bool czy_lewo(float prog)
  66. {
  67.     float los = (float) rand() / (float) RAND_MAX;
  68.     return los < prog;
  69. }
  70.  
  71. void inicjalizacja_pozycji(int *osoba, int liczba_ruchow)
  72. {
  73.     for (int i = 0; i < liczba_osob ; i++)
  74.         osoba[i] = liczba_ruchow;   // pozycja poczatkowa to liczba_ruchow, zeby uniknac pozycji ujemnych
  75. }
  76.  
  77. void symulacja(int *osoba, int liczba_osob, int liczba_ruchow, float prog)
  78. {
  79.     for (int i = 0; i < liczba_ruchow ; i++) {
  80.         for ( int j = 0; j < liczba_osob; j++) {
  81.             if (czy_lewo(prog))
  82.                 osoba[j] --;
  83.             else
  84.                 osoba[j] ++;
  85.         }
  86.     }
  87. }
  88.  
  89. int policz_wysokosc_maksimum(int *wysokosc, int *osoba, int liczba_osob, int liczba_ruchow)
  90. {
  91.     for (int i = 0; i <= 2 * liczba_ruchow; i++)
  92.         wysokosc[i] = 0;
  93.  
  94.     for (int i = 0 ; i < liczba_osob; i++)
  95.         wysokosc[osoba[i]] ++;
  96.  
  97.     for (int i = 0 ; i <= 2 * liczba_ruchow; i++)
  98.         maksimum = std::max(maksimum, wysokosc[i]);
  99.  
  100.     return maksimum;
  101. }
  102.  
  103. void rysuj_wykres(int *wysokosc, int liczba_ruchow, int maksimum)
  104. {
  105.     graphics(200 + 2 * liczba_ruchow, 800);
  106.     line(50, 650, 150 + 2 * liczba_ruchow, 650);
  107.     line(100 + liczba_ruchow, 700 , 100 + liczba_ruchow, 870);
  108.  
  109.     for( int i = 0 ; i <= 2 * liczba_ruchow; i++)
  110.         line( 100 + i, 650, 100 + i, 650 - wysokosc[i] * 620 / maksimum);
  111. }
  112.  
  113. void main()
  114. {
  115.     // Deklaracja zmiennych
  116.     int liczba_osob, liczba_ruchow;    // liczba osob uczestniczacych w symulacji, dlugosc symulacji
  117.     int *osoba;         // tablica z pozycja danej osoby
  118.     float prog;         // wartosc graniczna decydujaca o kierunku ruchu
  119.  
  120.     int *wysokosc;      // liczba osob konczacych na danej pozycji
  121.     int maksimum = 0;   // zmienna pomocnicza z maksymalna liczba osob na pozycji
  122.  
  123.     // Wczytanie danych wejsciowych
  124.     liczba_osob = wczytaj_liczbe_osob();
  125.     liczba_ruchow = wczytaj_liczbe_ruchow();
  126.     prog = wczytaj_prog();
  127.  
  128.     // Alokacja tablic i ziarna losowania
  129.     srand(time(NULL));
  130.     osoba = (int*) malloc(liczba_osob * sizeof(int));
  131.     wysokosc = (int*) malloc((2 * liczba_ruchow + 1) * sizeof(int));
  132.  
  133.     // Inicjalizacja pozycji osob
  134.     inicjalizacja_pozycji(osoba, liczba_ruchow);
  135.  
  136.     // Symulacja bladzenia
  137.     symulacja(osoba, liczba_osob, liczba_ruchow, prog);
  138.  
  139.     // Policzenie rozkladu
  140.     maksimum = policz_wysokosc_maksimum(wysokosc, osoba, liczba_osob, liczba_ruchow);
  141.  
  142.     // Rysowanie wykresu
  143.     rysuj_wykres(wysokosc, liczba_ruchow, maksimum);
  144.  
  145.     // Zwalnianie pamieci
  146.     free(wysokosc);
  147.     free(osoba);
  148.     wait();
  149. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement