Fronta - Simulace pošty – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Fronta - Simulace pošty – C / C++ – Fórum – Programujte.comFronta - Simulace pošty – C / C++ – Fórum – Programujte.com

 

Kajo1354
~ Anonymní uživatel
2 příspěvky
2. 3. 2012   #1
-
0
-

Dobrý deň,

mám za úlohu jeden projekt a moc ho nechápem. môžete mi napísať ako danú problematiku vydíte vy a ako by som mal s projektom zacať poprípade aj nejaký ten kod by si ma zišiel. Dakujem

Simulace pošty

Problém

Na poště je N přepážek (např. N = 5), každá z nich je určena pro jiný typ transakcí. U každé přepážky je fronta pro libovolné množství zákazníků. Zákazník, který přijde na poštu, si zvolí typ transakce a postaví se do fronty u odpovídající přepážky. Doba strávená u přepážky je závislá na tom, kolik trans-akcí daného typu potřebuje zákazník realizovat - nejméně jednu transakci, nejvýše P transakcí (např. P = 3). Zpracování jedné transakce bez ohledu na její typ trvá jednu časovou jednotku. Pravidelně přicházejí noví zákazníci k překážkám (v jedné časové jednotce přijde na poštu právě jeden zákazník). Simulujte průběh zpracování front u přepážek pro M zákazníků pošty (např. M = 100).

Implementace

• Čísla N, M, P deklarujte jako globální konstanty.

• Každou přepážku reprezentujte frontou implementovanou pomocí ukazatelů. Fronta bude umět poskytnout první prvek. Nepoužívejte třídy (fronta bude reprezentována jako struktura).

• N přepážek reprezentujte polem délky N, prvky pole budou fronty.

• Prvek fronty implementujte jako strukturu, která bude obsahovat identifikaci zákazníka (číslo typu int) a počet požadovaných transakcí (číslo typu int).

• Průběh zpracování front u přepážek reprezentujte cyklem while, který bude ukončen, pokud bu-dou všechny fronty prázdné. V každém kroku cyklu (jedné časové jednotce) bude všem zákazní-kům, kteří jsou na řadě (první ve frontě), buď zpracována jedna transakce, nebo pokud nebude žádná transakce požadována (není co zpracovat), bude zákazník odebrán z fronty. Pokud celkový počet zákazníků vygenerovaných během simulace nedosáhl M, bude vygenerován další zákazník s náhodně vygenerovaným typem transakce (0 až N-1 tak, aby to odpovídalo některému indexu fronty v poli) a s náhodným počtem požadovaných transakcí (od 1 do P). Identifikátorem zákazní-ka je pořadí, ve kterém byl vygenerován (první zákazník bude mít identifikátor 1, poslední M). Zá-kazník se poté se zařadí do fronty pro odpovídající typ transakce.

Na výstupu zobrazte odděleny mezerou tyto operace:

• Vygenerování nového zákazníka ve formě G#1[F#2][#3], kde #1 je identifikace zákazníka a #2 je typ transakce (index fronty v poli) a #3 je počet požadovaných transakcí. Třetí zákazník pro druhý typ transakce se třemi požadavky bude vytisknut ve tvaru G3[F1][3].

• Vložení zákazníka do fronty ve formě V#1[F#2], kde #1 je identifikace zákazníka, #2 je index fron-ty v poli. Pokud bude vložen třetí zákazník do druhé fronty, bude na výstupu V3[F1].

• Zpracování jedné transakce zákazníka ve formě T#1[#2], kde #1 je identifikace zákazníka a #2 je počet zbývajících transakcí. Pokud zpracujeme jednu transakci třetímu zákazníkovi, bude na vý-stupu K3[2].

• Odebrání zákazníka z fronty ve tvaru O#1[F#2], kde #1 je identifikace zákazníka, #2 je index fronty v poli. Pokud bude odebrán třetí zákazník z druhé fronty, bude na výstupu O3[F1].

Nahlásit jako SPAM
IP: 178.40.75.–
KIIV
~ Moderátor
+43
God of flame
2. 3. 2012   #2
-
0
-

Ja to vidim jako vcelku presne zadani ...

udelat si strukturu zakaznika, nahodne mu nasadit pocet veci co chce provest a pak v kazdem kole jednoho zakaznika prihodit do odpovidajici fronty... zaroven v kazdem kole prvnimu ve fronte zpracovat jednu akci...

samozrejme musis vsechny zakazniky vypisovat v pozadovanem formatu, kdyz nekoho zaradis do fronty tak taky vypsat, a kdyz nekomu zpracujes vsechny pozadavky tak ho z fronty vyjmout a samozrejme vypsat

nic tezkyho v tom neni

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Kajo1354
~ Anonymní uživatel
2 příspěvky
2. 3. 2012   #3
-
0
-

#2 KIIV
no keby som to vedel naprogramovať nemohol by si mu tu nejaký postup napísať ako by som mal zacať alebo niečo bo ja som v tom programovaní amater ale chcel by sa sa to naučiť a pochopiť omu len ked neviem ani ako poriadne zacať

Nahlásit jako SPAM
IP: 178.40.75.–
KIIV
~ Moderátor
+43
God of flame
2. 3. 2012   #4
-
0
-

zacni podle instukci ... najdi si jak se delaji struktury, udelej strukturu zakaznika

az to budes mit najdi si neco o frontach (na netu se to vyskytuje casto jako pojem FIFO (First In First Out))

a pak uz budes mit ty nejtezsi casti vesmes hotove... popis je fakt podrobnej takze zkus ty temata rovnou hledat po netu

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Cibule
~ Anonymní uživatel
100 příspěvků
27. 5. 2012   #5
-
0
-

#1 Kajo1354

// Fronta.h
#include <stdlib.h>
// definice datovych typu

struct Prvek
{
  unsigned int Zakaznik;
  unsigned int PocetTransakci;
};

struct tFronta
{
  Prvek polozka;
  tFronta *ukDalsi;
};

struct Fronta
{
  tFronta *MyFronta;
  tFronta *zacatek;
};

void InitFronta(Fronta & tmp)
{
    tmp.MyFronta = NULL;
    tmp.zacatek = NULL;
}

  void InsertF(Fronta & tmpF,Prvek & tmpP)
{
           if(tmpF.zacatek != NULL)
           {
                tmpF.MyFronta->ukDalsi = new tFronta [sizeof(tFronta)];
                if(!tmpF.MyFronta->ukDalsi) exit(1);

                tmpF.MyFronta->ukDalsi->polozka.Zakaznik = tmpP.Zakaznik;
                tmpF.MyFronta->ukDalsi->polozka.PocetTransakci = tmpP.PocetTransakci;
                tmpF.MyFronta->ukDalsi->ukDalsi = NULL;
                tmpF.MyFronta = tmpF.MyFronta->ukDalsi;
           }
           else
           {
                tmpF.MyFronta = new tFronta [sizeof(tFronta)];
                if(!tmpF.MyFronta) exit(1);

                tmpF.MyFronta->polozka.Zakaznik = tmpP.Zakaznik;
                tmpF.MyFronta->polozka.PocetTransakci = tmpP.PocetTransakci;
                tmpF.MyFronta->ukDalsi = NULL;
                tmpF.zacatek = tmpF.MyFronta;
           }
}

bool JePrazdnaFronta(Fronta & tmpF)
{
    if(tmpF.zacatek == NULL) return true;
    else return false;
}

void OdebraniPrvniPrvek(Fronta & tmpF)
{
    if(JePrazdnaFronta(tmpF) != true){
                tFronta * tmp = tmpF.zacatek->ukDalsi;
                delete tmpF.zacatek;
                tmpF.zacatek = tmp;
            }
}

tFronta * VratPrvniPrvek(Fronta & tmpF)
{
    if(JePrazdnaFronta(tmpF) != true) return tmpF.zacatek;
    else return NULL;
}

void UvolneniPameti(Fronta & tmpF)
{
    while(tmpF.zacatek!=NULL)
    {
        tFronta * tmp = tmpF.zacatek;
        tmpF.zacatek = tmpF.zacatek->ukDalsi;
        delete tmp;
    }
}

//main.cpp
#include <iostream>
#include <time.h>
#include <windows.h>
#include "Fronta.h"

using namespace std;

const unsigned int N = 5;
const unsigned int M = 100;
const unsigned int P = 3;


void OdebraniZFronty(Fronta & prepazky,int & TypTransakce)
{
    cout<<"O"<<prepazky.zacatek->polozka.Zakaznik<<"[F"<<TypTransakce<<"]"<<endl;
    OdebraniPrvniPrvek(prepazky);
}

void zpracovaniJedneTransakce(Fronta & prepazky,int & TypTransakce)
{
    tFronta * tmp = VratPrvniPrvek(prepazky);
        if(tmp != NULL)
        {
           tmp->polozka.PocetTransakci--;
           cout<<"T"<<tmp->polozka.Zakaznik<<"["<<tmp->polozka.PocetTransakci<<"]"<<endl;
           if(tmp->polozka.PocetTransakci == 0) OdebraniZFronty(prepazky,TypTransakce);
        }
}

void vlozeniZakaznikaDoFronty(Fronta & prepazky,Prvek & tmp,int & TypTransakce)
{
        InsertF(prepazky,tmp);
       cout<<"V"<<tmp.Zakaznik<<"[F"<<TypTransakce<<"]"<<endl;
}

void vygenerovaniZakaznika(Fronta * prepazky)
{
Prvek tmp = {0,0};
int TypTransakce = 0;
int PomPolePoradi[N] = {0};

    for(unsigned int i = 0; i < M;i++)
    {
        srand(time(NULL));  Sleep(50);  // nastaveni randomu Sleep = zpozdeni

        TypTransakce = (rand() % N);
        PomPolePoradi[TypTransakce]++;
        tmp.Zakaznik =  PomPolePoradi[TypTransakce];
        tmp.PocetTransakci = ((rand() % P) + 1);

       cout<<"G"<<tmp.Zakaznik<<"[F"<<TypTransakce<<"]"<<"["<<tmp.PocetTransakci<<"]"<<endl;

        vlozeniZakaznikaDoFronty(prepazky[TypTransakce],tmp,TypTransakce); //vlozeni do jednotlivych front
    }
}

int main(void)
{
cout<<"-------------------------------------"<<endl;
cout<<"     POSTA OTEVREMA                  "<<endl;
cout<<"-------------------------------------"<<endl<<endl;

Fronta prepazky[N];

for(unsigned int i = 0; i < N; i++) InitFronta(prepazky[i]);  //inicializace jednolivych front

vygenerovaniZakaznika(prepazky);  //vygenerovani zakazniku

cout<<"-------------------------------------"<<endl;
cout<<"     PREPAZKY OTEVRENY      "<<endl;
cout<<"-------------------------------------"<<endl<<endl;

bool ukonceni = false;
int TypTransakce = 0;


while(ukonceni != true)  //simulace posty
{
    for(unsigned int i = 0; i < N; i++)
        if(JePrazdnaFronta(prepazky[i]) == false){ukonceni = false; break;}
        else ukonceni = true;

    if(ukonceni != true)
    {
    zpracovaniJedneTransakce(prepazky[TypTransakce],TypTransakce);
    TypTransakce++;
    TypTransakce %= N;
    }

}

for(unsigned int i = 0; i < N; i++) UvolneniPameti(prepazky[i]); //uvolneni pameti

cout<<"--------------------------------------------------------"<<endl;
cout<<"     POSTA ZAVRENA A PREPAZKY ZAVRENY PRIDTE ZITRA      "<<endl;
cout<<"--------------------------------------------------------"<<endl;

return 0;
}
Nahlásit jako SPAM
IP: 85.70.207.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 4 hosté

Podobná vlákna

Dynamická fronta — založil Erik

Fronta(Struct) — založil Barda

Sledování zásilek u České pošty — založil Miloslav Kubín

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý