Advertisement
BiRabittoh

Aeromodellismo

Apr 22nd, 2017
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.77 KB | None | 0 0
  1. /* MARCO ANDRONACO
  2. Un gruppo di appassionati di aeromodellismo desidera effettuare una gara in cui esibire i modelli realizzati. A tale scopo, raccoglie per ogni partecipante
  3.     le seguenti informazioni:
  4. 1) Nome e cognome del partecipante
  5. 2) Categoria di partecipazione all'evento (due categorie possibili: aeromodellismo statico o dinamico)
  6. 3) L'elenco dei modelli che prendono parte alla gara (sono ammessi piu velivoli per partecipante)
  7. Le informazioni relative al modello includono un codice identificante, una tipologia (aereo/elicottero) Il peso in Kg e la cilindrata del motore (in cc)
  8. Per modellare il sistema viene utilizzata una lista di partecipanti e per ciascun partecipante l'elenco dei modelli e' memorizzato in una seconda lista ordinata
  9.     per codice identificativo.
  10. Il sistema deve permettere le operazioni di seguito descritte:
  11. 1) Iscrizione di un nuovo velivolo. Tale opzione deve prevedere l'iscrizione di un nuovo velivolo associato ad un partecipante. Se il partecipante e' gia'
  12.     iscritto il velivolo verra'  aggiunto all'elenco; se il partecipante non risulta iscritto va aggiunto prima il partecipante alla lista dei partecipanti
  13.     e quindi il velivolo all'elenco associato al partecipante.
  14. 2) Calcolo e visualizzazione delle percentuali di aerei e di elicotteri rispetto al totale di velivoli partecipanti
  15. 3) Visualizzazione di tutti i velivoli iscritti
  16. 4) La visualizzazione dell'elenco di tutti gli elicotteri con peso inferiore ad uno dato e cilindrata pari ad un valore dato
  17. 5) Cancellazione di un velivolo iscritto (se è l'unico di un dato partecipante viene cancellato anche il partecipante) fornendo in ingresso il codice identificativo
  18. */
  19.  
  20. #include <stdio.h>
  21. #include <stdlib.h>
  22. #include <string.h>
  23. #define M 31
  24.  
  25. //TYPEDEF
  26. typedef struct s1{
  27.     int codice;
  28.     int tipo;
  29.     float peso;
  30.     int cilindrata;
  31. } Aereo;
  32.  
  33. typedef struct s2{
  34.     Aereo infoA;
  35.     struct s2 *next;
  36. } NodoAereo, * ListaAereo;
  37.  
  38. typedef struct s3{
  39.     char nome[M];
  40.     char cognome[M];
  41.     int categoria;
  42.     ListaAereo modelli;
  43. } Persona;
  44.  
  45. typedef struct s4{
  46.     Persona infoP;
  47.     struct s4 * next;
  48. } NodoPersona, *ListaPersona;
  49.  
  50. //FUNZIONI
  51. int menu(){
  52.     puts("1) Iscrizione di un nuovo velivolo.");
  53.     puts("2) Stampa le percentuali di aerei e di elicotteri rispetto al totale di velivoli");
  54.     puts("3) Stampa tutti i velivoli iscritti");
  55.     puts("4) Stampa gli elicotteri con peso inferiore ad uno dato e cilindrata pari ad un valore dato");
  56.     puts("5) Cancella un velivolo iscritto");
  57.     puts("0) Esci dal programma");
  58. }
  59.  
  60. int ricercaPersone(ListaPersona lis, char nome[], char cognome[]){
  61.     if (lis == NULL){
  62.         return 0;
  63.     }
  64.     int posizione = 1;
  65.     do{
  66.         if ((strcmp(lis->infoP.nome, nome) == 0) && (strcmp(lis->infoP.cognome, cognome) == 0)){
  67.             return posizione;
  68.         }
  69.         lis = lis->next;
  70.         posizione++;
  71.     } while (lis != NULL);
  72.     return 0;
  73. }
  74.  
  75. int inserisciPersona(ListaPersona * lis, char nome[], char cognome[], int categoria){
  76.     ListaPersona aux;
  77.     aux = malloc(sizeof(NodoPersona));
  78.     if (aux == NULL) {
  79.         puts("Errore nell'allocazione di memoria.");
  80.         exit(2);
  81.     }
  82.     strcpy(aux->infoP.nome, nome);
  83.     strcpy(aux->infoP.cognome, cognome);
  84.     aux->infoP.categoria = categoria;
  85.     aux->infoP.modelli = NULL;
  86.     aux->next = *lis;
  87.     *lis = aux;
  88. }
  89.  
  90. int inserisciVelivolo(ListaPersona * lis, int posizione, Aereo velivolo){
  91.     ListaPersona aux1 = *lis;
  92.     int i = 1;
  93.     //vado alla posizione richiesta della lista di persone
  94.     while (i < posizione) {
  95.         aux1 = aux1->next;
  96.         i++;
  97.     }
  98.     ListaAereo aux2 = aux1->infoP.modelli;
  99.  
  100.     //controllo se vi sono altri modelli in lista
  101.     if (aux2 == NULL){
  102.         aux2 = malloc(sizeof(Aereo));
  103.         aux2->infoA = velivolo;
  104.         aux2->next = NULL;
  105.         aux1->infoP.modelli = aux2;
  106.     }
  107.     else if (aux2->next == NULL) {
  108.         ListaAereo aux3;
  109.         aux3 = malloc(sizeof(NodoAereo));
  110.         aux3->infoA = velivolo;
  111.         if (velivolo.codice < aux2->infoA.codice){
  112.             aux3->next = aux2;
  113.             aux2 = aux3;
  114.             aux1->infoP.modelli = aux2;
  115.         }
  116.         else {
  117.             aux2->next = aux3;
  118.             aux3->next = NULL;
  119.         }
  120.     } else {
  121.         int fatto = 0;
  122.         //la lista e' ordinata per codice, quindi devo stare attento a inserire gli elementi in modo che siano gia' ordinati
  123.         do {
  124.             if (velivolo.codice < aux2->next->infoA.codice){
  125.                 ListaAereo aux3;
  126.                 aux3 = malloc(sizeof(Aereo));
  127.                 aux3->next = aux2->next;
  128.                 aux3->infoA = velivolo;
  129.                 aux2->next = aux3;
  130.                 fatto = 1;
  131.             }
  132.             aux2 = aux2->next;
  133.         } while (aux2 != NULL && fatto != 0);
  134.     }
  135.     return 1;
  136. }
  137.  
  138. int stampaTutto(ListaPersona lis){
  139.     if (lis == NULL) {
  140.         return 0;
  141.     }
  142.     do {
  143.         printf("________________________\n\nNome: %s\nCognome: %s\nCategoria: %d\n", lis->infoP.nome, lis->infoP.cognome, lis->infoP.categoria);
  144.         printf("Modelli presentati:\n");
  145.         do {
  146.             printf("- Codice: %d\n- Tipo: %d\n- Peso: %f\n- Cilindrata: %d\n---------\n", lis->infoP.modelli->infoA.codice, lis->infoP.modelli->infoA.tipo, lis->infoP.modelli->infoA.peso, lis->infoP.modelli->infoA.cilindrata);
  147.             lis->infoP.modelli = lis->infoP.modelli->next;
  148.         } while (lis->infoP.modelli != NULL);
  149.         printf("________________________\n");
  150.         lis = lis->next;
  151.     } while (lis != NULL && lis->infoP.modelli != NULL);
  152. }
  153.  
  154. //MAIN
  155. int main(void){
  156.     int scelta, x, y, z;
  157.     Persona persona;
  158.     Aereo velivolo;
  159.     ListaPersona lis = NULL;
  160.     do{
  161.         menu();
  162.         scanf("%d", &scelta);
  163.         switch (scelta){
  164.         case 0:
  165.             break;
  166.         case 1: //Iscrizione di un nuovo velivolo
  167.             puts("\nA nome di chi vuoi aggiungere il velivolo? <nome> <cognome>");
  168.             scanf("%s%s", persona.nome, persona.cognome);
  169.             x = ricercaPersone(lis, persona.nome, persona.cognome);
  170.            
  171.             if (x != 0){
  172.                 printf("\nHo trovato una corrispondenza in posizione %d. Procedo ad aggiungere il velivolo.\n", x);
  173.  
  174.             }
  175.             else {
  176.                 puts("Nessuna corrispondenza trovata. Procedo ad aggiungere la persona.");
  177.                 do {
  178.                     puts("In che categoria di automodellismo gareggia? (0 = statico, 1 = dinamico)");
  179.                     scanf("%d", &y);
  180.                 } while (y != 0 && y != 1);
  181.                 inserisciPersona(&lis, persona.nome, persona.cognome, y);
  182.                 printf("\nHo aggiunto %s %s alla lista dei partecipanti. Procedo ad aggiungere il velivolo.\n", persona.nome, persona.cognome);
  183.                 x = 1;
  184.             }
  185.  
  186.             puts("Inserisci in ordine codice, tipo (0 = aereo, 1 = elicottero), peso e cilindrata del velivolo da aggiungere.");
  187.             scanf("%d %d %f %d", &velivolo.codice, &velivolo.tipo, &velivolo.peso, &velivolo.cilindrata);
  188.             inserisciVelivolo(&lis, x, velivolo);
  189.             puts("Fatto.");
  190.             break;
  191.         case 2: //Stampa percentuali degli elicotteri rispetto al totale dei velivoli
  192.  
  193.             break;
  194.         case 3: //Visualizza tutti i velivoli iscritti
  195.             stampaTutto(lis);
  196.             break;
  197.  
  198.         case 4: //Stampa gli elicotteri con peso < x e cilindrata = y
  199.            
  200.             break;
  201.  
  202.         case 5:
  203.  
  204.             break;
  205.         default:
  206.             puts("Si prega di inserire un valore dell'elenco.");
  207.         }
  208.     } while (scelta);
  209.     puts("Arrivederci!");
  210.     return 0;
  211. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement