Esercizio sulle strutture in C

di il
24 risposte

Esercizio sulle strutture in C

Salve a tutti! Sono nuovo nel forum e sono ancora agli inizi nella programmazione in C. Avrei bisogno(se potete) del vostro aiuto per risolvere un problema. Io dovrei fare il seguente esercizio con il linguaggio C:

"Un cinecircolo richiede un programma per elaborare le programmazioni televisive di
film. Per ciascun film si vuole tener traccia di titolo, durata, data, ora e canale (intero)
su cui verrà trasmesso e se la trasmissione è già stata effettuata.
Il programma deve permettere l’inserimento di nuovi film e, una volta trasmesso, di
aggiornare questo dato ricercando il film per data oppure per titolo.
Visualizzare inoltre i film che sono già stati trasmessi, quelli che verranno trasmessi in
una certa data (immessa dall’utente), i film in programmazione divisi per canali e i titoli
dei quattro film più lunghi."

Nel mio codice ho utilizzato lo switch e delle strutture( e e poi altre cose) e fermandomi un attimo per controllare se stavo facendo giusto sorge il problema dell' acquisizione del titolo del film. Infatti non riesco ad acquisirlo del tutto poiché essendo composto da spazi es:"Le colline hanno gli occhi" me li interpreta giustamente come caratteri '\0' e mi tronca la stringa. Ho provato ad utilizzare alternative a scanf() come fgets() ma il problema permane comunque. Chiederei il vostro aiuto, se possibile.

Vi posto il codice del mio programma(fino a dove mi sono fermato per controllare):
#include <string.h>
#include <stdio.h>

int main()
{

struct{

    char titolo[20],data[20],ora[20],canale[20],trasm[20];

    int durata;

}film[100];


int i,n=0,scelta;

printf("\n***Programma di gestione per cinecircolo***\n");

do{

        printf("\n1:Inserimento film\n2:Aggiornamento film\n3:Film gia' trasmessi\n4:Film trasmessi in una certa data\n5:Film che verrano trasmessi su un certo canale\n6:I 4 film piu' lunghi\n7:FINE");


        printf("\n\nFornisci scelta:\n");
        scanf("%d",&scelta);

switch(scelta)
{


case 1:
{

if(n<100)
{


    printf("\nFornisci dati\n");


scanf("%s%d%s%s%s",film[n].data,&film[n].durata,film[n].ora,film[n].canale,film[n].trasm);



}
else
printf("\nSpazio esaurito\n");

}
}
}while(scelta!=7);
return(0);
}
Grazie in anticipo!

24 Risposte

  • Re: Esercizio sulle strutture in C

    Per le stringhe puoi utilizzare la

    fgets

    usando stdin come ultimo parametro.
  • Re: Esercizio sulle strutture in C

    Potresti(se vuoi) mostrarmi ciò nel mio codice? Ho già provato ad utilizzare fgets() ma mi saltava l'input, quindi mi potresti dare una mano?
  • Re: Esercizio sulle strutture in C

    Scusa, ma se l'hai usato, scrivi tu come hai fatto e quali problemi hai avuto ...
  • Re: Esercizio sulle strutture in C

    Avevo fatto così:
    #include <string.h>
    #include <stdio.h>
    
    int main()
    {
    
    struct{
    
        char titolo[20],data[20],ora[20],canale[20],trasm[20];
    
        int durata;
    
    }film[100];
    
    
    int i,n=0,scelta;
    
    printf("\n***Programma di gestione per cinecircolo***\n");
    
    do{
    
            printf("\n1:Inserimento film\n2:Aggiornamento film\n3:Film gia' trasmessi\n4:Film trasmessi in una certa data\n5:Film che verrano trasmessi su un certo canale\n6:I 4 film piu' lunghi\n7:FINE");
    
    
            printf("\n\nFornisci scelta:\n");
            scanf("%d",&scelta);
    
    switch(scelta)
    {
    
    
    case 1:
    {
    
    if(n<100)
    {
    
    
        printf("\nFornisci dati\n");
    
    fgets(film[n].titolo,20,stdin);
    scanf("%s%d%s%s%s",film[n].data,&film[n].durata,film[n].ora,film[n].canale,film[n].trasm);
    
    
    
    }
    else
    printf("\nSpazio esaurito\n");
    
    }
    }
    }while(scelta!=7);
    return(0);
    }
    
    Ma purtroppo non funziona.
  • Re: Esercizio sulle strutture in C

    Devi usare una fgets per ogni campo stringa non solo per il primo.

    Solo per il campo numerico va bene la scanf, avendo cura di pulire il buffer di tastiera con un ciclo while ... Per capirci, praticamente

    fgets ...

    scanf("%d", &film[n].durata);
    while(getchar() != '\n') ;

    fgets ...
    fgets ...

    ...
  • Re: Esercizio sulle strutture in C

    Scusami ho fatto un tremendo errore ecco e' questo il codice giusto:
    #include <string.h>
    #include <stdio.h>
    
    int main()
    {
    
    struct{
    
        char titolo[20],data[20],ora[20],canale[20],trasm[20];
    
        int durata;
    
    }film[100];
    
    
    int i,n=0,scelta;
    
    printf("\n***Programma di gestione per cinecircolo***\n");
    
    do{
    
            printf("\n1:Inserimento film\n2:Aggiornamento film\n3:Film gia' trasmessi\n4:Film trasmessi in una certa data\n5:Film che verrano trasmessi su un certo canale\n6:I 4 film piu' lunghi\n7:FINE");
    
    
            printf("\n\nFornisci scelta:\n");
            scanf("%d",&scelta);
    
    switch(scelta)
    {
    
    
    case 1:
    {
    
    if(n<100)
    {
    
    
        printf("\nFornisci dati\n");
    
    fgets(film[n].titolo,20,stdin);
    scanf("%s%s%d%s%s%s",film[n].titolo,film[n].data,&film[n].durata,film[n].ora,film[n].canale,film[n].trasm);
    
    
    
    }
    else
    printf("\nSpazio esaurito\n");
    
    }
    }
    }while(scelta!=7);
    return(0);
    }
    
    Il problema sta nel acquisizione di un titolo tipo "Le colline hanno gli occhi" in questa parte di codice:
    scanf("%s%s%d%s%s%s",film[n].titolo,film[n].data,&film[n].durata,film[n].ora,film[n].canale,film[n].trasm);
    .Ho provato ad utilizzare fgets() per
    film[n].titolo
    , ma non viene...
  • Re: Esercizio sulle strutture in C

    Ti ho già risposto su come devi organizzare le scanf ... hai letto la risposta?

    In ogni caso, fai attenzione perché quel titolo è più lungo di 20 caratteri che hai previsto per il titolo.
  • Re: Esercizio sulle strutture in C

    Ciao, scusami ma avevo capito un' altra cosa rispetto alla risposta che mi avevi dato.Comunque ho provato a fare come dici tu ma purtroppo mi salta un input e non capisco perchè.

    Ecco la parte di codice che ho modificato(ho inoltre modificato la lunghezza delle mie stringhe a 60):
    
    printf("\nFornisci dati\n");
    
    fgets(film[n].titolo,60,stdin);
    
    scanf("%d",&film[n].durata);
    
    while(getchar()!='\n');
    
    fgets(film[n].data,60,stdin);
    
    fgets(film[n].ora,60,stdin);
    
    fgets(film[n].trasm,60,stdin);
    
    fgets(film[n].canale,60,stdin);
    
    
  • Re: Esercizio sulle strutture in C

    Cosa salta?
  • Re: Esercizio sulle strutture in C

    Credo salti
    fgets(film[n].canale,60,stdin);
    ,poichè mi chiede di fare solo 5 inserimenti anziché 6, quindi suppongo non mi chieda quest' ultimo fgets()...
  • Re: Esercizio sulle strutture in C

    Posta tutto il codice corretto ...
  • Re: Esercizio sulle strutture in C

    Eccolo qui:
    
    
    #include <string.h>
    #include <stdio.h>
    
    int main()
    {
    
    struct{
    
        char titolo[60],data[60],ora[60],canale[60],trasm[60];
    
        int durata;
    
    }film[100];
    
    
    int i,n=0,scelta;
    
    printf("\n***Programma di gestione per cinecircolo***\n");
    
    do{
    
            printf("\n1:Inserimento film\n2:Aggiornamento film\n3:Film gia' trasmessi\n4:Film trasmessi in una certa data\n5:Film che verrano trasmessi su un certo canale\n6:I 4 film piu' lunghi\n7:FINE");
    
    
            printf("\n\nFornisci scelta:\n");
            scanf("%d",&scelta);
    
    switch(scelta)
    {
    
    
    case 1:
    {
    
    if(n<100)
    {
    
    
    printf("\nFornisci dati\n");
    
    fgets(film[n].titolo,60,stdin);
    
    scanf("%d",&film[n].durata);
    
    while(getchar()!='\n');
    
    fgets(film[n].data,60,stdin);
    
    fgets(film[n].ora,60,stdin);
    
    fgets(film[n].trasm,60,stdin);
    
    fgets(film[n].canale,60,stdin);
    
    
    
    
    
    }
    else
    printf("\nSpazio esaurito\n");
    
    }
    }
    }while(scelta!=7);
    
    return(0);
    }
  • Re: Esercizio sulle strutture in C

    Dopo la scanf per la scelta aggiungi il ciclo per pulire il buffer
    
            scanf("%d",&scelta);
    	while(getchar()!='\n');
    
    La lunghezza 60 va bene per il titolo ma non ha senso anche per la data e l'ora ...
  • Re: Esercizio sulle strutture in C

    Ok grazie mille,adesso funziona,ti ringrazio molto.Posso chiederti un ultima cosa? Mi potresti spiegare che cos' è il buffer e perchè bisogna pulirlo in questi casi? E perche' non ci sta il titolo di "le colline hanno gli occhi" in una stringa di 20 ?
Devi accedere o registrarti per scrivere nel forum
24 risposte