Untitled

mail@pastecode.io avatar
unknown
csharp
a month ago
5.0 kB
1
Indexable
Never
//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
*/
Leave a Comment