Progetto in C

di il
69 risposte

69 Risposte - Pagina 3

  • Re: Progetto in C

    Vorrei fare una piccola osservazione:

    Quando si scrive in C, si può concatenare il codice come piace, il compilatore non si lamenta.

    Per piccoli programmi è accettabile l'indentazione come la mostri, ad esempio:

    <pre id=code><font face=courier size= id=code>
    if(veicolo==5){

    traghetto[i].nposti=100;
    nnsaliti= posticat-traghetto[i].nposti ;
    }
    </font id=code></pre id=code>

    ma più che i programmi diventano complessi, più è necessario fare lo sforzo di scrivere codice pulito, e sempre molto bene leggibile. E' uno sbaglio credere che lo si farà in un secondo momento, e siccome mi capita almeno una volta il mese di dover leggere codice fatto da altri, apprezzo molto se è scritto bene.

    Per farlo breve:

    a) le espressioni dovrebbero presentarsi con lo spazio fra costante e variabile.
    <pre id=code><font face=courier size= id=code>
    if(veicolo == 5)
    </font id=code></pre id=code>
    b) il blocco codice dovrebbe iniziare allo stesso livello dell'if, for, while, loop e simili; praticamente come inizia una procedura:
    <pre id=code><font face=courier size= id=code>
    if(veicolo == 5)
    {
    }
    </font id=code></pre id=code>
    So che per alcuni ambienti, soprattutto per Unix, si sceglie spesso la forma "if(){", che sintatticamente è corretta, ma di difficile lettura, se l'espressione è molto lunga, e in particolare, se si allunga a diverse righe, e se l'espressione contiene delle macro.

    c) la spaziatura riguarda anche il codice, non solo le espressioni:
    <pre id=code><font face=courier size= id=code>
    if(veicolo == 5)
    {
    traghetto[i].nposti = 100;
    nnsaliti = posticat - traghetto[i].nposti;
    }
    </font id=code></pre id=code>
    A dicembre ho revisionato un codice C++, che era caratterizzato da tutti questi piccoli difetti. Per poter leggere il codice, ho passato tre giorni interi per ripararlo, e poi ho trovato anche l'errore, che si nascondeva fra gli spazi e blocchi non messi bene.

    Giovanni
    ---
    http://www.y2ksw.com/vbulletin
  • Re: Progetto in C

    Grazie mille e per fare il numero totale delle persone nn salite? cioè se veciolo==1, 2, 3, 4, 5, 6, 7 etc calcolo il numero dei posti e delle macchine nn salite in base al tipo di veicolo, però alla fine devo fare il totale dei veicoli nn saliti, mentre prima negli if ho calcolato i mezzi nn saliti in base al tipo di veicolo... i tipi di veicolo sono 7 e il totale nn saliti deve essere posticat(totale dei posti per tutti i veicoli) - nn saliti!!!!
    posti cat è posticat=(rand()%1000)+500; e tot nn saliti nn so cm calcolarlo!!! lo so fare solo in base al tipo di veicolo
    e se invece che i mettessi veioclo, cioè if...traghetto[veciolo].nposti=100; if...etc; così per calcolare npostitotale potrei scrivere npostitotale=traghetto[veicolo].nposti... può andare?
    più che altro è il prof che lo vuole scritto in questa maniera!!!!
    cmq ho solo da risolvere alcuni piccoli problemini e poi in teoria ho fatto tutto anche sae mi sembra troppo strano, quindi ci sarà di sicuro qlc errore
  • Re: Progetto in C

    Siccome hai blocchi separati if(), è necessario che ricalcoli alla fine di ogni blocco i totali.

    Se useresti invece:
    <pre id=code><font face=courier size= id=code>
    if(...)
    {
    }
    else if(...)
    {
    }
    else if(...)
    {
    }
    else
    {
    }
    </font id=code></pre id=code>
    è sufficiente fare il calcolo finale in fondo. Per il resto non ci dovrebbero essere errori in questa parte del codice.

    Giovanni
    ---
    http://www.y2ksw.com/vbulletin
  • Re: Progetto in C

    Ah, ma quindi se io uso if else calcolo il n non saliti alla fine, ma il tot è globale, coè per ogni tipo di veicolo, cioè la somma dei posti disp per ogni tipo di veicolo - totale mezzi in coda e quindi cm lo scrivo?


    baci e buona notte.
  • Re: Progetto in C

    Concettualmente, se fra i vari blocchi if() non c'è altro codice, è come se avessi usato if() else. Se c'è codice, il calcolo finale potrebbe essere diverso, a secondo cosa stai facendo nel mezzo. Meglio ancora sarebbe usare switch(), perché confronti sempre la stessa variabile con una costante.

    Giovanni
    ---
    http://www.y2ksw.com/vbulletin
  • Re: Progetto in C

    Infatti io ho scritto così

    for(i=0; i<n; i++){


    veicolo= rand()%7;
    posticat=(rand()%1000)+500;

    switch(veicolo){

    case 0:
    traghetto[i].nposti=100;
    nnsaliti= posticat-traghetto[i].nposti ;

    case 1:

    traghetto[i].nposti=150;
    nnsaliti= posticat-traghetto[i].nposti ;

    case 2:

    traghetto[i].nposti=15;
    nnsaliti= posticat-traghetto[i].nposti ;

    case 3:

    traghetto[i].nposti=25;
    nnsaliti= posticat-traghetto[i].nposti ;

    case 4:

    traghetto[i].nposti=200;
    nnsaliti= posticat-traghetto[i].nposti ;

    case 5:

    traghetto[i].nposti=100;
    nnsaliti= posticat-traghetto[i].nposti ;

    case 6:

    traghetto[i].nposti=10;
    nnsaliti= posticat-traghetto[i].nposti ;

    }
    }
    totnsaliti= totnsaliti + nnsaliti;????? boh
    mezzisaliti= posticat-totnsaliti;
  • Re: Progetto in C

    Oltre a questo nn so cm smistare la gente degli autobus e per i posti totali per ogni categoria, cabina1, cabina2, poltrone nn so cm metterli giù, io farei cm per tipo veciolo cioè categoria=rand()%3; e poi switch ma nn si può fare in un altro modo.... grazie

    Eleonora
  • Re: Progetto in C

    Aia!

    switch(veicolo){

    case 0:
    traghetto[i].nposti=100;
    nnsaliti= posticat-traghetto[i].nposti ;
    <b>break;</b>

    case 1:

    traghetto[i].nposti=150;
    nnsaliti= posticat-traghetto[i].nposti ;
    <b>break;</b>

    // ...

    Se non metti il 'break', il primo ciclo esegue tutto il codice di switch(), il secondo da 'case 1' in poi, ecc. Risultato: sicuramente errato.

    Giovanni
    ---
    http://www.y2ksw.com/vbulletin
  • Re: Progetto in C

    Giusto ma oltre a qst...

    totnsaliti= somam di tutti in posti disponibili per ogni tipo di veicolo- posti disponibili, ma nn so cm scrivere la somma avendo prima un switch e case????? boh
    mezzisaliti= posticat-totnsaliti;
    oltre a questo nn so cm smistare la gente degli autobus e per i posti totali per ogni categoria, cabina1, cabina2, poltrone nn so cm metterli giù, io farei cm per tipo veciolo cioè categoria=rand()%3; e poi switch ma nn si può fare in un altro modo.... grazie
  • Re: Progetto in C

    Beh, potresti provare così:

    switch(veicolo){

    case 0:
    traghetto[i].nposti=100;
    break;

    case 1:

    traghetto[i].nposti=150;
    break;

    // ...

    }
    nnsaliti = posticat - traghetto[i].nposti;

    Cioè dopo lo switch fai le cose che sono comuni a tutti gli elementi. Cmq sono già fuso, oggi. Eppure non ho fatto nulla di speciale ... immagino che sia la vecchiaia

    Giovanni
    ---
    http://www.y2ksw.com/vbulletin
  • Re: Progetto in C

    Uffa mi va il orog fino alla fine, tranne le varie classifica.... e incasso che nn sta,mpa, e poi mi da sempre glui steesi valori....
    qst è il mio prog

    include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<strings.h>
    #include<time.h>

    /*dichiarazione delle struct tipo_t, client_t, cat_t e cmp_t che mi servirà per la
    funzione cmp (=compare) che riordinerà i risultati ottenuti, stilando una classifica*/

    typedef struct {

    char *tipoveicolo;
    char *categoria;

    }tipo_t;

    typedef struct prezzotype{

    float costoveicolo;
    float prezzocategoria;

    }prezzo_t;


    typedef struct clientype {

    tipo_t type;
    int maxpersone;
    int npersone;
    prezzo_t preis;
    int nposti;
    int prob;

    } client_t;

    typedef struct cmptype{

    float incasso;
    int perstot, ni, pni;
    int maxcategoria;

    }cmp_t;


    /*le funzioni cmppers e cmpinc servono per fare una classifica in base al giorno che ha
    trasportato più persone e ha incassato di più*/

    void printclient(client_t *t, int n){

    int i;

    for(i=0; i<n; i++){

    printf("%s -%s\n", t[i].type.tipoveicolo, t[i].type.categoria);
    printf("%d\n", t[i].maxpersone);
    printf("%d\n", t[i].npersone);
    printf("%f - %f\n", t[i].preis.costoveicolo, t[i].preis.prezzocategoria);
    printf("%d\n", t[i].nposti);
    printf("%d\n", t[i].prob);
    }
    }



    int cmppers(const void *a,const void *b){

    cmp_t*pa=(cmp_t*)a;
    cmp_t*pb=(cmp_t*)b;
    if(pa->ni> pb->ni)return 1;
    if(pa->ni< pb->ni)return -1;
    return 0;
    }

    int cmpinc(const void *a, const void *b){

    cmp_t*pa=(cmp_t*)a;
    cmp_t*pb=(cmp_t*)b;
    if(pa->incasso> pb->incasso)return 1;
    if(pa->incasso< pb->incasso)return -1;
    return 0;
    }

    int cmptipoveicolo(const void *a, const void *b){

    client_t*pa=(client_t*)a;
    client_t*pb=(client_t*)b;
    if(pa->type.tipoveicolo>pb ->type.tipoveicolo )return 1;
    if(pa->type.tipoveicolo< pb->type.tipoveicolo)return -1;
    return 0;
    }

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

    // Dichiarazione delle variabili

    FILE *fpi;/*fpi è un puntatore a FILE e p è un puntatore a una variabile di
    tipo char che mi servirà per far leggere dal programma il file di
    testo .txt*/
    char *p, b[BUFSIZ];
    client_t *traghetto;
    cmp_t *classifica;
    int n, i, g; /*i e g sono indici, contatori*/
    int ni, pni; /*ni è il numero delle persone imbarcate e pni è il numero delle
    persone non imbarcate*/
    int ngiorni, totpostimezzi, veicolo, posticat;
    float perc;
    int mezzisaliti, nnsaliti,pers, people, totnsaliti;
    ngiorni=atoi(argv[2]);

    fpi=fopen(argv[1], "r"); /*apro il file in sola lettura*/


    /*Questo if contolla che il programma sia lanciato nel modo corretto*/

    if(argc!=3){
    printf("\nIl programma deve essere lanciato in questo modo:\n");
    printf("\t>traghetto traghetto.txt <Giorni della simulazione>\n\n");
    exit(1);
    }

    /*contollo inoltre che il puntatore a file non sia nullo*/

    if(fpi==NULL){

    perror(argv[1]);
    exit(1);
    }

    /*Questo if controlla che il numero di giorni della simulazione sia 10*/

    if(ngiorni<10){

    printf("i giorni della simulazione devono essere almeno 10\n");
    exit(1);

    }

    p=(fgets(b,sizeof(b),fpi));
    n=atoi(b);
    traghetto=(client_t*)malloc(n*sizeof(client_t));

    /*Allocazione dinamica dello spazio per le struct e ciclo di apertura dell file
    e memorizzazione, per l'inserimento die dati nella struct*/

    if(traghetto==NULL){

    perror(argv[1]);
    exit(1);
    }

    i=0;

    while(n>i){

    p=strtok(b,"|");
    traghetto[i].type.tipoveicolo=(char*)malloc(strlen(p)+1);
    strcpy(traghetto[i].type.tipoveicolo,p);
    p=strtok(b,"|");
    traghetto[i].type.categoria=(char*)malloc(strlen(p)+1);
    strcpy(traghetto[i].type.categoria,p);
    p=strtok(NULL,"|");
    traghetto[i].maxpersone=atoi(p);
    p=strtok(NULL,"|");
    traghetto[i].npersone=atoi(p);
    p=strtok(NULL,"|");
    traghetto[i].preis.costoveicolo=atof(p);
    p=strtok(NULL,"|");
    traghetto[i].preis.prezzocategoria=atof(p);
    p=strtok(NULL,"|");
    traghetto[i].nposti=atoi(p);
    p=strtok(NULL,"|");
    traghetto[i].prob=atoi(p);
    i++;
    }

    fclose(fpi);


    classifica=(cmp_t*)malloc(n*sizeof(cmp_t));
    if(classifica==NULL){
    perror(argv[1]);
    exit(1);
    }

    /*iniziallizzo random per evitare che i valori vengano ripetuti*/

    srand(time(NULL));

    /*ciclo dei giorni*/

    for(g=0; g<ngiorni; g++){

    /*stabilisco quanti sono i posti disponibili per le persone e per i mezzi*/

    for(i=0; i<n; i++){

    /*per ogni giornata il numero delle persone in colonna, dei mezzi e il tipo di qst ultimi è casuale*/

    veicolo= rand()%7;
    posticat=(rand()%1000)+500;

    switch(veicolo){

    case 0:
    traghetto[veicolo].nposti=100;
    break;

    case 1:

    traghetto[veicolo].nposti=150;
    break;

    case 2:

    traghetto[veicolo].nposti=15;
    break;

    case 3:

    traghetto[veicolo].nposti=25;
    break;

    case 4:

    traghetto[veicolo].nposti=200;
    break;

    case 5:

    traghetto[veicolo].nposti=100;
    break;

    case 6:

    traghetto[veicolo].nposti=10;
    nnsaliti=posticat-traghetto[i].nposti;
    break;
    }


    totnsaliti=posticat-traghetto[veicolo].nposti++;
    mezzisaliti= posticat-totnsaliti;

    }

    printf("I mezzi saliti oggi sono %d, quelli non saliti %d\n", mezzisaliti, totnsaliti);

    for (i=0; i<n; i++){

    people=rand()%3;

    switch(people){

    case 0:
    traghetto[i].maxpersone=150;
    break;

    case 1:
    traghetto[i].maxpersone=250;
    break;

    case 2:
    traghetto[i].maxpersone=600;
    break;
    }

    pers=(rand()%2000)+1000;
    classifica[i].maxcategoria=(pers-traghetto[i].maxpersone);
    classifica[i].perstot=classifica[i].perstot+classifica[i].maxcategoria;
    classifica[i].pni=pers-classifica[i].perstot;
    classifica[i].ni= pers-classifica[i].pni;
    }
    printf("Le persone salite oggi sono %d, mentre quelle non salite %d\n", classifica[i].ni,classifica[i].pni);

    /*sommatoria costi*/

    for(i=0; i<n; i++){

    float a;
    a=traghetto[i].preis.costoveicolo+(traghetto[i].preis.prezzocategoria * classifica[i].ni);
    classifica[i].incasso= classifica[i].incasso+a;


    }

    printf("L'incasso quotidiano è di %f euro\n", classifica[i].incasso);

    }
    printf("CLASSIFICA DEL TIPO DI MEZZI PER GIORNATA\n");
    printclient(traghetto, n);
    qsort(traghetto, n, sizeof(tipo_t), cmptipoveicolo);
    printf("\nCLASSIFICA DEL NUMERO DELLE PERSONE IMBARCATE\n");
    qsort(classifica, n, sizeof(cmp_t), cmppers);
    printf("\nCLASSIFICA DEGLI INCASSI\n");
    qsort(classifica, n, sizeof(cmp_t), cmpinc);

    }
    basta lo farò a febbraio se ci riesco!!!
  • Re: Progetto in C

    Se continui così ti assumo domani. Sul serio.

    Ora, non proprio domani, devo andarci io a sbattere la testa, ma prima che vai a fare lavoretti in giro fatti viva, ok? Non so dove sei, ma uno dei miei clienti cerca disperatamente programmatori, ed è una proposta sempre aperta - per chi è disposto ad abitare in montagna, e che non ha intenzione di abbandonare l'area software subito

    Giovanni
    ---
    http://www.y2ksw.com/vbulletin
  • Re: Progetto in C

    Non è spiritoso!!!!domani dovrei consegnarlo ma nn lo faccio!!!
  • Re: Progetto in C

    Ma io non lo trovo per nulla male. Per quel poco tempo che avevi hai fatto un gran bel lavoro, e inoltre anni luce meglio della prima prova.

    Giovanni
    ---
    http://www.y2ksw.com/vbulletin
  • Re: Progetto in C

    Ma ancora nn av bene però!!foirse ho sbagliato uni!!nn mi stampa gli incassu e nemmeno le varie classifiche, poi il numero dell eprsone ira sono riuscita a farlo diverso, ma si ripete ogni tot è normale?
    scusa per gli errori ma sono in crisi e ho gli occhi appannati dalle lacrimi!!!nn lo pasasserà mai visto che nn va!!!
Devi accedere o registrarti per scrivere nel forum
69 risposte