学生成绩管理系统C语言.docx
《学生成绩管理系统C语言.docx》由会员分享,可在线阅读,更多相关《学生成绩管理系统C语言.docx(35页珍藏版)》请在冰豆网上搜索。
学生成绩管理系统C语言
【学生成绩管理系统】
计算机程序编程课程设计实验报告
实验地点:
第一教学楼502室
实验平台:
WindowsXPMicrosoftVisualC++6.0
实验用时:
2013.8.27——2013.8.30
实验题目
学生成绩管理系统
一.实验目的
使用标准C或C++实现一般管理系统的基本功能。
进一步巩固C语言的学习,培养一定的综合编程能力。
二.实验设计要求
(一)需要处理的基础数据
学生基本信息包括:
Ø学号(如2010级14班6号写作20101406)
Ø姓
Ø名
Ø性别
Ø出生年月日
Ø课程对应的考试成绩(外语SCORE[0]、高数SCORE[1]、C语言SCORE[2]、马哲SCORE[3])
Ø平均成绩和总成绩
(二)系统功能
1.学生基本情况录入。
要求对输入的性别、出生年月日的合理性进行判断(如0代表“女”,1代表“男”,输入其他值非法,年龄不能为负,月份不能大于13等)。
2.允许对已经录入的数据进行显示。
3.允许进行数据的插入。
4.删除基本数据的相关信息。
5.基于姓名的查询。
如:
姓张的所有同学。
6.基于各种基本数据的统计计算。
如:
①统计每个学生各门功课的平均成绩,并按平均成绩从高到低的次序排名输出每个学生各门功课的综合成绩和平均成绩(名次、学号、姓名、平均成绩、各门功课的考试成绩)。
②列出90分及以上、80分及以上、70分及以上、60分及以上、不及格学生清单(学号、姓名、不及格的课程和成绩)。
③统计并输出各门功课的平均成绩和总平均成绩。
④按班级统计并输出总成绩(需对学号进行解析)。
(三)数据结构说明
typedefstructSt1
{charIDNumber[16];/*学号*/
charFamilyName[16];/*姓*/
charGivenName[16];/*名*/
intsex;/*性别(0代表“女”,1代表“男”)*/
intBirthYear;/*出生年*/
intBirthMonth;/*出生月*/
intBirthDay;/*出生日*/
floatscore[4];/*成绩*/
floatsum;/*总分*/
floataverage;/*平均分*/
structSt1*next;
}StudentNode;
(四)菜单的样板模式为:
1.Enterlist输入记录
2.Deletearecordfromlist从表中删除记录
3.Printlist显示链表中所有记录
4.Searchrecordonname按照姓名查找记录
5.Savethefile将链表中记录保存到文件中
6.Loadthefile从文件中读入记录
7.Computethescore计算所有学生的总分和平均分
8.Querybyclass按班级查询显示学生总分
9.Quit退出
(五)当前时间获取C代码
以下代码可以获取系统当前时间,用于判断年龄是否合理。
#include"time.h"
voidmain()
{structtm*ptm;
longts;
inty,m,d,h,n,s;
ts=time(NULL);
ptm=localtime(&ts);
y=ptm->tm_year+1900;/*年*/
m=ptm->tm_mon+1;/*月*/
d=ptm->tm_mday;/*日*/
h=ptm->tm_hour;/*时*/
n=ptm->tm_min;/*分*/
s=ptm->tm_sec;/*秒*/
}
三,系统构成
1.系统模块结构图
2.各模块的功能
1.学生基本信息的录入
选择菜单栏中的“1”项进入学生基本信息录入模块。
在该模块中可以多以录入例如学号,班级,分数等学生的基本信息,并且,可以对于输入的信息作出有效性的判断。
2.学生基本信息的显示
选择菜单栏的“3”项进入学生基本信息显示模块,在该模块中可以对于已经录入的信息进行显示。
3.学生基本信息的插入与删除
选择菜单栏的“1”项进入学生基本信息的插入模块,在此模块中可以对学生的信息进行插入。
选择菜单栏的“3”项进入学生基本信息删除模块,在此模块中可以对于学生的以输入学号的方式进行删除。
4.文件的保存和读取
选择菜单栏的“5”项进入文件的保存模块,在此模块中,可以吧录入的信息保存到文件中去。
选择菜单栏的“6”项进入文件的读取模块。
在此模块中,通过输入文件名的方式对于保存到文件中的学生信息进行读取。
5.学生基本信息的查询模块
选择菜单栏的第“4”项进入按姓名查找的模块,在此模块中,可以按照姓名查找此学生的相关信息。
选择菜单栏的第“8”项进入按班级查询显示学生总分的模块。
此模块中,学生可以通过输入班级号来查找自己的总分成绩
6.学生基本信息的统计模块
选择菜单栏的第”7“项进入计算所有学生总分,平均分模块。
选择菜单栏的第”9“项进入校成绩单模块。
在此模块中,学生可以查询到每科的总分,平均分以及各科在各段的分布情况等,也可以查到按照平均分自己在输入的数据中的排名。
3.数据结构设计以及用法说明
1.需处理的学生基本信息包括:
学号、学生姓名、出生年、月、日,各科成绩。
这些信息采用结构体数据类型表示更为方便,因为学生信息数量的不确定性,所以信息应采用链表进行存储,这更符合实际应用
所以采用的数据结构如下
typedefstructSt1
{
charIDNumber[16];/*学号*/
charFamilyName[16];/*姓*/
charGivenName[16];/*名*/
intsex;/*性别(0代表“女”,1代表“男”)*/
intBirthYear;/*出生年*/
intBirthMonth;/*出生月*/
intBirthDay;/*出生日*/
floatscore[4];/*成绩*/
floatsum;/*总分*/
floataverage;/*平均分*/
structSt1*next;
};StudentNode
(Struct是声明结构体类型时所必须使用的关键字,不能省略。
)该结构体包括IDNumber,Family,…sum,average等不同类型的数据项引用结构体变量名中成员的一般方式为:
结构体变量名.成员名
2.本程序用链表方法来处理对象。
对象之间连接起来的程序为:
p1=p1->next.数据交换的代码为:
p2=p1->next;
P1->next=p2->next;
P2->next=p1;
P1=p2;
3.同时此程序仍沿用很多车辆违章系统的框架,在程序中仍然使用了switch,for,if,do-while等结构。
已达到想要的目的。
4.为了实现学生系统的很多功能,此系统应用了函数的知识,在整个系统中存在很多函数嵌套的现象。
正是由于函数的存在,方便了我们很到位的完成了我们的系统。
4.程序结构(流程图)
四.心得体会
忙忙碌碌中,一周的实验课就这样接近了尾声。
用一句话评价这一周就是即累并快乐着。
本周,我们进行了计算机程序编程课程的设计。
老师上课时留了2个任务。
需要我们用一周的时间来完成。
第一个任务是做车辆违章系统。
这个系统做起来还算简单。
但,虽然简单,却也充分暴露了我c语言方面的瘸腿。
这么简单的任务,我用了周一周二2天才算编完,而且,基本上每晚我都得到1点到2点左右才能睡觉。
虽然,有点儿辛苦,但,我发现,我这2天的进步很快。
通过这2天熬夜的编程,为我第2个任务的顺利进行打下了坚实的基础。
2天的时间,我回忆起很多已经遗忘的知识,而且,学习如链表等的平时不怎么常用的新知识。
通过这2天的努力,我已经适应了程序语言,可以编一些稍大点儿的程序。
第二个任务是学生成绩管理系统。
学生成绩管理系统这个实验很复杂,需要把程序按功能分成各个模块,每个模块的功能是特定的,有的是输入记录数据,有的是对成绩排序。
在输入数据还要注意数据是否合法,长度是否符合规定等等。
在这次程序中,用链表会快捷一些,通过存储的地址找到数据,会提高运行速度。
同时还要注意各个模块之间的联系,数据的调用。
完成这个程序光是靠自己硬编硬想是一定不能完成的。
编这个程序,我查阅了很多的书籍,也看了很多相关的资料,同样,也参照了一些以前学长们完成的程序。
在这种自学的条件下我收获了很多的快乐。
虽然,很辛苦,但,有了坚实的地基,才能筑起坚固的大楼。
虽然,这其中我还是遇到了很多很多的的困难,但,完成后的幸福感是我坚持下去的理由。
终于,在周四晚2点,我完成了我的第2个任务。
感觉很满足,很有成就。
为期一周的实验结束啦,这一周我学到了很多知识,不仅是在编程方面,在自己学习方面,在锻炼自己意志品质方面,我自己都有很大的提升。
我相信这次的实验设计将是我人生中一笔宝贵的财富,是我老年时回忆的很美好很美好的回忆。
同样地,感谢老师一周以来悉心的教诲与陪伴。
五.实验结果
1.菜单栏
2.输入页
2.删除页
3.显示页
4.查询页
5.保存页
6.读取页
7.查询页
8.校成绩单页
9.退出页
五.程序清单
#include
#include
#include
#include
typedefstructST1
{
charIDNumber[10];/*学号*/
charClass[4];/*班级*/
charFamilyname[6];/*姓*/
charGivenName[6];/*名*/
charsex[3];/*性别(0代表"女",1代表"男")*/
charBirthYear[6];/*出生年*/
charBirthMonth[4];/*出生月*/
charBirthDay[4];/*出生日*/
floatscore[4];
floatsum;
floataverage;
structST1*next;
}StudentNode;
StudentNode*headLink;
voidLoad();
voidMenu();
voidHeadLink();
StudentNode*Malloc();
voidGetInformation(StudentNode*t);
voidOutputInformation();
voidDesplayOneNode(StudentNode*t);
voidInsert(StudentNode*t);
voidDelete();
voidFamily();
voidSave();
voidwy();
voidgs();
voidcyy();
voidmz();
voidClass();
voidmz90();
voidmz80();
voidmz70();
voidmz60();
voidmzfail();
voidgs90();
voidgs80();
voidgs70();
voidgs60();
voidgsfail();
voidwy90();
voidwy80();
voidwy70();
voidwy60();
voidwyfail();
voidcyy90();
voidcyy80();
voidcyy70();
voidcyy60();
voidcyyfail();
voidone();
voidcompute();
intchoose;
voidmain()
{HeadLink();
Menu();
}
voidMenu()
{StudentNode*p;
printf("\n");
printf("---欢迎您使用学生成绩管理系统---\n\n");
printf("--1--enterlist输入记录\n");
printf("--2--deletearecard从表中删除记录\n");
printf("--3--printlist显示链表中所有记录\n");
printf("--4--searchrecordonname按照姓名查找记录\n");
printf("--5--Savethefile将链表中记录保存到文件中\n");
printf("--6--Loadthefile从文件中读记录\n");
printf("--7--Computethescore计算所有学生的总分和均分\n");
printf("--8--Querybyclass按班级查询显示学生总分\n");
printf("--9--Schoolreport校成绩单\n");
printf("--10--quit退出\n\n");
scanf("%d",&choose);
printf("请输入您的选择");
switch(choose)
{case1:
p=Malloc();
GetInformation(p);
Insert(p);
break;
case2:
Delete();
break;
case3:
OutputInformation();
break;
case4:
Family();
break;
case5:
Save();
break;
case6:
Load();
break;
case7:
compute();
break;
case8:
Class();
break;
case9:
one();
wy();gs();cyy();mz();
mz90();mz80();mz70();mz60();mzfail();
gs90();gs80();gs70();gs60();gsfail();
wy90();wy80();wy70();wy60();wyfail();
cyy90();cyy80();cyy70();cyy60();cyyfail();
break;
case10:
free(headLink);
return;
break;
default:
break;
}
Menu();
}
voidHeadLink()
{
StudentNode*p;
p=(StudentNode*)malloc(sizeof(StudentNode));
headLink=p;
p->next=NULL;
}
StudentNode*Malloc()
{StudentNode*p;
inti;
p=(StudentNode*)malloc(sizeof(StudentNode));
if(p==NULL)
returnNULL;
for(i=0;i<10;i++)
p->IDNumber[i]='\0';
for(i=0;i<6;i++)
p->Familyname[i]='\0';
for(i=0;i<6;i++)
p->GivenName[i]='\0';
for(i=0;i<3;i++)
p->sex[i]='\0';
for(i=0;i<6;i++)
p->BirthYear[i]='\0';
for(i=0;i<4;i++)
p->BirthMonth[i]='\0';
for(i=0;i<4;i++)
p->BirthDay[i]='\0';
p->score[0]=0.0;p->score[1]=0.0;p->score[2]=0.0;
p->score[3]=0.0;
p->sum=0.0;
p->average=0.0;
p->next=NULL;
returnp;
}
voidGetInformation(StudentNode*t)
{
structtm*ptm;
longts;
inty,m,d;
ts=time(NULL);
ptm=localtime(&ts);
y=ptm->tm_year+1900;
m=ptm->tm_mon+1;
d=ptm->tm_mday;
printf("请输入学号:
\n");scanf("%s",t->IDNumber);
printf("请输入班级:
\n");scanf("%s",t->Class);
printf("请输入姓:
\n");scanf("%s",t->Familyname);
printf("请输入名:
\n");scanf("%s",t->GivenName);
printf("请输入性别:
\n");scanf("%s",t->sex);
printf("请输入出生年:
\n");scanf("%s",t->BirthYear);
printf("请输入出生月:
\n");scanf("%s",t->BirthMonth);
printf("请输入出生日:
\n");scanf("%s",t->BirthDay);
printf("请输入外语成绩:
\n");scanf("%f",&(t->score[0]));
printf("请输入高数成绩:
\n");scanf("%f",&(t->score[1]));
printf("请输入C语言成绩:
\n");scanf("%f",&(t->score[2]));
printf("请输入马哲成绩:
\n");scanf("%f",&(t->score[3]));
}
voidInsert(StudentNode*t)
{StudentNode*p;
p=headLink;
while(p->next)
{p=p->next;
}
p->next=t;
}
voidLoad()
{FILE*fp;
StudentNode*p;
fp=fopen("StudentNode.txt","r");
if(!
fp)
{printf("文件不存在\n");
return;
}charfileo[10];
printf("nameofStudentNode'txt:
\n");
scanf("%s",fileo);
p=Malloc();
while(fscanf(fp,"%s%s%s%s%s%s%s%f%f%f%f%f%f",p->IDNumber,p->Familyname,p->GivenName,p->sex,p->BirthYear,p->BirthMonth,p->BirthDay,&(p->score[0]),&(p->score[1]),&(p->score[2]),&(p->score[3]),p->sum,p->average)>0);
{Insert(p);
p=Malloc();
}
fclose(fp);
}
voidSave()
{
StudentNode*p;
FILE*fp;
charfilee[10];
printf("nameofStudentNode'txt:
\n");
scanf("%s",filee);
p=headLink->next;
if(p==NULL)
{
printf("无文件,请先输入学生信息\n\n");
return;
}
fp=fopen("StudentNode.txt","w+");
if(!
fp)
{
printf("文件不存在\n");
return;
}
while(p)
{fprintf(fp,"%s%s%s%s%s%s%s%f%f%f%f%f%f\n",p->IDNumber,p->Familyname,p->GivenName,p->sex,p->BirthYear,p->BirthMonth,p->BirthDay,p->score[0],p->score[1],p->score[2],p->score[3],p->sum,p->average);
p=p->next;
}
fclose(fp);
}
voidFamily()
{StudentNode*p;
charfn[6];
charflag=0;
p=headLink->next;
printf("请输入姓:
\n");
scanf("%s",fn);
while(p)
{if(strcmp(p->Familyname,fn)==0)
{DesplayOneNode(p);
flag=1;
break;
}
p=p->next;
}
if(!
flag)
printf("对不起,不存在姓为%s的学生\n",fn);
}
voidDesplayOneNode(StudentNode*t)
{printf("%s\t",t->IDNumber);printf("%s\t",t->Familyname);
printf("%s\t",t->GivenName);printf("%s\t",t->sex);
printf("%s\t",t->BirthYear);printf("%s\t",t->BirthMonth);
printf("%s\t",t->BirthDay);printf("%.0f\t",t->score[0]);
printf("%.0f\t",t->score[1]);printf("%.0f\t",t->score[2]);
printf("%.0f\t",t->score[3]);
t->sum=t->score[0]+t->score[1]+t->score[2]+t->score[3];
printf("%.0f\t",t->sum);
t->average=(t->sum)/4;
printf("%.0f\t\n",t->average);
}
voidDelete()
{chargo[8];
StudentNode*p,*q;
charhave=0;
printf("请输入要删除的学