Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <time.h>
- #include <stdlib.h>
- #include <string.h>
- #define DIM_NOME 50
- #define DIM_HEAP 50
- #define MIN_NOME 1
- #define MAX_NOME 10
- //stuttura che rappresenta un Pronto soccorso
- typedef struct
- {
- int numeroB;
- int numeroG;
- int numeroV;
- int numeroR;
- } ProntoSoccorso;
- //enumerazione che rappresenta i codici del pronto soccorso
- typedef enum {BIANCO, VERDE, GIALLO, ROSSO} Codice;
- //struttura che rappresenta un Paziente
- typedef struct
- {
- char nome[DIM_NOME];
- Codice codice;
- int ordine;
- }Paziente;
- /*funzione che chiede i dati relativi ad un nuovo paziente e lo restituisce (con il campo ordine calcolato automaticamente),
- pronto per essere inserito nella coda con priorita' (heap) */
- Paziente nuovoPaziente(ProntoSoccorso *ps);
- Paziente nuovoPazienteCasuale(ProntoSoccorso *ps); //per generazione casuale, la logica non è stata modificata
- int priorita(Paziente p1, Paziente p2);
- void insertHeap(Paziente coda[], Paziente p , int * n_el);
- Paziente deleteHeap(Paziente coda[], int * n_el);
- void print_heap(Paziente coda[], int n_pazienti);
- void print_with_priority(Paziente coda[], int n_pazienti);
- void confronta_pazienti(Paziente coda[], int n_pazienti);
- int main()
- {
- srand(time(NULL)*62681);
- //inizializzazione pronto soccorso
- ProntoSoccorso ps;
- ps.numeroB = ps.numeroG = ps.numeroV = ps.numeroR = 0;
- //inizializzazione della Coda con priorita'
- Paziente codaPrio[DIM_HEAP]={};
- int scelta;
- Paziente p_temp={};
- int n_pazienti=0;
- do{
- printf("\n\nche azione vuoi svolgere?"
- "\n1 -> inserisci dati nuovo paziente"
- "\n2 -> genera casualente un paziente pronto ad essere inserito"
- "\n3 -> confronta priorita' tra due pazienti"
- "\n4 -> inserisci nuovo paziente in coda"
- "\n5 -> rimuovi il paziente con priorita' maggiore dalla coda"
- "\n6 -> stampa lo stato della coda, in ordine posizionale"
- "\n7 -> stampa lo stato della coda, in ordine di priorita' (non richiesto)");
- printf("\ninserisci azione: ");
- scanf(" %d", &scelta);
- getchar();
- switch(scelta)
- {
- case 1:
- p_temp = nuovoPaziente(&ps);
- break;
- case 2:
- p_temp = nuovoPazienteCasuale(&ps);
- printf("\nnome paziente generato: %s", p_temp.nome);
- break;
- case 3:
- confronta_pazienti(codaPrio, n_pazienti);
- break;
- case 4:
- insertHeap(codaPrio, p_temp, &n_pazienti );
- break;
- case 5:
- deleteHeap(codaPrio, &n_pazienti);
- break;
- case 6:
- printf("\nNUMERO PAZIENTI: %d", n_pazienti);
- print_heap(codaPrio, n_pazienti);
- break;
- case 7:
- print_with_priority(codaPrio, n_pazienti);
- break;
- }
- }while(scelta!=0);
- return 0;
- }
- int priorita(Paziente p1, Paziente p2)
- {
- if(p1.codice > p2.codice) return 1;
- if(p2.codice > p1.codice) return 2;
- //se ora i codici sono uguali controllo il numero
- //do per scontato che non possano avere lo stesso numero
- if(p1.ordine< p2.ordine) return 1;
- else return 2;
- }
- void insertHeap(Paziente coda[], Paziente p , int * n_el)
- {
- int i;
- // inserisce un nuovo item in un heap di n elementi
- if (*n_el == DIM_HEAP-1)
- {
- printf("\nL'heap e' pieno");
- }
- else
- {
- //aggiungo uno al contatore degli elementi
- (*n_el)++;
- i = *n_el; //inizializzo i per scorrere l'array
- while (i != 1 && priorita(p, coda[i/2] )==1)
- {
- //partendo dall'ultimo elemento risalgo finche ho raggiunto il top oppure ha priorita minore del padre
- coda[i] = coda[i/2]; //se è maggiore metto il padre nel figlio
- i = i/2;
- }
- coda[i] = p; //a fine ciclo inserisco nella posizione corretta
- }
- }
- Paziente deleteHeap(Paziente heap[], int * n_el)
- {
- Paziente item={}, temp;
- int padre,figlio;
- // cancella e restituisce l’elemento radice in un heap di n elementi
- item = heap[1];
- temp = heap[*n_el];
- if((*n_el)>0)
- (*n_el)--;
- else return item;
- padre= 1;
- figlio=2;
- while(figlio <= *n_el)
- {
- if (figlio < *n_el && priorita(heap[figlio], heap[figlio+1])==2 ) //se il figlio destro ha priorita avanzo di 1
- figlio++;
- if ( priorita(temp ,heap[figlio]) ==1)
- break;
- //metto il figlio nella posizione del padre e continuo a scendere con il figlio *=2
- heap[padre] = heap[figlio];
- padre = figlio;
- figlio*=2;
- }
- heap[padre] = temp; //piazzo temp nella posizione corretta solo alla fine
- return item;
- }
- void confronta_pazienti(Paziente coda[], int n_pazienti)
- {
- int a, b;
- printf("\nscegli 2 pazienti da confrontare: ");
- print_heap(coda, n_pazienti);
- do
- {
- printf("\ninserisci indice paziente A : ");
- scanf("%d", &a), getchar();
- printf("\ninserisci indice paziente B : ");
- scanf("%d", &b), getchar();
- }while(a<1 || b<1 || a>n_pazienti || b>n_pazienti || a==b);
- if(priorita(coda[a], coda[b])==1)
- printf("\n%s ha priorita' su %s", coda[a].nome, coda[b].nome);
- else
- printf("\n%s ha priorita' su %s", coda[b].nome,coda[a].nome );
- }
- void print_heap(Paziente coda[], int n_pazienti)
- {
- int j=0;
- for(int i=1; j<n_pazienti && i<DIM_HEAP; i++)
- {
- if(coda[i].nome[0]!='\0')
- {
- j++;
- printf("\n\nPaziente %d : ",j);
- printf("\nnome: %s", coda[i].nome);
- printf("\ncodice: ");
- switch(coda[i].codice)
- {
- case ROSSO:
- printf("ROSSO");
- break;
- case GIALLO:
- printf("GIALLO");
- break;
- case VERDE:
- printf("VERDE");
- break;
- case BIANCO:
- printf("BIANCO");
- break;
- }
- printf("\nposizione: %d", coda[i].ordine);
- }
- }
- }
- void print_with_priority(Paziente coda[], int n_pazienti)
- {
- int pazienti_appoggio = n_pazienti;
- Paziente appoggio[pazienti_appoggio];
- for(int i=0; i<n_pazienti; i++)
- {
- appoggio[i]=coda[i];
- }
- Paziente tmp;
- while(pazienti_appoggio > 0)
- {
- tmp= deleteHeap(appoggio, &pazienti_appoggio);
- if(tmp.nome[0]!='\0')
- {
- printf("\n\nnome: %s", tmp.nome);
- printf("\ncodice: ");
- switch(tmp.codice)
- {
- case ROSSO:
- printf("ROSSO");
- break;
- case GIALLO:
- printf("GIALLO");
- break;
- case VERDE:
- printf("VERDE");
- break;
- case BIANCO:
- printf("BIANCO");
- break;
- }
- printf("\nposizione: %d", tmp.ordine);
- }
- }
- }
- Paziente nuovoPazienteCasuale(ProntoSoccorso *ps)
- {
- //modifica della funzione che chiede i pazienti per generarli casualmente
- Paziente p;
- int casuale;
- casuale=MIN_NOME + rand()%(MAX_NOME-MIN_NOME+1);
- switch(casuale)
- {
- case 1:
- strcpy(p.nome, "Anastasia");
- break;
- case 2:
- strcpy(p.nome, "Bartolomeo");
- break;
- case 3:
- strcpy(p.nome, "Claudio");
- break;
- case 4:
- strcpy(p.nome, "Denis");
- break;
- case 5:
- strcpy(p.nome, "Endro");
- break;
- case 6:
- strcpy(p.nome, "Francesca");
- break;
- case 7:
- strcpy(p.nome, "Gaia");
- break;
- case 8:
- strcpy(p.nome, "Lorenzo");
- break;
- case 9:
- strcpy(p.nome, "Marco");
- break;
- case 10:
- strcpy(p.nome, "Nicole");
- break;
- default:
- strcpy(p.nome, "sFortunato");
- //non dovrebbe mai arrivare qua, ma se apppare il nome sFortunato c'è qualche errore :)
- break;
- }
- p.codice=BIANCO + rand()%(ROSSO-BIANCO+1);
- if(p.codice == BIANCO)
- {
- ps->numeroB++;
- p.ordine = ps->numeroB;
- }
- else if(p.codice == GIALLO)
- {
- ps->numeroG++;
- p.ordine = ps->numeroG;
- }
- else if (p.codice == VERDE)
- {
- ps->numeroV++;
- p.ordine = ps->numeroV;
- }
- else
- {
- ps->numeroR++;
- p.ordine = ps->numeroR;
- }
- return p;
- }
- Paziente nuovoPaziente(ProntoSoccorso *ps)
- {
- Paziente p;
- printf("\nNome paziente -> ");
- scanf("%[^\n]s", p.nome);
- getchar();
- do
- {
- printf("\nCodice paziente (0 = bianco, 1 = verde, 2 = giallo, 3 = rosso)-> ");
- scanf("%u", &p.codice);
- getchar();
- if(p.codice < BIANCO || p.codice > ROSSO)
- printf("\nCodice non valido");
- }while(p.codice < BIANCO || p.codice > ROSSO);
- if(p.codice == BIANCO)
- {
- ps->numeroB++;
- p.ordine = ps->numeroB;
- }
- else if(p.codice == GIALLO)
- {
- ps->numeroG++;
- p.ordine = ps->numeroG;
- }
- else if (p.codice == VERDE)
- {
- ps->numeroV++;
- p.ordine = ps->numeroV;
- }
- else
- {
- ps->numeroR++;
- p.ordine = ps->numeroR;
- }
- return p;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement