1
0
Fork 0
You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

234 lines
5.4 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NUM_VOLI 10
#define LUNG_CODICE 5
typedef struct {
char codice[LUNG_CODICE];
char *destinazione;
int partenza_ore;
int partenza_minuti;
int posti;
} volo_t;
typedef struct {
volo_t voli[MAX_NUM_VOLI];
int num_voli;
} tabella_voli_t;
void stampa_volo(volo_t volo);
void dealloca_tabella(tabella_voli_t *tabella);
int cerca_volo(char codice[], tabella_voli_t *tabella);
void cerca_e_stampa_volo(char codice[], tabella_voli_t *tabella);
void stampa_tabella_voli(tabella_voli_t *tabella);
int aggiungi_volo(tabella_voli_t *tabella);
int cerca_e_elimina_volo(char codice[], tabella_voli_t *tabella);
int cambia_orario_partenza(char codice[], tabella_voli_t *tabella, int nuova_ora, int nuovi_min);
int cambia_posti_liberi(char codice[], tabella_voli_t *tabella, int posti_diff);
int main() {
tabella_voli_t tabella;
char buffer[16];
char scelta;
int tmp_1;
int tmp_2;
tabella.num_voli = 0;
while (1) {
printf(
"*** Gestione voli ***\n"
" 1) Stampa tutti i voli presenti\n"
" 2) Aggiungi un volo\n"
" 3) Cerca e stampa un volo\n"
" 4) Elimina un volo\n"
" 5) Cambia orario di partenza\n"
" 6) Riserva posti\n"
" Q) Esci dal programma\n"
"\n"
"Scelta: "
);
scanf(" %c", &scelta);
printf("\n");
switch (scelta) {
case '1':
stampa_tabella_voli(&tabella);
break;
case '2':
if (!aggiungi_volo(&tabella)) {
printf("Impossibile aggiungere il volo.\n");
};
break;
case '3':
printf("Codice: ");
scanf(" %5c", buffer);
cerca_e_stampa_volo(buffer, &tabella);
break;
case '4':
printf("Codice: ");
scanf(" %5c", buffer);
if (!cerca_e_elimina_volo(buffer, &tabella)) {
printf("Impossibile eliminare il volo.\n");
};
break;
case '5':
printf("Codice: ");
scanf(" %5c", buffer);
printf("Nuovo orario di partenza: ");
scanf("%d:%d", &tmp_1, &tmp_2);
if (!cambia_orario_partenza(buffer, &tabella, tmp_1, tmp_2)) {
printf("Impossibile cambiare l'orario di partenza.\n");
};
break;
case '6':
printf("Codice: ");
scanf(" %5c", buffer);
printf("Numero di posti da riservare: ");
scanf("%d", &tmp_1);
if (!cambia_posti_liberi(buffer, &tabella, tmp_1)) {
printf("Impossibile riservare posti.\n");
};
break;
case 'Q':
case 'q':
printf("Arrivederci!\n");
dealloca_tabella(&tabella);
return 0;
}
printf("\n");
}
return 0;
}
void stampa_volo(volo_t volo) {
printf("Volo %5s:\n", volo.codice);
printf("- Destinazione: %s\n", volo.destinazione);
printf("- Partenza: %02d:%02d\n", volo.partenza_ore, volo.partenza_minuti);
printf("- Posti disponibili: %d\n", volo.posti);
}
void dealloca_tabella(tabella_voli_t *tabella) {
int i;
for (i = 0; i < tabella->num_voli; i++) {
free(tabella->voli[i].destinazione);
}
}
int cerca_volo(char codice[], tabella_voli_t *tabella) {
int i;
for (i = 0; i < tabella->num_voli; i++) {
if (!memcmp(codice, tabella->voli[i].codice, LUNG_CODICE)) {
return i;
}
}
return -1;
}
void cerca_e_stampa_volo(char codice[], tabella_voli_t *tabella) {
int indice_volo;
indice_volo = cerca_volo(codice, tabella);
if (indice_volo == -1) {
printf("Volo %5s non trovato\n", codice);
} else {
stampa_volo(tabella->voli[indice_volo]);
}
}
void stampa_tabella_voli(tabella_voli_t *tabella) {
int i;
if (tabella->num_voli == 0) {
printf("Nessun volo presente!\n");
return;
}
for (i = 0; i < tabella->num_voli; i++) {
stampa_volo(tabella->voli[i]);
}
}
int aggiungi_volo(tabella_voli_t *tabella) {
int indice_volo;
char buffer[128];
char *dest_ptr;
indice_volo = tabella->num_voli;
if (indice_volo >= MAX_NUM_VOLI) {
return 0;
}
printf("Codice: ");
scanf(" %5c", tabella->voli[indice_volo].codice);
printf("Destinazione: ");
scanf("%s", buffer);
printf("Partenza: ");
scanf("%d:%d", &tabella->voli[indice_volo].partenza_ore,
&tabella->voli[indice_volo].partenza_minuti);
printf("Posti disponibili: ");
scanf("%d", &tabella->voli[indice_volo].posti);
dest_ptr = malloc(strlen(buffer) + 1);
if (dest_ptr == NULL) {
printf("Errore nell'allocazione di memoria.\n");
return 0;
}
strcpy(dest_ptr, buffer);
tabella->voli[indice_volo].destinazione = dest_ptr;
tabella->num_voli++;
return 1;
}
int cerca_e_elimina_volo(char codice[], tabella_voli_t *tabella) {
int indice_volo;
indice_volo = cerca_volo(codice, tabella);
if (indice_volo == -1) {
return 0;
}
tabella->num_voli--;
tabella->voli[indice_volo] = tabella->voli[tabella->num_voli];
return 1;
}
int cambia_orario_partenza(char codice[], tabella_voli_t *tabella, int nuova_ora, int nuovi_min) {
int indice_volo;
indice_volo = cerca_volo(codice, tabella);
if (indice_volo == -1) {
return 0;
}
tabella->voli[indice_volo].partenza_ore = nuova_ora;
tabella->voli[indice_volo].partenza_minuti = nuovi_min;
return 1;
}
int cambia_posti_liberi(char codice[], tabella_voli_t *tabella, int posti_diff) {
int indice_volo;
indice_volo = cerca_volo(codice, tabella);
if (indice_volo == -1) {
return 0;
}
tabella->voli[indice_volo].posti -= posti_diff;
return 1;
}