C语言程序设计成绩管理系统设计与开发.docx
- 文档编号:15167844
- 上传时间:2023-07-02
- 格式:DOCX
- 页数:66
- 大小:253.33KB
C语言程序设计成绩管理系统设计与开发.docx
《C语言程序设计成绩管理系统设计与开发.docx》由会员分享,可在线阅读,更多相关《C语言程序设计成绩管理系统设计与开发.docx(66页珍藏版)》请在冰点文库上搜索。
C语言程序设计成绩管理系统设计与开发
C语言程序设计小学期实习
成绩管理系统设计与开发
一、需求分析
本系统的主要目的是实现对学生成绩的管理,要方便用户的管理,能提高效率,又能一目了然,方便用户对学生成绩的分析等。
二、功能分析
1、学生信息的输入
用户要对学生的信息、成绩进行管理,那么就需要先输入学生的信息,而输入学生信息时,要考虑输入的格式问题,并将学生按学号从小到大排序;
2、学生信息的添加
由于学生信息的输入将清除用户之前保存的学生名单,如果用户需要添加学生信息,便要用到这个功能,这个功能便是为用户所添加的学生信息插入到原来的学生名单中,并按学号排序;
3、学生信息的删除
本功能是要将用户所需删除的学生信息从原有的学生列表中删除;
4、学生成绩的输入
学生的成绩按要求分为三科:
语文、英语、数学,用户以学生学号为序,按三科顺序依次输入学生成绩;
5、学生成绩的输出
学生成绩以表格形式输出,其中会计算学生的平均分与总分、单科的最高分与最低分,还有学生平均分与总分的最高分和最低分,并且按60分以下、60~69、70~79、80~89、90~100(不及格、及格、中、良、优)五个等级,为学生成绩分类,最后,输出一个统计的表格,表格中将输出五个等级分别所占的人数;
6、学生信息的查找与修改
按学生姓名和学生学号两种遍历方式,为用户查找到学生的信息,并进行修改;
7、系统的退出和学生信息的保存
用户每次执行完前六项功能后都将返回主界面,最后,用户提交的学生信息在选择退出时将以文本(TXT)和二进制(DAT)两种形式保存在计算机种,以方便下一次对学生成绩系统的操作;
三、软件设计
1、Dos窗口的设计
i.主界面设计:
Desk_top
容错处理:
若用户输入的数值超过了范围,便提示信息错误;
设计思想:
用printf函数输出主菜单的界面,将“输入学生信息”、“添加学生信息”、“删除学生信息”、“输入学生成绩”、“输出学生成绩”、“查找并且修改”、“退出并保存”七大功能用0~6表示,在界面的最后一行,要求用户输入自己的选择,并以回车确认。
ii.学生列表设计:
Stu_LIST
设计思想:
学生列表包括班级“CLASS”、姓名“NAME”、学号“STU_NUMBER”三项,其中班级与学号都是以“int”类型存储,而姓名是以“char”类型存储的,并且以格式化方式输出,这样能保证班级、姓名、学号对齐,界面整齐美观。
iii.
学生成绩表和成绩统计:
Output
学生成绩表:
设计思想:
学生成绩表以“表格”的形式输出,表格的设计是经过试验与计算而得到的,表格中的元素分别有:
学生姓名、学号、语文成绩、英语成绩、数学成绩、平均分、总分、最高分等十个项目,所有数据均以格式化方式输出,使得“表格”整齐美观,并且,学生成绩按要求分为五个等级:
60分以下为红色,60~69为黄色、70~79为白色、80~89为绿色,90~100为蓝色。
成绩统计:
设计思想:
成绩统计中主要是对学生在各个科目中不同成绩等级的人数统计,同样是以“表格”的形式输出给用户,以求观察方面,整体美观等。
设计中遇到的困难:
由于自己没学过更改DOS界面的文字与背景的颜色,因此我在网上查找了资料,并且做了自学工作与很多次试验,最终还是达到了自己的目的。
2、数据管理的设计
i.学生数据链表的建立:
Extablish
容错处理:
(1)由于学生数据在退出程序后将得到保存,而输入学生信息时,会清空原来的数据,因此做了以下处理:
如果已经有学生数据,系统会提示以上信息,若要添加学生信息,可以选择主菜单的“学生信息添加”来实现。
(2)输入时,如果学生的学号重复,系统将会报错,并要求重新输入:
设计思想:
用户也许不一定要立马输入成绩,但必须实现输入学生的信息(班级、姓名、学号),因此需要建立一个学生列表来实现,其中输入信息时,需要用户按格式来输入,建立的学生信息将在输入信息时便逐个排序,并且以链表的形式连接起来,这样实现内存的最优化同时,又方面用户管理。
设计中遇到的困难:
由于链表和动态内存的分布我没有学过,因此链表的整体排序让我感到很困难,这不仅要从链表中找到元素,删除后再插入,然后再继续找,需要用到多重循环,并且要考虑首尾元素中的指针问题,因此,我在用户逐个添加的过程中便一个一个的排序好,减少循环次数,使得排序简单易行,因此也达到了我的目的。
ii.学生数据的插入:
Add_info
容错处理:
(1)如果用户没用学生列表,系统将提示用户,并要求用户先返回主菜单,选择“输入学生信息”。
(2)如果用户要插入的学生信息中的学号与原学生列表中的学生学号重复,系统将报错,并要求重新输入。
设计思想:
由于我采用链表的数据结构来存储学生数据,因此插入时较为方便,只用改改动结构体中的指针即可,并且,在插入之前,按学号大小将学生信息排序处理。
设计过程中遇到的困难:
链表的排序让我感到十分困难,考虑到插入的元素的排序问题,于是我将“插入到首元素之前”的情况单独讨论,再采用循环的方法做比较,这样便解决了自己的问题。
iii.学生成绩的输入:
Input
容错处理:
成绩的上限为999.9,如果输入的成绩超过1000,系统将报错,并要求用户重新输入。
设计思想:
单独设计这个接受成绩的函数,再用一个循环语句调用。
iv.数据的删除:
Dele
容错处理:
(1)如果系统没有保存过学生的信息,那么系统将报错:
(2)如果输入的信息错误,那么系统将报错,并返回:
设计思想:
为用户提供两种遍历方式:
姓名与学号,如果用户不再删除,可以选择退出:
v.数据的查询与修改:
search
容错处理:
(1)如果没有学生,系统报错:
(2)如果输入的信息错误,系统报错:
设计思想:
将学生表展示出来,供用户选择要修改的学生项目,并且,用户需要结束时,选择结束即可。
四、流程图
五、函数代码
1、
Addstu_info
#include"stdafx.h"
#include
#include
#include
#include
//
//
//
structSubject
{
floatMath;
floatEnglish;
floatChinese;
};
structSTUDENT
{
intstu_num;
intcla_num;
charname[10];
structSubjectscore;
structSTUDENT*next;
};
structSTUDENT*add_info(structSTUDENT*p,inti)
{
structSTUDENT*head=p;
structSTUDENT*p1=p;
structSTUDENT*p2=NULL;
p2=(structSTUDENT*)malloc(sizeof(structSTUDENT));
p2->score.Chinese=0;
p2->score.English=0;
p2->score.Math=0;
p2->next=NULL;
printf("请输入第%d名学生的信息:
(班级、姓名、学号)\n",i+1);
scanf("%d%s%d",&(*p2).cla_num,(*p2).name,&(*p2).stu_num);
for(;p1;p1=p1->next)
{
if((p2->stu_num)==(p1->stu_num))
{
printf("你输入的学号重复,请重新输入:
\n");
free(p2);
return(add_info(head,i));
}
}
if((p2->stu_num)<(p->stu_num))
{
p2->next=p;
return(p2);
}
else
{
for(;p->next;p=p->next)
{
if((p2->stu_num)>(p->next->stu_num))
{
continue;
}
p2->next=p->next;
p->next=p2;
return(head);
}
p->next=p2;
p2->next=NULL;
return(head);
}
}
structSTUDENT*add_info2(structSTUDENT*p,structSTUDENT*head)
{
if(p==NULL)
{
printf("******************************************\n");
printf("*你没有学生列表,请先选择“输入学生信息”*\n");
printf("******************************************\n");
returnNULL;
}
structSTUDENT*p2=NULL;
p2=(structSTUDENT*)malloc(sizeof(structSTUDENT));
p2->score.Chinese=0;
p2->score.English=0;
p2->score.Math=0;
p2->next=NULL;
printf("请输入你要添加的学生的信息:
(班级、姓名、学号)\n");
scanf("%d%s%d",&(*p2).cla_num,(*p2).name,&(*p2).stu_num);
if((p->stu_num)>(p2->stu_num))
{
p2->next=p;
return(p2);
}
elseif((p->stu_num)==(p2->stu_num))
{
printf("你输入的学号重复,请重新输入!
\n");
free(p2);
return(add_info2(p,head));
}
for(;head->next;head=head->next)
{
if((head->stu_num)<(p2->stu_num))
continue;
elseif((head->stu_num)==(p2->stu_num))
break;
p2->next=p->next;
p->next=p2;
return(head);
}
if((head->stu_num)==(p2->stu_num))
{
printf("你输入的学号重复,请重新输入!
\n");
free(p2);
return(add_info2(p,head));
}
head->next=p2;
return(p);
}
2、
Dele
#include"stdafx.h"
#include
#include
#include
#include
//
//
//
structSubject
{
floatMath;
floatEnglish;
floatChinese;
};
structSTUDENT
{
intstu_num;
intcla_num;
charname[10];
structSubjectscore;
structSTUDENT*next;
};
structSTUDENT*dele_1(structSTUDENT*);
structSTUDENT*dele_2(structSTUDENT*);
voidstudent_list(structSTUDENT*);
structSTUDENT*dele(structSTUDENT*point)
{
inti=3;
do
{
printf("============================================================\n\n");
printf("------------------------------------------\n");
printf("|1、按姓名删除|2、按学号删除|0、退出|\n");
printf("------------------------------------------\n");
printf("请选择:
");
fflush(stdin);
scanf("%d",&i);
switch(i)
{
case0:
break;
case1:
point=dele_1(point);
break;
case2:
point=dele_2(point);
break;
default:
printf("你输入的信息有误,请重新输入!
\n");
}
}while(i);
return(point);
}
structSTUDENT*dele_1(structSTUDENT*p1)
{
if(p1==NULL)
{
printf("******************\n");
printf("*你目前没有学生!
*\n");
printf("******************\n");
returnNULL;
}
else
{
student_list(p1);
structSTUDENT*p=p1->next;
structSTUDENT*p2=p1;
charname[10];
fflush(stdin);
printf("请输入要删除学生的姓名:
");
gets(name);
if(strcmp(name,p1->name)==0)//如果要删除的是链表的第一个元素
{
free(p1);
returnp;
}
for(;p->next;p=p->next,p2=p2->next);
if(strcmp(name,p->name)==0)
{
free(p);
p2->next=NULL;
return(p1);
}
for(p=p1->next,p2=p1;p->next;p=p->next,p2=p2->next)
if(strcmp(name,p1->name)==0)
{
p2->next=p->next;
free(p);
return(p1);
}
printf("你输入的名字有误,请重新输入!
\n");
return(p1);
}
}
structSTUDENT*dele_2(structSTUDENT*p2)
{
if(p2==NULL)
{
printf("******************\n");
printf("*你目前没有学生!
*\n");
printf("******************\n");
returnNULL;
}
else
{
student_list(p2);
structSTUDENT*p=p2->next;
structSTUDENT*p1=p2;
intStuID=1;
printf("请输入要删除学生的学号:
");
fflush(stdin);
scanf("%d",&StuID);
if(StuID==p2->stu_num)//如果要删除的是链表的第一个元素
{
free(p2);
returnp;
}
for(;p->next;p=p->next);
if(StuID==p->stu_num)
{
free(p);
p1->next=NULL;
return(p2);
}
for(p=p2->next,p1=p2;p;p=p->next,p1=p1->next)
if(StuID==p2->stu_num)
{
p1->next=p->next;
free(p);
return(p2);
}
printf("你输入的学号有误,请重新输入!
\n");
return(p2);
}
}
3、
Desk_top
#include"stdafx.h"
#include
#include
#include
#include
//
//
//
structSubject
{
floatMath;
floatEnglish;
floatChinese;
};
structSTUDENT
{
intstu_num;
intcla_num;
charname[10];
structSubjectscore;
structSTUDENT*next;
};
//
//
//
voiddesk_top()
{
printf("\n\n学生成绩管理系统\n");
printf("==============================================================================\n");
printf("-------------------------------------------------------\n");
printf("|1、输入学生信息|2、添加学生信息|3、删除学生信息|\n");
printf("-------------------------------------------------------\n");
printf("|4、输入学生成绩|5、输出学生成绩|6、查找并且修改|\n");
printf("-------------------------------------------------------\n");
printf("|0、退出并保存|\n");
printf("-------------------------------------------------------\n");
printf("==============================================================================\n");
printf("请输入你的选择:
");
}
4、
document
#include"stdafx.h"
#include
#include
#include
#include
//
//
//
structSubject
{
floatMath;
floatEnglish;
floatChinese;
};
structSTUDENT
{
intstu_num;
intcla_num;
charname[10];
structSubjectscore;
structSTUDENT*next;
};
STUDENT*read(STUDENT*hp)
{
FILE*fp=fopen("student.dat","rb");
if(NULL==fp)
{
hp=NULL;
returnNULL;
}
hp=(structSTUDENT*)malloc(sizeof(structSTUDENT));
hp->next=NULL;
STUDENT*p=hp;
STUDENT*p1=NULL;
//while(!
ferror(fp))
while(!
feof(fp))
{
intcount=fread(p,sizeof(structSTUDENT),1,fp);
if(count!
=1)
{
for(p1=hp;p1->next->next;p1=p1->next);
p1->next=NULL;
free(p);
returnhp;
}
p1=(structSTUDENT*)malloc(sizeof(structSTUDENT));
p->next=p1;
p=p->next;
p->next=NULL;
}
fclose(fp);
returnhp;
}
voidwrite_a(STUDENT*hp)//将学生信息保存在TXT文件中
{
FILE*fp=NULL;
if((fp=fopen("student.txt","w"))==NULL)
{
printf("文件存取错误!
\n");
return;
}
fprintf(fp,"================学生成绩管理===============\n\n");
fprintf(fp,"姓名学号语文英语数学\n");
for(;hp;hp=hp->next)
{
fprintf(fp,"%-10s%10d%3.1f%3.1f%3.1f\n",hp->name,hp->stu_num,hp->score.Chinese,hp->score.English,hp->score.Math);
}
fprintf(fp,"\n====
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 成绩管理系统 设计 开发