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