[Obecně]Fronta - Simulace pošty

C++, C#, Visual Basic, Delphi, Perl a ostatní

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod Kajo1354 29. 2. 2012 21:32

Dobrý den,
v škole som dostal naprogramovať daný projekt. Chcel by som len vedieť ako túto problematiku chápete a ako by som ju mal riešiť a naprogramovať.


Simulace pošty 1

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].
Kajo1354
Kolemjdoucí

Odeslat příspěvekod hunter21 29. 2. 2012 22:23

Ja vidim v simulacii jeden zasadny problem:
"Pravidelně přicházejí noví zákazníci..."
Ty si uz niekedy zazil aby prichadzali zakaznici pravidelne? Ja teda nie.
O pravidelnosti sa da hovorit na automatizovanych vyrobnych linkach (ak zrovna niesu pokazene) napr. v automobilovom priemysle.
Riesit to mozes, ovsem simulacia bude mat jalovy vysledok.
hunter21
Pokročilý

Odeslat příspěvekod Kajo1354 29. 2. 2012 23:53

no tak to ja mám zadané nemôžem za to ako to je napísané :D
Kajo1354
Kolemjdoucí

Odeslat příspěvekod Nargon 1. 3. 2012 00:02

Ja bych tohle nedelal z jednoducheho duvodu: " Fronta bude umět poskytnout první prvek. Nepoužívejte třídy (fronta bude reprezentována jako struktura)." Dnes kdy je OOP celkem rozumny zakladni standart nutit cloveka programovat proceduralne (na to to vede) je imho velmi spatna forma vyucovani. Zakazovat pouzivani objektu je blbost. Imho lepsi by bylo nechat na studentech jestli si to chce naprogramovat pomoci objektu nebo pres struktury.

Ale jako v tom programu moc problemu nevidim.
Na zacatku si nadeklarujes globalni konstanty M,N,P a pak nejaky globalni citac poradi zakazniku.
Struktura zakaznika bude mit nejakou promenou "delka operace", poradove cislo a ukazatel na dalsiho zakaznika. (nebo sloziteji ten prvek "fronty" bude mit ukazatele na dalsi prvek fronty a ukazatel na strukturu "zakaznik". Ale to je imho moc ukazatelu a clovek se v tom jen zamota, takze radeji bych prvek fronty a zakaznika sloucil)
Pak tam bude globalni "pole" o velikosti N (pro kazdou prepazku jedna polozka) a to pole bude typu ukazatel na zakaznika.
A nakonec ta hlavni while smycka. Bude cyklit dokud je nekdo ve fronte. a v kazdem cylku bude toto:
1) kontrola zda je uz vygenerovano M zakazniku. Pokud ne, tak zvysit globalni citac o 1 a vygenerovat zakaznika s delkou operace (max P) a vygenerovat cislo prepazky kam pujde a zaradit ho do spravne fronty.
2) for cyklus pres N prepazek a v kazdem prubehu:
a) zkontrolovat zda ma zakaznik "delku operace" 0, pokud ano, tak ho odebrat z fronty a jit na dalsi prepazku
b) pokud nema 0 delku, tak delku o 1 zkratit a jit na dalsi prepazku.
3) Zpet na 1 a stale cyklit dokud nedojde na konec.

Asi takhle to chapu a tak bych to naprogramoval. Ale urcite se mi to nechce programovat.
Desktop: Ryzen 7 1800X (3.95GHz, 1.35V), Asus Crosshair VI Hero, 16GB DDR4 Ram (3200MHz), 128GB SSD + 3TB HDD, Nvidia GTX 1080
Notebook: Asus UL50VT 15.6" (SU7300@1.7GHz, 4GB ram, 500GB HDD, Intel GMA 4500MHD + nVidia G210M, dlouha vydrz cca 7+ hod)
Nargon
Moderátor

Odeslat příspěvekod Fuller009 1. 3. 2012 08:56

Vždyť tu implementaci máš docela podrobně popsanou už v zadání. Co víc chceš? Asi by bylo vhodnější obrátit se sem s přesnými problémy při implementaci a ne jen skopírovat zadání a doufat....

To Nargon:Dost záleží v čem to mají napsat, a čeho chce učitel dosáhnout. Ne vždy je výhoda použít OOP(ale tady zrovna jo), a tak se hodí umět i ostatní paradigmata.
Pole přepážek navíc zdaleka nemusí být globální a já osobně bych ho globální ani nedával.

To Hunter: Tato simulace není pravděpodobně dělaná kvůli výsledku. Věci jako omezené délky front, různá doba vyřizování, více přepážek pro 1 operaci a rozhodování příchozího, do které fronty se zařadí, vůle zákazníka čekat(pokud před ním je víc jak 5 lidí tak s pravděpodobností 50% odejde) atd. Od reálného modelu aby se výsledky dali nějak interpretovat tomu nechybý jen pořádná simulace příchodu zákazníků.
Fuller009
Junior

Odeslat příspěvekod sejnt 1. 3. 2012 11:55

docent Dvorsky na VSB konecnce zmenil zadania projektov ??:D
Lekvár je produkt šialenej myšlienky ako neurobiť zo všetkých sliviek slivovicu.[CZ] Povidla jsou produkt šílený myšlenky jak neudelat ze všech švestek slivovici.
sejnt
Junior
Uživatelský avatar

Odeslat příspěvekod kamil2268 1. 3. 2012 14:03

Některé změnil úplně a některé jen upravil :-]
kamil2268
Mírně pokročilý

Odeslat příspěvekod Kajo1354 1. 3. 2012 22:23

nemohli by ste mi tu dat nejaký ten kod aspon ako zacať ?
Kajo1354
Kolemjdoucí

Odeslat příspěvekod ahriman 2. 3. 2012 09:31

to Nargon: navíc oběktově se dá programovat i bez tříd... u objektového programování jde o to myšlení a nikoli o to, že potřebuješ k tomu nějaké třídy...třeba já když píšu něco v céčku, tak se to docela dost snažím dělat objektově a C není vůbec objektový jazyk z pohledu že nemá žádné třídy atd.
ahriman
Junior

Odeslat příspěvekod gandor 2. 3. 2012 11:01

ahriman: preboha ake principi mas na mysli?

Boze chran ma pred podobnym "OOP" kodom...
gandor
Mírně pokročilý

Odeslat příspěvekod Kajo1354 2. 3. 2012 21:44

no ja to musím robiť cez struktury preto, bo sme triedy ešte nepreberali. Nemohol by mi tu niekto hodiť nejaký ten kod ako zacať aspon niečo.
Kajo1354
Kolemjdoucí

Odeslat příspěvekod Nargon 3. 3. 2012 06:49

Mno vubec jsi nam nerekl jazyk, v jakym to mas delat. Ale moje vestecka koule hlasi C++. Tak te zkusim trochu nakopnout. Ale v C++ jsem uz par let nedelal, tak nevim jestli to bude dobre zapsane.

Kód: Vybrat vše
struct ZAKAZNIK {
  ZAKAZNIK* next; //ukazatel na dalsiho zakaznika ve fronte
  int id; //poradove cislo zakaznika
  int transakce; //pocet transakci, ktere chce zakaznik vykonat
}

int zakazniku = 0; //pocet vygenerovanych zakazniku
const int M = 100; //max pocet zakazniku
const int N = 5; //pocet prepazek
const int P = 3; //max pocet transakci

ZAKAZNIK* Prepazky[N]; //fronty prepazek pro zakazniky

ZAKAZNIK* GetFirst(int prepazka){
  //To je na tobe. Funkce ma vratit ukazatel na zakaznika, ktery je na rade pro zadane cislo prepazky (fronty)
  //Pokud zadny zakaznik u prepazky nestoji, vraci NULL
}
void Insert(int prepazka, ZAKAZNIK* zakaznik){
  //To je na tobe. Funkce vlozi noveho zakaznika na konec fronty pro dane cislo prepazky
}
void DeleteFirst(int prepazka){
  //To je na tobe. Funkce smaze (pomoci delete) zakaznika na zacatku fronty a na zacatek fronty umisti dalsiho v poradi.
}
void Generate(){
  //To je na tobe. Funkce nahodne vygeneruje cislo prepazky a pocet transakci. Pomoci new vyrobi noveho zakaznika a pres funkci Insert ho vlozi do fronty u prepazky.
  //Nezapomenout na inkrement citace poctu zakazniku.
}
void DecrementTransaction(ZAKAZNIK* zakaznik){
  //To je na tobe snizi pocet transakci o 1.
}


Myslim ze jsem pomohl celkem dost. Delal jsem to cca podle toho jak jsem psal na zacatku "jak bych to udelal ja". Melo by stacit doplnit kod do tech funkci a spravne je pouzit (v mainu ty dva vnorene cykly while a for a pouziti techto funkci). Ty jednotlive funkce jsou celkem jednoduche vetsinou tak na 2-5 radek kodu. Sice to v komentari nemam, ale u vsech tech metod samozrejme taky doplnit vypis v tom tvaru jak je v zadani.
Desktop: Ryzen 7 1800X (3.95GHz, 1.35V), Asus Crosshair VI Hero, 16GB DDR4 Ram (3200MHz), 128GB SSD + 3TB HDD, Nvidia GTX 1080
Notebook: Asus UL50VT 15.6" (SU7300@1.7GHz, 4GB ram, 500GB HDD, Intel GMA 4500MHD + nVidia G210M, dlouha vydrz cca 7+ hod)
Nargon
Moderátor

Odeslat příspěvekod Kajo1354 3. 3. 2012 12:51

diky velmi si mi pomohol idem skusiť tie funkcie vyplniť ako si mi to tam písal.
Kajo1354
Kolemjdoucí


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků