C++ - simulace obchodu na principu fronty
Ahoj! Tak jsme dostali zadání školního projektu, ze kterého nejsem moc chytrý :D Máme udělat simulaci obchodu na principu fronty, tj. mám zadán počet pokladen, počet zákazníků a max. počet položek, které můžou zákazníci koupit. Program má pak vypisovat u každého zákazníka "stav", tj. G"index""počet věcí co nakoupil" - po vygenerování, V"index""pokladna u které je nejkratší fronta - tam se zařadí""pořadí v té frontě", K"index""počet prvků co mu zbývá v košíku" - při každém průběhu hl. cyklu se za současného generování a zařazování nových zákazníků "odbaví" jedna položka z jeho nákupu. No a na závěr, po odbavení všech položek O"index""počet lidí, co zbývá ve frontě odkud zákazník odešel".
Myslím, že problém je v ukončovací podmínce hlavního cyklu, nebo u práce s hlavou fronty na konci programu - některé zákazníky mi to neodebírá a počítá s nimi dál, pak dochází k tomu, že se program ukončí předdčasně, aniž by všichni zákazníci odešli / jede do nekonečna / nevypisuje se nic (můj současný stav, ke kterému jsem po úpravách dospěl :D - to mě mate úplně, při krokování vidím, že program normálně pře výpisy jede, jen nic nevypisuje)...
Moc dík za veškeré rady, tady už fakt nevím :D
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
const int cashes = 5;
const int customers = 10;
const int max_items = 10;
struct cus{ //zakaznik
int id;
int items;
cus *next;
};
struct queue{ //fronta
cus *head, *tail;
int size;
};
bool isEmpty(queue arr[]){ //kontrola pole, jestli je prazdne
for(int i = 0; i < cashes; ++i){
if(arr[i].size != 0){
return false;
}else{
return true;
}
}
}
void init(queue arr[]){ //inicializace pole na zacatku
for(int i = 0; i < cashes; ++i){
arr[i].head = arr[i].tail = NULL;
arr[i].size = 1;
}
}
int main(){
queue arr[cashes];
init(arr);
int total = 0; //poradi zakazniku
srand(time(NULL)); //pro urceni nahodneho cisla nakupu
while(isEmpty(arr) == false){
//generovani noveho zakaznika
if(total <= customers){
cus *newC = new cus; //novy zakaznik
newC->id = total;
newC->items = rand() % (max_items + 1);
cout << "G" << newC->id << "[" << newC->items << "]" << " ";
++total;
//urceni nejkratsi fronty a zarazeni zakaznika
int qMin = 0; //index nejkratsi fronty
int lMin = arr[0].size; //delka nejkratsi fronty
for(int i = 0; i < cashes; ++i){
if(lMin > arr[i].size){
lMin = arr[i].size;
qMin = i;
}
}
//zarazeni zakaznika na konec nejkratsi fronty
cus *next_assist = new cus;
if(arr[qMin].tail == NULL){
arr[qMin].tail = newC;
}else{
arr[qMin].tail->next = newC;
}
//overim, jestli je head NULL
if(arr[qMin].head == NULL){
arr[qMin].head = arr[qMin].tail;
arr[qMin].tail = NULL;
}
++arr[qMin].size; //zvetsim velikost pole +1
cout << "V" << newC->id << "[F" << qMin << "]" << " ";
}
//"odbaveni" zakaznika na pokladne
for(int i = 0; i < cashes; ++i){ //prochazim pokladny a hledam, jestli je na headu hodnota - zakaznik
if(arr[i].head != NULL){
--arr[i].head->items; //odstranim polozku z kosiku
if(arr[i].head->items >= 0){
cout << "K" << arr[i].head->id << "[" << arr[i].head->items << "] ";
}/*else{
cout << "K" << arr[i].head->id << "[0] ";
}*/
if((arr[i].head->items) == 0){
--arr[i].size;
cout << "O" << arr[i].head->id << "[F" << i << "]" << "[" << arr[i].size << "] ";
if (arr[i].head->next == NULL){
arr[i].head = arr[i].head->next;
}
}
}
}
}
return 0;
}
Strašně moc díky, už mi to funguje Jinak, původní kód jsem psal s asistencí jednoho známého, protože ve škole se to tak nějak proletělo a pointery mi nebyly moc jasné... Jo a OOP se tu nesmí používat, fakt jenom struktury :D Jakmile bude pondělí, tak pokud to bude dobře, mrsknu tu celý kód, třeba to někomu pomůže
He? Uz mi je asi jasne odkial MS bere tolkych ludi co potom robia ten deravy OS. Asi studovali tiez tam :D
Ono OOP přijde, ale zatím byl jenom zmíněn na přednášce, takže musíme projekt dělat jen s pomocí struktur... No a pak to takhle dopadá :D
Ono sa to da urobit slusne aj so strukturami, mal si si urobit funkcie pridatprvok vymazatprvok tie by sa zaoberali len tou FIFO frontou t.j. len tymi 3 premennymi v strukture takze pri tvorbe tych fcii sa clovek moze zamerat len na tie 3 premenne v strukture a urobit tie 2 funkcie dokonale. Potom samozrejme vo vacsom/zlozitejsom programe by boli tie funkcie volane aj viackrat, preto su nakoniec v zlozitom programe tie funkcie aj nutne. Hlavny program by bol prehladny (malo riadkov - len volania funkcii) a citatelny.
Ono OOP trieda neni nic ine len sada struktur a funkcii, len je to v OOP trochu syntakticky (opticky) uhladenejsie aby to bolo lepsie a jednoduchsie citatelne.
Jo, tak to mě napadlo, až jsem měl napsanou většinu kódu a nechtělo se mi to měnit :D
Tak mě napadá, ty struktury newC a arr bych měl asi před returnem uvolnit pomocí delete, že? :D
Tak, tady je ten finální kód