#include <iostream> #include <cstdlib> #include <ctime> #include <string> #include <Windows.h> #include "Polje.h" using namespace std;   struct petorka{ 	short a,b,c,d,e; } *pet;   datum danasDat;  unsigned short glRed, uputniceRecepti, trecina;    const  short loseKombinacije_cd[][2]  = { {1, 3}, {1, 4} };			 const short loseKombinacije_ce[][2] = { {1,1}, {3, 5} };			 const short loseKombinacije_de[][3] = { {3,2}, {3,3}, {3,4}, {3,5},   										{4,2}, {4,3}, {4,4}, {4,5},	 									  };    bool DobraKombinacija(petorka pet){ 	 	for(int i=0; i<2; i++){ 		if( (pet.c == loseKombinacije_cd[i][0]) && (pet.d == loseKombinacije_cd[i][1]) )		 			return false; 		else if( (pet.c == loseKombinacije_ce[i][0]) && (pet.e == loseKombinacije_ce[i][1]) )	 			return false; 	} 	for(int i=0; i<8; i++){ 		if((pet.d == loseKombinacije_de[i][0]) && (pet.e == loseKombinacije_de[i][1]) )			 			return false; 	} 	return true;  }    void GeneriranjePetorke(petorka &pet){  	pet.a = (rand() % 251)+50;  	pet.b = (rand() % 251)+50;  	do{ 		pet.c = (rand() % 5) +1;  		pet.d = (rand() % 4) +1;  		pet.e = (rand() % 5)+1;	 	 	}while(! DobraKombinacija(pet) );	  }    bool ValjanDan(short dan, short mj, short god){ 	 	if( (dan > 31) || (dan < 1) ) 		return false;  	else if(mj == 2){ 		if( (god % 4 == 0) && (dan > 29) )  			return false; 		else if( (god % 4 != 0) && (dan > 28) )  			return false; 	}  	else if( (mj == 4) || (mj == 6) || (mj == 9) || (mj == 11) ){ 		if( dan > 30) 			return false; 	} 	else 		return true; }    void Unos(pacijent &p){ 	cout << "Ime i prezime: "; getline(cin, p.prezIme);  	cout << "Datum rodjenja:\n\tGodina: ";  cin >> p.dat.godina; 	 	cout << "\tMjesec: ";  	do{ 		cin >> p.dat.mjesec; 	}while( (p.dat.mjesec < 1) || (p.dat.mjesec > 12) ); 	 	cout << "\tDan: ";  	do{ 		cin>> p.dat.dan; 	}while( ! ValjanDan(p.dat.dan, p.dat.mjesec, p.dat.godina) ); 	 	cout << "Spol (m - musko, z - zensko): "; 	do{ 		cin >> p.spol; 	}while( (p.spol != 'm') && (p.spol != 'z') ); 	 	cout << "Prioritet (1-5): "; 	if( (p.spol == 'm') && (p.brGod < 6)){  		do{ 			 cin >> p.c; 			 if(p.c == 3) 				 cout << "\nCak i uz danasnju tehnologiju je nemoguce da muskarac zatrudni!\n"; 		}while( (p.c < 1) || (p.c > 5) || (p.c == 3) ); 	} 	else if(p.brGod >= 6){ 		do{ 			cin >> p.c; 			cout << "Pa nije dijete mladje od 6 godina..." << endl; 		}while( p.c == 4); 	} 	else{ 		do{ 			 cin >> p.c; 		}while( (p.c < 1) || (p.c > 5) ); 	} 	 	cout << "Vrsta usluge(1-4): "; 	do{ 		cin >> p.d; 	}while( (p.d < 1) || (p.d > 4) ); 	 	cout << "Ordinacija(1-5): "; 	if(p.spol == 'm'){  		do{ 			cin >> p.e; 			if(p.e == 4) 				cout << "\nMuskarci obicno ne idu kod ginekologa...\n"; 		}while( (p.e < 1) || (p.e > 5) || (p.e == 4)); 	} 	else{  		do{ 			cin >> p.e; 			if(p.e == 4) 				cout << "\nZene obicno ne idu kod urologa...\n"; 		}while( (p.e < 1) || (p.e > 5) || (p.e == 5)); 	} 	 	 	p.brGod = danasDat.godina - p.dat.godina - 1; 	if(p.dat.mjesec >= danasDat.mjesec) 		p.brGod++; 	else if( (p.dat.mjesec == danasDat.mjesec) && (p.dat.dan >= danasDat.dan) ) 		p.brGod++;  	if( (p.d == 3) || (p.d == 4) ) 		uputniceRecepti++;  }    string Usluga(short u){ 	switch(u){ 		case 1: return "pregled"; 		case 2: return "previjanje"; 		case 3: return "recepti"; 		case 4: return "uputnice"; 	} }    string Prioritet(short u){ 	switch(u){ 		case 1: return "hitno"; 		case 2: return "invalid"; 		case 3: return "trudnica"; 		case 4: return "djeca <6 godina"; 		case 5: return "ostali"; 	} }    string Ordinacija(short u){ 	switch(u){ 		case 1: return "obiteljska medicina"; 		case 2: return "oftalmologija"; 		case 3: return "dermatovenerologija"; 		case 4: return "ginekologija"; 		case 5: return "urologija"; 	} }    void Ispis(pacijent p){ 	cout << "\n-------------------------------------------------" << endl; 	cout << "Ime i prezime: " << p.prezIme << endl; 	cout << "Datum rodjenja: " << p.dat.dan << "." <<  p.dat.mjesec <<"." << p.dat.godina << endl; 	cout << "Broj godina: " << p.brGod << endl; 	cout << "Spol: "<< p.spol << endl; 	cout << "Prioritet: "<< Prioritet(p.c) << endl; 	cout << "Vrsta usluge: " << Usluga(p.d) << endl; 	cout << "Ordinacija: " << Ordinacija(p.e) << endl; }    void UnosPacijenta(Queue *q,  petorka *pet, int n){  	pacijent p; 	for(int i=0; i<n; i++){ 		p.prezIme = "pacijent"; 		char str[5]; 		itoa(i+1, str, 10);  		p.prezIme += str;	 		p.a = pet[i].a; 		p.b = pet[i].b; 		p.c = pet[i].c; 		p.d = pet[i].d; 		p.e = pet[i].e; 		if( (p.c == 3) || (p.e == 4) )  			p.spol = 'z'; 		else if(p.e == 5)	 			p.spol = 'm'; 		else{  			if((rand() % 3) == 1) 				p.spol = 'm'; 			else 				p.spol = 'z'; 		} 		p.brGod = (rand()%40) + 20;  		p.dat.dan = 1; 		p.dat.mjesec = 1; 		p.dat.godina = danasDat.godina - p.brGod; 		EnQueue(q, p); 	} }    void UnosPacijenta(Queue *q){  	pacijent p; 	cin.ignore(); 	Unos(p); 	EnQueue(q, p); }     void PacijenticeKodOftalmologa(Queue *q){  	pacijent p; 	Queue *pom = new Queue;  	InitQ(pom);  	 	do{ 		p = FrontQ(q); 		if( (p.spol == 'z') && (p.brGod > 25) && (p.d == 1) && (p.e == 2))  			Ispis(p); 		EnQueue(pom, p); 		DeQueue(q); 	}while( !IsEmptyQ(q) ); 	 	do{ 		p = FrontQ(pom); 		EnQueue(q, p); 		DeQueue(pom); 	}while( !IsEmptyQ(pom) );  	delete pom; }    void IspisReda(Queue *q, bool glavni){ 	pacijent p; 	Queue *pom = new Queue;  	InitQ(pom);  	if(glavni) 		cout << "Ispis glavnog reda:\n" << endl; 	else 		cout << "Ispis brzog reda:\n" << endl;  	 	do{ 		p = FrontQ(q); 		Ispis(p); 		EnQueue(pom, p); 		DeQueue(q); 	}while( !IsEmptyQ(q) ); 	do{ 		p = FrontQ(pom); 		EnQueue(q, p); 		DeQueue(pom); 	}while( !IsEmptyQ(pom) );  	delete pom; }     void Invalidi(Queue *q){  	pacijent p; 	Queue *pom = new Queue;  	InitQ(pom);  	 	do{ 		p = FrontQ(q); 		if ( (p.spol == 'm') && (p.brGod > 50) && (p.c == 2) && (p.d == 2) && (p.e == 1) )  			glRed--;  		else  			EnQueue(pom, p);	 		DeQueue(q); 	}while( !IsEmptyQ(q) ); 	  	do{ 		p = FrontQ(pom); 		EnQueue(q, p); 		DeQueue(pom); 	}while( !IsEmptyQ(pom) );  	IspisReda(q, true);  	delete pom; }     void Sort(pacijent *p){ 	bool zamj; 	for(int i=0; i<glRed; i++){ 		zamj = false; 		for(int j=0; j<glRed-i-1; j++){ 			if(p[j].c > p[j+1].c){ 				pacijent pom = p[j]; 				p[j] = p[j+1]; 				p[j+1] = pom; 				zamj = true; 			} 			else if( (p[j].c == p[j+1].c) && (p[j].a > p[j+1].a)){ 				pacijent pom = p[j]; 				p[j] = p[j+1]; 				p[j+1] = pom; 				zamj = true; 			} 		} 		if(!zamj) break;  	} }    void Sort(Queue *q){ 	pacijent *p = new pacijent[glRed]; 	int i=0; 	do{ 		p[i] = FrontQ(q); 		DeQueue(q); 		i++; 	}while( !IsEmptyQ(q) ); 	Sort(p); 	for(i=0; i<glRed; i++) 		EnQueue(q, p[i]); }    void NoviRed(Queue *glavni, Queue *brzi, int i, int length, int upRec, int trecina){  	static pacijent *spremnik = new pacijent[length]; 	spremnik[i] = FrontQ(glavni); 	DeQueue(glavni); 	if(i < length-1) 		NoviRed(glavni, brzi, i+1, length, upRec, trecina);  	if(i == 0){ 		int x = 0; 		for(int j=0; j<length; j++){ 			if( (spremnik[j].d == 3) || (spremnik[j].d == 4) ){ 				x++; 				if(x > (upRec - trecina)) 					EnQueue(brzi, spremnik[j]); 				else 					EnQueue(glavni, spremnik[j]); 			} 			else 				EnQueue(glavni, spremnik[j]); 		} 	}  }         int main(){  	glRed = 0; 	uputniceRecepti = 0; 	trecina = 0; 	srand(time(0)); 	time_t t = time(0); 	struct tm *dat = localtime(&t); 	danasDat.dan = dat->tm_mday; 	danasDat.mjesec = dat->tm_mon + 1; 	danasDat.godina = dat->tm_year + 1900;  	int n; 	cout << "\nBroj uredjenih petorki: "; 	do{ 		cin >> n; 		if(n<=1) cout << "Krivi unos!\n\nBroj uredjenih cetvorki: "; 	}while(n<=1); 	pet = new petorka[n];  	glRed = n;  	for(int i=0; i<n; i++){ 		GeneriranjePetorke(pet[i]); 		if( (pet[i].d == 3) || (pet[i].d == 4) ) 			uputniceRecepti++; 	} 	 	Queue *q = new Queue; 	Queue *brzi = new Queue; 	InitQ(q); InitQ(brzi); 	UnosPacijenta(q, pet, n); 	Sort(q);  	char izb; 	system ("cls"); 	do{ 		cout << "\n1. Dodavanje novog pacijenta\n2. Invalidi idu na previjanje " << endl; 		cout << "3. Red brzih usluga\n0. Izlaz "; 		cout << endl << "\n\tIzbor: "; 		cin >> izb; 		system ("cls"); 		 		switch(izb){ 			case '0': { return 0; } 			case '1': { 						  cout << "Klijent br. " << glRed + 1 << ":\n" << endl; 						  UnosPacijenta(q); 						  glRed = glRed+1; 						  cout << endl; 						  Sort(q); 						  PacijenticeKodOftalmologa(q); 						  break; 					  } 			case '2': {	 						  Invalidi(q); 						  break; 					  } 			case '3': { 						trecina = uputniceRecepti/3;  						NoviRed(q, brzi, 0, glRed, uputniceRecepti, trecina);  						IspisReda(q, true); 						 						system("pause"); 						system("cls");  						if( IsEmptyQ(brzi) ) 							cout << "Prazan je.."; 						else 							IspisReda(brzi, false);  						glRed -= trecina; 						uputniceRecepti -= trecina; 						break;						 					  } 			default: { cout << "Krivi unos!" << endl; } 		} 		 		cout << "\n   Pritisnite bilo koju tipku na nastavak..." << endl; 		system("pause"); 		system ("cls"); 	}while(1); }