Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno 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;
}
Jsou zobrazeny jen nové odpovědi. Zobrazit všechny
Předmět Autor Datum
Strašně moc díky, už mi to funguje ;-) Jinak, původní kód jsem psal s asistencí jednoho známého, pro… nový
Katsushiro 15.03.2013 23:05
Katsushiro
OOP se tu nesmí používat He? Uz mi je asi jasne odkial MS bere tolkych ludi co potom robia ten dera… nový
MM.. 15.03.2013 23:19
MM..
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í str… nový
Katsushiro 16.03.2013 00:30
Katsushiro
Ono sa to da urobit slusne aj so strukturami, mal si si urobit funkcie pridatprvok vymazatprvok tie… nový
MM.. 16.03.2013 01:09
MM..
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á… nový
Katsushiro 17.03.2013 16:46
Katsushiro
Tak, tady je ten finální kód ;-) #include <iostream> #include <cstdlib> #include <ctime> using name… poslední
Katsushiro 21.03.2013 23:09
Katsushiro

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

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.

Tak, tady je ten finální kód ;-)

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

const int N = 3; //pocet pokladen
const int M = 2; //pocet zakazniku
const int P = 3; //max. pocet polozek v nakupu

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
	int sum = 0; //pocet prazdnych front
	for(int i = 0; i < N; ++i){
		if(arr[i].size == 0){
			sum++;
		}
	}
	if(sum == N){
		return true;
	}
	return false;
}

void init(queue arr[]){ //inicializace pole na zacatku

	for(int i = 0; i < N; ++i){
		arr[i].head = arr[i].tail = NULL;
		arr[i].size = 0;
	}

}

int main(){
	queue *arr = new queue[N];
	init(arr);

	int total = 1; //poradi zakazniku

	srand(time(NULL)); //pro urceni nahodneho cisla nakupu

	do{

		//generovani noveho zakaznika
		if(total <= M){
			cus *newC = new cus; //novy zakaznik
			newC->id = total;
			newC->items = rand() % P + 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 < N; ++i){
				if(lMin > arr[i].size){
					lMin = arr[i].size;
					qMin = i;
				}
			}

			//zarazeni zakaznika na konec nejkratsi fronty
			if(arr[qMin].head == NULL){
				arr[qMin].head = newC;
				arr[qMin].head->next = NULL;
			}else if(arr[qMin].tail == NULL){
				arr[qMin].head->next = newC;
				arr[qMin].tail = newC;
				arr[qMin].tail->next = NULL;
			}else{
				arr[qMin].tail->next = newC;
				arr[qMin].tail = newC;
				arr[qMin].tail->next = NULL;
			}

			arr[qMin].size++; //zvetsim velikost pole +1

			cout << "V" << newC->id << "[F" << qMin << "]" << " ";
		}

		//"odbaveni" zakaznika na pokladne
		for(int i = 0; i < N; ++i){ //prochazim pokladny a hledam, jestli je na headu hodnota - zakaznik
			if (arr != NULL && arr[i].head != NULL) {
				if (arr[i].head->items == 0){

					cout << "O" << arr[i].head->id << "[" << arr[i].size -1 << "] ";

					arr[i].head = arr[i].head->next;
					if(arr[i].head == arr[i].tail){
					    arr[i].tail = NULL;
					}

					arr[i].size--;
				}else{
					arr[i].head->items--;
					cout << "K" << arr[i].head->id << "[" << arr[i].head->items << "] ";
				}
			}
		}
	}while(isEmpty(arr) == false);

	cout << endl;
	delete []arr;
	return 0;
}

Zpět do poradny Odpovědět na původní otázku Nahoru