Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2008
    Messaggi
    2

    [c]Compito d'esame(cerco aiuto)

    Ciao a tutti, ieri ho svolto l'esame di fondamenti di informatica di ingegneria. Vi riporto il testo del primo esercizio:

    ESERCIZIO 1 Si consideri un file contenente informazioni su un insieme di articoli presenti in un magazzino(uno per riga,al massimo 200).
    Per ciascun articolo sono memorizzati il numero di pezzi disponibili e il nome,separati da uno spazio.Il nome è lungo al massimo 40 caratteri e può contenere anche spazi.Come esempio si consideri il seguente file:

    30 sacchi di cemento
    47 mattoni
    15 pannelli
    184 Tasselli da 8
    57 sacchi di malta
    12 Barattoli di vernice

    Si scriva una funzione C che prenda come parametri il nome di un file siffatto,il nome di un file di output ed un valore reale che rappresenti una soglia percentuale.
    La funzione deve scrivere nel file di output gli articolidel file di input nel formato:nome e percentuale di pezzi di quell'articolorispetto al numerototale di pezzi in magazzino(separati dal carattere ';').La funzione deve però scrivere solo gli articoli che superano in percentuale il valore di soglia e deve anche restituire il numero di articoli nel file di uscita.
    Ad esempio se il file di ingresso è quello dell'esempio e la soglia è 7.8 il file di uscita sarà il seguente e il valore restituito sarà 4:

    sacchi di cemento; 8.70
    Mattoni; 13.62
    Tasselli da 8; 53.33
    Sacchi di malta; 16.52

    ||QUI FINISCE IL TESTO DELL'ESERCIZIO||

    Ora vi propongo la mia soluzione adottata all'esame che però si è rivelata andare nel classico errore di Segmentation faul:

    #include <stdio.h>
    #include <string.h>

    struct oggetto
    {
    int num_pezzi;
    char nome[41];
    };


    float Percentuale(int num_oggetti,int somma)
    {
    float s;
    s=((float)num_oggetti/somma)*100;
    return s;
    }

    #define MAX_DIM 200
    int Stampa(char nome_file[],char nome_file_out[],float soglia)
    {
    FILE* fp;
    FILE* fp2;
    int j,i=0,a,cont,t,somma,n;
    char ch;
    struct oggetto k[MAX_DIM];
    char nome_numero[11];
    fp=fopen(nome_file,"r");
    while(fscanf(fp,"%s",nome_numero)!=EOF)
    {
    n=atoi(nome_numero);
    k[i].num_pezzi=n;
    somma=n+somma;
    j=0;
    getc(fp);
    while((ch=getc(fp))!='\n')
    {
    k[i].nome[j]=ch;
    j++;
    }
    k[i].nome[j]='\0';
    cont++;
    }
    fclose(fp);
    i=0;
    fp2=fopen(nome_file_out,"w");
    for(a=0;a<cont;a++)
    {
    if(Percentuale(k[i].num_pezzi,somma)>soglia)
    {
    fprintf(fp2,"%s; %g\n",k[i].nome,Percentuale(k[i].num_pezzi,somma));
    t++;
    }
    i++;
    }
    fclose(fp2);
    return t;
    }


    int main()
    { char nome_file[21];
    char nome_file_out[21];
    float soglia;
    printf("Inserire nome file input:\n");
    scanf("%s",nome_file);
    printf("Inserire nome file output:\n");
    scanf("%s",nome_file_out);
    printf("Inserire la soglia:\n");
    scanf("%g",&soglia);
    printf("Il numero di oggetti è %d",Stampa(nome_file,nome_file_out,soglia));
    return 0;
    }


    Spero possiate aiutarmi a trovare l'errore o eventualmente a proporre una nuova soluzione che però cerchi di rispecchiare il mio ragionamento.
    Grazie

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Fondamentalmente, mi sembra che tu abbia dimenticato

    1) di azzerare i totalizzatori/contatori prima di usarli (somma, cont, t ... non sono azzerati per default ... il loro valore iniziale e' casuale ...)

    2) di incrementare la variabile i nel while della funzione Stampa
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2008
    Messaggi
    2
    grazie gli errori erano quelli... sono uno stupido vabbè... ti ringrazio!

    Per me si può anche chiudere questo topic

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Originariamente inviato da Matsu88
    grazie gli errori erano quelli... sono uno stupido vabbè... ti ringrazio!

    Per me si può anche chiudere questo topic
    Ok.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.