PDA

Visualizza la versione completa : [C++] Programma per la gestione dei voli


sonik1987
21-01-2007, 22:37
ragazzi ho un problema..questo è un programma per la gestione dei voli:
dopo aver creato piu di un volo se uso la funzione modifica mi modifica sempre il primo volo, se uso al funzione elimina mi elimina sempre l'ultimo....come posso fare???


ecco il codice:
/* Direttive Include */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* Definizione tipo delle variabili */
typedef struct
{int codice_volo;
char partenza[20];
char destinazione[20];
int ora_partenza;
int minuti_partenza;
int data_partenza;
int mese_partenza;
int ora_arrivo;
int minuti_arrivo;
int data_arrivo;
int mese_arrivo;
int classe1_disp;
int classe1_sold;
int coach_disp;
int coach_sold;
} voli_t;

/* Eventuali Costanti */
#define max_voli 25 /* Massimo di voli memorizzabili */

/* Dichiarazione funzioni */
/* Mostra il menu di scelta e restituisce la funzione scelta */
int menu (int voliattuali);
/* Visualizza i voli attualmente registrati */
void visualizza (int voliesistenti, voli_t voli[]);
/* Registra un nuovo volo */
void registra (int *posto, voli_t voli[]);
/* Modifica una registrazione */
void modifica (int voliesistenti, voli_t voli[]);
/* Elimina una registrazione */
void elimina (int *voliesistenti, voli_t voli[]);

/* Main */
int main (void)
{
/* Variabili */
voli_t database[max_voli]; /* Input/Output - Vettore che contiene tutte le informazioni sui voli */
FILE *file_voli; /* Input/Output - File che contiene tutti i dati */
int operazione = 0; /* Input - Operazione da eseguire */
int voli_attuali = 0; /* Di programma - Valori attualmente memorizzati nel vettore */
int read_status = 1; /* Di programma - Controlla la riuscita del fread */
int counter = 0; /* Variabile contatore */

/* Apertura del file, lettura dei valori */
printf ("Caricamento...\n");
file_voli = fopen ("voli","rb");
if (file_voli == NULL) /* Se il file non esiste avvisa l'utente, il file sarà creato in seguito */
printf ("File di database non trovato, nessun dato caricabile.\n");
if (file_voli != NULL) /* Se il file esiste, carica i dati nel database */
{
do
{
read_status = fread (&database[counter], sizeof (voli_t), 1, file_voli);
++counter;
}
while (read_status == 1);
voli_attuali = counter - 1; /* I voli caricati saranno pari al contatore - 1 */
printf ("Voli caricati: %d \n\n\n", voli_attuali);
fclose (file_voli); /* Chiude il file in modo che possa essere riaperto in scrittura in seguito */
}
/* Esecuzione del programma vero e proprio */
do
{
operazione = menu(voli_attuali); /* Mostra il menu */
switch (operazione)
{
case 1: /* Visualizza i voli registrati */
visualizza (voli_attuali, database);
break;
case 2: /* Registra un nuovo volo */
registra (&voli_attuali, database);
break;
case 3: /* Modifica un valore registrato */
modifica (voli_attuali, database);
break;
case 4: /* Elimina un volo */
elimina (&voli_attuali, database);
break;
}
}
while (operazione != 5);
counter = 0; /* Riazzera il contatore */
file_voli = fopen ("voli","wb"); /* Apre il file in scrittura */
printf ("\n\nSalvataggio informazioni in corso...\n");
while (counter < voli_attuali)
{
fwrite (&database[counter], sizeof (voli_t), 1, file_voli); /* Scrive sul file la tabella dei voli */
++counter;
}
printf ("Salvataggio dati effettuato con successo.\n");
printf ("Voli salvati: %d \n", counter);
fclose (file_voli);

/* Fine del programma */
system ("pause");
return (0);
}

/* Definizione funzioni */
/* Mostra il menu di scelta e restituisce la funzione scelta */
int menu (int voliattuali)
{
int funzione; /* Operazione scelta */
printf ("\n\n============================================== \n");
printf ("|| GESTORE VOLI ||\n");
printf ("==============================================\n");
printf ("Voli attualmente memorizzati: %d \n", voliattuali);
printf ("(1) Visualizzare la lista dei voli registrati.\n");
printf ("(2) Registrare un nuovo volo.\n");
printf ("(3) Modificare una registrazione.\n");
printf ("(4) Eliminare una registrazione.\n");
printf ("(5) Salvare tutto e uscire dal programma.\n");
printf ("Selezionare una funzione: ");
scanf ("%d", &funzione);
return (funzione);
}

