c语言课程设计学生成绩管理系统.docx
《c语言课程设计学生成绩管理系统.docx》由会员分享,可在线阅读,更多相关《c语言课程设计学生成绩管理系统.docx(25页珍藏版)》请在冰豆网上搜索。
c语言课程设计学生成绩管理系统
C语言学生成绩管理系统程序
学院计算机(软件)学院
班级信管1002班成员陈昊311009030212
陈梁311009030213
陈俊311009030214
日期2011-9-6
C可视化程序设计报告
一.设计题目
学生成绩管理系统
二、课题的任务:
1、所有记录保存在一个数据文件中;
2、具备记录添加功能;
3、查询功能(如按学号查询成绩等);
4、计算统计功能(如统计某门课程的平均程序);
5、排序功能(如按成绩排序);
6、统计并显示信息功能;
三.课程设计目的
了解软件工程中的一些系统分析,模块分析,代码设计的概念,利用visualc++实现学生成绩管理系统的录入、查询、删除、统计等基本操作,掌握C语言中的结构体、指针、函数(系统函数、自定义函数)、文件操作等知识。
通过对系统的分析和设计,进一步巩固C语言的学习,以提高对开发环境。
四、成员承担的任务:
陈梁:
完成下面子程序的编写:
a:
主函数的编译
b:
定位指针的Locate()函数的编译,与调试。
c:
主菜单函数的编译,及其它外部函数的编译,与调试。
d:
任务分配,规定变量符号,及变量的初始化。
e:
程序的组装及调试。
:
完成下面子程序的编写:
a:
统计数据函数的编译。
b:
:
查找学生记录函数的编译。
c:
增加学生记录的函数的编译。
陈俊:
完成下面子程序的编写:
a:
删除函数的编译
b:
修改函数的编译
c:
排序函数的编译
陈昊:
完成下面子程序的编写:
a:
显示函数的编译。
b:
欢迎界面的制作。
c:
保存函数的编译
五、程序流程图
1.系统总体结构图
六.系统源代码
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
intshoudsave=0;//定义一个全局变量
structstudent
{
charnum[11];//学号
charname[20];//姓名
charsex[4];//性别
intcgrade;//c语言成绩
intmgrade;//数学成绩
integrade;//英语成绩
inttotle;//总分
intave;//平均分
charneartime[10];//最近更新时间
};
typedefstructnode//声明新的结构体类型Node
{
structstudentdata;
structnode*next;
}Node,*Link;
voidwelcome()//欢迎界面
{
printf("***************************\n");
printf("*欢迎使用*\n");
printf("*河南理工大学大学学生成绩管理系统*\n");
printf("***************************\n");
printf("本系统由计算机学院信管1002班\n\t\t\t倾情奉献\n");
printf("\n");
printf("愿我们的努力\n");
printf("能为您的学习工作带来方便\n");
printf("您的支持将是我们不断创新的动力\n");
printf("祝您使用愉快!
\n\t\t如有任何疑问联系我们\n\t\tQQ:
453275642\n\t\tTel:
15116336758\n");
}
voidmenu()//主菜单
{
printf("\t*************************************************************\n");
printf("\t*MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM*\n");
printf("\t*MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM*\n");
printf("\t*MMM1<输入学生资料>2<删除学生资料>MMM*\n");
printf("\t*MMM3<查询学生资料>4<修改学生资料>MMM*\n");
printf("\t*MMM5<显示学生资料>6<统计学生成绩>MMM*\n");
printf("\t*MMM7<排序学生成绩>8<保存学生资料>MMM*\n");
printf("\t*MMM9<菜单导航>0<退出系统>MMM*\n");
printf("\t*MMMMMM*\n");
printf("\t*MMMMMM*\n");
printf("\t*MMM*********************************MMM*\n");
printf("\t*MMMi欢迎使用河南理工大学大学学生成绩管理系统iMMM*\n");
printf("\t*MMM*********************************MMM*\n");
printf("\t*MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM*\n");
printf("\t*MMM出品人:
梦幻小组|辅导老师:
于金霞MMM*\n");
printf("\t*MMM组长:
陈梁|梦幻组合MMM*\n");
printf("\t*MMM组员:
陈梁陈昊陈俊成就梦幻品质MMM*\n");
printf("\t*MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM*\n");
printf("\t*************************************************************\n");
}
voidprintstart()
{
printf("-----------------------------------------------------------------------\n");
}
voidWrong()
{
printf("\n对不起!
你输入的信息有误!
请重新输入!
\n");
}
voidNofind()
{
printf("________________________________________________________________________\n");
printf("\n\t!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
提示:
没有找到该学生!
\n");
printf("________________________________________________________________________\n");
printf("\n");
}
voidprintc()//本函数用于输出中文
{
printf("学号\t姓名性别英语数学C语言总分平均分\n");
}
voidprinte(Node*p)//本函数用于输出英文
{
printf("%-12s%s\t%s\t%d\t%d\t%d\t%d\t%d\n",p->data.num,p->data.name,p->data.sex,p->data.egrade,p->data.mgrade,p->data.cgrade,p->data.totle,p->data.ave);//输出成绩
}
Node*Locate(Linkl,charfindmess[],charnameornum[])//该函数用于定位链表中符合要求的接点,并返回该指针
{
Node*r;
if(strcmp(nameornum,"num")==0)//按学号查询
{
r=l->next;
while(r!
=NULL)
{
if(strcmp(r->data.num,findmess)==0)//将输入学号与已有学号对比
returnr;//返回地址
r=r->next;
}
}
elseif(strcmp(nameornum,"name")==0)//按姓名查询将输入姓名与已有姓名对比
{
r=l->next;
while(r!
=NULL)
{
if(strcmp(r->data.name,findmess)==0)
returnr;//返回地址
r=r->next;
}
}
return0;
}
voidAdd(Linkl)//增加学生
{
Node*p,*r,*s;//定义Node型指针
charnum[11];
r=l;
s=l->next;
while(r->next!
=NULL)
r=r->next;//将指针置于最末尾
while
(1)
{
printf("请您输入学号(以'0'返回上一级菜单:
)");
scanf("%s",num);
if(strcmp(num,"0")==0)
break;
while(s)
{
if(strcmp(s->data.num,num)==0)//将新输入学号与已有学号对比
{
printf("!
!
!
!
!
!
提示:
学号为'%s'的学生已经存在,若要修改请你选择'4修改'!
\n",num);
printstart();
printc();
printe(s);
printstart();
printf("\n");
return;
}
s=s->next;//指向下一个地址
}
p=(Node*)malloc(sizeof(Node));//在内存中分配长度与node相同的连续空间用于存储新数据
strcpy(p->data.num,num);
printf("请你输入姓名:
");
scanf("%s",p->data.name);
getchar();
printf("请你输入性别:
");
scanf("%s",p->data.sex);
getchar();
printf("请你输入c语言成绩:
");
scanf("%d",&p->data.cgrade);
getchar();
printf("请你输入数学成绩:
");
scanf("%d",&p->data.mgrade);
getchar();
printf("请你输入英语成绩:
");
scanf("%d",&p->data.egrade);
getchar();
p->data.totle=p->data.egrade+p->data.cgrade+p->data.mgrade;//求总分
p->data.ave=p->data.totle/3;//信息输入已经完成
p->next=NULL;
r->next=p;
r=p;
shoudsave=1;
}
}
voidQur(Linkl)//查询学生
{
intsel;
charfindmess[20];
Node*p;
if(!
l->next)//当l->next=NULL时成立
{
printf("\n********>提示:
没有资料可以查询!
\n");
return;
}
printf("\n********>1按学号查找\n********>2按姓名查找\n");
scanf("%d",&sel);
if(sel==1)//学号
{
printf("请你输入要查找的学号:
");
scanf("%s",findmess);
p=Locate(l,findmess,"num");
if(p)
{
printf("\t\t\t\t查找结果\n");
printstart();
printc();
printe(p);
printstart();
}
else
Nofind();
}
elseif(sel==2)//姓名
{
printf("请你输入要查找的姓名:
");
scanf("%s",findmess);
p=Locate(l,findmess,"name");
if(p)
{
printf("\t\t\t\t查找结果\n");
printstart();
printc();
printe(p);
printstart();
}
else
Nofind();
}
else
Wrong();
}
voidDel(Linkl)//删除函数
{
intsel;
Node*p,*r;
charfindmess[20];
if(!
l->next)
{
printf("\n********>提示:
没有资料可以删除!
\n");
return;
}
printf("\n********>1按学号删除\n********>2按姓名删除\n");
scanf("%d",&sel);
if(sel==1)
{
printf("请你输入要删除的学号:
");
scanf("%s",findmess);
p=Locate(l,findmess,"num");
if(p)
{
r=l;
while(r->next!
=p)
r=r->next;
r->next=p->next;
free(p);
printf("\n********>提示:
该学生已经成功删除!
\n");
printf("\t\t\t\t请按任意键返回。
。
。
\n");
getchar();
shoudsave=1;
}
else
Nofind();
}
elseif(sel==2)
{
printf("请你输入要删除的姓名:
");
scanf("%s",findmess);
p=Locate(l,findmess,"name");
if(p)
{
r=l;
while(r->next!
=p)
r=r->next;
r->next=p->next;
free(p);
printf("\n********>提示:
该学生已经成功删除!
\n");
shoudsave=1;
}
else
Nofind();
}
else
Wrong();
}
voidModify(Linkl)//修改函数模块
{
Node*p;
charfindmess[20];
if(!
l->next)
{
printf("\n********>提示:
没有资料可以修改!
\n");
return;
}
printf("请你输入要修改的学生学号:
");
scanf("%s",findmess);
p=Locate(l,findmess,"num");
voidprintstart1();
if(p)
{
printf("请你输入新学号(原来是%s):
",p->data.num);
scanf("%s",p->data.num);
printf("请你输入新姓名(原来是%s):
",p->data.name);
scanf("%s",p->data.name);
getchar();
printf("请你输入新性别(原来是%s):
",p->data.sex);
scanf("%s",p->data.sex);
printf("请你输入新的c语言成绩(原来是%d分):
",p->data.cgrade);
scanf("%d",&p->data.cgrade);
getchar();
printf("请你输入新的数学成绩(原来是%d分):
",p->data.mgrade);
scanf("%d",&p->data.mgrade);
getchar();
printf("请你输入新的英语成绩(原来是%d分):
",p->data.egrade);
scanf("%d",&p->data.egrade);
p->data.totle=p->data.egrade+p->data.cgrade+p->data.mgrade;
p->data.ave=p->data.totle/3;
printf("\n********>提示:
资料修改成功!
\n");
shoudsave=1;
}
else
Nofind();
}
voidDisp(Linkl)//显示函数模块
{
intcount=0;
Node*p;
p=l->next;
if(!
p)
{
printf("\n********>提示:
没有资料可以显示!
\n");
return;
}
printf("\t\t\t\t显示结果\n");
printstart();
printc();
printf("\n");
while(p)
{
printe(p);
p=p->next;
}
printstart();
printf("\n");
}
voidTongji(Linkl)
{
Node*pm,*pe,*pc,*pt,*pa;//用于指向分数最高的接点
Node*r=l->next;
if(!
r)
{
printf("\n********>提示:
没有资料可以统计!
\n");
return;
}
pm=pe=pc=pt=pa=r;
while(r!
=NULL)
{
if(r->data.cgrade>=pc->data.cgrade)
pc=r;
if(r->data.mgrade>=pm->data.mgrade)
pm=r;
if(r->data.egrade>=pe->data.egrade)
pe=r;
if(r->data.totle>=pt->data.totle)
pt=r;
if(r->data.ave>=pa->data.ave)
pa=r;
r=r->next;
}
printf("------------------------------统计结果--------------------------------\n");
printf("*总分最高者:
\t%s%d分\n",pt->data.name,pt->data.totle);
printf("*平均分最高者:
\t%s%d分\n",pa->data.name,pa->data.ave);
printf("*英语最高者:
\t%s%d分\n",pe->data.name,pe->data.egrade);
printf("*数学最高者:
\t%s%d分\n",pm->data.name,pm->data.mgrade);
printf("*c语言最高者:
\t%s%d分\n",pc->data.name,pc->data.cgrade);
printstart();
}
voidSort(Linkl)
{
Linkll;
Node*p,*rr,*s;
ll=(Link)malloc(sizeof(Node));//用于做新的连表
ll->next=NULL;
if(l->next==NULL)
{
printf("\n********>提示:
没有资料可以排序!
\n");
return;
}
p=l->next;
while(p)
{
s=(Node*)malloc(sizeof(Node));//新建接点用于保存信息
s->data=p->data;
s->next=NULL;
rr=ll;
while(rr->next!
=NULL&&rr->next->data.totle>=p->data.totle)
rr=rr->next;
if(rr->next==NULL)
rr->next=s;
else
{
s->next=rr->next;
rr->next=s;
}
p=p->next;
}
free(l);
l->next=ll->next;
printf("\n********>提示:
排序已经完成!
\n");
}
voidSave(Linkl)
{
FILE*fp;
Node*p;
intflag=1,count=0;
fp=fopen("c:
\\student","wb");
if(fp==NULL)
{
printf("\n********>提示:
重新打开文件时发生错误!
\n");
exit
(1);
}
p=l->next;
while(p)
{
if(fwrite(p,sizeof(Node),1,fp)==1)
{
p=p->next;
count++;
}
else
{
flag=0;
break;
}
}
if(flag)
{
printf("\n********>提示:
文件保存成功.(有%d条记录已经保存.)\n",count);
shoudsave=0;
}
fclose(fp);
}
voidhelp()
{
printf("欢迎进入河南理工大学学生成绩管理系统《菜单导航》\n\