班级成绩管理系统.docx
《班级成绩管理系统.docx》由会员分享,可在线阅读,更多相关《班级成绩管理系统.docx(21页珍藏版)》请在冰豆网上搜索。
班级成绩管理系统
轻工大学
数计学院
C语言课程设计报告
班级:
计算机类1307班
学号:
1305110009
姓名:
韩晶
指导教师:
贾瑜
日期:
2014年6月18日
一、实验目的
1.在编辑应用程序过程中,逐步加深对C语言编程的理解;
2.加强实践的能力,动手能力,同时进一步对所学的知识进行巩固;
3.培养初步编程的能力,为以后的学习奠定基础。
二、实验容
运用所学的C语言知识编辑应用程序:
班级成绩管理系统以及运动的时钟
三.系统软件环境:
本程序主要运行在:
VisualC++6.0
TurboC/C++3.0
四.课程设计题目:
1.必做题:
班级成绩管理系统
对一个有N个学生的班级,每个学生有M门课程。
该系统实现对班级成绩的录入、显示、修改、排序、保存、查询等操作的管理。
功能要求:
(1)本系统采用一个结构体数组,每个数据的结构应当包括:
学号、姓名、M门课程名称。
(2)本系统显示这样的菜单:
请选择系统功能项:
a、成绩录入
b、成绩显示
c、成绩保存
d、成绩排序
e、成绩修改(要求先输入密码)
f、成绩统计
1)显示每门课程成绩最高的学生的基本信息。
2)显示每门课程的平均成绩,柱状图显示。
3)显示超过某门课程平均成绩的学生人数。
4)显示某门课程每个分数段区间的人数,用饼状图显示。
g、退出系统
(3)执行一个具体的功能之后,程序将重新显示菜单。
(4)将学生成绩保存到文件中。
五.数据结构设计描述:
(一)班级成绩管理系统
主函数
↓
菜单函数
↓
添加显示查找修改删除排序存档读档退出
六.源程序
(一)班级成绩管理系统
#include
#include
#include
#include
#include
#define_COURSES3//定义科目数
#define_LENsizeof(student)//定义结构体大小
//枚举返回值情况
enumstatus
{
OVERFLOW=-1,//存(溢出)问题
DONE=0,//成功
NOFOUND=1,//不存在
OPENFAIL=2,//打开(文件)失败
BACK=3//返回
};
//end
//定义学生信息结构体
typedefstructStudentInfo
{
//数据域
unsignedintnum;//学号
charname[11];//姓名
floatscores[_COURSES];//各科成绩
//指针域
structStudentInfo*next;//存放下一节点的地址
}student;
//end
student*head=NULL;//声明链表头结点
student*curr=NULL;//声明指向当前节点的指针
inttotal=0;//声明当前节点个数
intinit();//初始化链表
intadd_stu();//添加新节点
intshow_all();//显示所有学生信息
intfind_stu();//查找指定信息节点
intmodify_stu();//修改指定信息节点
intremove_stu();//删除指定信息节点
intsort_list();//对链表排序
intsave_to_file();//将所有信息保存至文件
intread_from_file();//从文件中读取信息
intpicture();//画分布图
intquit();//释放所有节点空间
intentering(student*input);//录入学生信息
voidmenu();
voidshow_stu(student*show,intserial);//显示指定学生信息
voidstart();//程序开始界面
voidchange(student*former,student*latter,student*temp);//交换两个节点的数据域
voidmain(){
inth,flag1,flag2;
charname[20]="hyw",password[10]="hyw";
charperson[20],password1[10];
printf("\t\t********欢迎进入学生成绩管理系统!
********\n\n");
printf("\t\t\t用户登录\n\n");
for(h=0;h!
=5;)
{
printf("\t\t\t\t用户名:
");
gets(person);
flag1=strcmp(person,name);
printf("\t\t\t\t密码:
");
gets(password1);
flag2=strcmp(password,password1);
if(flag1==0&&flag2==0)
{
printf("\t\t\t\t登陆成功!
\n\n");
menu();
break;
}
else
{
printf("\t\t\t用户名或密码错误!
\n\n");
printf("\t\t\t请注意:
您还剩%d次机会!
\n\n",4-h);
h++;
}
}
if(h=5)
printf("对不起,您输入的用户名或密码有误,已被强制退出。
\n");
}
voidmenu()
{
intchoice=0;
init();
while
(1){system("cls");//清屏
start();
printf("请选择:
");
scanf("%d",&choice);
fflush(stdin);//清空缓冲区
switch(choice){
case1:
add_stu();break;
case2:
show_all();break;
case3:
find_stu();break;
case4:
modify_stu();break;
case5:
remove_stu();break;
case6:
sort_list();break;
case7:
save_to_file();break;
case8:
read_from_file();break;
case9:
picture();break;
case0:
quit();exit(0);break;
default:
break;
}
system("pause");//暂停批文件的处理并显示消息
}
}
intinit(){
head=(student*)malloc(_LEN);//为头结点申请空间
if(!
head)
{//如果申请空间失败,返回
returnOVERFLOW;
}
head->next=NULL;//指向下一节点(空)
curr=head->next;//当前节点指针指向第一个结点
total=0;//当前节点个数初始化为0(头结点不计算在)
returnDONE;
}
/*功能:
头插法添加新节点,并刷新学生人数*/
intadd_stu(){
student*add=(student*)malloc(_LEN);
curr=head->next;//当前节点指针指向第一个节点
printf("\t====当前已存入%d个同学\n",total);
printf("请输入第%d个学生的信息\n",total+1);
if(BACK==entering(add)){
free(add);
returnBACK;
}
head->next=add;//头结点指针域指向新建的节点
add->next=curr;//新建节点指针域指向第一个节点
curr=add;//当前节点指向新建的节点
total+=1;//更新学生总人数
returnDONE;
}
/*功能:
显示所有学生信息*/
intshow_all(){
if(0==total){
printf("\t====没有可供显示的学生信息!
\n");
returnNOFOUND;
}
curr=head->next;//当前节点指针指向第一个节点
printf("\t%4s%12s%12s","序号","学号","姓名");
for(intm=0;m<_COURSES;m++){
printf("%7s","科目");
}
printf("\n");
printf("\t-------------------------------------------------------------\n");
for(inti=1;i<=total;i++){
show_stu(curr,i);
curr=curr->next;//当前节点指针后移
}
printf("\t-------------------------------------------------------------\n");
returnDONE;
}
/*功能:
查找指定学生信息*/
intfind_stu(){
charstu_name[11];
intflag=1;
printf("请输入要查找的学生姓名:
");
scanf("%s",stu_name);
curr=head->next;//指向第一个节点
while(curr!
=NULL){
if(strcmp(stu_name,curr->name)==0){
printf("\t%4s%12s%12s","序号","学号","姓名");
for(intm=0;m<_COURSES;m++){
printf("%7s","科目");
}
printf("\n");
printf("\t-------------------------------------------------------------\n");
show_stu(curr,flag);
returnDONE;
}
curr=curr->next;
++flag;
}
printf("\t====没有找到%s!
请仔细核对姓名再查找\n",stu_name);
returnNOFOUND;
}
/*功能:
修改指定学生的所有信息*/
intmodify_stu(){
charstu_name[11];
intflag=1;
curr=head->next;//指向第一个节点
printf("请输入要修改的学生的姓名:
");
scanf("%s",stu_name);
while(curr!
=NULL){
if(strcmp(stu_name,curr->name)==0){
printf("\t%4s%12s%12s","序号","学号","姓名");
for(intm=0;m<_COURSES;m++){
printf("%7s","科目");
}
printf("\n");
printf("\t-------------------------------------------------------------\n");
show_stu(curr,flag);
entering(curr);
printf("\t====成功修改了%s的所有信息!
\n",stu_name);
returnDONE;
}
curr=curr->next;
++flag;
}
printf("\t====没有找到%s!
请仔细核对姓名\n",stu_name);
returnNOFOUND;
}
/*功能:
删除指定学生*/
intremove_stu(){
student*pre=head;
charstu_name[11];
curr=head->next;//指向第一个节点
printf("请输入要删除的学生的姓名:
");
scanf("%s",stu_name);
while(curr!
=NULL){
if(strcmp(stu_name,curr->name)==0)
{
pre->next=curr->next;
free(curr);
--total;
printf("\t====已成功删除\"%s\"\n",stu_name);
returnDONE;
}
pre=pre->next;
curr=curr->next;
}
printf("\t====没有找到%s!
请仔细核对姓名\n",stu_name);
returnNOFOUND;
}
/*功能:
对所有学生排序*/
intsort_list(){
student*temp=(student*)malloc(_LEN);
student*curr_i=head->next;
student*curr_j=NULL;
charchoice='0';
printf("\t\t1----按学号排序.\t2----按姓名排序.\n");
printf("\t\t3----按科目排序.\t0----退出排序.\n");
printf("请选择:
");
scanf("%c",&choice);
fflush(stdin);
switch(choice){
case'1':
{
while(curr_i->next!
=NULL){
curr_j=curr_i->next;
while(curr_j!
=NULL){
if(curr_i->num>curr_j->num){
change(curr_i,curr_j,temp);
}
curr_j=curr_j->next;
}
curr_i=curr_i->next;
}
printf("\t====排序成功!
\n");
break;
}
case'2':
{
while(curr_i->next!
=NULL){
curr_j=curr_i->next;
while(curr_j!
=NULL){
if(strcmp(curr_i->name,curr_j->name)>0){
change(curr_i,curr_j,temp);
}
curr_j=curr_j->next;
}
curr_i=curr_i->next;
}
printf("\t====排序成功!
\n");
break;
}
case'3':
{
while(curr_i->next!
=NULL){
curr_j=curr_i->next;
while(curr_j!
=NULL){
if(curr_i->scores[0]scores[0]){
change(curr_i,curr_j,temp);
}
curr_j=curr_j->next;
}
curr_i=curr_i->next;
}
printf("\t====排序成功!
\n");
break;
}
case'0':
{
free(temp);
returnBACK;
}
default:
{
printf("\t====输入有误!
\n");break;
}
}
free(temp);
returnDONE;
}
/*功能:
保存数据到文件*/
intsave_to_file(){
curr=head->next;
if(total==0){
printf("\t====目前还没有任何信息,不用保存!
\n");
returnBACK;
}
FILE*fp;
if((fp=fopen("record.dat","wb"))==NULL){
printf("\t====文件打开失败!
\n");
returnOPENFAIL;
}
while(curr!
=NULL){
//将数据成块写入文件
fwrite((char*)curr,_LEN,1,fp);
curr=curr->next;
}
fclose(fp);
printf("\t====信息已成功保存至文件\"record.dat\"文件中\n");
returnDONE;
}
/*功能:
从文件中读取数据*/
intread_from_file()
{
charjudge='y';
FILE*fp;
if((fp=fopen("record.dat","r"))==NULL){
printf("文件不存在或者打开失败!
\n");
returnOPENFAIL;
}
printf("\t====读取文件会覆盖当前信息!
是否确定载入文件?
(y/n):
");
scanf("%c",&judge);
if(judge=='n'||judge=='N'){
returnBACK;
}
quit();//释放以前所有信息的空间
init();//重新初始化链表
curr=head;//当前节点指针指向头结点
student*add=(student*)malloc(_LEN);//申请空间存放读取的信息
while(fread((char*)add,_LEN,1,fp)){//由于存储的信息是最新的信息在前,所以读取的时候将其添加在链表尾
add->next=curr->next;
curr->next=add;
curr=add;
add=(student*)malloc(_LEN);
++total;
}
fclose(fp);
printf("\t====文件载入成功!
当前已有%d个学生。
\n",total);
returnDONE;
}
/*功能:
释放存*/
intquit(){
curr=head->next;
student*temp=curr;
while(curr!
=NULL){
temp=curr->next;
free(curr);
curr=temp;
}
curr=NULL;
temp=NULL;
free(head);//释放头节点
returnDONE;
}
/*功能:
录入一个学生的全部信息*/
intentering(student*input){
printf("\n请输入学生的学号(输入0退出添加):
");
scanf("%d",&input->num);
if(0==input->num){
returnBACK;
}
printf("请输入学生的姓名(五个汉字以):
");
scanf("%s",&input->name);
printf("请输入%d门科目的成绩(用空格隔开):
",_COURSES);
for(inti=0;i<_COURSES;i++){
scanf("%f",&input->scores[i]);
}
returnDONE;
}
/*功能:
显示指定学生的所有信息*/
voidshow_stu(student*show,intserial){
printf("\t%4d%12d%12s",serial,show->num,show->name);
for(inti=0;i<_COURSES;i++){
printf("%7.1f",show->scores[i]);
}
printf("\n");
}
/*功能:
根据权限进入不同的界面*/
voidstart(){
printf("\n")
printf("\t\t\t欢迎使用学生成绩管理系统\n");
printf("\t*************************************************************\n");
printf("\t|\t1----添加学生.\t2----显示信息.|\n");
printf("\t|\t3----查找学生.\t4----修改信息.|\n");
printf("\t|\t5----删除学生.\t6----学生排序.|\n");
printf("\t|\t7----信息存档.\t8----读取存档.|\n");
printf("\t|\t9----成绩统计.\t0----退出.|\n");
printf("\t*************************************************************\n");
}
voidchange(student*former,student*latter,student*temp){
*temp=*former;
strcpy(former->name,latter->name);
strcpy(latter->name,temp->name);
former->num=latter->num;
latter->num=temp->num;
for(inti=0;i<_COURSES;i++){
former->scores[i]=latter->scores[i];
latter->scores[i]=temp->scores[i];
}
}
voidbing(doublea,doubleb,intc){
initgraph(640,480);
doublex,y;
chars[]="A:
100~80红;B:
80~60蓝;C: