Return to Snippet

Revision: 53912
at January 20, 2012 21:22 by dsitum1


Updated Code
#include <iostream>
#include <cstdlib>
#include <ctime>
//#include "red_polje.h"
#include "red_pokazivac.h"
using namespace std;

int vrijeme(tred *Q, int n)    //vremena provedena u ordinaciji + eventualna cekanja kad nikog nema
{
    tpacijent *R = new tpacijent [10000];
    tpacijent pacijent;         //najprije kopirat postojeci red u novi, pa manipulirat s novim
    for (int i=0; i<n; i++)
    {
        pacijent = frontQ(Q);
        dequeueQ(Q);
        enqueueQ(pacijent, Q);
        R[n-i]=pacijent;
    }

    int trajanje=0;             //ukupno trajanje
    int vrijeme_prvog=0;        //vrijeme osobe u ordinaciji
    int cekanje_da_dodju=0;     //cekanje da netko dodje na red ako nikog nema

    while (n)
    {
        vrijeme_prvog=R[n--].y;
        trajanje+=vrijeme_prvog;

        while (vrijeme_prvog > cekanje_da_dodju && n)
        {
            trajanje+=R[n].y;
            cekanje_da_dodju+=R[n--].x;
        }
        trajanje+=cekanje_da_dodju-vrijeme_prvog;       //visak vremena -> cekanje da neki pacijent dodje u kliniku kad nema nikog u redu
        cekanje_da_dodju=0;
    }
    delete [] R;
    return trajanje;
}

void generiraj(tred *Q, int &n)
{
    srand(time(0));
    cout << "Unesite broj parova koje zelite generirati: ";
    cin >> n;
    tpacijent pacijent;
    for (int i=0; i<n; i++)
    {
        pacijent.x=rand()%10000+1;
        pacijent.y=rand()%10000+1;                  //generiranje pacijenta i dodavanje na kraj reda
        pacijent.prioritet=rand()%4+1;
        enqueueQ(pacijent, Q);
    }
}

void lijeci(tred *Q, int &n)                        //Obradjivanje pacijenata redom kojim su dosli
{
    int ukupno_vrijeme=vrijeme(Q,n);
    tpacijent pacijent;
    while (!isemptyQ(Q))
    {
        cout << "Stanje reda:" << endl;
        for (int i=1; i<=n; i++)
        {
            pacijent = frontQ(Q);
            dequeueQ(Q);
            cout << "--------------" << endl;
            cout << "Pacijent: " << i << endl;
            cout << "Vrijeme dolaska: " << pacijent.x << endl;
            cout << "Vrijeme u ordinaciji: " << pacijent.y << endl;
            enqueueQ(pacijent, Q);
        }
        cout << "============================" << endl;
        cout << "Pacijent s pocetka reda odlazi u ordinaciju i izadje zdrav :)" << endl;

        dequeueQ(Q);
        n--;
    }
    cout << "Svi pacijenti su obradjeni." << endl;
    cout << "Vrijeme trajanja lijecenja pacijenata: " << ukupno_vrijeme << endl;
}

void lijeci2(tred *Q, int &n)                   //Obradjivanje pacijenata prioritetnim redom
{
    int ukupno_vrijeme=vrijeme(Q,n);
    tpacijent pacijent;
    while (!isemptyQ(Q))
    {
        cout << "Stanje reda:" << endl;                 //ispis stanja reda
        for (int i=1; i<=n; i++)
        {
            pacijent = frontQ(Q);
            dequeueQ(Q);
            cout << "--------------" << endl;
            cout << "Pacijent: " << i << endl;
            cout << "Vrijeme dolaska: " << pacijent.x << endl;
            cout << "Vrijeme u ordinaciji: " << pacijent.y << endl;
            cout << "Prioritet: " << pacijent.prioritet << endl;
            enqueueQ(pacijent, Q);
        }
        cout << "============================" << endl;

        cout << "Pacijent s pocetka reda odlazi u ordinaciju i izadje zdrav :)" << endl;
        tpacijent prvi;
        prvi = frontQ(Q);
        dequeueQ(Q);
        n--;

        int zbroj_vremena_dolazaka=0;
        int broj_preko_reda=0;
        tpacijent *R = new tpacijent [10000];
        while (prvi.y > zbroj_vremena_dolazaka && broj_preko_reda<n)
        {
            pacijent = frontQ(Q);
            zbroj_vremena_dolazaka += pacijent.x;
            if (prvi.y > zbroj_vremena_dolazaka)
            {
                R[broj_preko_reda++] = pacijent;
                dequeueQ(Q);
            } else break;
        }

        int i,j;
        for (i=1; i<broj_preko_reda; i++)           //uzlazno sortiramo polje (insertion sort)
        {
            tpacijent pom = R[i];
            for (j=i-1; j>=0 && R[j].prioritet>pom.prioritet; j--)
                R[j+1]=R[j];
            R[j+1]=pom;
        }

        for (i=0; i<broj_preko_reda; i++)
            enqueueQ(R[i], Q);

        for (i=0; i<n-broj_preko_reda; i++)   //hocemo da nam parovi s prioritetom dodju na celo reda pa sve kruzno pomaknemo za n-broj_preko_reda mjesta
        {
            pacijent = frontQ(Q);
            dequeueQ(Q);
            enqueueQ(pacijent, Q);
        }

        if (broj_preko_reda>1)
            cout << "Dogodila se prioritetna promjena. Broj pacijenata koji su zamijenili pozicije: " << broj_preko_reda << endl;
        delete [] R;
    }


    cout << "Svi pacijenti su obradjeni." << endl;
    cout << "Vrijeme trajanja lijecenja pacijenata: " << ukupno_vrijeme << endl;
}


int main()
{
    int izbor, n;
    tred *Q = initQ(Q);
    do
    {
        cout << "1. Generiranje brojeva" << endl;
        cout << "2. Pruzanje medicinske pomoci pacijentima" << endl;
        cout << "3. Pruzanje medicinske pomoci pacijentima (s prioritetom)" << endl;
        cout << "0. Izlaz iz programa" << endl;
        cout << "Odaberite mogucnost: ";
        cin >> izbor;
        switch (izbor)
        {
            case 1:
                generiraj(Q,n);
                break;
            case 2:
                lijeci(Q,n);
                break;
            case 3:
                lijeci2(Q,n);
                break;
        }
    } while (izbor);
    delete Q;
}

Revision: 53911
at December 3, 2011 06:09 by dsitum1


Initial Code
#include <iostream>
#include <cstdlib>
#include <ctime>
//#include "red_polje.h"
#include "red_pokazivac.h"
using namespace std;

int vrijeme(tred *Q, int n)    //vremena provedena u ordinaciji + eventualna cekanja kad nikog nema
{
    tpacijent *R = new tpacijent [10000];
    tpacijent pacijent;         //najprije kopirat postojeci red u novi, pa manipulirat s novim
    for (int i=0; i<n; i++)
    {
        pacijent = frontQ(Q);
        dequeueQ(Q);
        enqueueQ(pacijent, Q);
        R[n-i]=pacijent;
    }

    int trajanje=0;             //ukupno trajanje
    int vrijeme_prvog=0;        //vrijeme osobe u ordinaciji
    int cekanje_da_dodju=0;     //cekanje da netko dodje na red ako nikog nema

    while (n)
    {
        vrijeme_prvog=R[n--].y;
        trajanje=vrijeme_prvog;

        while (vrijeme_prvog > cekanje_da_dodju && n)
        {
            trajanje+=R[n].y;
            cekanje_da_dodju+=R[n--].x;
        }
        trajanje+=cekanje_da_dodju-vrijeme_prvog;       //visak vremena -> cekanje da neki pacijent dodje u kliniku kad nema nikog u redu
        cekanje_da_dodju=0;
    }
    delete [] R;
    return trajanje;
}

void generiraj(tred *Q, int &n)
{
    srand(time(0));
    cout << "Unesite broj parova koje zelite generirati: ";
    cin >> n;
    tpacijent pacijent;
    for (int i=0; i<n; i++)
    {
        pacijent.x=rand()%10000+1;
        pacijent.y=rand()%10000+1;                  //generiranje pacijenta i dodavanje na kraj reda
        pacijent.prioritet=rand()%4+1;
        enqueueQ(pacijent, Q);
    }
}

