Program in C x esame di ing informatica AIUTO!!!!

di il
26 risposte

Program in C x esame di ing informatica AIUTO!!!!

Ciao a tutti,
ho da scrivere un programma in C per l'esame di Programmazione, ho messo giù una bozza.. potete dirmi se fin qui va bene...?? Avevo in mente di fare un programma per la gestione delle ore di mio padre e delle spese...Grazie mille!!! Maldengo
----------------------------------------------------------------
*Programma di gestione ore e spese mensili per l'attività di un
tecnico, prima scrittura effettuata il 13 ottobre*/

#include <stdio.h>

{
typedef struct {char OreEffettuate[1];
char OreStraordinarie[1];
char OreRecupero[1];
}Ore;
typedef enum (2004,2005,2006,2007,2008)Anno;
typedef enum (01,02,03,04,05,06,07,08,09,10,11,12) Mese;
typedef int Giorno;

typedef struct {int Materiali;
int Pranzi;
int Parcheggi;
}Spese;
typedef int Acconti;
}

{
printf("Inserisci Anno\n");
scanf(%d,&Data.Anno);
while(Anno<2004)
printf("La data è errata");
else printf("Inserisci Mese\n");
scanf(%d, &Data.Mese);
printf("Inserisci Giorno\n");
scanf(%d, &Data.Giorno);
printf("Inserisci ore effettuate");
scanf(%d,&Ore)
---------------------------------------------------------------

26 Risposte

  • Re: Program in C x esame di ing informatica AIUTO!!!!

    Hmbeh', nì

    <pre id=code><font face=courier size= id=code>
    #include <stdio.h>

    typedef struct
    {
    char OreEffettuate[1];
    char OreStraordinarie[1];
    char OreRecupero[1];
    } Ore;

    typedef struct
    {
    int Materiali;
    int Pranzi;
    int Parcheggi;
    } Spese;


    int main(int argc, char* argv[])
    {
    int dwAnno = 0;
    int dwMese = 0;
    int dwGiorno = 0;
    int dwOre = 0;

    while(dwAnno < 2004 || dwAnno > 2008)
    {
    printf("Inserisci Anno (2004-2008):\n");
    scanf("%d", &dwAnno);
    }

    while(dwMese < 1 || dwMese > 12)
    {
    printf("Inserisci Mese (1-12):\n");
    scanf("%d", &dwMese);
    }

    while(dwGiorno < 1 || dwGiorno > 31)
    {
    printf("Inserisci Giorno (1-31):\n");
    scanf("%d", &dwGiorno);
    }

    while(dwOre <= 0)
    {
    printf("Inserisci ore effettuate:");
    scanf("%d", &dwOre);
    }

    return 0;
    }
    </font id=code></pre id=code>

    Così compila. Il typedef si usa solo per (ri)definire un tipo semplice, e dove ci sono tipi semplici già disponibili, conviene farlo il più ovvio possibile.

    Mancava la main(), e tutto ciò che viene sopra, non si deve trovare fra { e }, altrimenti è privato a quell'area.

    'while' non ha un 'else', e gli enumerati, se usati devono essere nomi e non costanti, caso mai:

    <pre id=code><font face=courier size= id=code>
    typedef enum _Mese
    {
    Gennaio = 1,
    Febbraio = 2
    // etc
    } Mese
    </font id=code></pre id=code>

    Poi, non puoi assegnare qualcosa a Data.x, se non l'hai dichiarata.

    Es.:

    <pre id=code><font face=courier size= id=code>
    Ore Data;

    printf("Inserisci ore effettuate:");
    scanf("%d", &Data.OreEffettuate);
    </font id=code></pre id=code>

    Solo che con "%d" ci vai in overflow con un numero > 255. Non so se C ci mette una trappola, forse

    Per il resto sei sulla buona strada, soprattutto per il motivo di non chiederci tutto il routiname, ma di usare la propria materia grigia per trovare soluzioni, e tutto sommato non eri lontano dal programma funzionante ...

    Giovanni
    ---
    http://www.y2ksw.com/vbulletin
  • Re: Program in C x esame di ing informatica AIUTO!!!!

    Ciao Giovanni, ho appena terminato di compilare.... me lo puoi sistemare??? Così il programma è finito.... grazie mille...
    ______________________________________________________________

    /*Programma di gestione ore e spese mensili per l'attività di un tecnico, prima scrittura effettuata il 13 ottobre 2004*/

    #include <stdio.h>

    {
    typedef struct {char Ore Ordinarie[1];
    char OreStraordinarie[1];
    char OreRecupero[1];
    }Ore;
    typedef int Anno;
    typedef int Mese;
    typedef int Giorno;

    typedef struct {float Materiali;
    float Pranzi;
    float Parcheggi;
    }Spese;
    typedef float Acconti;
    }
    main()
    {
    printf("Inserisci Anno\n");
    scanf(%d,&Data.Anno);

    while(Anno<2004)
    {
    printf("La data è errata: Inserisci nuovamente l'anno");
    scanf(%d, &Data.Anno);
    if(Anno>2007);
    printf("La data è errata: Inserisci nuovamente l'anno");
    scanf(%d, &Data.Anno);
    else
    printf("Inserisci Mese\n");
    scanf(%d, &Data.Mese);
    }

    while(Mese<01)
    {
    printf("La data è errata: Inserisci nuovamente il mese");
    scanf(%d, &Data.Mese);
    if(Mese>12);
    printf("La data è errata: Inserisci nuovamente il mese");
    else
    printf("Inserisci Giorno\n");
    scanf(%d, &Data.Giorno);
    }

    while(Giorno<01)
    {
    printf("La data è errata: Inserisci nuovamente il giorno");
    scanf(%d, &Data.Mese);
    if(Giorno>31);
    printf("La data è errata: Inserisci nuovamente il giorno");
    scanf(%d, &Data.Mese);
    else
    printf("Inserisci ore ordinarie");
    scanf(%c,&OreOrdinarie);
    }
    if (OreOrdinarie!=8);
    printf ("Le ore ordinarie devono essere 8, le altre vanno in straordinarie e recupero!");
    else
    OreOrdinarie==OreOrdinarie+8;
    printf ("Inserisci ore straordinarie");
    scanf(%c, &OreOrdinarie);
    if (OreStraordinarie>1);
    printf ("Le ore straordinarie devono essere 1, le altre vanno nelle ore in recupero!");
    else
    OreStraordinarie==OreStraordinarie+1;
    printf ("Inserisci ore da recuperare");
    scanf(&c, &OreRecupero);

    while(OreRecupero>5)
    printf("Le ore in recupero sono errate!");
    scanf(%c, OreRecupero);
    else
    OreRecupero==OreRecupero+1;
    Ore==OreOrdinarie+OreStraordinarie+OreRecupero;

    printf ("Inserisci spese per materiali");
    scanf(%f, &Spese.Materiali);
    }
    printf ("Inserisci spese per pranzi");
    scanf(%f, &Spese.Pranzi);
    printf ("Inserisci spese per parcheggi");
    scanf(%f, &Spese.Parcheggi);

    Spese==Materiali+Pranzi+Parcheggi;
    printf("Inserisci acconti ricevuti");
    scanf(%f, &Acconti);

    printf ("Riepilogo dei dati inseriti oggi\n");
    printf ("Oggi %d &d &d hai effettuato %c ore,\n tra cui %c ore ordinarie,\n %c ore straordinarie, \n e %c ore di recupero" Ore, OreOrdinarie, OreStraordinarie, OreRecupero);
    printf ("Hai sostenuto %f di spese,\n tra cui %f di materiali,\n %f di pranzi,\n e %c di parcheggi" Spese, Materiali, Pranzi, Parcheggi);
    printf ("Hai ricevuto %f di acconti\n\n\n\n\n" Acconti);
    printf ("Bravo papà!!");




    }

    _______________________________________________________
    Grazie mille!!!!!

    Maldengo
  • Re: Program in C x esame di ing informatica AIUTO!!!!

    Scusa se non l'ho corretto prima di mandartelo, ma magari mi sono appena connessa ad internet e la tua risp l'ho vista quando ho finito di scriverlo.. grazie mille!!!

    Maldengo
  • Re: Program in C x esame di ing informatica AIUTO!!!!

    Eh, no !

    Ora ripassa un attimo su quel che ho scritto e guarda cosa hai combinato! Il copia-incolla va bene, ma prendi almeno il codice giusto

    Hai clamorosamente rifatto gli stessi errori, solo che ora l'elenco è più lungo.

    Poi hai aggiunto nuovi errori:

    <pre id=code><font face=courier size= id=code>
    if(Anno>2007);
    ...
    </font id=code></pre id=code>

    e

    <pre id=code><font face=courier size= id=code>
    Spese == Materiali + Pranzi + Parcheggi;
    </font id=code></pre id=code>

    Nel primo caso, "if(cosa?)". Finito lì? Il ';' indica 'termine dell'operazione'. Poi, se non metti le paretesi graffe, ti esegue solo la prima riga, l'else lo vede poi come un errore di sintassi.

    Nel secondo caso fai un confronto, e non assegni nulla.

    <pre id=code><font face=courier size= id=code>
    Spese = Materiali + Pranzi + Parcheggi;
    </font id=code></pre id=code>

    è il codice corretto.

    Ho visto la nota in basso ora, ma non fare il furbo. In fondo il compito è tuo (meno male)

    Poi un piccolo consiglio: rientra tutto come ti ho mostrato. La lettura del codice è importante, e se le parentesi sono sparse un po' qua e là, non è degno di un voto ottimo, anzi, diminuisce la qualità di tutto il codice. Se il codice è pulito si trovano subito tutti gli errori, ed è un ingrediente indispensabile per i programmi grossi. Se ti abitui ora, da "grande" non avrai problemi di alcun genere, e potrai pestare i piedi a chi scrive "Spaghetti Code", così si chiama nel gergo.

    Qui, sul forum, so che non è possibile farlo vedere, se non si usa [c o d e] e [/c o d e] (senza gli spazi), ma si vede benissimo se il tentativo è stato fatto, o no.

    Quindi al lavoro, e vedrai che tutto fila

    Giovanni
    ---
    http://www.y2ksw.com/vbulletin
  • Re: Program in C x esame di ing informatica AIUTO!!!!

    Ok, do un'occhiata sistemo e poi torno... anzi, oltre a ringraziarti, volevo dirti che il programma lo devo presentare solo su carta, indipendentemente dal suo funzionamento..

    Grazie ancora..

    Maldengo
  • Re: Program in C x esame di ing informatica AIUTO!!!!

    Non riesco a capire perchè devo modificare così.. aiuto.. spiegami perpia...

    maldengo
  • Re: Program in C x esame di ing informatica AIUTO!!!!

    Non riesco a capire perchè devo modificare così.. aiuto.. spiegami perpia...

    maldengo
  • Re: Program in C x esame di ing informatica AIUTO!!!!

    Non immaginavo che si trattava di un esame scritto tipo Paper-Ware degli anni 80

    In genere, il tuo programma ha due grossi difetti, uno è che dichiari dei tipi, come:

    <pre id=code><font face=courier size= id=code>
    typedef int Anno;
    </font id=code></pre id=code>

    che non serve a nulla, perché 'int' è un tipo primitivo, e serve solo se tu vorresti dire:

    <pre id=code><font face=courier size= id=code>
    Anno dwAnno;

    // per dire:

    int dwAnno;
    </font id=code></pre id=code>

    In pratica si cerca di evitare questi descrittori supplementari, dove è possibile, perché rende il codice difficile da leggere e capire.

    Il secondo grosso difetto è, che a forza di implementare tante funzionalità ti perdi nei dettagli e non riesci più a controllare l'insieme.

    Programmare è essenzialmente un copia-incolla, ma con criterio. Se avevo scritto:

    <pre id=code><font face=courier size= id=code>
    int dwAnno = 0;
    </font id=code></pre id=code>

    avevo intenzione di dire: facciamolo semplice, molto semplice. Quindi, se poi scrivo:

    <pre id=code><font face=courier size= id=code>
    while(dwAnno < 2004 || dwAnno > 2008)
    {
    //
    }
    </font id=code></pre id=code>

    entro nel ciclo con già l'anno sbagliato (=0), e quindi chiedo l'anno, finché non è soddisfatto il criterio.

    Poi predo esattamente questo ciclo e lo duplico quante volte mi serve, e cambio parametri, ma solo quando ho accertato che tutto funziona come dovuto.

    Puoi fare anche tutto con if() e goto. Ma non è molto elegante.

    Per quanto riguarda tutte le parole chiave di blocco, consiglio di usare le parentesi graffe, anche se si tratta di una sola riga di codice:

    <pre id=code><font face=courier size= id=code>
    if(dwAnno < 2004 || dwAnno > 2008)
    {
    // se è vero
    }
    else
    {
    // altrimenti
    }

    while(1)
    {
    // infinito
    }

    for(;;)
    {
    // infinito
    }
    </font id=code></pre id=code>

    In questo modo è chiaro cosa vuoi fare, e non ti scappa mai un errore logico.

    Poi, per quanto riguarda gli errori clamorosi, confronta:

    <pre id=code><font face=courier size= id=code>
    scanf(%d, dwAnno); //non va
    scanf("%d", dwAnno); // va
    </font id=code></pre id=code>

    Non vedi la differenza? Le virgolette. Questo per tutto il documento tranne qualche eccezione, se non mi ricordo male...

    Il discorso che riguarda i diversi messaggi, lo puoi risolvere anche così:

    <pre id=code><font face=courier size= id=code>
    while(dwAnno < 2004 || dwAnno > 2008)
    {

    if(dwAnno <= 0)
    {
    // Primo invito
    }
    else
    {
    // successivi inviti
    }

    // scanf()
    }
    </font id=code></pre id=code>

    Poi non avevo detto che devi scrivere come voglio io. Io ti do una mano a comprendere la sintassi, e questa è uguale per tutti (mi piacerebbe se fosse di mio sacco ). Non ti consiglio usare le eccezioni, ma la regola, perché il codice è molto più semplice da comprendere, e più che altro, compilabile in altri sistemi, senza cambiare una virgola.

    C e i linguaggi derivanti è molto semplice, ma l'ingenio umano ne ha fatto un mostro che 'fa tutto'. Ma anche nella sua semplicità fa tutto, basta conoscere le regole, e a volte lo fa anche meglio. E' qui che si vedono le qualità del docente, e mi sa che hai preso uno che sa molto, tranne le basi fondamentali. Oppure sei stato poco attento

    Ora devo lavorare, non impazzire, hm? Stasera sono di nuovo on-line...

    Giovanni
    ---
    http://www.y2ksw.com/vbulletin
  • Re: Program in C x esame di ing informatica AIUTO!!!!

    Giovanni non è che otresti aiutare anche me!!! sono una compagna di uni di zanzan!!!!!!!grazie mille e scusa per il disturbo

    salve, il 29 di questo mese devo sostenere un esame su un progettino sul c ... io ho deciso di creare una rubrica!!! volevo sapere se c'è qlc che è in grado di corregere il mio programmino e di dirmi come potrei migliorarlo e continuarlo... segue programmino:

    /*Programma per la creazione di una Rubrica telefonica*/

    #include <stdio.h>

    {
    typedef struct { char Via [30];
    char Citta[30];
    char Stato[30];
    char NCivico[5];
    int Cap;
    } Indirizzo;

    typedef struct { int TelefonoCasa;
    int Cellulare;
    char Email[30];
    int TelefonoUfficio;
    } Reperibilita;

    typedef struct { char Nome[30];
    char Cognome[30];
    char CodFiscale[16];
    } Persona;
    }
    main ()

    { Persona Pers1, Pers2, Pers3, Pers4;

    {

    printf (“Inserisci Nome\n”);
    scanf (“%c”, &Persona.Nome);

    printf (“Inserisci Cognome\n”);
    scanf (“%c”, &Persona.Cognome);

    printf(Inserisci CodFiscale\n”)
    scanf (“%c”, %Persona.CodFiscale);

    printf (“Inserisci Via\n”);
    scanf (“%c”, &Indirizzo.Via);

    printf (“Inserisci Citta\n”)
    scanf (“%c”, &Indirizzo.Citta)

    …. E così via per tutti gli struct (indirizzo e persona)

    }
    If (Reperibilità.TelefonoUfficio = Reperibilità.TelefonoCasa)
    printf (“Ufficio ==Casa\n”)

    else printf (“Ufficio!=Casa\n”)
    }

    non so cm continuare, e se persona pers1... va dopo il main om priam e quando devo chiudere laparentesi. Inoltre vorrei sapere se finio ad ora è giusto!!!!!!!!!!!!!!!!!!!!
    grazie mille


    Eleonora


    Eleonora
  • Re: Program in C x esame di ing informatica AIUTO!!!!

    Chiunque non solo giovannipuò aiutarmi... ma mi è venuto in mente il suo nome perchè me ne ha parlato la mia amica zanzan

    Eleonora
  • Re: Program in C x esame di ing informatica AIUTO!!!!

    Ah, ora diventerò insegnante di un'intera classe

    <pre id=code><font face=courier size= id=code>
    /*
    Programma per la creazione di una Rubrica telefonica
    */

    #include <stdio.h>

    {
    typedef struct
    {
    char Via [30];
    char Citta[30];
    char Stato[30];
    char NCivico[5];
    int Cap;
    } Indirizzo;

    typedef struct
    {
    int TelefonoCasa;
    int Cellulare;
    char Email[30];
    int TelefonoUfficio;
    } Reperibilita;

    typedef struct
    {
    char Nome[30];
    char Cognome[30];
    char CodFiscale[16];
    } Persona;
    }

    int main(int argc, char* argv[])
    {
    Persona Pers1, Pers2, Pers3, Pers4;

    {
    printf ("Inserisci Nome\n");
    scanf ("%s", &Persona.Nome);

    printf ("Inserisci Cognome\n");
    scanf ("%s", &Persona.Cognome);

    printf(Inserisci CodFiscale\n")
    scanf ("%s", %Persona.CodFiscale);

    printf ("Inserisci Via\n");
    scanf ("%s", &Indirizzo.Via);

    printf ("Inserisci Citta\n");
    scanf ("%s", &Indirizzo.Citta);
    }

    if(Reperibilità.TelefonoUfficio == Reperibilità.TelefonoCasa)
    printf ("Ufficio == Casa\n");
    else
    printf ("Ufficio != Casa\n");

    return 0;
    }
    </font id=code></pre id=code>

    Di per sé, questo esempio è andato molto meglio. Ho applicato qualche modifica, che soltanto l'occhio d'acquila riesce a percepire...

    Esempio:

    int main(int argc, char* argv[])

    ---

    <pre id=code><font face=courier size= id=code>
    #include <stdio.h>

    {
    typedef struct
    ...
    </font id=code></pre id=code>

    In questo pezzetto di codeice si vede che lavorate assieme

    Dunque, il problema è, che iniziando a livello modulo, dopo l'include, con le parentesi graffe, si apre una sezione privata, ed è stata chiusa correttamente prima di main(). Però, main() non "vede" le strutture, perché sono private a una sezione di cui non si sa che fine farà... Si chiama "codice morto", codice che non sarà mai eseguito, e forse neanche compilato. Quindi c'è da togliere "{" e "}" attorno a quel blocco (dopo include e prima di main().

    <pre id=code><font face=courier size= id=code>
    int main(int argc, char* argv[])
    {
    Persona Pers1, Pers2, Pers3, Pers4;
    ...
    </font id=code></pre id=code>

    Dichiara le persone Pers1-4, ma non ne fai uso. Invece, ti riferisci direttamente a Persona, che è però il nome del tipo, e non la persona. Quindi:

    <pre id=code><font face=courier size= id=code>
    printf ("Inserisci Nome\n");
    scanf ("%s", &Pers1.Nome);
    </font id=code></pre id=code>

    sarebbe più adeguato, sempre che vuoi riempire la struttura "Pers1". Questo vale anche Indirizzo, manca inoltre la sua dichiarazione.

    <pre id=code><font face=courier size= id=code>
    scanf ("%c", ...);
    </font id=code></pre id=code>

    è potenzialmente corretto, ma si riferisce a un solo carattere. "%s" mostra tutta la stringa.

    <pre id=code><font face=courier size= id=code>
    {
    printf ("Inserisci Nome\n");
    scanf ("%s", &Persona.Nome);

    printf ("Inserisci Cognome\n");
    scanf ("%s", &Persona.Cognome);

    printf(Inserisci CodFiscale\n")
    scanf ("%s", %Persona.CodFiscale);

    printf ("Inserisci Via\n");
    scanf ("%s", &Indirizzo.Via);

    printf ("Inserisci Citta\n");
    scanf ("%s", &Indirizzo.Citta);
    }
    </font id=code></pre id=code>

    Non ho capito bene perché ci metti anche lì le parentesi graffe. Comunque, essendo all'interno di main() sarà eseguito correttamente.

    PS: se apri una nuova discussione, facciamo meno confusione, hm?

    Giovanni
    ---
    http://www.y2ksw.com/vbulletin
  • Re: Program in C x esame di ing informatica AIUTO!!!!

    Giovanni,
    se guradi sul forujm sotto il nome inginofaria.. c'è la mia discussione!!!grazieeeeeeeeeeeeeeeeee"!!!!!!!!!!!1


    Eleonora
  • Re: Program in C x esame di ing informatica AIUTO!!!!

    OK, si continua lì...

    Giovanni
    ---
    http://www.y2ksw.com/vbulletin
  • Re: Program in C x esame di ing informatica AIUTO!!!!

    Ciao Giovanni,
    vedo che Eleonora ti ha già contattato.
    Comunque, ecco il mio programmino finito.. che ne pensi? Credi sia un po' scarno per presentarlo ad un esame?
    Grazie mille per tutto, Maldengo
    _____________________________________________________________
    /*Programma di gestione ore e spese mensili per l'attività di
    un tecnico, prima scrittura effettuata il 13 ottobre 2004*/

    #include <stdio.h>
    #define OreOrdinarie=8;
    #define OreStraordinarie=1;


    typedef struct
    {
    int OreRecupero;
    int OreTot;
    }Ore;

    typedef struct
    {
    float Materiali;
    float Pranzi;
    float Parcheggi;
    float SpeseTot;
    }Spese;

    int Anno;
    int Mese;
    int Giorno;
    Ore OreTotali;
    Spese SpeseTotali;
    float Acconti;
    main()
    {
    printf("Inserisci Anno\n");
    scanf("%d", &Anno);
    while(Anno<2004 || 2007>Anno)
    {
    printf("La data è errata: Inserisci nuovamente l'anno");
    scanf("%d", &Anno);
    }
    printf("Inserisci Mese\n");
    scanf("%d", &Mese);
    while(Mese<01 || Mese>12)
    {
    printf("La data è errata: Inserisci nuovamente il mese");
    scanf("%d", &Mese);
    }
    printf("Inserisci Giorno\n");
    scanf("%d", &Giorno);
    while(Giorno<01 || Giorno>31)
    {
    printf("La data è errata: nserisci nuovamente il giorno");
    scanf("%d", &Mese);
    }
    printf("Inserisci ore effettuate");
    scanf("%d",&OreTotali.OreTot);

    while(OreTotali.OreTot>24)
    {
    printf("Le ore sono errate: inserisci nuovamente le ore");
    scanf("&d", &OreTotali.OreTot);
    }

    OreTotali.OreRecupero = OreTotali.OreTot-OreOrdinarie-OreStraordinarie;

    printf ("Inserisci spese per materiali");
    scanf("%f", &SpeseTotali.Materiali);

    printf ("Inserisci spese per pranzi");
    scanf("%f", &SpeseTotali.Pranzi);
    printf ("Inserisci spese per parcheggi");
    scanf("%f", &SpeseTotali.Parcheggi);

    SpeseTotali.SpeseTot = SpeseTotali.Materiali+SpeseTotali.Pranzi+SpeseTotali.Parcheggi;

    printf("Inserisci acconti ricevuti");
    scanf("%f", &Acconti);

    printf ("Riepilogo dei dati inseriti oggi\n");
    printf ("Oggi %d %d %d hai effettuato %d ore,\n tra cui %d ore ordinarie,\n %d ore straordinarie, \n e %d ore di recupero" OreTotali.OreTot, OreOrdinarie, OreStraordinarie, OreTotali.OreRecupero);
    printf ("Hai sostenuto %f di spese,\n tra cui %f di materiali,\n %f di pranzi,\n e %f di parcheggi" SpeseTotali.SpeseTot, SpeseTotali.Materiali, SpeseTotali.Pranzi, SpeseTotali.Parcheggi);
    printf ("Hai ricevuto %f di acconti\n\n\n\n\n" Acconti);
    printf ("Bravo papà!!");




    }
    ________________________________________________________________
Devi accedere o registrarti per scrivere nel forum
26 risposte