/* Visualizza i voli attualmente registrati */
void visualizza (int voliesistenti, voli_t voli[])
{
int counter = 0; /* Contatore */
if (voliesistenti == 0)
printf ("Nessun volo salvato.\n");
while (counter < voliesistenti)
{
printf ("\n\nVolo numero %d - Codice %d\n", counter+1, voli[counter].codice_volo);
printf ("Partenza da %s alle ore %d:%d del %d/%d \n", voli[counter].partenza, voli[counter].ora_partenza, voli[counter].minuti_partenza, voli[counter].data_partenza, voli[counter].mese_partenza);
printf ("Arrivo a %s alle ore %d:%d del %d/%d\n", voli[counter].destinazione, voli[counter].ora_arrivo, voli[counter].minuti_arrivo, voli[counter].data_arrivo, voli[counter].mese_arrivo);
printf ("Prima classe: %d disponibili e %d liberi\n", voli[counter].classe1_disp, voli[counter].classe1_sold);
printf ("Turistica: %d disponibili e %d liberi\n", voli[counter].coach_disp, voli[counter].coach_sold);
++counter;
}
}
/* Registra un nuovo volo */
void registra (int *posto, voli_t voli[])
{
printf ("\nCodice del volo: ");
scanf ("%d", &voli[*posto].codice_volo);
printf ("Citta' di partenza: ");
scanf ("%s", voli[*posto].partenza);
printf ("Orario della partenza:\nOre: ");
scanf ("%d", &voli[*posto].ora_partenza);
printf ("Minuti: ");
scanf ("%d", &voli[*posto].minuti_partenza);
printf ("Data della partenza:\nGiorno: ");
scanf ("%d", &voli[*posto].data_partenza);
printf ("Mese: ");
scanf ("%d", &voli[*posto].mese_partenza);
printf ("Citta' di destinazione: ");
scanf ("%s", voli[*posto].destinazione);
printf ("Orario di arrivo:\nOre: ");
scanf ("%d", &voli[*posto].ora_arrivo);
printf ("Minuti: ");
scanf ("%d", &voli[*posto].minuti_arrivo);
printf ("Data di arrivo:\nGiorno: ");
scanf ("%d", &voli[*posto].data_arrivo);
printf ("Mese: ");
scanf ("%d", &voli[*posto].mese_arrivo);
printf ("Posti disponibili in prima classe: ");
scanf ("%d", &voli[*posto].classe1_disp);
printf ("Posti venduti in prima classe: ");
scanf ("%d", &voli[*posto].classe1_sold);
printf ("Posti disponibili in classe turistica: ");
scanf ("%d", &voli[*posto].coach_disp);
printf ("Posti venduti in classe turistica: ");
scanf ("%d", &voli[*posto].coach_sold);
printf ("\nVolo registrato con successo.\n");
*posto += 1; /* Incrementa di uno il numero di voli attuali e vi registra il nuovo dato */
}



siccome il codice supera i caratteri consentiti continuo nel prossimo post....

sonik1987
21-01-2007, 22:38
/* Modifica una registrazione */
void modifica (int voliesistenti, voli_t voli[])
{
int posto; /* Numero della registrazione da modificare */
char operaz; /* Operazione scelta */
if (voliesistenti == 0)
{
printf ("Non ci sono voli da modificare.");
return; /* Se non ci sono voli registrati non si puo modificare un volo */
}
do
{
printf ("\n\nNumero della registrazione da modificare: ");
scanf ("%d", &posto);
}
while (posto > voliesistenti || posto <= 0);
posto -= 1; /* Il vero volo ha per indice il precedente del numero indicato */
/* Ripete il tutto fino a che non si sceglie di finire */
do
{

printf ("\n\nVolo numero %d - Codice %d\n", posto+1, voli[posto].codice_volo);
printf ("Partenza da %s alle ore %d:%d del %d/%d \n", voli[posto].partenza, voli[posto].ora_partenza, voli[posto].minuti_partenza, voli[posto].data_partenza, voli[posto].mese_partenza);
printf ("Arrivo a %s alle ore %d:%d del %d/%d\n", voli[posto].destinazione, voli[posto].ora_arrivo, voli[posto].minuti_arrivo, voli[posto].data_arrivo, voli[posto].mese_arrivo);
printf ("Prima classe: %d disponibili e %d liberi\n", voli[posto].classe1_disp, voli[posto].classe1_sold);
printf ("Turistica: %d disponibili e %d liberi\n", voli[posto].coach_disp, voli[posto].coach_sold);
printf ("\n");
printf ("(a) Codice del volo\n");
printf ("(b) Citta' di partenza (c) Citta' di destinazione\n");
printf ("(d) Orario della partenza (e) Orario di arrivo\n");
printf ("(f) Data della partenza (g) Data di arrivo\n");
printf ("(h) Posti in prima classe (i) Posti in turistica\n");
printf ("Selezionare dato da modificare (0 per finire): ");
scanf ("%s", &operaz); /* Nota: si utilizza %s perchè %c causa un errore */
printf ("\n\n");
switch (operaz) /* Effettua la modifica scelta */
{
case 'a':
printf ("Inserire il nuovo codice: ");
scanf ("%d", &voli[posto].codice_volo);
break;
case 'b':
printf ("Inserire la nuova citta' di partenza: ");
scanf ("%s", voli[posto].partenza);
break;
case 'c':
printf ("Inserire la nuova destinazione: ");
scanf ("%s", voli[posto].destinazione);
break;
case 'd':
printf ("Inserire il nuovo orario della partenza:\nOre: ");
scanf ("%d", &voli[posto].ora_partenza);
printf ("Minuti: ");
scanf ("%d", &voli[posto].minuti_partenza);
break;
case 'e':
printf ("Inserire il nuovo orario di arrivo:\nOre: ");
scanf ("%d", &voli[posto].ora_arrivo);
printf ("Minuti: ");
scanf ("%d", &voli[posto].minuti_arrivo);
break;
case 'f':
printf ("Inserire la nuova data di partenza:\nGiorno: ");
scanf ("%d", &voli[posto].data_partenza);
printf ("Mese: ");
scanf ("%d", &voli[posto].mese_partenza);
break;
case 'g':
printf ("Inserire la nuova data di arrivo:\nGiorno: ");
scanf ("%d", &voli[posto].data_arrivo);
printf ("Mese: ");
scanf ("%d", &voli[posto].mese_arrivo);
break;
case 'h':
printf ("Posti occupati: ");
scanf ("%d", &voli[posto].classe1_disp);
printf ("Posti liberi: ");
scanf ("%d", &voli[posto].classe1_sold);
break;
case 'i':
printf ("Posti occupati: ");
scanf ("%d", &voli[posto].coach_disp);
printf ("Posti liberi: ");
scanf ("%d", &voli[posto].coach_sold);
break;
}
printf ("Modifica effettuata con successo.\n");

}
while (operaz != '0');
}

