C语言学生成绩管理系统 怎么用文件排序

2025-06-28 15:03:01
推荐回答(3个)
回答1:

文件是用来保存数据的,是无法用文件来进行排序的。应该从文件中把数据读入到链表或数组中,再用数组或链表结构进行排序。

typedef struct/*学生结构体*/
{
char num[10]; /*学生学号*/
char name[20]; /*学生姓名*/
char sex[4];/*学生性别*/
int year,month,day;/*出生年月日*/
char face[4];/*政治面貌*/
float math,gaoji,dianlu,aver; /*数学分析,高级语言程序设计,电路与电子学成绩*/

}Student;
Student stu[30];

void paixu_xuehao(Student stud[],int n) /*按学号排序*/
{ float p,q,w;
int i,j,r,g,h;
double y;
char x[20],t[10],z[10];
for(i=0;ifor(j=0;jif(strcmp(stud[j].num,stud[j+1].num)>0)
{ strcpy(t,stud[j].num);strcpy(stud[j].num,stud[j+1].num);strcpy(stud[j+1].num,t);
strcpy(x,stud[j].name);strcpy(stud[j].name,stud[j+1].name);strcpy(stud[j+1].name,x);
r=stu[j].year;stu[j].year=stu[j+1].year;stu[j+1].year=r;
g=stu[j].month;stu[j].month=stu[j+1].month;stu[j+1].month=g;
h=stu[j].day;stu[j].day=stu[j+1].day;stu[j+1].day=h;
strcpy(z,stud[j].face);strcpy(stud[j].face,stud[j+1].face);strcpy(stud[j+1].face,z);
y=stu[j].aver;stu[j].aver=stu[j+1].aver;stu[j+1].aver=y;
p=stu[j].math;stu[j].math=stu[j+1].math;stu[j+1].math=p;
q=stu[j].gaoji;stu[j].gaoji=stu[j+1].gaoji;stu[j+1].gaoji=q;
w=stu[j].dianlu;stu[j].dianlu=stu[j+1].dianlu;stu[j+1].dianlu=w;
}
return;
}

int wenjian2(Student stu[],int n) /*从文件中读入数据*/
{
int i=0;
FILE *fp; /*定义文件指针*/
char filename[20]; /*定义文件名*/
printf("\t\t\tInput the filename:");
scanf("\t\t\t%s",filename); /*输入文件名*/
if((fp=fopen(filename,"rb"))==NULL) /*打开文件*/
{ printf("\t\t\tcann't open the file\n"); /*打开失败信息*/
printf("\t\t\t");
}
fread(&stu[i],sizeof(Student),1,fp);
while(!feof(fp))fread(&stu[i++],sizeof(Student),1,fp);
fclose(fp); /*关闭文件*/
printf("\t\t\tSuccessed!\n");
printf("\t\t\t");
system("pause");
return(i);
}

回答2:

文件是用来保存数据的,不是用来排序的!
从文件中把数据读入链表或数组中,用数组或链表结构进行排序!
typedef struct/*学生结构体*/
{
char num[10]; /*学生学号*/
char name[20]; /*学生姓名*/
char sex[4];/*学生性别*/
int year,month,day;/*出生年月日*/
char face[4];/*政治面貌*/
float math,gaoji,dianlu,aver; /*数学分析,高级语言程序设计,电路与电子学成绩*/

}Student;
Student stu[30];

void paixu_xuehao(Student stud[],int n) /*按学号排序*/
{ float p,q,w;
int i,j,r,g,h;
double y;
char x[20],t[10],z[10];
for(i=0;i for(j=0;j if(strcmp(stud[j].num,stud[j+1].num)>0)
{ strcpy(t,stud[j].num);strcpy(stud[j].num,stud[j+1].num);strcpy(stud[j+1].num,t);
strcpy(x,stud[j].name);strcpy(stud[j].name,stud[j+1].name);strcpy(stud[j+1].name,x);
r=stu[j].year;stu[j].year=stu[j+1].year;stu[j+1].year=r;
g=stu[j].month;stu[j].month=stu[j+1].month;stu[j+1].month=g;
h=stu[j].day;stu[j].day=stu[j+1].day;stu[j+1].day=h;
strcpy(z,stud[j].face);strcpy(stud[j].face,stud[j+1].face);strcpy(stud[j+1].face,z);
y=stu[j].aver;stu[j].aver=stu[j+1].aver;stu[j+1].aver=y;
p=stu[j].math;stu[j].math=stu[j+1].math;stu[j+1].math=p;
q=stu[j].gaoji;stu[j].gaoji=stu[j+1].gaoji;stu[j+1].gaoji=q;
w=stu[j].dianlu;stu[j].dianlu=stu[j+1].dianlu;stu[j+1].dianlu=w;
}
return;
}

int wenjian2(Student stu[],int n) /*从文件中读入数据*/
{
int i=0;
FILE *fp; /*定义文件指针*/
char filename[20]; /*定义文件名*/
printf("\t\t\tInput the filename:");
scanf("\t\t\t%s",filename); /*输入文件名*/
if((fp=fopen(filename,"rb"))==NULL) /*打开文件*/
{ printf("\t\t\tcann't open the file\n"); /*打开失败信息*/
printf("\t\t\t");
}
fread(&stu[i],sizeof(Student),1,fp);
while(!feof(fp))fread(&stu[i++],sizeof(Student),1,fp);
fclose(fp); /*关闭文件*/
printf("\t\t\tSuccessed!\n");
printf("\t\t\t");
system("pause");
return(i);
}

回答3:

//排序的子函数
void paixu(struct student *s,int n){
int i,j;
struct student m;
for(i=0;i for(j=i+1;j if (s[i].sum m=s[i];s[i]=s[j];s[j]=m;
}
}
//调用方法,
//调用之前应该先计算好sum总分,
paixu(str,N); //调用子函数排序