void srank(float a[],int b[],int n)
{
int i,j,temp2;
float temp1;
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
if(a[i]<a[j])
{
temp1=a[i];
a[i]=a[j];
a[j]=temp1;
temp2=b[i];
b[i]=b[j];
b[j]=temp2;
}
}
}
}
void Show(char s[],int n)
{
FILE *fp;
int i;
struct name t;
fp=fopen(s,"rb");
printf("ID\tNAME\tCO1\tCO2\tCO3\tCO4\n");
for(i=0;i<n;i++)
{
fseek(fp,sizeof(struct name)*i,SEEK_SET);
fread(&t,sizeof(struct name),1,fp);
printf("%-8d%-8s%.1f\t%.1f\t%.1f\t%.1f\n",t.id,t.name,t.c1,t.c2,t.c3,t.c4);
}
fclose(fp);
}
void C_Ave(char s[],int n)
{
FILE *fp;
struct name t;
int i;
fp=fopen(s,"rb");
for(i=0;i<n;i++)
{
fseek(fp,sizeof(struct name)*i,SEEK_SET);
fread(&t,sizeof(struct name),1,fp);
cs1+=t.c1;
cs2+=t.c2;
cs3+=t.c3;
cs4+=t.c4;
}
printf("ITEM\tCO1\tCO2\tCO3\tCO4\n");
printf("AVG\t%.1f\t%.1f\t%.1f\t%.1f\n",cs1/4,cs2/4,cs3/4,cs4/4);
flag1=1;
fclose(fp);
}
void S_Ave(char s[],int n)
{
FILE *fp;
int i;
struct name t;
fp=fopen(s,"rb");
printf("ID\tNAME\tSCORE\n");
for(i=0;i<n;i++)
{
fseek(fp,sizeof(struct name)*i,SEEK_SET);
fread(&t,sizeof(struct name),1,fp);
ss[i]=(t.c1+t.c2+t.c3+t.c4)/4;
printf("%-2d\t%-8s\t%.2f\n",t.id,t.name,ss[i]);
}
flag2=1;
fclose(fp);
}
void Save(char s[],int n)
{
FILE *fp;
struct name t;
int select;
int i;
fp=fopen(s,"rab");
if(flag1==1&&flag2==1)
{
fprintf(fp,"%f%f%f%f",cs1/4,cs2/4,cs3/4,cs4/4);
for(i=0;i<N;i++)
{
fprintf(fp,"%f ",ss[i]);
}
printf("SAVE SUCCESSFULLY!\nNow it is:\n");
printf("ID\tNAME\tCO1\tCO2\tCO3\tCO4\tAVG\n");
for(i=0;i<N;i++)
{
fseek(fp,sizeof(struct name)*i,SEEK_SET);
fread(&t,sizeof(struct name),1,fp);
printf("%-8d%-8s%.1f\t%.1f\t%.1f\t%.1f\t%.1f\n",t.id,t.name,t.c1,t.c2,t.c3,t.c4,ss[i]);
}
printf("- \t- \t%.1f\t%.1f\t%.1f\t%.1f\t-\n",cs1/4,cs2/4,cs3/4,cs4/4);
fclose(fp);
}
else
{
fclose(fp);
printf("you haven't calculated the ave_score!\n");
printf("Do you want to calculate the ave_score and then save it(1 for yes,2 for no)?\n");
scanf("%d",&select);
if(select==1)
{
C_Ave(s,n);
S_Ave(s,n);
Save(s,n);
}
}
}
void Rank(char s[],int n)
{
FILE *fp;
struct name t;
int b[n];
float a[n];
int select,i,j;
if(flag1==1&&flag2==1)
{
fp=fopen(s,"rb");
printf("Input course ID:(0 for ave_score ranking)\n");
scanf("%d",&select);
switch(select)
{
case 0:
for(i=0;i<n;i++)
{
fread(&t,sizeof(struct name),1,fp);
a[i]=(t.c1+t.c2+t.c3+t.c4)/4;
b[i]=i;
}
srank(a,b,n);
break;
case 1:
for(i=0;i<n;i++)
{
fread(&t,sizeof(struct name),1,fp);
a[i]=t.c1;
b[i]=i;
}
srank(a,b,n);
break;
case 2:
for(i=0;i<n;i++)
{
fread(&t,sizeof(struct name),1,fp);
a[i]=t.c2;
b[i]=i;
}
srank(a,b,n);
break;
case 3:
for(i=0;i<n;i++)
{
fread(&t,sizeof(struct name),1,fp);
a[i]=t.c3;
b[i]=i;
}
srank(a,b,n);
break;
case 4:
for(i=0;i<n;i++)
{
fread(&t,sizeof(struct name),1,fp);
a[i]=t.c4;
b[i]=i;
}
srank(a,b,n);
break;
default:
printf("Illegal input!");
}
printf("RANK\tID\tNAME\tSCORE\n");
for(i=0;i<n;i++)
{
fseek(fp,sizeof(struct name)*b[i],SEEK_SET);
fread(&t,sizeof(struct name),1,fp);
printf("%-8d%-8d%-8s%.1f\n",i+1,t.id,t.name,a[i]);
}
fclose(fp);
}
else
{
Save(s,n);
Rank(s,n);
}
}