c语言学生成绩管理系统Word文件下载.docx
《c语言学生成绩管理系统Word文件下载.docx》由会员分享,可在线阅读,更多相关《c语言学生成绩管理系统Word文件下载.docx(19页珍藏版)》请在冰豆网上搜索。
经过一周的编程实习,并在后一段的报告总结,我对C语言这门科有新的认识,本人实在是获益不浅!
要想编写一个准确、高效并有使用价值的程序,一定先要对课本知识熟悉,还要掌握必要的上机操作能力,写程序其实很容易而关键在于调试程序。
这次设计,让我重新掌握了C语言,而且还得到了用C语言解决实际问题的宝贵经验。
三、源程序清单
#include〈stdio。
h〉
#include<
conio.h>
#include<
malloc。
h>
#include〈string。
typedefstructSTUDENT
{
charstudentNumber[10];
/*学生学号*/
charstudentName[20];
/*学生姓名*/
charclassName[20];
/*班级名称*/
charyearName[20];
/*学期名称*/
floatmark1;
/*第1门成绩*/
floatmark2;
/*第2门成绩*/
floatmark3;
/*第3门成绩*/
structSTUDENT*next;
}STUDENT;
STUDENT*headLink;
/*链表表头指针*/
/*以下是函数声明*/
voidReadInfoFormFile(void);
voidDesplayMenu(void);
voidCreateHeadLink(void);
STUDENT*MallocNode(void);
voidGetInformation(STUDENT*t);
voidOutputInformation(void);
voidDesplayInfoBystudentName(void);
voidDesplayOneNode(STUDENT*t);
voidInsertOneNode(STUDENT*t);
voidDeleteNodeBystudentNumber(void);
voidChangeMarkByName(void);
voidChangeMarkByNumber(void);
voidSaveLinkToFile(void);
voidDesplayMarkSegment(void);
voidCompositorByTotalMark(void);
intchoose;
/*用于接受用户的选择*/
/*主函数*/
voidmain()
CreateHeadLink();
ReadInfoFormFile();
DesplayMenu();
}
/************************************
函数功能:
从文件中读学生信息到链表中
************************************/
voidReadInfoFormFile(void)
{
FILE*fp;
STUDENT*p;
fp=fopen("
student。
txt”,”r”);
if(!
fp)
printf(”文件不存在\n"
);
return;
p=MallocNode();
while(fscanf(fp,"
%s%s%s%f%f%f"
p-〉studentNumber,p->
studentName,p->
className,&(p—〉mark1),&
(p—>
mark2),&(p—〉mark3))〉0)
InsertOneNode(p);
}
fclose(fp);
/************************************
显示菜单,根据用户的输入
完成相应的功能
************************************/
voidDesplayMenu(void)
STUDENT*p;
printf("
——-———-请选择相应功能—-—-————-—-—\n\n”);
printf(”|1按班级输出学生成绩单|\n”);
|2按姓名查询|\n"
|3增加学生|\n"
|4删除学生|\n"
);
printf(”|5按班级修改学生成绩|\n”);
printf(”|6按学期修改学生成绩|\n"
printf(”|7保存所有学生信息|\n”);
|8显示不及格学生成绩|\n"
printf(”|9按平均成绩排序并输出绩|\n”);
|10退出|\n\n”);
scanf("
%d"
,&choose);
/*取得用户的选择*/
switch(choose)
case1:
OutputInformation();
/*显示所有学生的信息*/
break;
case2:
DesplayInfoBystudentName();
case3:
/*先申请一个新结点*/
GetInformation(p);
/*要求用户输入信息到新结点中*/
/*将新结点加到链表中*/
case4:
DeleteNodeBystudentNumber();
/*根据用户输入的学号删除该学生*/
case5:
ChangeMarkByName();
/*根据用户输入的姓名修改学生成绩*/
case6:
ChangeMarkByNumber();
/*根据用户输入的学号修改学生成绩*/
case7:
SaveLinkToFile();
/*保存数据*/
break;
case8:
DesplayMarkSegment();
/*显示不及格的学生成绩*/
case9:
CompositorByTotalMark();
/*按平均成绩排序*/
case10:
SaveLinkToFile();
/*保存数据后再退出*/
free(headLink);
exit
(1);
default:
/*递归调用*/
/************************************
函数功能:
建立链表表头
************************************/
voidCreateHeadLink(void)
STUDENT*p;
p=(STUDENT*)malloc(sizeof(STUDENT));
headLink=p;
p-〉next=NULL;
/************************************
申请一个新结点,并将其初始化
************************************/
STUDENT*MallocNode(void)
inti;
p=(STUDENT*)malloc(sizeof(STUDENT));
if(p==NULL)
returnNULL;
for(i=0;
i〈10;
i++)
p->
studentNumber[i]='
\0’;
i<
20;
p—〉studentName[i]=’\0’;
i〈20;
p-〉className[i]='
\0'
;
p—>
mark1=0。
0;
p-〉mark2=0.0;
p—〉mark3=0。
next=NULL;
returnp;
/************************************
取得用户输入的学生信息
************************************/
voidGetInformation(STUDENT*t)
请输入学生学号:
\n"
%s”,t->
studentNumber);
printf(”请输入学生姓名:
\n”);
%s”,t->
studentName);
printf(”请输入该生所在班级:
scanf(”%s”,t—〉className);
请输入第1门成绩:
%f”,&(t—〉mark1));
printf(”请输入第2门成绩:
%f”,&(t-〉mark2));
printf(”请输入第3门成绩:
%f”,&
(t-〉mark3));
/************************************
在链表的结尾处增加一个结点
************************************/
voidInsertOneNode(STUDENT*t)
p=headLink;
while(p—〉next)
p=p—〉next;
next=t;
/************************************
根据用户输入的学生姓名显示该学生的信息
************************************/
voidDesplayInfoBystudentName(void)
charstudentName[20];
charflag=0;
p=headLink—>
next;
请输入学生姓名:
scanf(”%s"
,studentName);
while(p)
if(strcmp(p—〉studentName,studentName)==0)
printf(”学号\t姓名\t班级\t成绩1\t成绩1\t成绩3\t总成绩\t平均成绩\n\n”);
DesplayOneNode(p);
flag=1;
p=p-〉next;
if(!
flag)
对不起,不存在姓名为%s的学生\n”,studentName);
/************************************
输出一个结点的信息
************************************/
voidDesplayOneNode(STUDENT*t)
%s\t"
,t->
printf(”%s\t”,t-〉studentName);
printf(”%s\t”,t—〉className);
printf(”%。
2f\t"
t->
mark1);
printf(”%.2f\t”,t—>
mark2);
%.2f\t"
t—〉mark3);
%。
2f\t”,t->
mark1+t-〉mark2+t—〉mark3);
%.2f\t\n"
(t->
mark1+t-〉mark2+t—〉mark3)/3);
/************************************
根据用户输入的学号删除该学生
************************************/
voidDeleteNodeBystudentNumber(void)
charstudentNumber[10];
STUDENT*p,*q;
charflag=0;
请输入要删除的学生学号:
"
,studentNumber);
q=headLink—>
next;
while(q)
if(strcmp(q->
studentNumber,studentNumber)==0)
p-〉next=q-〉next;
free(q);
flag=1;
break;
p=p->
q=q—〉next;
if(!
printf(”不存在该学号的学生\n”);
成功删除\n"
/************************************
显示所有学生的信息
************************************/
voidOutputInformation(void)
p=headLink-〉next;
现在没有学生信息,请先输入学生信息\n\n”);
printf(”学号\t姓名\t班级\t成绩1\t成绩1\t成绩3\t总成绩\t平均成绩\n\n"
DesplayOneNode(p);
p=p—〉next;
/************************************
根据输入的班级修改成绩
************************************/
voidChangeMarkByName(void)
inta;
charstudentName[20];
floatmark1,mark2,mark3;
p=headLink—〉next;
printf(”请输入学生班级:
scanf(”%d"
,&
a);
请输入学生姓名:
%s”,studentName);
if(strcmp(p—>
studentName,studentName)==0)
printf(”请输入新的第1门成绩:
%f”,&mark1);
printf(”请输入新的第2门成绩:
scanf(”%f”,&
请输入新的第3门成绩:
%f"
,&mark3);
p-〉mark1=mark1;
p-〉mark2=mark2;
mark3=mark3;
flag=1;
修改成功\n"
p=p-〉next;
printf(”对不起,不存在班级为%s的学生\n"
studentName);
/************************************
根据输入的学期修改成绩
************************************/
voidChangeMarkByNumber(void)
intb;
charstudentNumber[20];
printf(”请输入学生所在学期:
\n”);
scanf(”%d"
&b);
printf(”请输入学生学号:
if(strcmp(p->
printf(”请输入新的第1门成绩:
scanf(”%f”,&
mark1);
printf(”请输入新的第2门成绩:
scanf(”%f"
,&mark2);
printf(”请输入新的第3门成绩:
%f"
p—〉mark1=mark1;
p—〉mark2=mark2;
p-〉mark3=mark3;
printf(”修改成功\n”);
p=p->
printf(”对不起,不存在学期为%s的学生\n”,studentNumber);
/************************************
保存链表数据到文件中
************************************/
voidSaveLinkToFile(void)
STUDENT*p;
printf(”现在没有学生信息,请先输入学生信息\n\n"
return;
fp=fopen(”student.txt"
”w+”);
fprintf(fp,"
%s%s%s%f%f%f\n"
p—>
studentNumber,p—〉studentName,p—>
className,p—〉mark1,p-〉mark2,p-〉mark3);
p=p—>
fclose(fp);
/************************************
不及格学生成绩
************************************/
voidDesplayMarkSegment(void)
intcount=0;
printf(”60分以下(不及格)的学生成绩如下:
学号\t姓名\t班级\t成绩1\t成绩1\t成绩3\t总成绩\t平均成绩\n\n”);
if((6>
((int)(p-〉mark1/10)))||(6>
((int)(p-〉mark2/10)))||(6〉((int)(p->
mark3/10))))/*只要有一科不及格就认为该生不及格*/
count++;
不及格的学生一共有%d人\n”,count);
/************************************
按平均成绩排序
************************************/
voidCompositorByTotalMark(void)
STUDENTexchange,*r,*p,*q;
r=headLink-〉next;
if(r==NULL)
printf(”现在还没学生信息,请先输入学生信息\n”);
while(r)/*两层while循环实现排序*/
p=r;
q=r-〉next;
if((q->
mark1+q—〉mark2+q->
mark3)>
mark1+p-〉mark2+p->
mark3))
strcpy(exchange。
studentNumber,q-〉studentNumber);
/*先复制q结点信息到exchange*/
studentName,q-〉studentName);
strcpy(exchange.className,q->
className);
exchange.mark1=q—〉mark1;
exchange。
mark2=q-〉mark2;
mark3=q->
mark3;
strcpy(q—>
studentNumber,p—>
studentNumber);
/*再复制p结点信息到q*/
strcpy(q->
studentName,p—〉studentName);
strcpy(q—〉className,p-〉className);
q—〉mark1=p—〉mark1;
q-〉mark2=p-〉mark3;
q->
mark3=p->
strcpy(p->
studentNumber,exchange。
/*最后复制exchange结点信息到p*/
strcpy(p—>
studentName,exchange.studentName);
strcpy(p—〉className,exchange.className);
mark1=exchange。
mark1;
mark2=exchange。
mark2;
p-〉mark3=exchange。
q=q—〉next;
r=r—〉next;