[项目记录] 用c语言完成的一个学生成绩管理系统

时间:2023-03-08 21:46:47

本文为大大维原创,最早于博客园发表,转载请注明出处!!!

一、要求:

学生成绩管理系统

某班有最多不超过30人(具体人数由键盘输入)参加期末考试,最多不超过6门(具体门数由键盘输入)。使用链表编程实现如下菜单驱动的学生成绩管理系统。

  1. 从文件读入每个学生个人信息和成绩信息,可以由键盘输入文件名。读入成功提示读入学生记录的个数,不成功提示相应出错信息。
  2. 增量式手动录入每个学生的学号、姓名和各科考试成绩。不考虑中文姓名,但需要考虑重名情况下的处理,学生的学号是唯一的。
  3. 计算每门课程的总分和平均分;
  4. 计算每个学生的总分和平均分;
  5. 按每个学生的总分由高到低排出名次表;
  6. 按每个学生的总分由低到高排出名次表;
  7. 按学号由小到大排出成绩表;
  8. 按姓名的字典顺序排出成绩表;
  9. 按学号查询学生排名及其考试成绩;
  10. 按姓名查询学生排名及其考试成绩;需要考虑学生重名的情况。
  11. 按优秀(100-90)、良好(89-80)、中等(79-70)、及格(69-60)、不及格(59-0)5个类别,对每门课程分别统计每个类别的人数以及所占的百分比;并将计算结果输出到文件,文件名可由键盘输入。
  12. 将每个学生的学号、姓名、各科考试成绩、总分和平均分输出到显示器;
  13. 将每个学生的个人信息和成绩写入文件,可由键盘输入文件名;

二、程序结构与设计

  1. 模块划分:

整个函数划分为:

      a. 用户欢迎与权限通过界面

b. 主菜单与用户退出界面

c. 函数调用用程序执行界面

三个模块。

2.主函数的主要功能:

     a. 通过switch函数调用各功能函数

     b. 构建良好亲和的用户体验界面

3. 各子函数主要功能:

F1:  从文件读入每个学生个人信息和成绩信息,可以由键盘输入文件名。读入成功提示读入学生记录的个数,不成功提示相应出错信息。

F2:增量式手动录入每个学生的学号、姓名和各科考试成绩。不考虑中文姓名,但需要考虑重名情况下的处理,学生的学号是唯一的。

F3:计算每门课程的总分和平均分;

F4:计算每个学生的总分和平均分;

F5:按每个学生的总分由高到低排出名次表;

F6:按每个学生的总分由低到高排出名次表;

F7:按学号由小到大排出成绩表;

F8:按姓名的字典顺序排出成绩表;

F9:按学号查询学生排名及其考试成绩;

F10:按姓名查询学生排名及其考试成绩;需要考虑学生重名的情况。

F11:按优秀(100-90)、良好(89-80)、中等(79-70)、及格(69-60)、不及格(59-0)5个类别,对每门课程分别统计每个类别的人数以及所占的百分比;并将计算结果输出到文件,文件名可由键盘输入。

F12:将每个学生的学号、姓名、各科考试成绩、总分和平均分输出到显示器;

F13:将每个学生的个人信息和成绩写入文件,可由键盘输入文件名;

4.函数之间的调用关系:

以结构体数组为主体,辅以链表,通过switch函数调用各功能函数。

Main函数负责对各个小函数的调用,而f1---f13分别完成对题目所要求的13个操作的实现,程序整体大方整洁,风格良好,有较好的结构化特点

三、项目代码

 /*student achievement management system*/
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<windows.h>
#define L 32
#define N 6
#define M 30
#define LEN sizeof(struct student)
struct student
{
char name [L]; ///姓名
int num; ///学号
float ach[N]; ///成绩数组
float total; ///总分
struct student *next;
};
struct student stu[M];
int count=,n,m,j,i,k,l;
char filename[L]={}; ///声明变量 存储文件名
int f1(int m,int n,char filename[L]);
int f2(int m,int n,char filename[L]);
int f3(int m,int n,char filename[L]);
int f4(int m,int n,char filename[L]);
int f5(int m,int n,char filename[L]);
int f6(int m,int n,char filename[L]);
int f7(int m,int n,char filename[L]);
int f8(int m,int n,char filename[L]);
int f9(int m,int n,char filename[L]);
int f10(int m,int n,char filename[L]);
int f11(int m,int n,char filename[L]);
int f12(int m,int n,char filename[L]);
int f13(int m,int n,char filename[L]);
int main()
{
int cishu=;
r0: system("CLS");
system("color 0C");
char mima[L];
printf("-------------------------------------------------------------------------------\n");
printf("| 欢迎使用学生信息管理系统 |");
printf("-------------------------------------------------------------------------------\n");
printf("\n\n\n\n++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
printf("+ 系 统 权 限 认 证 +\n");
printf(">>>>>>>>>>>>>>>>>>>>>请提供管理员权限,输入系统启动密码<<<<<<<<<<<<<<<<<<<<<<<\n");
printf("+ +\n");
printf("+----------------------------------------------------------------------------+\n");
printf("\n>>>>>> 密 码: ");
scanf("%s",&mima);
cishu --;
for(;strcmp(mima,"LLL1996")!=;)
{
if(cishu==)
{
printf("对不起,程序即将关闭,谢谢使用");
getchar();
getchar();
exit ();
}
else
{
printf("对不起,密码错误,请重新输入(你还有%d次输入机会)",cishu);
getchar();
getchar();
goto r0;
}
}
getchar();
system("CLS");
system("color BC");
printf("-------------------------------------------------------------------------------\n");
printf("| WELCOME TO USE THE SYSTEM |");
printf("-------------------------------------------------------------------------------\n");
printf(" 建议:1. 使用本系统时需要首先输入班级总人数、总科目数、录入信息文件 \n");
printf(" 2. 如果您已经有输入文件,建议请先选择选项1,用于检查文件信息总数 \n");
printf(" 与录入人数、科目数是否一致,避免计算出错 \n");
printf(" 3. 如果您是初次使用本系统请先选择选项2用于创建学生信息文件,录入 \n");
printf(" 信息时填写数据较多,并耐心仔细地录入学生信息 \n O(∩_∩)O谢谢合作!!\n");
printf("-------------------------------------------------------------------------------\n\n");
printf("\n<<<< 请输入班级的总人数: ");
scanf("%d",&m);
printf("\n<<<< 请输入课程总数: ");
scanf("%d",&n);
printf("\n<<<< 请输入要读取或录入信息的文件的名字: "); ///提示输入文件名
getchar();
gets(filename); ///接收输入
for(j;;j++)
{
char xuanze[]={};
printf("\n\n>>>>>>>>如果想进行清屏操作请输入yes,如果想跳过清屏直接继续请按任意键!<<<<<<<<\n");
getchar();
gets(xuanze);
if(strcmp(xuanze,"yes")==) system("CLS");
printf("\n * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *");
printf("\n * 欢迎进入学生成绩信息管理系统 *");
printf("\n * 一、读取文件 >>请按1 *");
printf("\n * 二、录入学生成绩信息 >>请按2 *");
printf("\n * 三、课程总成绩与平均分数据统计 >>请按3 *");
printf("\n * 四、学生个人总成绩与平均分统计 >>请按4 *");
printf("\n * 五、学生成绩降序排名 >>请按5 *");
printf("\n * 六、学生成绩升序排名 >>请按6 *");
printf("\n * 七、学生成绩按学号大小排序 >>请按7 *");
printf("\n * 八、姓名字典顺序排出成绩表 >>请按8 *");
printf("\n * 九、按学号查询学生排名及其考试成绩 >>请按9 *");
printf("\n * 十、按姓名查询学生排名及其考试成绩 >>请按10 *");
printf("\n * 十一、学生成绩各等级数据统计 >>请按11 Designd by:刘佳维 *");
printf("\n * 十二、学生信息输出到屏幕 >>请按12 刘成亮 *");
printf("\n * 十三、学生信息导出到文件 >>请按13 李乐 *");
printf("\n * 零 、退出系统 >>请按0 *");
printf("\n * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * \n");
printf("\n请从菜单中选择一项进行操作>>>>>>>>>>\n");
scanf("%d",&i);
if(i==)
break;
else
switch(i)
{
case : f1(m,n,filename); break;
case : f2(m,n,filename); break;
case : f3(m,n,filename); break;
case : f4(m,n,filename); break;
case : f5(m,n,filename); break;
case : f6(m,n,filename); break;
case : f7(m,n,filename); break;
case : f8(m,n,filename); break;
case : f9(m,n,filename); break;
case : f10(m,n,filename); break;
case : f11(m,n,filename); break;
case : f12(m,n,filename); break;
case : f13(m,n,filename); break;
default: break;
}
}
printf("\n\n=====谢谢使用本系统,祝您生活愉快!=====\n\n"); ///退出界面
return ;
}
int f1(int m,int n,char filename[L])
{
struct student card;
FILE *file;
if((file =fopen(filename,"rb"))!=NULL) ///打开 并判断
{
printf("=====文件打开成功!=====\n\n"); ///成功则提示成功
count=;
while((fread(&card,sizeof(student),,file))!=(int)NULL)
{
stu[i].num=card.num;
strcpy(stu[i].name,card.name);
for(j=;j<n;j++)
stu[i].ach[j]=card.ach[j];
stu[i].total=card.total;
count++;
}
if(count<m)
printf("=====已经录入学生信息的有%d人,还需录入%d人的信息=====\n",count,m-count);
else if(count==m)
printf("=====已经录入学生信息的有%d人,已经将所有成绩信息录入完毕=====\n",count);
else
{
printf("=====录入学生信息大于输入的学生总数,系统将自行关闭,请检查信息后再次进入!=====");
getchar();
exit();
}
fclose(file);
return count;
}
else
printf("=====文件打开失败!=====\n"); ///打开失败则提示打开失败
return ;
};
int f2(int m,int n,char filename[L])
{
struct student card;
FILE *file;
if((file =fopen(filename,"rb"))!=NULL) ///打开 并判断
{
count=;
while((fread(&card,LEN,,file))!=(int)NULL)
{
stu[i].num=card.num;
strcpy(stu[i].name,card.name);
for(j=;j<n;j++)
stu[i].ach[j]=card.ach[j];
stu[i].total=card.total;
count++;
}
if(count<m)
{
printf("=====已经录入学生信息的有%d人,还需录入%d人的信息=====\n",count,m-count);
printf("<<<< 注:录入信息时,如果想中途停止输入,以后再进行补录,请将学号输为-1,谢谢!\n");
}
else if(count==m)
printf("=====已经录入学生信息的有%d人,已经将所有成绩信息录入完毕=====\n",count);
else
{
printf("=====录入学生信息大于输入的学生总数,系统将自行关闭,请检查信息后再次进入!=====");
getchar();
exit();
}
}
fclose(file);
if((file=fopen(filename,"ab"))!=NULL)
{
for(count;count<m;count ++)
{
printf("<<<< 请输入该学生的学号:\n");
scanf("%d",&stu[count].num);
if(stu[count].num==-)
goto r2;
for(j=;j<count;j++)
{
if(stu[j].num==stu[count].num)
{
printf("=====学号输入重复,输入错误,请检查后再进行录入=====\n");
count --;
goto r2;
}
}
stu[count].total=;
printf("<<<< 请输入该学生的姓名:\n");
getchar();
gets(stu[count].name);
for(j=;j<=n;j++)
{
printf("<<<< 请输入该学生第%d门功课的成绩:",j);
scanf("%f",&stu[count].ach[j-]);
stu[count].total=stu[count].total+stu[count].ach[j-];
}
fwrite(&stu[count],LEN,,file);
}
}
printf("\n=====学生信息已成功录入二进制文件 %s 中,谢谢=====\n",filename);
fclose (file);
r2: return ;
};
int f3(int m,int n,char filename[L])
{
struct student card;
FILE *fp1;
float zf[N]={};
fp1=fopen(filename,"rb");
if(fp1==NULL)
{
printf("\n=====文件%s打开失败=====\n",filename);
goto r3;
}
while((fread(&card,LEN,,fp1))!=(int)NULL)
{
for(i=;i<n;i++)
{
zf[i]=zf[i]+card.ach[i];
}
}
printf("=====课程总成绩与平均分为=====\n");
for(i=;i<n;i++)
{
printf("<<<< 第%d门课程的总成绩为%.3f 平均分为%.3f\n",i+,zf[i],zf[i]/m);
}
fclose (fp1);
r3: return ;
};
int f4(int m,int n,char filename[L])
{
struct student card;
FILE *fp1;
float zf[M]={};
char nam[M][L]={};
fp1=fopen(filename,"rb");
if(fp1==NULL)
{
printf("\n=====文件%s打开失败=====\n",filename);
goto r4;
}
printf("=====学生个人总成绩与平均分为=====\n");
for(i=;(fread(&card,LEN,,fp1))!=(int)NULL;i++)
{
strcpy(nam[i],card.name);
zf[i]=card.total;
printf("<<<< %s的课程的总成绩为%.3f 平均分为%.3f\n",nam[i],zf[i],zf[i]/n);
}
fclose (fp1);
r4: return ;
}
int f5(int m,int n,char filename[L])
{
struct student card;
FILE *fp1;
fp1=fopen(filename,"rb");
if(fp1==NULL)
{
printf("\n=====文件%s打开失败=====\n",filename);
goto r5;
}
i=;
while((fread(&card,sizeof(student),,fp1))!=(int)NULL)
{
stu[i].num=card.num;
strcpy(stu[i].name,card.name);
for(j=;j<n;j++)
stu[i].ach[j]=card.ach[j];
stu[i].total=card.total;
i++;
}
for(k=;k<=i;k++)
{
for(j=k+;j<i;j++)
if(stu[k].total<stu[j].total)
{
card=stu[k];
stu[k]=stu[j];
stu[j]=card;
}
}
printf("=====成绩正序排名为=====\n");
for(j=;j<i;j++)
{
printf("<<<< 名次;%d 学号:%d 姓名:%s 总分:%.3f\n",j+,stu[j].num,stu[j].name,stu[j].total);
}
fclose (fp1);
r5: return ;
};
int f6(int m,int n,char filename[L])
{
struct student card;
FILE *fp1;
fp1=fopen(filename,"rb");
if(fp1==NULL)
{
printf("\n文件%s打开失败\n",filename);
goto r6;
}
i=;
while((fread(&card,sizeof(student),,fp1))!=(int)NULL)
{
stu[i].num=card.num;
strcpy(stu[i].name,card.name);
for(j=;j<n;j++)
stu[i].ach[j]=card.ach[j];
stu[i].total=card.total;
i++;
}
for(k=;k<=i;k++)
{
for(j=k+;j<i;j++)
if(stu[j].total<stu[k].total)
{
card=stu[k];
stu[k]=stu[j];
stu[j]=card;
}
}
printf("=====成绩倒序排名为=====\n");
for(j=;j<i;j++)
{
printf("<<<< 名次;%d 学号:%d 姓名:%s 总分:%.3f\n",m-j,stu[j].num,stu[j].name,stu[j].total);
}
fclose (fp1);
r6: return ;
};
int f7(int m,int n,char filename[L])
{
struct student card;
FILE *fp1;
fp1=fopen(filename,"rb");
if(fp1==NULL)
{
printf("\n=====文件%s打开失败=====\n",filename);
goto r7;
}
i=;
while((fread(&card,sizeof(student),,fp1))!=(int)NULL)
{
stu[i].num=card.num;
strcpy(stu[i].name,card.name);
for(j=;j<n;j++)
stu[i].ach[j]=card.ach[j];
stu[i].total=card.total;
i++;
}
for(k=;k<=i;k++)
{
for(j=k+;j<i;j++)
if(stu[j].num<stu[k].num)
{
card=stu[k];
stu[k]=stu[j];
stu[j]=card;
}
}
printf("=====成绩依靠学号顺序排名=====\n");
for(j=;j<i;j++)
{
printf("----------------------------------------------------\n");
printf("序号;%d 学号:%d 姓名:%s\n",j+,stu[j].num,stu[j].name);
for(k=;k<n;k++)
printf("第%d科:%.3f ",k+,stu[j].ach[k]);
printf("\n总分%.3f 平均分%.3f\n",stu[j].total,stu[j].total/n);
}
printf("----------------------------------------------------");
fclose(fp1);
r7: return ;
}; int f8(int m,int n,char filename[L])
{
struct student card;
FILE *fp1;
fp1=fopen(filename,"rb");
if(fp1==NULL)
{
printf("\n=====文件%s打开失败=====\n",filename);
goto r8;
}
i=;
while((fread(&card,sizeof(student),,fp1))!=(int)NULL)
{
stu[i].num=card.num;
strcpy(stu[i].name,card.name);
for(j=;j<n;j++)
stu[i].ach[j]=card.ach[j];
stu[i].total=card.total;
i++;
} ///将信息读入结构体
for(i=;i<m-;i++)
for(j=i+;j<m;j++)
if(strcmp(stu[i].name,stu[j].name)>)
{
card=stu[i];
stu[i]=stu[j];
stu[j]=card;
}
printf("=====按姓名的字典顺序排出成绩表=====");
for(k=;k<m;k++)
{ printf("----------------------------------------------------\n");
printf("序号;%d 学号:%d 姓名:%s\n",k+,stu[k].num,stu[k].name);
for(i=;i<n;i++)
printf("第%d科:%.3f ",i+,stu[k].ach[i]);
printf("\n总分%.3f 平均分%.3f\n",stu[k].total,stu[k].total/n);
}
printf("----------------------------------------------------");
fclose(fp1);
r8: return ;
};
int f9(int m,int n,char filename[L])
{
struct student *head,*p1,*p2;
int ChooseNum;
printf("=====请输入要查询信息的学生的学号:=====\n");
scanf("%d",&ChooseNum);
struct student card;
FILE *fp1;
fp1=fopen(filename,"rb");
if(fp1==NULL)
{
printf("\n=====文件%s打开失败=====\n",filename);
goto r9;
}
i=;
while((fread(&card,LEN,,fp1))!=(int)NULL)
{
stu[i].num=card.num;
strcpy(stu[i].name,card.name);
for(j=;j<n;j++)
stu[i].ach[j]=card.ach[j];
stu[i].total=card.total;
i++;
} ///读入到结构体数组
for(k=;k<=i;k++)
{
for(j=k+;j<i;j++)
if(stu[k].total<stu[j].total)
{
card=stu[k];
stu[k]=stu[j];
stu[j]=card;
}
} ///排名
head=&stu[];
p1=&stu[];
p2=NULL;
head->next=p1;
p1->next=p2; ///建立链表
if(head->num==ChooseNum)
{
{
printf("名次;%d 学号:%d 姓名:%s\n",i+,head->num,head->name);
for(k=;k<n;k++)
printf("第%d科:%.3f ",k+,head->ach[k]);
printf("\n总分%.3f 平均分%.3f\n",head->total,head->total/n);
goto r9;
}
}
else
for(i=;<m;i++)
{
p1=&stu[i];
p1->next=p2;
if(p1->num==ChooseNum)
{
printf("名次;%d 学号:%d 姓名:%s\n",i+,p1->num,p1->name);
for(k=;k<n;k++)
printf("第%d科:%.3f ",k+,p1->ach[k]);
printf("\n总分%.3f 平均分%.3f\n",p1->total,p1->total/n);
goto r9;
}
else {
printf("没有该学号!!!!!!");
goto r9;
}
}
r9: return ;
}
int f10(int m,int n,char filename[L])
{
char ChooseName[L];
printf("<<<< 请输入要查询的学生的姓名:\n");
getchar();
gets(ChooseName);
struct student card;
FILE *fp1;
fp1=fopen(filename,"rb");
if(fp1==NULL)
{
printf("\n=====文件%s打开失败=====\n",filename);
goto r10;
}
i=;
while((fread(&card,sizeof(student),,fp1))!=(int)NULL)
{
stu[i].num=card.num;
strcpy(stu[i].name,card.name);
for(j=;j<n;j++)
stu[i].ach[j]=card.ach[j];
stu[i].total=card.total;
i++;
}
for(k=;k<=i;k++)
{
for(j=k+;j<i;j++)
if(stu[k].total<stu[j].total)
{
card=stu[k];
stu[k]=stu[j];
stu[j]=card;
}
}
printf("=====按姓名查询学生排名及其考试成绩=====\n");
for(j=;j<i;j++)
{
if(strcmp(stu[j].name,ChooseName)==)
{
printf("----------------------------------------------------\n");
printf("名次;%d 学号:%d 姓名:%s\n",j+,stu[j].num,stu[j].name);
for(k=;k<n;k++)
printf("第%d科:%.3f ",k+,stu[j].ach[k]);
printf("\n总分%.3f 平均分%.3f\n",stu[j].total,stu[j].total/n);
}
}
printf("----------------------------------------------------");
fclose(fp1);
r10: return ;
};
int f11(int m,int n,char filename[L])
{
char output[L];
float a=,b=,c=,d=,e=;
struct student card;
FILE *fp1,*fp2;
fp1=fopen(filename,"rb");
printf("\n<<<< 请输入要输出到文件的名字:\n"); ///提示输入文件名
getchar();
gets(output); ///接收输入
fp2=fopen(output,"w");
if(fp1==NULL)
{
printf("\n=====文件%s打开失败=====\n",filename);
goto r11;
}
if(fp2==NULL)
{
printf("\n=====文件%s打开失败=====\n",output);
goto r11;
}
i=;
while((fread(&card,sizeof(student),,fp1))!=(int)NULL)
{
stu[i].num=card.num;
strcpy(stu[i].name,card.name);
for(j=;j<n;j++)
stu[i].ach[j]=card.ach[j];
stu[i].total=card.total;
i++;
}
fprintf(fp2,"=======================================各科目成绩分析=============================================\n总参考人数:%d\n考试科目数:%d\n",i,n);
fprintf(fp2," 科目 优秀(比例) 良好(比例) 中等(比例) 及格(比例) 不及格(比例)\n");
fprintf(fp2," <90-100> <80-89> <70-79> <60-69> <0-59>\n");
fprintf(fp2,"==================================================================================================\n");
for(k=;k<n;k++) ///课程
{
a=,b=,c=,d=,e=;
for(j=;j<m;j++) ///学生
{
if((stu[j].ach[k]<=)&&(stu[j].ach[k]>=))
a++;
else if((stu[j].ach[k]<=)&&(stu[j].ach[k]>=))
b++;
else if((stu[j].ach[k]<=)&&(stu[j].ach[k]>))
c++;
else if((stu[j].ach[k]<=)&&(stu[j].ach[k]>=))
d++;
else if((stu[j].ach[k]<=)&&(stu[j].ach[k]>=))
e++;
}
fprintf(fp2," 第%d科 %.0f人(%.3f%%) %.0f人(%.3f%%) %.0f人(%.3f%%) %.0f人(%.3f%%) %.0f人(%.3f%%)\n",k+,a,a/m*,b,b/m*,c,c/m*,d,d/m*,e,e/m*);
}
printf("=====已经将所有信息写入到文件%s中,请注意接收!=====\n",output);
r11: return ;
};
int f12(int m,int n,char filename[L])
{
struct student card;
FILE *fp1;
fp1=fopen(filename,"rb");
if(fp1==NULL)
{
printf("\n=====文件%s打开失败=====\n",filename);
goto r12;
}
i=;
while((fread(&card,sizeof(student),,fp1))!=(int)NULL)
{
stu[i].num=card.num;
strcpy(stu[i].name,card.name);
for(j=;j<n;j++)
stu[i].ach[j]=card.ach[j];
stu[i].total=card.total;
i++;
}
for(k=;k<=i;k++)
{
for(j=k+;j<i;j++)
if(stu[k].total<stu[j].total)
{
card=stu[k];
stu[k]=stu[j];
stu[j]=card;
}
}
printf("=====学生所有信息屏幕输出=====\n");
for(j=;j<i;j++)
{
printf("----------------------------------------------------\n");
printf("名次;%d 学号:%d 姓名:%s\n",j+,stu[j].num,stu[j].name);
for(k=;k<n;k++)
printf("第%d科:%.3f ",k+,stu[j].ach[k]);
printf("\n总分%.3f 平均分%.3f\n",stu[j].total,stu[j].total/n);
}
printf("----------------------------------------------------");
fclose(fp1);
r12: return ;
};
int f13(int m,int n,char filename[L])
{
char output[L]={};
struct student card;
FILE *fp1,*fp2;
fp1=fopen(filename,"rb");
printf("\n<<<< 请输入要输出到文件的名字:\n"); ///提示输入文件名
getchar();
gets(output); ///接收输入
fp2=fopen(output,"w");
if(fp1==NULL)
{
printf("\n=====文件%s打开失败=====\n",filename);
goto r13;
}
if(fp2==NULL)
{
printf("\n=====文件%s打开失败=====\n",output);
goto r13;
}
i=;
while((fread(&card,LEN,,fp1))!=(int)NULL)
{
stu[i].num=card.num;
strcpy(stu[i].name,card.name);
for(j=;j<n;j++)
stu[i].ach[j]=card.ach[j];
stu[i].total=card.total;
i++;
}
for(k=;k<=i;k++)
{
for(j=k+;j<i;j++)
if(stu[k].total<stu[j].total)
{
card=stu[k];
stu[k]=stu[j];
stu[j]=card;
}
}
printf("=====已经将所有信息写入到文件%s中,请注意接收!=====\n",output);
for(j=;j<i;j++)
{
fprintf(fp2,"----------------------------------------------------\n");
fprintf(fp2,"名次;%d 学号:%d 姓名:%s\n",j+,stu[j].num,stu[j].name);
for(k=;k<n;k++)
fprintf(fp2,"第%d科:%.3f ",k+,stu[j].ach[k]);
fprintf(fp2,"\n总分%.3f 平均分%.3f\n",stu[j].total,stu[j].total/n);
}
fprintf(fp2,"----------------------------------------------------");
fclose(fp1);
fclose(fp2);
r13: return ;
};

四、程序备注

这是笔者在大一刚学c的时候做的,虽然简单,但实现了所有上文的功能,今天不知咋的,突然翻了出来,心想不如写入博客,也算留个备份

笔者在vc6.0和codeblocks下均通过运行,进入系统的密码为LLL1996

本程序纯属原创,如有引用,请注明出处