void lijeci(tred *Q, int &n)                        //Obradjivanje pacijenata redom kojim su dosli
{
    int ukupno_vrijeme=vrijeme(Q,n);
    tpacijent pacijent;
    while (!isemptyQ(Q))
    {
        cout << "Stanje reda:" << endl;
        for (int i=1; i<=n; i++)
        {
            pacijent = frontQ(Q);
            dequeueQ(Q);
            cout << "--------------" << endl;
            cout << "Pacijent: " << i << endl;
            cout << "Vrijeme dolaska: " << pacijent.x << endl;
            cout << "Vrijeme u ordinaciji: " << pacijent.y << endl;
            enqueueQ(pacijent, Q);
        }
        cout << "============================" << endl;
        cout << "Pacijent s pocetka reda odlazi u ordinaciju i izadje zdrav :)" << endl;

        dequeueQ(Q);
        n--;
    }
    cout << "Svi pacijenti su obradjeni." << endl;
    cout << "Vrijeme trajanja lijecenja pacijenata: " << ukupno_vrijeme << endl;
}

void lijeci2(tred *Q, int &n)                   //Obradjivanje pacijenata prioritetnim redom
{
    int ukupno_vrijeme=vrijeme(Q,n);
    tpacijent pacijent;
    while (!isemptyQ(Q))
    {
        cout << "Stanje reda:" << endl;                 //ispis stanja reda
        for (int i=1; i<=n; i++)
        {
            pacijent = frontQ(Q);
            dequeueQ(Q);
            cout << "--------------" << endl;
            cout << "Pacijent: " << i << endl;
            cout << "Vrijeme dolaska: " << pacijent.x << endl;
            cout << "Vrijeme u ordinaciji: " << pacijent.y << endl;
            cout << "Prioritet: " << pacijent.prioritet << endl;
            enqueueQ(pacijent, Q);
        }
        cout << "============================" << endl;

        cout << "Pacijent s pocetka reda odlazi u ordinaciju i izadje zdrav :)" << endl;
        tpacijent prvi;
        prvi = frontQ(Q);
        dequeueQ(Q);
        n--;

        int zbroj_vremena_dolazaka=0;
        int broj_preko_reda=0;
        tpacijent *R = new tpacijent [10000];
        while (prvi.y > zbroj_vremena_dolazaka && broj_preko_reda<n)
        {
            pacijent = frontQ(Q);
            zbroj_vremena_dolazaka += pacijent.x;
            if (prvi.y > zbroj_vremena_dolazaka)
            {
                R[broj_preko_reda++] = pacijent;
                dequeueQ(Q);
            } else break;
        }

        int i,j;
        for (i=1; i<broj_preko_reda; i++)           //uzlazno sortiramo polje (insertion sort)
        {
            tpacijent pom = R[i];
            for (j=i-1; j>=0 && R[j].prioritet>pom.prioritet; j--)
                R[j+1]=R[j];
            R[j+1]=pom;
        }

        for (i=0; i<broj_preko_reda; i++)
            enqueueQ(R[i], Q);

        for (i=0; i<n-broj_preko_reda; i++)   //hocemo da nam parovi s prioritetom dodju na celo reda pa sve kruzno pomaknemo za n-broj_preko_reda mjesta
        {
            pacijent = frontQ(Q);
            dequeueQ(Q);
            enqueueQ(pacijent, Q);
        }

        if (broj_preko_reda>1)
            cout << "Dogodila se prioritetna promjena. Broj pacijenata koji su zamijenili pozicije: " << broj_preko_reda << endl;
        delete [] R;
    }


    cout << "Svi pacijenti su obradjeni." << endl;
    cout << "Vrijeme trajanja lijecenja pacijenata: " << ukupno_vrijeme << endl;
}


int main()
{
    int izbor, n;
    tred *Q = initQ(Q);
    do
    {
        cout << "1. Generiranje brojeva" << endl;
        cout << "2. Pruzanje medicinske pomoci pacijentima" << endl;
        cout << "3. Pruzanje medicinske pomoci pacijentima (s prioritetom)" << endl;
        cout << "0. Izlaz iz programa" << endl;
        cout << "Odaberite mogucnost: ";
        cin >> izbor;
        switch (izbor)
        {
            case 1:
                generiraj(Q,n);
                break;
            case 2:
                lijeci(Q,n);
                break;
            case 3:
                lijeci2(Q,n);
                break;
        }
    } while (izbor);
    delete Q;
}

Initial URL


Initial Description
Programsko rješenje 3. zadatka iz struktura - red

Initial Title
programsko_rjesenje.cpp

Initial Tags


Initial Language
C++