数据结构课程设计成绩管理系统.docx
- 文档编号:29423368
- 上传时间:2023-07-23
- 格式:DOCX
- 页数:23
- 大小:225.07KB
数据结构课程设计成绩管理系统.docx
《数据结构课程设计成绩管理系统.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计成绩管理系统.docx(23页珍藏版)》请在冰豆网上搜索。
数据结构课程设计成绩管理系统
《数据结构》
课程设计报告
(成绩管理系统)
目录
一.需求分析……………………………………………………第3页
二.概要设计……………………………………………………第3页
三.详细设计……………………………………………………第5页
四.调试分析…………………………………………………第17页
五.用户使用说明……………………………………………第17页
六.测试结果…………………………………………………第19页
七.附录………………………………………………………第19页
一、需求分析
1.实现功能:
该程序有非常清晰的所以能够方便用户的使用,该成绩系统能够添加多科成绩,并能够统计总成绩,能够按照学号,姓名两种方式查看,修改,删除数据.同时可以按照学号的升序排序成绩表,已经按照单科成绩,总成绩降序排序成绩表,统计学生成绩的情况,成绩有容量查询功能,保存成绩表到磁盘,以及打开磁盘成绩表的功能,且存储位置就在程序运行文件夹内,存储文件名可以自定.
2.测试数据:
输入一组成绩
学号12,姓名:
zengyao,数学:
75,语文:
67
学号14,姓名:
taokai,数学:
84,语文:
72
学号27,姓名:
xucheng,数学:
92,语文:
95
能够在程序中正确运行达到要求中的所有功能
二、概要设计
1.成绩管理系统:
structst
{
longnum;
charc[21];
floatgrade;
floatchinese;
floattotal;
}std[NUM];
基本操作:
intempty();
操作结果:
判断成绩表是否为空.
voiddone();
操作结果:
从键盘上输入所选择的功能.
voidcreat();
操作结果:
从键盘输入新的成绩.
voidprint();
初始条件:
成绩表已存在.
操作结果:
输出已有的成绩表.
voidfix_number()
初始条件:
成绩表已存在.
操作结果:
按照学号修改成绩.
voidfix_name()
初始条件:
成绩表已存在.
操作结果:
按照姓名修改成绩.
voidfix()
初始条件:
成绩表已存在.
操作结果:
选择修改成绩方式.
voiddel_number()
初始条件:
成绩表已存在.
操作结果:
按照学号删除成绩.
voiddel_name()
初始条件:
成绩表已存在.
操作结果:
按照姓名删除成绩.
voiddel()
初始条件:
成绩表已存在.
操作结果:
选择删除方式.
voidsearch_number()
初始条件:
成绩表已存在.
操作结果:
按照学号查找.
voidsearch_name()
初始条件:
成绩表已存在.
操作结果:
按照姓名查找.
voidsearch()
初始条件:
成绩表已存在.
操作结果:
选择查找方式.
voidline_number(intm)
初始条件:
成绩表已存在.
操作结果:
按照学号排序.
voidline_grade(intm)
初始条件:
成绩表已存在.
操作结果:
按照数学成绩排序.
voidline_chinese(intm)
初始条件:
成绩表已存在.
操作结果:
按照语文成绩排序.
voidline_total(intm)
初始条件:
成绩表已存在.
操作结果:
按照总成绩排序.
voidline()
初始条件:
成绩表已存在.
操作结果:
选择排序方式.
voidsave()
初始条件:
成绩表已存在.
操作结果:
保存成绩表到磁盘.
voidload()
初始条件:
磁盘中存在此名称的成绩表.
操作结果:
从磁盘打开成绩表.
2.主程序:
voidmain(){
初始化:
do{
接受命令;
处理命令;
}while(“命令”=“退出”);
}
三、详细设计
structst//定义结构体
{
longnum;//定义学号
charc[21];//定义姓名字符数组
floatgrade;//定义浮点型变量grade
floatchinese;//定义浮点型变量chinese
floattotal;//定义浮点型变量total
}std[NUM];//定义结构体数组
intn=0;//定义表单容量记录变量
1.成绩表为空判断函数
intempty()
intflag=1;
if(n==0)
printf("\n%c成绩表为空!
回车键返回!
",19);
flag=0;
while
(1)//如果不输入回车则继续进行循环
getchar();if(getchar()=='\n')break;
return(flag);//将flag的值返回进行接下来操作
//判断成绩表为空函数是许多子函数调用之前if语句的判断条件,而返回值flag将赋为0,1用于之后的函数判断.
2.操作完成格式输出函数
voiddone()
printf("\n%c操作完成!
回车键结束!
\n",19);
while
(1)//不是回车则不断循环
getchar();
if(getchar()=='\n')//判断输入的是否是回车
system("cls");break;//进行系统清屏
//设计操作完成函数在整个程序运行中都将起到非常重要的作用,其中调用了系统清屏函数,同时while
(1)的使用比较巧妙,简单确有非常好的操作效果;
3.查看表单容量函数
voidcapacity()
printf("\n%c成绩表最大容量:
%d条",16,NUM-1);
printf("\n%c已用容量:
%d条",16,n);
printf("\n%c剩余容量:
%d条",16,NUM-n-1);
done();//本身设计程序时,开始开辟了100个容量为最大空间,所以设计了表单容量查询.
4.添加数据函数
voidcreat()
inti,j,flag;
printf("\n-------添加数据-------\n\n");
for(i=n+1;i<=NUM;i++)
flag=0;
printf("请输入要添加的学号:
");
scanf("%ld",&std[i].num);
if(i>=1)//当成绩表中已经存在成绩,进行循环查找若存在相同的学号则跳出循环,不输入成绩
for(j=1;j
if(std[i].num==std[j].num)
printf("%c该学号已存在!
请输入新的学号!
\n\n",19);
flag=1;i--;break;//将i++减回去
if(flag!
=0)continue;
printf("姓名:
");
scanf("%s",std[i].c);
printf("数学成绩:
");
scanf("%f",&std[i].grade);
printf("语文成绩:
");
scanf("%f",&std[i].chinese);
std[i].total=std[i].chinese+std[i].grade;
n+=1;
printf("\n%c是否继续添加数据(1、退出;任意键继续!
):
\n",19);
getchar();
if(getchar()=='1')break;
elsecontinue;
system("cls");//添加成绩首先将所有成绩查询,看是否存在相同的学号,若存在还要将循环时i的计数减1,添加时直接将各项数据循环存储与结构体数组中,利用continue语句和getchar()函数结合做条件判断实现了选择性的继续添加或者退出,也区别开了存在相同学号成绩的情况
5.查看数据函数
voidprint()
if(empty()==0)system("cls");//判断成绩表是否为空,不为空就执行下面程序输出成绩表
else
inti;
for(i=1;i<=n;i++)
printf("\n%ld\t\t%s\t\t%5.2f\t\t%5.2f\t\t%5.2f\n",std[i].num,std[i].c,std[i].grade,std[i].chineses,std[i].total);
done();
//查看函数简单的利用数组的循环输出数据,但是在开头必须判断成绩表是否为空,\t%s\t\t%5.2f不断改变间距使得输出的数据整齐好看.
6.按学号修改数据函数
voidfix_number()
longnum;
inti,flag=0;
printf("%c请输入学生的学号:
",16);
scanf("%ld",&num);//输入学号
for(i=1;i<=n;i++)//循环查找到这个学号
if(std[i].num==num)
flag=1;break;//做标记
if(flag==1)
printf("%c变更%ld的姓名为:
",16,num);
scanf("%s",std[i].c);
printf("%c变更%ld的数学成绩为:
",16,num);
scanf("%f",&std[i].grade);
printf("%c变更%ld的语文成绩为:
",16,num);
scanf("%f",&std[i].chinese);
std[i].total=std[i].chinese+std[i].grade;
done();
else{printf("%c此学号不存在!
!
!
",19);done();}
//修改函数与添加成绩思路比较接近,只是在开始查找是否存在需要修改的数据.
7.按姓名修改数据函数
voidfix_name()
printf("%c请输入学生的姓名:
",16);
scanf("%s",&c);
for(i=1;i<=n;i++)
if(strcmp(std[i].c,c)==0)//判断是否存在此姓名的学生
flag=1;break;//如果没有则跳出操作
if(flag==1)
printf("%c变更%s的学号为:
",16,c);
scanf("%ld",&std[i].num);
printf("%c变更%s的数学成绩为:
",16,c);
scanf("%f",&std[i].grade);
printf("%c变更%s的语文成绩为:
",16,c);
scanf("%f",&std[i].chinese);
std[i].total=std[i].chinese+std[i].grade;//将总成绩修改
done();
else{printf("\n%c此姓名不存在!
!
!
",19);done();//该函数与按学号修改函数思路完全一致.
8.修改数据函数
voidfix()
if(empty()==0)system("cls");
else
ints;
scanf("%d",&s);
switch(s)
case1:
fix_number();break;//按学号修改成绩
case2:
fix_name();break;//按姓名修改成绩
default:
system("cls");
9.按学号删除数据函数
voiddel_number()
longnum;
inti,j,flag=0;
printf("\n%c请输入学生的学号:
",16);
scanf("%ld",&num);
for(i=1;i<=n;i++)//循环搜索需要删除的成绩
if(std[i].num==num)
flag=1;break;
if(flag==1)
for(j=i;j<=n;j++)
std[j].num=std[j+1].num;//将删除数据之后的学号前移一位
strcpy(std[j].c,std[j+1].c);//将删除数据之后的姓名前移一位
std[j].grade=std[j+1].grade;//分别将数学,语文,总成绩前移一位
std[j].chinese=std[j+1].chinese;
std[j].total=std[j+1].total;
n-=1;
done();
else{printf("\n%c此学号不存在!
!
!
",19);done()
//删除算法的思路,经典在于删除数据后将之后所有数据提前的循环量的控制首先还是简单的查找删除数据的位置,n-=1改变表单数据量
10.按姓名删除数据函数
voiddel_name()
charc[21];
inti,j,flag=0;
printf("\n%c请输入学生的姓名:
",16);
scanf("%s",c);
for(i=1;i<=n;i++)
if(strcmp(std[i].c,c)==0)
flag=1;break;
if(flag==1)
for(j=i;j<=n;j++)
std[j].num=std[j+1].num;//将删除数据之后的学号前移一位
strcpy(std[j].c,std[j+1].c);//将删除数据之后的姓名前移一位
std[j].grade=std[j+1].grade;//分别将数学,语文,总成绩前移一位
std[j].chinese=std[j+1].chinese;
n-=1;
done();
else{printf("\n%c此姓名不存在!
!
!
\n",19);done();按照姓名删除与按照学号删除思路一致
11.删除数据函数
voiddel()
if(empty()==0)system("cls");
else
ints;
scanf("%d",&s);
switch(s)
case1:
del_number();break;//按照学号删除成绩
case2:
del_name();break;//按照姓名删除成绩
default:
system("cls");
11.按学号查找函数
voidsearch_number()
longnum;
inti,flag=0;
scanf("%ld",&num);
for(i=1;i<=n;i++)//循环查找若找到了该学号则进行输出,没有找到则跳出查找
if(std[i].num==num)
flag=1;break;
if(flag==1)
printf("\n%ld\t\t%s\t\t%5.2f\t\t%5.2f\n",std[i].num,std[i].c,std[i].grade,std[i].chinese);
done();
else{printf("\n%c此学号不存在!
!
!
",19);done();}
12.按姓名查找函数
voidsearch_name()
charc[21];
inti,flag=0;
printf("%c请输入学生的姓名:
",16);
scanf("%s",c);
for(i=1;i<=n;i++)
if(strcmp(std[i].c,c)==0)//循环查找该姓名,没有找到则跳出操作
flag=1;break;
if(flag==1)
printf("\n%ld\t\t%s\t\t%5.2f\t\t%5.2f\n",std[i].num,std[i].c,std[i].grade,std[i].chinese);
done();
else{printf("\n%c此姓名不存在!
!
!
",19);done();}
13.查找数据函数
voidsearch()
if(empty()==0)system("cls");
else
ints;
printf("\n-------查找数据-------\n\n");
printf("请选择查找方式(1、按学号查找;2、按姓名查找;任意键返回!
):
");
scanf("%d",&s);
switch(s)
case1:
search_number();break;//按学号查找
case2:
search_name();break;//按姓名查找
default:
system("cls");//进行系统清屏
14.按学号排序函数
voidline_number(intm)
structsttemp;//定义结构体变量temp
for(i=1;i for(j=i+1;j<=m;j++) if(std[i].num>std[j].num)//比较学号大小按从小到大排序 temp.num=std[i].num;//利用中间变量排序学号 std[i].num=std[j].num; std[j].num=temp.num; strcpy(temp.c,std[i].c);//利用中间变量按学号排序调整姓名 strcpy(std[i].c,std[j].c); strcpy(std[j].c,temp.c); temp.chinese=std[i].chinese;//利用中间变量按学号排序调整语文成绩 std[i].chinese=std[j].chinese; std[j].chinese=temp.chinese; temp.grade=std[i].grade;//利用中间变量按学号排序调整数学成绩 std[i].grade=std[j].grade; std[j].grade=temp.grade; temp.total=std[i].total;//利用中间变量按学号排序调整总成绩 std[i].total=std[j].total; std[j].total=temp.total; done();//排序函数简单的利用中间变量来交换位置排序,只是for循环中j=i+1;j<=m这些变量的的选择比较关键. 15.按数学成绩排序函数 voidline_grade(intm) structsttemp;//定义结构体变量temp for(i=1;i for(j=i+1;j<=m;j++) if(std[i].grade temp.num=std[i].num;//利用中间变量按数学成绩排序调整学号 std[i].num=std[j].num; std[j].num=temp.num; strcpy(temp.c,std[i].c);//利用中间变量按数学成绩排序调整姓名 strcpy(std[i].c,std[j].c); strcpy(std[j].c,temp.c); temp.chinese=std[i].chinese;//利用中间变量按数学成绩排序调整语文成绩 std[i].chinese=std[j].chinese; std[j].chinese=temp.chinese; temp.grade=std[i].grade;//利用中间变量排序数学成绩 std[i].grade=std[j].grade; std[j].grade=temp.grade; temp.total=std[i].total;//利用中间变量按数学成绩排序调整总成绩 std[i].total=std[j].total; std[j].total=temp.total; done();//调用操作完成函数 //按其他方式排序思想与数学成绩排序完全一致 16.表单数据排序函数 voidline() if(empty()==0)system("cls"); else scanf("%d",&s); switch(s) case1: line_number(n);break;//按学号排序 case2: line_grade(n);break//;按数学成绩排序 case3: line_chinese(n);break;//按语文成绩排序 case4: line_total(n);break;//按总成绩排序 default: system("cls"); 17.保存成绩表文件函数 voidsave() if(empty()==0)system("cls");//成绩表如果为空,就不进行保存 else printf("\n-------保存成绩表-------\n\n"); FILE*fp;//定义文件指针 inti; charc[21]; printf("%c输入文件名: ",1); scanf("%s",c); if((fp=fopen(c,"wb"))==NULL)//此文件不存在,无法保存. printf("%c成绩表保存失败! \n",19); done(); return; for(i=1;i<=n;i++) fwrite(&std[i],sizeof(structst),1,fp);//进行文件保存 fclose(fp);//函数fclose()关闭给出的文件流,释放已关联到流的所有缓冲区 done(); 18.打开成绩表文件函数 voidload() FILE*fp;//定义文件指针 printf("%c输入文件名: ",1); scanf("%s",c); if((fp=fopen(c,"rb+"))==NULL)//没有找到此文件,打开失败 printf("\n%c无此文件! \n",19); done(); return; for(i=1;i fread(&std[i],sizeof(structst),1,fp);//读取成绩表 if(feof(fp))break; n+=1; fclose(fp);//保存和打开成绩表的函数都是基本的文件存储方式,利用数组保存到磁盘,储存的位置就在运行该程序的文件夹所以方便找到,同时n+=1;非常重要否则将出现打开文件成功但是查看成绩表依旧为空的情况, 19.主程序 voidmain() { charc; while (1) { printf("\n\t\t——学生成绩管理工具——\n"); printf("\t\t< printf("\t\t\t1、查看已有的成绩表\n"); printf("\t\t\t2、修改一个已有的数据\n"); printf("\t\t\t3、添加一个新的数据\n");
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 成绩管理系统