Matematické Fórum

Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.

Nástěnka
22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.

Nejste přihlášen(a). Přihlásit

#1 01. 03. 2012 22:10

Kajo1354
Příspěvky: 34
Reputace:   
 

Fronta - Simulace pošty

Dobrý deň,
v škole som dostal projekt, ktorému moc nerozumiem. Chcel by som vedieť ako danú problematiku vidíte vy a ako by som mal s projektom začať a keby sa dalo aj nejaký ten kód na začiatok by sa zišiel. Ďakujem

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].

Offline

 

#2 02. 03. 2012 13:16

frank_horrigan
Příspěvky: 938
Reputace:   31 
 

Re: Fronta - Simulace pošty

Zdravím,

docela pěkný příklad, který ti toho hodně dá, pokud jej pochopíš a zapojíš vlastní hlavu.

Mohl bych ti tady vysypat kompletní zdroják (trvalo by to asi hodinku až dvě, když se ví, jak to uchopit), což neudělám, a zkusím s tebou pracovat tak, abys sis na to přišel sám - tedy tě budu strkat, ale kód ode mně neuvidíš (maximálně jen útržky)

Takže se zeptám - čemu přesně nerozumíš? Už jsi se s tím pokoušel hnout? jak to dopadlo?

Rada první (jsi student, učíš se to tak máš na to právo) - kóduj. piš program, co tě napadne, co by mohlo fungovat, a pak si zkoušej, jestli to funguje :)

Zadání není o tom vymyslet kód, ale algoritmus "jak to udělat".

Se zbytkem ti pomohu já nebo zdejší šikovní kolegové :)


The only thing worse than being wrong is staying wrong
Sun Tzu - The Art of War

Offline

 

#3 02. 03. 2012 13:34

Kajo1354
Příspěvky: 34
Reputace:   
 

Re: Fronta - Simulace pošty

no tak zatial som si urobil struckuru asi takto:

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

struct zakaznik
{
    int dlzka_operacie;
    int poradove_cislo;
    zakaznik *next;
};

len neviem čo dalej
a ešte nrozumiem tomuto
•    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].

čo vlastne to G#1[F#2] atd. čo to je, čo tým vlastne myslí, aspon keby si mi tu nejaký postup napísal ako zacať napríklad vytvor si pole cez for alebo či mám používať dynamicky alokovanú pamäť. Ja som v tom programovaní amater na strednej škole som to nemal tak boh vie ako tomu nerozumiem ale chcel by som tomu pochopiť.

Offline

 

#4 02. 03. 2012 14:15

RePRO
Místo: Jihlava
Příspěvky: 363
Škola: AI VŠPJ (09-12, Bc.)
Pozice: programátor
Reputace:   11 
Web
 

Re: Fronta - Simulace pošty

Zdravím,
jaký programovací jazyk má být použit? Fronta může být naimplementována třeba buď jako pole, nebo jako spojový seznam. ;-)


Srdcem trochu-programátor, duší rádoby-matematik a povoláním analytik-vývojář.

Offline

 

#5 02. 03. 2012 14:20

Kajo1354
Příspěvky: 34
Reputace:   
 

Re: Fronta - Simulace pošty

↑ RePRO:
no ma to byť v c++ a asi to mám robiť cez ten zoznam

Offline

 

#6 02. 03. 2012 17:45

RePRO
Místo: Jihlava
Příspěvky: 363
Škola: AI VŠPJ (09-12, Bc.)
Pozice: programátor
Reputace:   11 
Web
 

Re: Fronta - Simulace pošty

↑ Kajo1354:
Dobře, zkusím se Ti na to podívat, hlavně to prvně pořádně promyslet a pak zkusím nastínit implementaci. Ale moc toho nebude, musíš na sobě makat ty sám. S ostatními kolegy však rádi poradíme.


Srdcem trochu-programátor, duší rádoby-matematik a povoláním analytik-vývojář.

Offline

 

#7 02. 03. 2012 18:04

Kajo1354
Příspěvky: 34
Reputace:   
 

Re: Fronta - Simulace pošty

↑ RePRO:
no bol by som strašne rád ak by si mi tu dal nejaký postup ako mám zacať a pokračovať a poprípade potom by som tu hadzal kody že či to dobre programujem potrebujem aby ma niekto kontroloval poprípade opravoval ked niečo zle urobím

Offline

 

#8 02. 03. 2012 20:30

frank_horrigan
Příspěvky: 938
Reputace:   31 
 

Re: Fronta - Simulace pošty

S těmi kódy je to hodně dobrý nápad :)  to se mně líbí, a myslím že kolegovi, který se též angažoval (děkuji) taktéž (ač nechci mluvit za něj) :)


The only thing worse than being wrong is staying wrong
Sun Tzu - The Art of War

Offline

 

#9 02. 03. 2012 22:26 — Editoval RePRO (02. 03. 2012 22:27)

RePRO
Místo: Jihlava
Příspěvky: 363
Škola: AI VŠPJ (09-12, Bc.)
Pozice: programátor
Reputace:   11 
Web
 

Re: Fronta - Simulace pošty

Tak teda sem sestřelil malý nástin, můžeš pokračovat. Kolega mě může klidně opravit, co by šlo lépe, jestli tam jsou nějaké šachry s ukazateli, nebo jiné nápady, jiné implementace... Díky.

Code:

#include <cstdlib>
#include <iostream>

using namespace std;

// Pocet prepazek
const int N = 5;
// Pocet zakazniku
const int M = 100;
// Pocet transakci
const int P = 3;

enum TypTransakce
{
     // Asi nevyuzijeme
};

struct Zakaznik
{
    int id_zakaznik;
    int poradove_cislo;
};

// Prepazka by mela byt fronta zakazniku
struct Prepazka
{
      Zakaznik *zakaznici[M];
      // Prvni a posledni zakaznik
      int first, last;
      // Aktualni pocet zakazniku ve fronte u dane prepazky
      int pocitadlo;
};

void inicializace(Prepazka *q) {
     
     q->first = 0;
     q->last = M - 1;
     q->pocitadlo = 0;
};

void doFronty(Prepazka *q, Zakaznik *x) {
     
     q->last = (q->last + 1) % M;
     // Vlozime zakaznika do fronty
     q->zakaznici[q->last] = x;
     q->pocitadlo = q->pocitadlo + 1;
};

Zakaznik *zFronty(Prepazka *q) {
    
    // Zakaznik ktereho odebirame
    Zakaznik *k = q->zakaznici[q->first];
    q->first = (q->first + 1) % M;
    q->pocitadlo = q->pocitadlo - 1;
    // A vratime zakaznika ktereho jsme odebrali
    return k;
};

// Funkce na odzkouseni problematiky
int main(int argc, char *argv[])
{  
    // 5 prepazek - kazda ma jiny typ transakce
    Prepazka prepazky[N];
    
    inicializace(&prepazky[0]);
    
    Zakaznik z;
    z.id_zakaznik = 1;
    z.poradove_cislo = 545;
    
    doFronty(&prepazky[0], &z);
    
    system("PAUSE");
    return EXIT_SUCCESS;
}

Srdcem trochu-programátor, duší rádoby-matematik a povoláním analytik-vývojář.

Offline

 

#10 02. 03. 2012 22:46

Kajo1354
Příspěvky: 34
Reputace:   
 

Re: Fronta - Simulace pošty

↑ RePRO:
Diky že si mi pomohol šak ako sa tak pozerám tak si mi skoro celý projekt urobil :D. Skúsim si to ešte nejak pomeniť podla svojho poprípade niečo dorobiť.

Offline

 

#11 03. 03. 2012 02:04

RePRO
Místo: Jihlava
Příspěvky: 363
Škola: AI VŠPJ (09-12, Bc.)
Pozice: programátor
Reputace:   11 
Web
 

Re: Fronta - Simulace pošty

Celý určitě ne. ;-) Navíc musí se to otestovat. Plno věcí je ještě na dodělání.


Srdcem trochu-programátor, duší rádoby-matematik a povoláním analytik-vývojář.

Offline

 

#12 05. 03. 2012 21:16 — Editoval janca361 (07. 03. 2012 14:46)

janca361
.
Příspěvky: 3284
 

Re: Fronta - Simulace pošty

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson