DOMANDA Mi potete aiutare a svolgere e correggere un problema in C ??

Giovanni Montanaro

Nuovo Utente
15
0
Questo è il mio problema, con i relativi Warring. Logicamente è ancora incompleto, stavo cercando di capire se comunque ciò che ho scritto ha errori e se funziona. :):thanks:


C:
/* L'aereoporto della città "Vattelapesca" gestisce le prenotazioni dei voli mediande una
tabella che, per ogni volo, riporta il codice del volo, la città di partenza,
la città di destionazione, il numero totale dei posti e il numero dei posto occupati.
Ogni agenzia di viaggio inoltre una serie di prenotazioni che riportano ciscuna il codice
del volo e il numero dei posti che si vogliono prenotare.

Progettare una soluzione al problema di gesione delle prenotazione considerando che:

--> Le prenotazioni provengono da un'unica agenzia
--> Per ogni prenotazione trattata occore fornire in output un messaggio di prenotazione
    effettuata o di posti non disponibile
--> Si vuole in output la tabella aggiornata.

*/




#include <stdio.h>
#include <stdlib.h>
#include <locale.h>

//tabella
typedef struct {

    int cod_V;
    char Città_volo[20];
    char Città_destinazione[20];
    int n_tot_p[100];
    int n_p_o;

}Gestione_Prenotazioni;




int acquisizione_dati(Gestione_Prenotazioni *abc);
int posti_disponibili(Gestione_Prenotazioni abc);
int ordinamento(Gestione_Prenotazioni abc);

int main(int args, char *argv[]) {

    //inizio int main

    setlocale(LC_ALL, "");

    Gestione_Prenotazioni voli;

    printf("**********************************************************\n");
    printf("**    Inserisci i dati identificativi del volo   **\n");
    printf("**********************************************************\n");
    acquisizione_dati(&voli);

    printf("\n\n\n**************************************************************\n");
    printf("**    I posti disponibili sono -->   **\n");
    printf("**************************************************************\n");
    posti_disponibili(voli);

    printf("\n\n\n**************************************************************\n");
    printf("**    Ecco i posti aggiornati -->   **\n");
    printf("**************************************************************\n");
    ordinamento(voli);

    getch();
    return 0;
} //fine int main

int acquisizione_dati(Gestione_Prenotazioni *abc) {
    int n_voli;
    int i;


    do {

        printf_s("\n Inserisci il numero di voli \n");
        scanf_s("%d", &n_voli);
        /*
        if (n_voli = 0) {
            printf_s("Nessun volo disponibile\n");
        } */
    } while (++n_voli > 0);

    i = 1;


    do {
        printf_s("\n\n       Codice Volo   --> ");
        scanf_s("%d", &abc->cod_V);

        printf_s("\n\n       Città di Partenza   --> ");
        scanf_s("%s", &abc->Città_volo); /*scanf_s: Sono Passati argomenti insufficenti per la stringa di formato, codice 4473 */

        printf_s("\n\n       Città di Destionazione   --> ");
        scanf_s("%s", &abc->Città_destinazione); /*scanf_s: Sono Passati argomenti insufficenti per la stringa di formato, codice 4473 */

        printf_s("\n\n       Numero Posti Prenotati   --> ");
        scanf_s("%d", &abc->n_tot_p);

        printf_s("\n\n       Numero Posti Occupati  --> ");
        scanf_s("%d", &abc->n_p_o);




    } while (i++ > n_voli);

    return 0;
}

int posti_disponibili(Gestione_Prenotazioni abc) {

    printf("\n\n       Numero Prenotazioni   --> %d", abc.n_tot_p);

    /*    C4477 'printf': con la stringa di formato '%d'
è necessario un argomento di tipo 'int', ma il tipo dell'argomento variadic 1 è 'int *' */


    return 0;
}


int ordinamento(Gestione_Prenotazioni abc) {


    return 0;
}
 

DispatchCode

Utente Attivo
883
551
CPU
Intel i7 6700HQ, 2.60Ghz, 4 core 8 threads
Scheda Madre
Asustek
HDD
Hitachi 7200 rpm, 1TB
RAM
16GB DDR4 (2 slot su 4)
GPU
Nvidia Geforce GTX 960M, 4GB
Audio
Realtek
Net
30Mbps/3Mbps con Eolo
OS
Windows 10 64bit
Rivedrei sicuramente il nome dei parametri. Leggendo nella funzione abc, non capisco cosa sia senza andare a vedere... dai nomi più esplicativi.
Le variabili non devono avere lettere accentate.

Fai attenzione perchè scanf_s è specifico di Microsoft, non di GCC.

Questo ciclo è infinito:
C:
    do {

        printf_s("\n Inserisci il numero di voli \n");
        scanf_s("%d", &n_voli);
        /*
        if (n_voli = 0) {
printf_s("Nessun volo disponibile\n");
        } */
    } while (++n_voli > 0);

n_voli sarà sempre maggiore di 0 al momento del confronto; inoltre non ha molto senso in quanto leggi il numero di voli per poi incrementarlo e testarlo...
Se ho capito ciò che vuoi fare, ovvero fare in modo che con 0 come input il ciclo viene ripetuto, dovresti cambiare condizione.

C:
    do {

        printf_s("\n Inserisci il numero di voli \n");
        scanf_s("%d", &n_voli);
        /*
        if (n_voli = 0) {
            printf_s("Nessun volo disponibile\n");
        } */
    } while (n_voli == 0);

ovviamente è una mia deduzione, magari non è ciò che in realtà ti serviva. :)

C:
int posti_disponibili(Gestione_Prenotazioni abc) {

    printf("\n\n       Numero Prenotazioni   --> %d", abc.n_tot_p);

    /*    C4477 'printf': con la stringa di formato '%d'
è necessario un argomento di tipo 'int', ma il tipo dell'argomento variadic 1 è 'int *' */


    return 0;
}

n_tot_p è un array di interi.
Inoltre penso tu stia errando anche nalla dichiarazione di una delle variabili nella struct, ovvero int n_p_o. Leggi il valore in un ciclo, quindi sicuramente non puoi memorizzarlo in quel modo.
Ovviamente posti_disponibili dovrà funzionare diversamente (ad esempio stampando il numero di posti di ogni volo).

Stai sbagliando nella lettura delle stringhe, manca il terzo parametro (la lunghezza).

Al momento ho notato queste cose.

Ps. probabilmente non siete arrivati alla gestione dinamica della memoria; in caso contrario potrebbe essere un approccio migliore.
 

Giovanni Montanaro

Nuovo Utente
15
0
Grazie innanzitutto di avermi risposto @DispatchCode . :ok:

Partendo dal nome dei parametri hai sicuramente ragione, ho scelto quel nome perchè non sapevo cosa scrivere. In verità stavo cercando di mettere in pratica quanto capito da argomenti come l'utilizzo dei prototipi di funzione e dei puntatori. Capire e mettere in pratica sono due cose molto distinte, la pratica è quella cosa che permette di fare padrona di un'argomento come ben sai.

Anche se dovrei usare GCC (La mia università preferisce IDE come Eclipse, ma non mi ci trovo bene), preferisco usare Visual Studio, e durante un'esame mi sono accorto che, GCC non riconosceva printf_s scanf_s , allora capii che non li dovevo usare al di fuori di MICROSOFT. Quindi ti ringrazio di nuovo per l'appunto.

Parlando del ciclo, mi sono accorto anche io che è infinito, volevo utilizzare il while, però mi dava errore. Invece stranamente con il do-while mi compilava anche se, il ciclo è infinito.

Volevo fare un controllo con il while in cui non esistono voli che siano 0 oppure minore di zero, proprio perchè non hanno possibilità di esistere come si evince. In questo caso sarebbe opportuno usare unsigned int per occuparmi solo dei numeri senza segno negativo. Inoltre l'intenzione sarebbe stata di chiedere all'utente il numero di voli e far in modo che a ogni iterazione n'è possa aggiungere uno qualora oppure in caso inserire zero stampare un messaggio a video con scritto non ci sono voli.

Per la seconda parte int posti_disponibili(Gestione_prenotazioni abc) la metterei da parte per sistemare il resto prima di procedere dato che ci sono errori qua e là. :)


Per la gestione dinamica, bhè ci ho dato uno sguardo e vorrei imparare ad applicarla, sono rimasto un pò indietro, però prima sto cercando di mettere apposto le mie incertezze che si sono rilevate fino a qui con l'utilizzo dei puntatori. Mi è capitato spesso che durante l'esame mi venissero dubbi dal nulla, quindi per ora sarebbe meglio diventare più sicuro con l'esercizio. :rolleyes: Magari prova a farmi vedere come avresti risolto questa prima parte con la gestione dinamica.

Ti sono grato :thanks:
 

Andretti60

Utente Èlite
3,969
2,680
L'errore principale e' che definisci solo una struttura di tipo Gestione_Prenotazioni (nome infelice, un Volo sarebbe stato sufficiente), che durante il ciclo in acquisizione_dati continui a riempire con tanti valori (quindi alla fine avra' i valori solo dell'ultimo ciclo)
In realta' quindi hai bisogno di un vettore, o di una lista (in questo caso la soluzione migliore sarebbe un dizionario, ma lasciamo stare al momento)

Se non vuoi avere a che fare con noiose allocazioni dinamiche di memoria, definisci un vettore statico lungo DIM (definiscilo quanto vuoi)
C:
Gestione_Prenotazioni voli[DIM];
e poi accertati che il numero di voli entrato da tastiera sia inferiori o uguale a DIM.
Dopodiche' ovviamente tutte le volte che stampi il numero di posti occupati e disponibili devi specificare di che volo stiamo parlando (ossia devi usare l'indirizzo opportuno dell'elemento del vettore che corrisponde al codice di volo)
 
  • Like
Reactions: DispatchCode

DispatchCode

Utente Attivo
883
551
CPU
Intel i7 6700HQ, 2.60Ghz, 4 core 8 threads
Scheda Madre
Asustek
HDD
Hitachi 7200 rpm, 1TB
RAM
16GB DDR4 (2 slot su 4)
GPU
Nvidia Geforce GTX 960M, 4GB
Audio
Realtek
Net
30Mbps/3Mbps con Eolo
OS
Windows 10 64bit
@Giovanni Montanaro credo di poterti rispondere in pausa pranzo. ;)

@Andretti60 si,c'era anche quello! L'avevo notato all'inizio, poi l'ho dimenticato e ignorato...
 
  • Like
Reactions: Giovanni Montanaro

Giovanni Montanaro

Nuovo Utente
15
0
@Andretti60 Hai ragione, le strutture dati dinamiche sono noiose, ma le strutture statiche mi stanno moltooo strette. Già, non poter scegliere il valore al momento dell'esecuzione e dover ogni volta dare una dimensione predefinita è una scocciatura. :D Quindi costato che mi basta definire la dimensione in un vettore cosa che io non ho fatto :cav: dimostrami come posso usare una lista per la risoluzione di questo problema. ;)

P.s Poi magari in un secondo momento cercherò di implementare lo stesso problema con un dizionario anche se credo che sia più complicato. :thanks:



L'errore principale e' che definisci solo una struttura di tipo Gestione_Prenotazioni (nome infelice, un Volo sarebbe stato sufficiente), che durante il ciclo in acquisizione_dati continui a riempire con tanti valori (quindi alla fine avra' i valori solo dell'ultimo ciclo)
In realta' quindi hai bisogno di un vettore, o di una lista (in questo caso la soluzione migliore sarebbe un dizionario, ma lasciamo stare al momento)

Se non vuoi avere a che fare con noiose allocazioni dinamiche di memoria, definisci un vettore statico lungo DIM (definiscilo quanto vuoi)
C:
Gestione_Prenotazioni voli[DIM];
e poi accertati che il numero di voli entrato da tastiera sia inferiori o uguale a DIM.
Dopodiche' ovviamente tutte le volte che stampi il numero di posti occupati e disponibili devi specificare di che volo stiamo parlando (ossia devi usare l'indirizzo opportuno dell'elemento del vettore che corrisponde al codice di volo)



@DispatchCode tranquillo quando puoi, mi rispondi, no problem :ok:
 

Andretti60

Utente Èlite
3,969
2,680
Se non hai ancora studiato le liste lascia stare, lo farai in futuro.
Comunque questo esercizio non ha a che fare con l'allocazione di memoria, quindi va bene definire un vettore di lunghezza massima.
 

DispatchCode

Utente Attivo
883
551
CPU
Intel i7 6700HQ, 2.60Ghz, 4 core 8 threads
Scheda Madre
Asustek
HDD
Hitachi 7200 rpm, 1TB
RAM
16GB DDR4 (2 slot su 4)
GPU
Nvidia Geforce GTX 960M, 4GB
Audio
Realtek
Net
30Mbps/3Mbps con Eolo
OS
Windows 10 64bit
Grazie innanzitutto di avermi risposto

Per la gestione dinamica, bhè ci ho dato uno sguardo e vorrei imparare ad applicarla, sono rimasto un pò indietro, però prima sto cercando di mettere apposto le mie incertezze che si sono rilevate fino a qui con l'utilizzo dei puntatori. Mi è capitato spesso che durante l'esame mi venissero dubbi dal nulla, quindi per ora sarebbe meglio diventare più sicuro con l'esercizio. :rolleyes: Magari prova a farmi vedere come avresti risolto questa prima parte con la gestione dinamica.

Ciò che dice Andretti è corretto comunque. L'esempio te lo scrivo volentieri, così vedi implementazioni alternative. Magari anche senza l'utilizzo dell'allocazione dinamica, ma solo mostrandoti altre implementazioni rispetto alla tua. ;)

Dovrai darmi qualche giorno però, quando torno da lavoro ormai non ho più la forza di concentrarmi. :muro:
 

Giovanni Montanaro

Nuovo Utente
15
0
@DispatchCode si vai tranquillo :)

Il fatto è che trovo difficoltà nell'utilizzare i puntatori, sopratutto quando devo utilizzare le tabelle. Sto studiando dall'ultima edizione del Deitel e stavo cercando in qualche modo disperato di passare gli argomenti a funzioni per riferimento però oltre a non esserci riuscito, gli errori non mancano. :muro:
Quindi, si, mi sarebbe utile qualche altro esempio. :thanks:
 

Entra

oppure Accedi utilizzando

Hot: PS5 VS XBOX X/S?

  • Playstation 5

    Voti: 263 61.6%
  • XBOX Series X/S

    Voti: 164 38.4%

Discussioni Simili