Untitled
unknown
csharp
2 years ago
5.0 kB
10
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