#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define M 2
struct ST{
char name[10];
int num;
int age;
char addr[5];
int s[3];
float ave;
}stu[M],temp;
void save()
{
//藉助一箇中間變量進行實現
int i,j,k;
FILE *fp;
//對文件操作,寫入
if((fp=fopen("t.dat","wb"))==NULL)
{
printf("error");
exit(0);
}
//只輸出第1,3,5,7,9個學生的信息
/*for(i=0;i<M;i+=2)
{
// fseek(fp,i*sizeof(struct s),0);//移動文件標誌
fread(&stu[i],sizeof(struct s),1,fp);
printf("%-10s %4d %4d %-15s\n",stu[i].name,stu[i].num,stu[i].age,stu[i].addr);
}
fclose(fp);*/
//實現按學生的平均分的高低進行排序,這裏用選擇排序來實現吧
for(i=0;i<M-1;i++)
{
k=i;
for(j=i+1;j<M;j++)
if(stu[j].ave>stu[k].ave)
k=j;
//注意這塊進行交換的是結構體數組,不是單個比較的數據項
temp=stu[i];
stu[i]=stu[k];
stu[k]=temp;
}
//排序好的寫入磁盤
for(i=0;i<M;i++)
{
if((fwrite(&stu[i],sizeof(struct ST),1,fp))!=1)
printf("file write error");
}
//改寫對文件的操作形式,讀
if((fp=fopen("t.dat","rb"))==NULL)
{
printf("error");
exit(0);
}
printf("輸出排序好的順序:\n");
for(i=0;i<M;i++)
{
fread(&stu[i],sizeof(struct ST),1,fp);
printf("%-10s %4d %4d %-15s %4f\n",stu[i].name,stu[i].num,stu[i].age,stu[i].addr,stu[i].ave);
}
fclose(fp);
}
//主函數
int main()
{
//FILE *fp;
int i,k=0,j;
float sum=0;
printf("輸入學生的數據:\n");
for(i=0;i<M;i++)
{ printf("請輸入第%d學生的學號和姓名(分別用空格隔開)\n",i+1);
scanf("%s%d%d%s",stu[i].name,&stu[i].num,&stu[i].age,stu[i].addr);
sum=0;
for(j=0;j<3;j++)
{
printf("請輸入第%d學生的第%d門課程成績(分別用空格隔開)\n",i+1,j+1);
scanf("%d",&stu[i].s[j]);
sum+=stu[i].s[j];
}
//計算的是每個學生的平均成績
//要求讀寫到磁盤中,可以在結構體中定義一個ave屬性,然後用fwrite一塊寫入磁盤。
stu[i].ave=sum/3;
}
save();
return 0;
}
作幾點說明:對結構體中的某一數據進行排序,然後其他的數據跟着變化,其實就是讓你對讓當前這個結構體進行排序。
所以其中的temp定義成ST.
若有不足,請指正!