Untitled
unknown
csharp
10 months ago
5.0 kB
4
Indexable
//Mikołaj Krawczyński, Wojciech Primus, grupa 2, Informatyka i Ekonometria #include <stdio.h> #include <stdlib.h> #include <time.h> #include <math.h> #include <stdlib.h> #include <windows.h> #define MAX_FLOORS 20 // Funkcja generująca losową liczbę zgodnie z rozkładem Poissona int poissonRandom(double lambda) { double L = exp(-lambda); // exp = Euler, L = exp(-lambda) = euler^(-lambda) = euler^(-1.5) = 0.22313 double p = 1.0; int k = 0; do { k++; p *= ((double)rand() / RAND_MAX); //RAND_MAX = 32767 } while (p > L); return k - 1; //wylosowana liczba } // Funkcja wyświetlająca pseudo-animację budynku z windą void displayElevator(int floors, int currentFloor, int passengers) { for (int i = floors - 1; i >= 0; i--) { if (i == currentFloor) { printf("|[W: %d]| <- Pietro %d\n", passengers, i); } else { printf("| | Pietro %d\n", i); } } printf("\n"); } //Glowna funkcja int main() { int capacity, floors; int currentFloor = 0; int passengers = 0; int waiting[MAX_FLOORS]; int destination[MAX_FLOORS] = { 0 }; // Liczba pasażerów chcących wysiąść na każdym piętrze // Inicjalizacja generatora liczb losowych srand(time(NULL)); // Pobranie liczby pięter i pojemności windy printf("Podaj pojemnosc windy (max 12): "); scanf_s("%d", &capacity); if (capacity > 12 || capacity < 1) { printf("Pojemnosc windy musi miedzy 1 a 12.\n"); return 1; } printf("Podaj liczbe pieter (co najmniej 5): "); scanf_s("%d", &floors); if (floors < 5 || floors > MAX_FLOORS) { printf("Liczba pieter musi byc co najmniej 5 i nie wiecej niz 20.\n"); return 1; } // Generowanie liczby osób oczekujących na każdym piętrze for (int i = 0; i < floors; i++) { waiting[i] = poissonRandom(1.5); // Użycie lambda = 1.5 dla rozkładu Poissona } // Symulacja przejazdu windy int direction = 1; // 1 oznacza jazdę w górę, -1 oznacza jazdę w dół while (1) { // Wyświetlanie aktualnego stanu printf("\nAktualny stan budynku:\n"); displayElevator(floors, currentFloor, passengers); printf("Liczba osob w windzie: %d\n", passengers); printf("Osoby oczekujace na pietrze %d: %d\n", currentFloor, waiting[currentFloor]); // Wysiadają pasażerowie na aktualnym piętrze while (destination[currentFloor] > 0) { passengers--; destination[currentFloor]--; printf("Osoba wysiadla z windy. Liczba osob w windzie: %d\n", passengers); } // Dodawanie pasażerów do windy while (passengers < capacity && waiting[currentFloor] > 0) { passengers++; waiting[currentFloor]--; // Pasażer wybiera losowe piętro docelowe int dest; do { dest = rand() % floors; //printf("dest: %d\n", dest); } while (dest == currentFloor); // Pasażer nie może jechać na to samo piętro destination[dest]++; printf("Osoba weszla do windy. Liczba osob w windzie: %d\n", passengers); } // Wyświetlanie pseudo-animacji przejazdu windy printf("Winda jedzie %s...\n", direction == 1 ? "do gory" : "w dol"); Sleep(500); // Opoznienie 500 milisekund // Przemieszczanie windy if (direction == 1) { if (currentFloor < floors - 1) { currentFloor++; } else { direction = -1; // Zmiana kierunku na dół } } else { if (currentFloor > 0) { currentFloor--; } else { printf("Winda dotarla na parter. Symulacja zakonczona.\n"); break; // Koniec symulacji } } } return 0; } /* NOTATKI 1. podaj inputy, zweryfikuj czy sie zgadza 2. ustalamy zmienne: passengers - ile osob jest obecnie w windzie 3. generujemy losowo ile osob czeka na danym pietrze for (int i = 0; i < floors; i++) { waiting[i] = poissonRandom(1.5); } lambda = 1.5 oznacza, że średnio oczekujemy 1.5 zdarzenia na określony przedział Przy lambda = 1.5, przykładowe prawdopodobieństwa wynoszą P(0;1.5) = e^(-1.5) = 22.3% P(1;1.5) = 1.5e^(-1.5) = 33.5% P(2;1.5) = [(1.5)^2 * e^(-1.5)] /2! = 25.1% P(3;1.5) = [(1.5)^3 * e^(-1.5)] /3! = 12.6% im dalej to mniej 4. int direction = 1; zaczynamy jazde do góry, tylko kiedy 5. zaczynamy infinite loopa => while(1) czyli warunek zawsze spelniony bo 1 to true value */
Editor is loading...
Leave a Comment