Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* MARCO ANDRONACO
- Un gruppo di appassionati di aeromodellismo desidera effettuare una gara in cui esibire i modelli realizzati. A tale scopo, raccoglie per ogni partecipante
- le seguenti informazioni:
- 1) Nome e cognome del partecipante
- 2) Categoria di partecipazione all'evento (due categorie possibili: aeromodellismo statico o dinamico)
- 3) L'elenco dei modelli che prendono parte alla gara (sono ammessi piu velivoli per partecipante)
- Le informazioni relative al modello includono un codice identificante, una tipologia (aereo/elicottero) Il peso in Kg e la cilindrata del motore (in cc)
- 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
- per codice identificativo.
- Il sistema deve permettere le operazioni di seguito descritte:
- 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'
- iscritto il velivolo verra' aggiunto all'elenco; se il partecipante non risulta iscritto va aggiunto prima il partecipante alla lista dei partecipanti
- e quindi il velivolo all'elenco associato al partecipante.
- 2) Calcolo e visualizzazione delle percentuali di aerei e di elicotteri rispetto al totale di velivoli partecipanti
- 3) Visualizzazione di tutti i velivoli iscritti
- 4) La visualizzazione dell'elenco di tutti gli elicotteri con peso inferiore ad uno dato e cilindrata pari ad un valore dato
- 5) Cancellazione di un velivolo iscritto (se è l'unico di un dato partecipante viene cancellato anche il partecipante) fornendo in ingresso il codice identificativo
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #define M 31
- //TYPEDEF
- typedef struct s1{
- int codice;
- int tipo;
- float peso;
- int cilindrata;
- } Aereo;
- typedef struct s2{
- Aereo infoA;
- struct s2 *next;
- } NodoAereo, * ListaAereo;
- typedef struct s3{
- char nome[M];
- char cognome[M];
- int categoria;
- ListaAereo modelli;
- } Persona;
- typedef struct s4{
- Persona infoP;
- struct s4 * next;
- } NodoPersona, *ListaPersona;
- //FUNZIONI
- int menu(){
- puts("1) Iscrizione di un nuovo velivolo.");
- puts("2) Stampa le percentuali di aerei e di elicotteri rispetto al totale di velivoli");
- puts("3) Stampa tutti i velivoli iscritti");
- puts("4) Stampa gli elicotteri con peso inferiore ad uno dato e cilindrata pari ad un valore dato");
- puts("5) Cancella un velivolo iscritto");
- puts("0) Esci dal programma");
- }
- int ricercaPersone(ListaPersona lis, char nome[], char cognome[]){
- if (lis == NULL){
- return 0;
- }
- int posizione = 1;
- do{
- if ((strcmp(lis->infoP.nome, nome) == 0) && (strcmp(lis->infoP.cognome, cognome) == 0)){
- return posizione;
- }
- lis = lis->next;
- posizione++;
- } while (lis != NULL);
- return 0;
- }
- int inserisciPersona(ListaPersona * lis, char nome[], char cognome[], int categoria){
- ListaPersona aux;
- aux = malloc(sizeof(NodoPersona));
- if (aux == NULL) {
- puts("Errore nell'allocazione di memoria.");
- exit(2);
- }
- strcpy(aux->infoP.nome, nome);
- strcpy(aux->infoP.cognome, cognome);
- aux->infoP.categoria = categoria;
- aux->infoP.modelli = NULL;
- aux->next = *lis;
- *lis = aux;
- }
- int inserisciVelivolo(ListaPersona * lis, int posizione, Aereo velivolo){
- ListaPersona aux1 = *lis;
- int i = 1;
- //vado alla posizione richiesta della lista di persone
- while (i < posizione) {
- aux1 = aux1->next;
- i++;
- }
- ListaAereo aux2 = aux1->infoP.modelli;
- //controllo se vi sono altri modelli in lista
- if (aux2 == NULL){
- aux2 = malloc(sizeof(Aereo));
- aux2->infoA = velivolo;
- aux2->next = NULL;
- aux1->infoP.modelli = aux2;
- }
- else if (aux2->next == NULL) {
- ListaAereo aux3;
- aux3 = malloc(sizeof(NodoAereo));
- aux3->infoA = velivolo;
- if (velivolo.codice < aux2->infoA.codice){
- aux3->next = aux2;
- aux2 = aux3;
- aux1->infoP.modelli = aux2;
- }
- else {
- aux2->next = aux3;
- aux3->next = NULL;
- }
- } else {
- int fatto = 0;
- //la lista e' ordinata per codice, quindi devo stare attento a inserire gli elementi in modo che siano gia' ordinati
- do {
- if (velivolo.codice < aux2->next->infoA.codice){
- ListaAereo aux3;
- aux3 = malloc(sizeof(Aereo));
- aux3->next = aux2->next;
- aux3->infoA = velivolo;
- aux2->next = aux3;
- fatto = 1;
- }
- aux2 = aux2->next;
- } while (aux2 != NULL && fatto != 0);
- }
- return 1;
- }
- int stampaTutto(ListaPersona lis){
- if (lis == NULL) {
- return 0;
- }
- do {
- printf("________________________\n\nNome: %s\nCognome: %s\nCategoria: %d\n", lis->infoP.nome, lis->infoP.cognome, lis->infoP.categoria);
- printf("Modelli presentati:\n");
- do {
- 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);
- lis->infoP.modelli = lis->infoP.modelli->next;
- } while (lis->infoP.modelli != NULL);
- printf("________________________\n");
- lis = lis->next;
- } while (lis != NULL && lis->infoP.modelli != NULL);
- }
- //MAIN
- int main(void){
- int scelta, x, y, z;
- Persona persona;
- Aereo velivolo;
- ListaPersona lis = NULL;
- do{
- menu();
- scanf("%d", &scelta);
- switch (scelta){
- case 0:
- break;
- case 1: //Iscrizione di un nuovo velivolo
- puts("\nA nome di chi vuoi aggiungere il velivolo? <nome> <cognome>");
- scanf("%s%s", persona.nome, persona.cognome);
- x = ricercaPersone(lis, persona.nome, persona.cognome);
- if (x != 0){
- printf("\nHo trovato una corrispondenza in posizione %d. Procedo ad aggiungere il velivolo.\n", x);
- }
- else {
- puts("Nessuna corrispondenza trovata. Procedo ad aggiungere la persona.");
- do {
- puts("In che categoria di automodellismo gareggia? (0 = statico, 1 = dinamico)");
- scanf("%d", &y);
- } while (y != 0 && y != 1);
- inserisciPersona(&lis, persona.nome, persona.cognome, y);
- printf("\nHo aggiunto %s %s alla lista dei partecipanti. Procedo ad aggiungere il velivolo.\n", persona.nome, persona.cognome);
- x = 1;
- }
- puts("Inserisci in ordine codice, tipo (0 = aereo, 1 = elicottero), peso e cilindrata del velivolo da aggiungere.");
- scanf("%d %d %f %d", &velivolo.codice, &velivolo.tipo, &velivolo.peso, &velivolo.cilindrata);
- inserisciVelivolo(&lis, x, velivolo);
- puts("Fatto.");
- break;
- case 2: //Stampa percentuali degli elicotteri rispetto al totale dei velivoli
- break;
- case 3: //Visualizza tutti i velivoli iscritti
- stampaTutto(lis);
- break;
- case 4: //Stampa gli elicotteri con peso < x e cilindrata = y
- break;
- case 5:
- break;
- default:
- puts("Si prega di inserire un valore dell'elenco.");
- }
- } while (scelta);
- puts("Arrivederci!");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement