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

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é :)
Offline
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
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. ;-)
Offline
↑ 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.
Offline
↑ 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

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) :)
Offline
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.
#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;
}Offline

Ono se to řešilo ještě někde jinde.
EDIT: Opraven odkaz.
Offline