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;
}
Tak, tady je ten finální kód