/* Elimina una registrazione */
void elimina (int *voliesistenti, voli_t voli[])
{
if (voliesistenti == 0)
{
printf ("Non ci sono voli da eliminare.");
return; /* Se non ci sono voli registrati non si puo eliminare un volo */
}
int posto;
printf ("Inserire il numero del volo da cancellare: ");
scanf ("%d", &posto);
int contatore = posto; /* Contatore */
while (contatore < *voliesistenti) /* Sposta indietro di un posto tutti i voli memorizzati */
{
voli[contatore].codice_volo = voli[contatore+1].codice_volo;
strcpy (voli[contatore].partenza, voli[contatore+1].partenza);
voli[contatore].ora_partenza = voli[contatore+1].ora_partenza;
voli[contatore].minuti_partenza = voli[contatore+1].minuti_partenza;
voli[contatore].data_partenza = voli[contatore+1].data_partenza;
voli[contatore].mese_partenza = voli[contatore+1].mese_partenza;
strcpy (voli[contatore].destinazione, voli[contatore+1].destinazione);
voli[contatore].ora_arrivo = voli[contatore+1].ora_arrivo;
voli[contatore].minuti_arrivo = voli[contatore+1].minuti_arrivo;
voli[contatore].data_arrivo = voli[contatore+1].data_arrivo;
voli[contatore].mese_arrivo = voli[contatore+1].mese_arrivo;
voli[contatore].classe1_disp = voli[contatore+1].classe1_disp;
voli[contatore].classe1_sold = voli[contatore+1].classe1_sold;
voli[contatore].coach_disp = voli[contatore+1].coach_disp;
voli[contatore].coach_sold = voli[contatore+1].coach_sold;
contatore += 1;
}
*voliesistenti -= 1; /* I voli memorizzati diminuiscono di 1 */
printf ("\nVolo numero %d eliminato con successo.\n", posto);
}


ECCO LA FINE DEL PROGRAMMA QUI SOPRA...FATEMI sapere grazie!!!

miscialo
22-01-2007, 01:46
se puoi essere più chiaro nel descrivere il problema...

sonik1987
22-01-2007, 10:09
QUESTO è UN PROGRAMMA PER LA GESTIONE DEI VOLI CHE UTILIZZA UN FILE DI INPUT CHE SI CHIAMA "VOLI".
QUANDO FACCIO PARTIRE IL PROGRAMMA ED CREDO PIU DI UN VOLO E SALVO TUTTO, ALLA RIAPERTURA DEL PROGRAMMA MI SALVA I VOLI CREATI.
SE APPORTO MODIFICHE O CANCELLO UN VOLO ARRIVANO I PROBLEMI.
OGNI VOLO HA UN NUMERO, SE USO LA FUZIONE ELIMINA UN VOLO INDIPENDEMENTE DAL NUMERO DEL VOLO CHE INSERISCO IL PROGRAMMA MI CANCELLA L'ULTIMO VOLO INSERITO NEL FILE. INVECE SE UTILIZZO LA FUNZIONE MODIFICA UN VOLO, IL PROGRAMMA MODIFICA IL VOLO INSERITO PER PRIMO, INDIPENDEMENTE DAL CODICE DEL VOLO.
CHIARO ADESSO??'

alka
22-01-2007, 15:28
Dal mio punto di vista, non ha molto senso scrivere tutto il codice: val la pena fare un po' di debugging e individuare il punto in cui il programma si comporta nel modo errato.

In ogni caso, non scrivere tutto in MAIUSCOLO.

oregon
22-01-2007, 16:01
Ho provato la funzione modifica e l'unica cosa che ho corretto e' stata la linea

scanf ("%c", &operaz);

in cui *devi* usare %c ... non capisco la tua nota che segnala l'errore ...

Dopo la correzione, la modifica ha regolarmente funzionato.

Loading