對結構體進行排序,根據結構體中某一數據進行排序後對其對應的整個結構體變量進行排序

#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.

若有不足,請指正!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章