/* PROVA D'ESAME 18-01-2022 */ #include #include using namespace std; // STRUTTURE struct elem{ // lista di veicoli char targa[7]; // 6 caratteri + '\0' elem* pun; // puntatore prossimo veicolo in coda }; struct Distributore{ elem* code[3]; // code alle varie pompe int quanti[3]; }; // UTILITY bool controllaTarga(char* s){ // controlla validità targa if(strlen(s)!=6){ // deve essere di 6 caratteri (strlen esclude dal conto il valore di \0). return false; } for(int i=0; i<6; i++){ // deve essere formata da caratteri A%Z o 0%9 if(! ((s[i]>='A' && s[i] <= 'Z') || (s[i]>='0' && s[i] <= '9'))){ return false; } } return true; } bool cercaTarga(elem* testa, char* s){ elem* p; for(p=testa; p!=NULL; p=p->pun){ if(strcmp(s, p->targa)==0){ return true; } } return false; } // FUNZIONI TESTO A void inizializzaDistributore(Distributore& d, char* s, char* t){ for(int i=0; i<3; i++){ //inizializza distributore d.code[i] = NULL; d.quanti[i] = 0; } if(controllaTarga(s) && controllaTarga(t) && (strcmp(s,t)!=0)){ elem* p = new elem; strcpy(p->targa, s); p->pun = NULL; d.code[0] = p; d.quanti[0]++; p = new elem; strcpy(p->targa, t); p->pun = NULL; d.code[2] = p; d.quanti[2]++; } } bool ingressoDistributore(Distributore& d, char* s){ if(!controllaTarga(s)){ return false; } // deve essere una targa valida for(int i=0;i<3;i++){ if(cercaTarga(d.code[i], s)){ return false; } // non deve già essere in coda da altre parti } int max = d.quanti[0]; // cerca il massimo int index = 0; int i; for(int i=1; i<3; i++){ if(d.quanti[i]>max){ max = d.quanti[i]; index = i; } } elem* q = d.code[i]; // prendi la coda con numero di veicoli maggiore elem* r = new elem; // crea nuovo veicolo strcpy(r->targa, s); r->pun = NULL; if(q==NULL){ // se la coda è vuota d.code[i] = r; }else{ while(q->pun != NULL){ q = q->pun; } q->pun = r; } d.quanti[i]++; return true; } bool servitoDistributore(Distributore& d, int i){ if(i<1||i>3){ return false; } // deve essere una pompa valida i--; // indice inizia da 0 if(d.quanti[i]==0){ return false; } // deve esserci almeno un veicolo in coda elem* p = d.code[i]; // puntatore al primo elemento della coda d.code[i] = p->pun; // adesso la coda punta a ciò che viene puntato dal primo elemento (i.e., il secondo elemento) d.quanti[i]--; delete p; return true; } void svuotaDistributore(Distributore& d){ elem* p; elem* q; for(int i=0; i<3; i++){ p = d.code[i]; while(p!=NULL){ q = p; // si salva il puntatore all'elemento corrente p = p->pun; // si salva il puntatore all'elemento successivo delete q; } d.code[i] = NULL; d.quanti[i] = 0; } } void stampaDistributore(const Distributore& d){ // const perchè il distributore non cambierà valori dentro questa funzione elem* p; for(int i=0; i<3; i++){ cout << '<' ; p = d.code[i]; while(p!=NULL){ cout << p->targa; if(p->pun!=NULL){ // se non è l'ultimo della lista cout << ", "; } p = p->pun; } cout << '>'; } cout << endl; return; }