大一的课程设计了,翻出来放上来供参考,也致曾经初学代码熬夜的我~
第一个功能(将文件中的数据存放到链表中,计算文件中的学生个数存放到a中)
第二个功能(键盘录入学生信息)
第三个功能(计算每门课程的总分和平均分)
第四个功能(计算每个学生的总分及平均分)
第五个功能(按每个学生的总分由高到低排出名次表)
第六个功能(按每个学生的总分由低到高排出名次表)
第七个功能(按学号由小到大排出成绩表)
第八个功能(按姓名的字典顺序排出成绩表)
第九个功能(按学号查询学生排名及其考试成绩)
第十个功能(按姓名查询学生排名及其考试成绩考虑学生重名)
第十一个功能(输出每一科目优秀、良好、中等、及格、不及格人数)
第十二个功能(输出每个学生的学号、姓名、各科考试成绩、总分和平均分)
第十三个功能(将每个学生的个人信息和成绩写入文件,可由键盘输入文件名)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int a,b; //定义全局变量记录学生数量与科目数量
enum tsex{male,female};
struct student{
char name[20];
enum tsex sex;
int num;
int score[6];
int sum;
float ave;
struct student *next;
};
struct student*creat(void); //创建一个链表并返回首地址
struct student*g1(void); //实现第一个功能(将文件中的数据存放到链表中,计算文件中的学生个数存放到a中)
struct student*g2(void); //实现第二个功能(键盘录入学生信息)
void g3(struct student *); //实现第三个功能(计算每门课程的总分和平均分)
struct student*g4(struct student *); //实现第四个功能(计算每个学生的总分及平均分)
struct student*g5(struct student *); //实现第五个功能(按每个学生的总分由高到低排出名次表)
struct student*g7(struct student *); //实现第六个功能(按每个学生的总分由低到高排出名次表)
struct student*g6(struct student *); //实现第七个功能(按学号由小到大排出成绩表)
struct student*g8(struct student *); //实现第八个功能(按姓名的字典顺序排出成绩表)
void g9(struct student *); //实现第九个功能(按学号查询学生排名及其考试成绩)
void g10(struct student *); //实现第十个功能(按姓名查询学生排名及其考试成绩考虑学生重名)
void g11(struct student *); //实现第十一个功能(输出每一科目优秀、良好、中等、及格、不及格人数)
void g12(struct student *); //实现第十二个功能(输出每个学生的学号、姓名、各科考试成绩、总分和平均分)
void g13(struct student *); //实现第十三个功能(将每个学生的个人信息和成绩写入文件,可由键盘输入文件名)
int main(){
int k,z;
struct student *head;
while(1){
printf("┌-------------------------------------------------------------- ┐\n");
printf("│ 欢迎使用学生成绩管理系统V3.0 │\n");
printf("│ │\n");
printf("│ ┏┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┓ │\n");
printf("│ ┇请输入您要选择的功能: ┇ │\n");
printf("│ ┇ 1.Read from a file ┇ │\n");
printf("│ ┇ 2.Append record manually ┇ │\n");
printf("│ ┇ 3.Calculate total and average score of every course ┇ │\n");
printf("│ ┇ 4.Calculate total and average score of every student ┇ │\n");
printf("│ ┇ 5.Sort in descending order by total score of every student ┇ │\n");
printf("│ ┇ 6.Sort in ascending order by total score of every stuednet ┇ │\n");
printf("│ ┇ 7.Sort in ascending order by number ┇ │\n");
printf("│ ┇ 8.Sort in dictionary order by name ┇ │\n");
printf("│ ┇ 9.Search by number ┇ │\n");
printf("│ ┇ 10.Search by name ┇ │\n");
printf("│ ┇ 11.Statistic analysis for every course ┇ │\n");
printf("│ ┇ 12.List record ┇ │\n");
printf("│ ┇ 13.Write to a file ┇ │\n");
printf("│ ┇ 0.Exit ┇ │\n");
printf("│ ┗┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┛ │\n");
printf("│ Made By:Gong │\n");
printf("│ Wan │\n");
printf("│ Tian │\n");
printf("│ │\n");
printf("│ │\n");
printf("└------------------------------------------------------------------┘\n");
printf("\n·请输入您要选择的功能:");
scanf("%d",&k);
while(k<0||k>13){
printf("\n·您输入的信息有误,请重新输入:");
fflush(stdin);
scanf("%d",&k);
}
switch(k){
case 1:{
head=g1();
break;
}
case 2:{
head=g2();
break;
}
case 3:{
g3(head);
break;
}
case 4:{
head=g4(head);
break;
}
case 5:{
head=g5(head);
break;
}
case 6:{
head=g6(head);
break;
}
case 7:{
head=g7(head);
break;
}
case 8:{
head=g8(head);
break;
}
case 9:{
g9(head);
break;
}
case 10:{
g10(head);
break;
}
case 11:{
g11(head);
break;
}
case 12:{
g12(head);
break;
}
case 13:{
g13(head);
break;
}
case 0:{
printf("\n\n感谢使用学生管理系统v3.0 ^.^ \n\n");
exit(0);
}
}
printf("您是否要退出系统(0.退出 1.不退出):");
scanf("%d",&z);
switch(z){
case 0:{
printf("\n\n感谢使用学生管理系统v3.0 ^.^ \n\n");
exit(0);
break;
}
case 1:{
break;
}
}
}
return 0;
}
struct student*creat(void){
int k;
struct student *head,*end,*p;
end=NULL;
for(k=1;k<=a;k++){
p=(struct student*)malloc(sizeof(struct student));
p->next=NULL;
if(end==NULL){
head=p;
end=p;
}
else{
end->next=p;
end=p;
}
end->next=NULL;
}
return head;
}
struct student*g1(void){
FILE *fp;
int i;
int x; //接受代表性别的数
char n,track[50];
struct student *top,*q;
a=1;
printf("\n\n·请输入您要选择的学生信息文件的路径与文件名:");
scanf("%s",track);
while((fp=fopen(track,"r"))==NULL){
printf("\n\n·文件打开失败,请重新输入您要选择的学生信息文件的路径与文件名:");
fflush(stdin);
scanf("%s",track);
}
while(!feof(fp)){ //判断文件中人数,同时将每个人信息保存到数组中。(feof)函数判断文件是否读完
n=fgetc(fp);
if(n=='\n')
a++;}
rewind(fp); //(rewind)函数将指针重新指向文件开头
top=creat(); //调用函数创建链表 ,并返回首地址
for(q=top;q!=NULL;q=q->next){
fscanf(fp,"%s",&(q->name));
fscanf(fp,"%d",&x);
switch(x){
case 1:q->sex=female;break;
case 2:q->sex=male;break;
}
fscanf(fp,"%d",&(q->num));
for(i=0;i<6;i++){
fscanf(fp,"%d",&(q->score[i]));
}
}
b=6;
fclose(fp);
printf("\n\n·您选择的文件中学生的数量为:%d\n",a);
return top;
}
struct student*g2(void){
int i,j,k;
struct student *top,*q;
i=1;
printf("\n\n·请输入您想要输入的学生个数:");
scanf("%d",&a);
printf("\n\n·请输入您想要输入的科目个数:");
scanf("%d",&b);
top=creat();
for(q=top;q!=NULL;q=q->next,i++){
printf("·请输入第%d个学生的姓名:",i);
scanf("%s",&(q->name));
printf("·请选择学生的性别(1.female 2.male):");
scanf("%d",&k);
switch(k){
case 1:q->sex=female;break;
case 2:q->sex=male;break;
}
printf("·请输入学生的学号:");
scanf("%d",&(q->num));
for(j=0;j<b;j++){
printf("·请输入学生第%d科的成绩",j+1);
scanf("%d",&(q->score[j]));
}
}
printf("·输入成功\n\n");
return top;
}
void g3(struct student *top){
struct student *q;
int sub[6]={0};
float ave2[6]={0};
int i;
for(q=top;q!=NULL;q=q->next)
{
for(i=0;i<b;i++)
sub[i]=sub[i]+(q->score[i]);
}
for(i=0;i<b;i++)
ave2[i]=sub[i]/(float)a;
printf("\n 总分 平均分\n");
for(i=0;i<b;i++)
printf("科目<%d> %d %.2f\n",i+1,sub[i],ave2[i]);
printf("·计算成功!\n");
}
struct student*g4(struct student *top){
struct student *q;
int i;
for(q=top;q!=NULL;q=q->next){
q->sum=0;
for(i=0;i<b;i++){
q->sum=(q->sum)+(q->score[i]);
}
q->ave=(q->sum)/(float)6;
}
printf("\n姓名 总分 平均分\n");
for(q=top;q!=NULL;q=q->next){
printf("%-15s ",q->name);
printf("%d %.2f\n",q->sum,q->ave);
}
printf("·计算成功!\n");
return top;
}
struct student*g5(struct student *top){ //第五个功能,按每个学生的总分由高到低排出名次表
struct student *p;
int i,j,k;
int zscore,max,maxzscore;
int check[30]={0}; //建立数组,记录是否被输出过
i=0; //初始化序号
printf("\n姓名 性别 学号 "); //建立表头
for(j=0;j<b;j++){
printf("科目<%d> ",j+1);
}
printf("总分 平均分 ");
for(k=1;k<=a;k++){
p=top; //调用链表
maxzscore=0; //初始化最大总分
i=0;
while(p!= NULL){
i++;
zscore=0; //初始化总分
for(j=0;j<b;j++){
zscore+=(p->score[j]); //计算单人总分
}
if( maxzscore<zscore&&check[i-1]==0){ //判断当前最高分与该学生总分大小关系及输出过与否
max=i; //将该学生序号赋予max
maxzscore=zscore; //将该学生总分赋予最高分
}
p=p->next;
}
p=top; //使p回到链表头
i=0;
printf("\n");
while(i!=max){
i++; //用序号控制循环,找到最大序号
if(i==max){
printf("%-15s",p->name);
switch(p->sex){
case male:printf("male ");break;
case female:printf("female ");break;
}
printf("%8d ",p->num);
for(j=0;j<b;j++){
printf("%d ",p->score[j]);
}
printf(" %3d ",p->sum);
printf(" %.2f",p->ave);
printf("\n");
check[i-1]=1; //使该学生成为已输出过的状态
}
else{
p=p->next; //录入下一个学生的数据
}
}
}
return top;
}
struct student*g6(struct student *top){ //第六个功能,按每个学生的总分由低到高排出名次表
struct student *p;
int i,j,k;
int zscore,min,minzscore;
int check[30]={0}; //建立数组,记录是否被输出过
i=0;
printf("\n姓名 性别 学号 ");
for(j=0;j<b;j++){
printf("科目<%d> ",j+1);
}
printf("总分 平均分 ");
printf("\n");
for(k=1;k<=a;k++){
p=top; //调用链表
minzscore=9999; //初始化最小总分
i=0;
while(p!= NULL){
i++;
zscore=0;
for(j=0;j<b;j++){ //计算单人总分
zscore+=(p->score[j]);
}
if( minzscore>zscore&&check[i-1]==0){ //判断当前最低分与该学生总分大小关系及输出过与否
min=i; //将该学生序号赋予max
minzscore=zscore; //将该学生总分赋予最低分
}
p=p->next;
}
p=top; //使p回到链表头
i=0;
while(i!=min){ //用序号控制循环,找到最小序号
i++;
if(i==min){
printf("%-15s",p->name);
switch(p->sex){
case male:printf("male ");break;
case female:printf("female ");break;
}
printf("%8d ",p->num);
for(j=0;j<b;j++){
printf("%d ",p->score[j]);
}
printf(" %3d ",p->sum);
printf(" %.2f",p->ave);
printf("\n");
check[i-1]=1; //使该学生成为已输出过的状态
}
else{
p=p->next;
}
}
}
return top;
}
struct student*g7(struct student *top){
struct student *p0,*p,*q,*k;
bool flag;
flag=true;
while(flag){
flag=false;
p0=top;
p=p0->next;
if((p0->num)>(p->num)){
p0->next=p->next;
p->next=p0;
top=p;
flag=true;
}
for(p0=top,p=p0->next,q=p->next;q->next!=NULL;p0=p0->next,p=p->next,q=q->next){
if((p->num)>(q->num)){
p0->next=q;
p->next=q->next;
q->next=p;
k=p;
p=q;
q=k;
flag=true;
}}
if((p->num)>(q->num)){
p0->next=q;
q->next=p;
p->next=NULL;
flag=true;
}
}
g12(top);
return top;
}
struct student*g8(struct student *top){
struct student *p0,*p,*q,*k;
bool flag;
flag=true;
while(flag){
flag=false;
p0=top;
p=p0->next;
if(strcmp(p0->name,p->name)>0){
p0->next=p->next;
p->next=p0;
top=p;
flag=true;
}
p0=top;
p=p0->next;
q=p->next;
while(q->next!=NULL){
if(strcmp(p->name,q->name)>0){
p0->next=q;
p->next=q->next;
q->next=p;
k=p;
p=q;
q=k;
flag=true;
}
p0=p0->next;
p=p->next;
q=q->next;
}
if(strcmp(p->name,q->name)>0){
p0->next=q;
q->next=p;
p->next=NULL;
flag=true;
}
}
g12(top);
return top;
}
void g9(struct student *top){
struct student *q;
int i,w=0,k=0,p=0,m=0,g=0,cc,j;
int max=0;
int zong[30]={0},check[30]={0};
j=0;
while(j!=1){
printf("·请输入学号:");
scanf("%d",&i);
for(q=top;q!=NULL;q=q->next){
if(q->num==i){
j=1;
}
}
printf("您输入的信息有误\n");
}
for(q=top;q!=NULL;q=q->next){
if(q->num==i){
for(cc=0;cc<b;cc++){
printf("第%d科成绩为:%d\n",cc+1,q->score[cc]);
w=q->score[cc]+w;}
}
}
for(q=top;q!=NULL;q=q->next){
for(i=0;i<b;i++){
zong[g]+=q->score[i];}
g++;
}
while(p!=1){
for(i=0;i<g;i++){
if(zong[i]>max&&check[i]==0){
max=zong[i];
m=i;}
}
check[m]=1;
k++;
if(max==w){
printf("·第%d名\n",k);
p=1;}
max=0;
}
}
void g10(struct student *top){
struct student *q;
char nam[20];
int i=0,w=0,k=0,check[30]={0},p=0,zong[30]={0},g=0,m,max,cc,j;
j=0;
while(j!=1){
printf("·请输入姓名");
scanf("%s",&nam);
for(q=top;q!=NULL;q=q->next){
if(strcmp(q->name,nam)==0){
j=1;
}
}
printf("您输入的信息有误\n");}
for(q=top;q!=NULL;q=q->next){
if(strcmp(q->name,nam)==0){
i++;}}
if(i>1){
g9(top);}
else{
for(q=top;q!=NULL;q=q->next){
if(strcmp(q->name,nam)==0){
for(cc=0;cc<b;cc++){
printf("第%d科成绩为%d\n",cc+1,q->score[cc]);
w=w+q->score[cc];}}}
for(q=top;q!=NULL;q=q->next){
for(i=0;i<b;i++){
zong[g]+=q->score[i];}
g++;}
while(p!=1){
for(i=0;i<g;i++){
if(zong[i]>max&&check[i]==0){
max=zong[i];
m=i;}}
check[m]=1;
k++;
if(max==w){
printf("·第%d名\n",k);
p=1;}
max=0;
}}}
void g11(struct student *top){
struct student *q;
int i,c[6][5]={0},k,j;
float d[6][5]={0};
char track[50];
FILE *fp;
for(i=0;i<b;i++){
for(q=top;q!=NULL;q=q->next){
k=(q->score[i])/10;
switch(k){
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:c[i][0]++;break;
case 6:c[i][1]++;break;
case 7:c[i][2]++;break;
case 8:c[i][3]++;break;
case 9:c[i][4]++;break;
}
}
}
for(i=0;i<b;i++){
for(j=0;j<5;j++){
d[i][j]=(c[i][j]/(float)a)*100;}}
printf("·请输入您想要创建的文件的路径与名称:");
scanf("%s",track);
while((fp=fopen(track,"w"))==NULL){
printf("\n\n·文件创建失败,请重新输入您要创建的学生信息文件的路径与名称:");
fflush(stdin);
scanf("%s",track);
}
for(i=0;i<b;i++){
fprintf(fp,"科目<%d>\n",i+1);
fprintf(fp,"·优秀: %d 人 %.2f%\n",c[i][4],d[i][4]);
fprintf(fp,"·良好: %d 人 %.2f%\n",c[i][3],d[i][3]);
fprintf(fp,"·中等: %d 人 %.2f%\n",c[i][2],d[i][2]);
fprintf(fp,"·及格: %d 人 %.2f%\n",c[i][1],d[i][1]);
fprintf(fp,"·不及格: %d 人 %.2f%\n",c[i][0],d[i][0]);
}
fclose(fp);
printf("·信息录入成功\n");
}
void g12(struct student *top){
struct student *p;
int i;
printf("┌————————┬—————┬——————┐\n");
printf("│ 姓名 │ 性别 │ 学号 │");
for(i=0;i<b;i++){
printf("科目<%d> ",i+1);
}
printf("\n");
for(p=top;p!=NULL;p=p->next){
printf("│%-15s │",p->name);
switch(p->sex){
case male:printf("male │");break;
case female:printf("female │");break;
}
printf(" %8d │",p->num);
for(i=0;i<b;i++){
printf("%3d ",p->score[i]);
}
printf("\n");
}
printf("└————————┴—————┴——————┘\n");
}
void g13(struct student *top){
FILE *fp;
struct student *p;
int i,j;
char track[50];
printf("\n·请输入您想要创建的文件的路径与名称:");
scanf("%s",track);
while((fp=fopen(track,"w"))==NULL){
printf("\n·文件创建失败,请重新输入您要创建的学生信息文件的路径与名称:");
fflush(stdin);
scanf("%s",track);
}
fprintf(fp,"\n姓名 性别 学号 ");
for(j=0;j<b;j++){
fprintf(fp,"科目<%d> ",j+1);
}
fprintf(fp,"总分 平均分 ");
fprintf(fp,"\n");
for(p=top;p!=NULL;p=p->next){
fprintf(fp,"%-15s",p->name);
switch(p->sex){
case male:fprintf(fp,"male ");break;
case female:fprintf(fp,"female ");break;
}
fprintf(fp," %d ",p->num);
for(i=0;i<b;i++){
fprintf(fp," %5d ",p->score[i]);
}
fprintf(fp," %3d ",p->sum);
fprintf(fp," %.2f",p->ave);
fprintf(fp,"\n");
}
fclose(fp);
printf("·信息录入成功\n");
}
时间确实久了,存放的文件找不到了,供参考,也可以根据代码倒退数据在文件中存放格式。