codice:
#include <stdio.h>
#include <stdlib.h>
#define FILE1 "articoli.txt"
#define FILE2 "revisioni_out.txt"
#define DIM (80)
#define N (8)
#define C (3)
typedef struct{
int cod;
float m;
int vg;
}ART;
FILE*open_file(char*name,char*mode);
ART*alloca(int r);
void carica(ART*g,int n,FILE*fp);
float media(int*v);
int controllo(int a,int b);
void ordina(ART*g,int n);
void swap(int *a,int *b);
void swap_f(float*a,float*b);
int main(int argc,char**argv){
int n,i;
char buf[DIM],*fin_name,*fout_name;
ART * giudizi;
//riceve parametri da linea di comando, altrimenti usa parametri predefiniti
switch(argc){
case 1:
fin_name=FILE1;
fout_name=FILE2;
break;
case 2:
fin_name=argv[1];
fout_name=FILE2;
break;
case 3:
fin_name=argv[1];
fout_name=argv[2];
break;
default:
printf("ERRORE! Inserire al massimo due parametri: <file di input> <file di output> \n");
exit(-1);
}
FILE*fin=open_file(fin_name,"r");
fgets(buf,sizeof(buf),fin);
sscanf(buf,"%d",&n);
giudizi=alloca(n);
carica(giudizi,n,fin);
for(i=0;i<n;i++)
// printf("%d %.3f %d\n\n",giudizi[i].cod,giudizi[i].m,giudizi[i].vg);
ordina(giudizi,n);
for(i=0;i<n;i++)
//printf("%d %.3f %d\n",giudizi[i].cod,giudizi[i].m,giudizi[i].vg);
return 0;
}
//inverte due numeri in virgola mobile
void swap_f(float*a,float*b){
float tmp=*a;
*a=*b;
*b=tmp;
}
//inverte due interi
void swap(int*a,int*b){
int tmp=*a;
*a=*b;
*b=tmp;
}
//ordina un vettore di strutture
void ordina(ART*g,int n){
int i,j;
for(i=0;i<n-1;i++){
for(j=i+1;j<n;j++)
if(g[i].m<g[j].m){
swap(&g[i].cod,&g[j].cod);
swap_f(&g[i].m,&g[j].m);
swap(&g[i].vg,&g[j].vg);
}
}
return;
}
//calcola media tra gli elementi del vettore
float media(int*v){
int i;
float somma=0;
for(i=0;i<N;i++)
somma+=v[i];
return somma/N;
}
/*funzione che deve restituire 1 se entrambi gli interi sono positivi,
-1 se sono entrambi negativi e 0 in tutti gli altri casi */
int controllo(int a,int b){
if(a>0 && b>0)
return 1;
if(a<0 && b<0)
return -1;
return 0;
}
/* funzione che elabora dati da file e li memorizza nel vettore di strutture */
void carica(ART*g,int n,FILE*fp){
int i,id,vg1,vg2;
int v[N];
char buf[DIM];
for(i=0;i<n;i++){
fgets(buf,sizeof(buf),fp);
sscanf(buf,"%d %d %d %d %d %d %d %d %d %d %d",&id,v,v+1,v+2,v+3,&vg1,v+4,v+5,v+6,v+7,&vg2);
g[i].cod = id;
g[i].m = media(v);
g[i].vg = controllo(vg1,vg2);
}
return;
}
//alloca un vettore di strutture
ART*alloca(int r){
ART * m;
m=(ART*)malloc(r*sizeof(int));
if(!m){
fprintf(stderr,"ERRORE:memoria non allocata!!\n");
exit(-1);
}
return m;
}
//verifica la giusta apertura del file
FILE*open_file(char*name,char*mode){
FILE*fp=fopen(name,mode);
if(!fp){
fprintf(stderr,"Errore nell'apertura del file %s!\n",name);
exit(-1);
}
return fp;
}