Advertisement
nicoviale_

Untitled

Jun 8th, 2023 (edited)
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 9.94 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6.  
  7. #define DIM_NOME 50
  8. #define DIM_HEAP 50
  9. #define MIN_NOME 1
  10. #define MAX_NOME 10
  11.  
  12.  
  13. //stuttura che rappresenta un Pronto soccorso
  14. typedef struct
  15. {
  16.     int numeroB;
  17.     int numeroG;
  18.     int numeroV;
  19.     int numeroR;
  20. } ProntoSoccorso;
  21.  
  22. //enumerazione che rappresenta i codici del pronto soccorso
  23. typedef enum {BIANCO, VERDE, GIALLO, ROSSO} Codice;
  24.  
  25. //struttura che rappresenta un Paziente
  26. typedef struct
  27. {
  28.     char nome[DIM_NOME];
  29.     Codice codice;
  30.     int ordine;
  31. }Paziente;
  32.  
  33. /*funzione che chiede i dati relativi ad un nuovo paziente e lo restituisce (con il campo ordine calcolato automaticamente),
  34. pronto per essere inserito nella coda con priorita' (heap) */
  35. Paziente nuovoPaziente(ProntoSoccorso *ps);
  36. Paziente nuovoPazienteCasuale(ProntoSoccorso *ps); //per generazione casuale, la logica non è stata modificata
  37.  
  38. int priorita(Paziente p1, Paziente p2);
  39. void insertHeap(Paziente coda[], Paziente p , int * n_el);
  40. Paziente deleteHeap(Paziente coda[],  int * n_el);
  41. void print_heap(Paziente coda[], int n_pazienti);
  42. void print_with_priority(Paziente coda[], int n_pazienti);
  43. void confronta_pazienti(Paziente coda[], int n_pazienti);
  44.  
  45. int main()
  46. {
  47.     srand(time(NULL)*62681);
  48.  
  49.   //inizializzazione pronto soccorso
  50.     ProntoSoccorso ps;
  51.     ps.numeroB = ps.numeroG = ps.numeroV = ps.numeroR = 0;
  52.  
  53.     //inizializzazione della Coda con priorita'
  54.     Paziente codaPrio[DIM_HEAP]={};
  55.     int scelta;
  56.     Paziente p_temp={};
  57.     int n_pazienti=0;
  58.  
  59.     do{
  60.         printf("\n\nche azione vuoi svolgere?"
  61.                "\n1 -> inserisci dati nuovo paziente"
  62.                "\n2 -> genera casualente un paziente pronto ad essere inserito"
  63.                "\n3 -> confronta priorita' tra due pazienti"
  64.                "\n4 -> inserisci nuovo paziente in coda"
  65.                "\n5 -> rimuovi il paziente con priorita' maggiore dalla coda"
  66.                "\n6 -> stampa lo stato della coda, in ordine posizionale"
  67.                "\n7 -> stampa lo stato della coda, in ordine di priorita' (non richiesto)");
  68.         printf("\ninserisci azione: ");
  69.         scanf(" %d", &scelta);
  70.         getchar();
  71.  
  72.         switch(scelta)
  73.         {
  74.             case 1:
  75.                     p_temp = nuovoPaziente(&ps);
  76.                 break;
  77.             case 2:
  78.                     p_temp = nuovoPazienteCasuale(&ps);
  79.                     printf("\nnome paziente generato: %s", p_temp.nome);
  80.                 break;
  81.             case 3:
  82.                     confronta_pazienti(codaPrio, n_pazienti);
  83.                 break;
  84.             case 4:
  85.                 insertHeap(codaPrio, p_temp, &n_pazienti );
  86.  
  87.                 break;
  88.             case 5:
  89.                 deleteHeap(codaPrio, &n_pazienti);
  90.  
  91.                 break;
  92.             case 6:
  93.                 printf("\nNUMERO PAZIENTI: %d", n_pazienti);
  94.  
  95.                 print_heap(codaPrio, n_pazienti);
  96.                 break;
  97.             case 7:
  98.                 print_with_priority(codaPrio, n_pazienti);
  99.                 break;
  100.         }
  101.     }while(scelta!=0);
  102.  
  103.     return 0;
  104. }
  105.  
  106.  
  107. int priorita(Paziente p1, Paziente p2)
  108. {
  109.     if(p1.codice > p2.codice) return 1;
  110.     if(p2.codice > p1.codice) return 2;
  111.  
  112.     //se ora i codici sono uguali controllo il numero
  113.     //do per scontato che non possano avere lo stesso numero
  114.     if(p1.ordine< p2.ordine) return 1;
  115.     else                     return 2;
  116.  
  117. }
  118.  
  119. void insertHeap(Paziente coda[], Paziente p , int * n_el)
  120. {
  121.     int i;
  122.     // inserisce un nuovo item in un heap di n elementi
  123.     if (*n_el == DIM_HEAP-1)
  124.     {
  125.         printf("\nL'heap e' pieno");
  126.     }
  127.     else
  128.     {
  129.         //aggiungo uno al contatore degli elementi
  130.         (*n_el)++;
  131.         i = *n_el; //inizializzo i per scorrere l'array
  132.         while (i != 1 && priorita(p, coda[i/2] )==1)
  133.         {
  134.             //partendo dall'ultimo elemento risalgo finche ho raggiunto il top oppure ha priorita minore del padre
  135.             coda[i] = coda[i/2]; //se è maggiore metto il padre nel figlio
  136.             i = i/2;
  137.         }
  138.         coda[i] = p; //a fine ciclo inserisco nella posizione corretta
  139.     }
  140. }
  141.  
  142. Paziente deleteHeap(Paziente heap[],  int * n_el)
  143. {
  144.     Paziente item={}, temp;
  145.     int padre,figlio;
  146.     // cancella e restituisce l’elemento radice in un heap di n elementi
  147.  
  148.     item = heap[1];
  149.     temp = heap[*n_el];
  150.  
  151.     if((*n_el)>0)
  152.         (*n_el)--;
  153.     else return item;
  154.  
  155.  
  156.     padre= 1;
  157.     figlio=2;
  158.  
  159.     while(figlio <= *n_el)
  160.     {
  161.         if (figlio < *n_el && priorita(heap[figlio], heap[figlio+1])==2 ) //se il figlio destro ha priorita avanzo di 1
  162.             figlio++;
  163.  
  164.         if ( priorita(temp ,heap[figlio]) ==1)
  165.             break;
  166.  
  167.         //metto il figlio nella posizione del padre e continuo a scendere con il figlio *=2
  168.         heap[padre] = heap[figlio];
  169.         padre = figlio;
  170.         figlio*=2;
  171.     }
  172.  
  173.     heap[padre] = temp; //piazzo temp nella posizione corretta solo alla fine
  174.     return item;
  175. }
  176.  
  177. void confronta_pazienti(Paziente coda[], int n_pazienti)
  178. {
  179.     int a, b;
  180.     printf("\nscegli 2 pazienti da confrontare: ");
  181.     print_heap(coda, n_pazienti);
  182.  
  183.     do
  184.     {
  185.         printf("\ninserisci indice paziente A : ");
  186.         scanf("%d", &a), getchar();
  187.  
  188.         printf("\ninserisci indice paziente B : ");
  189.         scanf("%d", &b), getchar();
  190.  
  191.  
  192.     }while(a<1 || b<1 || a>n_pazienti || b>n_pazienti || a==b);
  193.  
  194.     if(priorita(coda[a], coda[b])==1)
  195.         printf("\n%s ha priorita' su %s", coda[a].nome, coda[b].nome);
  196.     else
  197.         printf("\n%s ha priorita' su %s", coda[b].nome,coda[a].nome );
  198.  
  199. }
  200.  
  201. void print_heap(Paziente coda[], int n_pazienti)
  202. {
  203.     int j=0;
  204.  
  205.     for(int i=1;  j<n_pazienti &&   i<DIM_HEAP; i++)
  206.     {
  207.         if(coda[i].nome[0]!='\0')
  208.         {
  209.             j++;
  210.             printf("\n\nPaziente %d : ",j);
  211.             printf("\nnome: %s", coda[i].nome);
  212.  
  213.             printf("\ncodice: ");
  214.             switch(coda[i].codice)
  215.             {
  216.                 case ROSSO:
  217.                     printf("ROSSO");
  218.                     break;
  219.                 case GIALLO:
  220.                     printf("GIALLO");
  221.                     break;
  222.                 case VERDE:
  223.                     printf("VERDE");
  224.                     break;
  225.                 case BIANCO:
  226.                     printf("BIANCO");
  227.                     break;
  228.             }
  229.  
  230.             printf("\nposizione: %d", coda[i].ordine);
  231.         }
  232.  
  233.     }
  234. }
  235. void print_with_priority(Paziente coda[], int n_pazienti)
  236. {
  237.     int pazienti_appoggio = n_pazienti;
  238.     Paziente appoggio[pazienti_appoggio];
  239.  
  240.     for(int i=0; i<n_pazienti; i++)
  241.     {
  242.         appoggio[i]=coda[i];
  243.     }
  244.  
  245.     Paziente tmp;
  246.  
  247.  
  248.     while(pazienti_appoggio > 0)
  249.     {
  250.         tmp= deleteHeap(appoggio, &pazienti_appoggio);
  251.         if(tmp.nome[0]!='\0')
  252.         {
  253.             printf("\n\nnome: %s", tmp.nome);
  254.  
  255.             printf("\ncodice: ");
  256.             switch(tmp.codice)
  257.             {
  258.                 case ROSSO:
  259.                     printf("ROSSO");
  260.                     break;
  261.                 case GIALLO:
  262.                     printf("GIALLO");
  263.                     break;
  264.                 case VERDE:
  265.                     printf("VERDE");
  266.                     break;
  267.                 case BIANCO:
  268.                     printf("BIANCO");
  269.                     break;
  270.             }
  271.  
  272.             printf("\nposizione: %d", tmp.ordine);
  273.         }
  274.     }
  275.  
  276.  
  277.  
  278. }
  279. Paziente nuovoPazienteCasuale(ProntoSoccorso *ps)
  280. {
  281.     //modifica della funzione che chiede i pazienti per generarli casualmente
  282.  
  283.     Paziente p;
  284.     int casuale;
  285.  
  286.     casuale=MIN_NOME + rand()%(MAX_NOME-MIN_NOME+1);
  287.  
  288.     switch(casuale)
  289.     {
  290.         case 1:
  291.             strcpy(p.nome, "Anastasia");
  292.             break;
  293.         case 2:
  294.             strcpy(p.nome, "Bartolomeo");
  295.             break;
  296.         case 3:
  297.             strcpy(p.nome, "Claudio");
  298.             break;
  299.         case 4:
  300.             strcpy(p.nome, "Denis");
  301.             break;
  302.         case 5:
  303.             strcpy(p.nome, "Endro");
  304.             break;
  305.         case 6:
  306.             strcpy(p.nome, "Francesca");
  307.             break;
  308.         case 7:
  309.             strcpy(p.nome, "Gaia");
  310.             break;
  311.         case 8:
  312.             strcpy(p.nome, "Lorenzo");
  313.             break;
  314.         case 9:
  315.             strcpy(p.nome, "Marco");
  316.             break;
  317.         case 10:
  318.             strcpy(p.nome, "Nicole");
  319.             break;
  320.         default:
  321.             strcpy(p.nome, "sFortunato");
  322.             //non dovrebbe mai arrivare qua, ma se apppare il nome sFortunato c'è qualche errore :)
  323.             break;
  324.  
  325.     }
  326.  
  327.     p.codice=BIANCO + rand()%(ROSSO-BIANCO+1);
  328.  
  329.     if(p.codice == BIANCO)
  330.     {
  331.         ps->numeroB++;
  332.         p.ordine = ps->numeroB;
  333.     }
  334.     else if(p.codice == GIALLO)
  335.     {
  336.         ps->numeroG++;
  337.         p.ordine = ps->numeroG;
  338.  
  339.     }
  340.     else if (p.codice == VERDE)
  341.     {
  342.         ps->numeroV++;
  343.         p.ordine = ps->numeroV;
  344.     }
  345.     else
  346.     {
  347.         ps->numeroR++;
  348.         p.ordine = ps->numeroR;
  349.     }
  350.  
  351.     return p;
  352. }
  353.  
  354. Paziente nuovoPaziente(ProntoSoccorso *ps)
  355. {
  356.     Paziente p;
  357.  
  358.     printf("\nNome paziente -> ");
  359.     scanf("%[^\n]s", p.nome);
  360.     getchar();
  361.  
  362.     do
  363.     {
  364.         printf("\nCodice paziente (0 = bianco, 1 = verde, 2 = giallo, 3 = rosso)-> ");
  365.         scanf("%u", &p.codice);
  366.         getchar();
  367.  
  368.         if(p.codice < BIANCO || p.codice > ROSSO)
  369.             printf("\nCodice non valido");
  370.     }while(p.codice < BIANCO || p.codice > ROSSO);
  371.  
  372.     if(p.codice == BIANCO)
  373.     {
  374.         ps->numeroB++;
  375.         p.ordine = ps->numeroB;
  376.     }
  377.     else if(p.codice == GIALLO)
  378.     {
  379.         ps->numeroG++;
  380.         p.ordine = ps->numeroG;
  381.  
  382.     }
  383.     else if (p.codice == VERDE)
  384.     {
  385.         ps->numeroV++;
  386.         p.ordine = ps->numeroV;
  387.     }
  388.     else
  389.     {
  390.         ps->numeroR++;
  391.         p.ordine = ps->numeroR;
  392.     }
  393.  
  394.     return p;
  395. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement