学生管理系统C语言课程设计华南理工大学.docx
- 文档编号:10277487
- 上传时间:2023-02-09
- 格式:DOCX
- 页数:28
- 大小:153.48KB
学生管理系统C语言课程设计华南理工大学.docx
《学生管理系统C语言课程设计华南理工大学.docx》由会员分享,可在线阅读,更多相关《学生管理系统C语言课程设计华南理工大学.docx(28页珍藏版)》请在冰豆网上搜索。
学生管理系统C语言课程设计华南理工大学
C语言程序设计
课程设计报告
设计题目:
学生成绩管理系统
学号
班级
姓名
完成方式:
(单选)
自我评分:
(单选)
●独立完成
●优秀
○参考他人工作的基础上完成
○良好
○在他人的帮助下完成
○中等
○完整拷贝他人成果
○及格
○不及格
2011年5月11日
C语言课程设计任务书3
题目:
学生成绩管理系统
功能:
学生成绩管理系统,每个学生是一个记录,包括学号,姓名,性别,3门课程成绩。
系统
要求实现以下功能:
1、信息录入:
录入学生成绩信息(包括学生学号、姓名、各门课程的成绩等);
2、信息查询:
输入学号,查询学生各门课程的成绩,并显示。
3、排序:
按各门课程的成绩平均分进行排序,并显示。
4、信息删除与修改——输入学号,删除该学生的成绩信息。
分步实施:
1、初步完成总体设计,搭好框架,确定人机对话的界面,确定函数个数。
2、建立一个文件,将每位学生的信息写入文件中并能显示于屏幕上。
3、完成上述信息查询(学生学号、姓名等)、排序、信息删除与修改功能。
要求:
1、用C语言实现程序设计;
2、利用结构体数组实现学生信息的数据结构设计;
3、系统的各个功能模块要求用函数的形式实现;
4、界面友好(良好的人机交互),程序加必要的注释。
课程设计实验报告要求:
一、总体设计
1.程序的总体设计
2.数据结构
结构体数组
structstudent/*定义结构体变量student*/
{
intnum;
charname[10];
intgen;
intch,en,math,tot;
};
StructstudentStu[100];
3.函数原型声明的说明(功能,参数,返回值)
1).输出不及格名单:
voidfailsbj(intn,structstudentstu[])/*输出不及格的名单,只要有一科不及格即进入名单*/
2).计算平均分
voidsumup(int*n,structstudent(*stu)[])/*计算每个人各科平均分的函数*/
3).打印所有数据
voiddisplay(intn,structstudentstu[])/*输出所有数据*/
4).检索
voidsearch(intn,structstudentstu[])/*依照名字或者数字搜索条目*/
5).排序
voidassort(intn,structstudent(*stu)[])/*排序模块*/
6).增加条目
voidadd(int*n,structstudent(*stu)[])/*加入条目模块*/
7).删除条目
voiddel(int*n,structstudent(*stu)[])/*删除条目模块*/
8).编辑条目
voidedit(int*n,structstudent(*stu)[])/*编辑条目模块*/
9).导出列表
voidsave(int*n,structstudent(*stu)[])/*将结果另存为*/
10).统计分析
voidanlz(int*n,structstudent(*stu)[])/*统计全班成绩,包括求出各分数段人数,各科班平均分*/
4.流程图
二、详细设计
1.主程序如上图。
2.功能之“输出不及格名单”:
用for循环扫描每个同学的信息,如果某同学的语文、英语或数学成绩不及格(<60分),即输出该同学的条目。
3.功能之“排序”:
本系统提供六种排序,分别如下:
0.Accordingtothestudentnumber
1.Accordingtotheaveragescores.
2.AccordingtothescoresofChinese.
3.AccordingtothescoresofEnglish.
4.AccordingtothescoresofMathematics.
5.Bygender\*性别以1和0代替*\
6.Byname
即根据学号、平均分、单科成绩、性别、姓名排序。
根据用户要求的排序方法,用冒泡排序法排序。
4.功能之“删除条目”:
先列出所有学生的条目,要求用户输入欲删除的学号,搜索该学号,确定该学号对应条目的编号。
删除方式为,将该条目之后的所有条目逐个复制到前一个位置,以覆盖欲删除的条目,最后将条目总数减一。
5、功能之“编辑条目”:
先要求用户输入欲更改条目的学号,通过查找得到该学号对应的编号,要求用户输入欲更改的条目属性以及目标值。
然后直接修改该属性。
6.功能之“增加条目”:
要求用户键入欲增条目的详细信息,包括学号、姓名、性别、语文成绩、英语成绩、数学成绩。
然后新增条目。
7.功能之“检索”:
要求用户输入欲检索的是姓名还是数字信息。
若是姓名,则检索条目中是否有该姓名的学生,若有,则把条目输出;若是数字信息,则检索条目中是否有包含该数字的条目(包括学号、性别、成绩),把检索结果输出。
8.功能之“打印数据”:
把所有数据逐条输出,每个条目占一行。
9.功能之“统计分析”:
定义整形变量作为计数器,遍历所有条目,统计每种情况的学生人数。
其中包括语文、英语、数学的各分数段人数,分数区间为(0,60)、(60,70)、(70,80)、(80,90)、(90,100)。
并统计各科平均分。
将统计结果打印在屏幕上。
10.功能之“导出”:
导出文件为output.txt,放在默认目录下。
三、测试及调试(程序运行截图,测试方案、存在的问题及解决方法)
程序调试时主要运用了单步执行、设置breakpoint、跟踪变量等方法。
具体测试方案为:
1.通过编译检错,将检测出来的bug逐个更正。
2.运行程序,逐个功能模块测试。
若出现死循环则按Ctrl+F2强制退出。
3.单步执行并跟踪变量。
确定死循环的位置,分析其原因。
4.若有bug出现在某函数中,则应在函数中添加breakpoint,执行程序,跳到该breakpoint后,单步执行并跟踪变量。
调试过程中遇到的问题:
1.在编写“添加新条目”模块时,最早的做法是用scanf命令一次性读入学号、姓名、性别、成绩等属性。
遇到的问题是,因为姓名为字符串格式,性别为整形格式,因此,读取字符串时并不以空格为结束,执行结果会将姓名后面的性别等属性也当作姓名输入。
提出的解决办法是:
逐个读取属性,每读取一个属性之前有文本提示。
因此,每读取一个属性必须以回车结束。
此时,在读取字符串的时候,遇到回车即结束读取,于是不再出现原来的问题了。
2.遇到的问题:
在打印所有数据时,往往窗口不足以显示所有数据。
解决方案:
此时,在打印的循环语句中加入一句——if(i%10==0)getchar()。
此时每显示十个数据,需要读入一个回车符才能继续显示。
3.遇到的问题:
使用scanf命令不能把输入的数据保存到变量中,甚至于蓝屏重启。
问题原因:
变量前漏了加&。
解决办法:
在变量前加上&。
测试数据为:
Input.txt
1345Koo1936888
1933Jay1697378
1534Kate0858469
0432William1988689
0538Mary0799995
1370Xiaopeng1458656
532Babe0546545
1934ALai1899067
538Lich198887890
显示所有数据:
主面板:
输出成绩不及格的同学:
按照个人平均分排序后:
各科各分数段人数统计:
四、小结(收获和建议)
这次本次课程设计,提供了一次绝好的机会让我重新复习了大一学过的C程序设计课程。
为此,我利用了一个下午的时间把大一学过的知识重新梳理了一遍。
通过自主设计一个系统,我把原来学到的理论知识提升到了运用的层次。
我在编写这个系统的时候,遇到了很多的错误,更正程序的bug耗费了很多的时间,但这是值得的,因为bug对于每一个程序员来说都是难以避免的。
在不断修正bug的过程中,我提升了自己调试程序、排查错误的能力。
并且让我对C语言的认识进一步加深,特别是在指针的使用方面。
这也是我第一次设计一个实用的程序。
此过程让我掌握了编写设计一个软件的基本方法。
附件:
主要源程序代码
#include
#include
#include
structstudent/*定义结构体变量student*/
{
intnum;
charname[10];
intgen;
intch,en,math,av;/*语文、英语、数学、平均分*/
};
voidsumup(int*n,structstudent(*stu)[])/*计算每个人各科平均分的函数*/
{
inti;
for(i=1;i<=*n;i++)
{
(*stu)[i].av=(*stu)[i].ch+(*stu)[i].en+(*stu)[i].math;
(*stu)[i].av=(*stu)[i].av/3;
};
}
voidfailsbj(intn,structstudentstu[])/*输出不及格的名单,只要有一科不及格即进入名单*/
{
inti,c,e,m;
printf("\nThestudentslistedbelowfailinatleastonesubjects:
\n");
printf("-------------------------------------\n");
for(i=1;i<=n;i++)
{if(((stu[i].ch)<=60)||((stu[i].en)<=60)||((stu[i].math)<=60))
{printf("\n%d|",i);
printf("Num=%d",stu[i].num);
printf("Name=%s",stu[i].name);
printf("Gen=%d",stu[i].gen);
printf("Ch=%d",stu[i].ch);
printf("En=%d",stu[i].en);
printf("Math=%d",stu[i].math);
printf("Average=%d\n",stu[i].av);
};
};
printf("-------------------------------------\n");
};
voiddisplay(intn,structstudentstu[])/*输出所有数据*/
{inti;
printf("\n\nItemsareasshownbelow:
\n");
printf("-------------------------------------\n");
for(i=1;i<=n;i++)
{printf("\n%d|",i);
printf("Num=%d",stu[i].num);
printf("Name=%s",stu[i].name);
printf("Gen=%d",stu[i].gen);
printf("Ch=%d",stu[i].ch);
printf("En=%d",stu[i].en);
printf("Math=%d",stu[i].math);
printf("Average=%d\n",stu[i].av);
};
printf("-------------------------------------\n");
};
voidsearch(intn,structstudentstu[])/*依照名字或者数字搜索条目*/
{
intinfo;
inti,j,g;
chars[10];
printf("Searchnameorinformation?
\n");
printf("1.information\n");
printf("2.name\n");
printf("3.gender\n");
printf(">>");
scanf("%d",&j);
switch(j)
{
case1:
/*寻找与某数字匹配的条目*/
printf("pleasetypeintheinformationyouwanttosearch:
");
scanf("%d",&info);
printf("-------------------------------------\n");
for(i=1;i<=n;i++)
if((stu[i].num==info)||(stu[i].gen==info)||(stu[i].ch==info)||(stu[i].en==info)||(stu[i].math==info)||(stu[i].av==info))
{
printf("num=%d",stu[i].num);
printf("name=%s",stu[i].name);
printf("gen=%d",stu[i].gen);
printf("ch=%d",stu[i].ch);
printf("en=%d",stu[i].en);
printf("math=%d",stu[i].math);
printf("Average=%d\n",stu[i].av);
}
printf("-------------------------------------\n");
break;
case2:
/*寻找与某姓名匹配的条目*/
printf("pleasetypeinthenameyouwanttosearch:
");
scanf("%s",s);
printf("-------------------------------------\n");
for(i=1;i<=n;i++)
if(strcmp(stu[i].name,s)==0)
{
printf("num=%d",stu[i].num);
printf("name=%s",stu[i].name);
printf("gen=%d",stu[i].gen);
printf("ch=%d",stu[i].ch);
printf("en=%d",stu[i].en);
printf("math=%d",stu[i].math);
printf("Average=%d\n",stu[i].av);
};
printf("-------------------------------------\n");
break;
case3:
/*单列某性别的所有条目*/
printf("Whichgender?
\n");
printf(">>");
scanf("%d",&g);
printf("-------------------------------------\n");
for(i=1;i<=n;i++)
if(stu[i].gen==g)
{
printf("num=%d",stu[i].num);
printf("name=%s",stu[i].name);
printf("gen=%d",stu[i].gen);
printf("ch=%d",stu[i].ch);
printf("en=%d",stu[i].en);
printf("math=%d",stu[i].math);
printf("Average=%d\n",stu[i].av);
};
printf("-------------------------------------\n");
break;
default:
;
};
};
voidassort(intn,structstudent(*stu)[])/*排序模块*/
{
inti,j,num;
structstudentstt;
printf("Howtoassort?
:
\n");/*操作面板*/
printf("0.Accordingtothestudentnumber\n");
printf("1.Accordingtothetotalscores.\n");
printf("2.AccordingtothescoresofChinese.\n");
printf("3.AccordingtothescoresofEnglish.\n");
printf("4.AccordingtothescoresofMathematics.\n");
printf("5.Bygender\n");
printf("6.Byname\n");
printf(">>");
scanf("%d",&num);
switch(num)
{case0:
/*根据学号排序*/
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
if((*stu)[i].num>(*stu)[j].num)
{
stt=(*stu)[i];
(*stu)[i]=(*stu)[j];
(*stu)[j]=stt;
};
break;
case1:
/*根据个人各科总分排序*/
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
if((*stu)[i].tot>(*stu)[j].av)
{
stt=(*stu)[i];
(*stu)[i]=(*stu)[j];
(*stu)[j]=stt;
};
break;
case2:
/*根据语文成绩排序*/
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
if((*stu)[i].ch>(*stu)[j].ch)
{
stt=(*stu)[i];
(*stu)[i]=(*stu)[j];
(*stu)[j]=stt;
};
break;
case3:
/*根据英语成绩排序*/
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
if((*stu)[i].en>(*stu)[j].en)
{
stt=(*stu)[i];
(*stu)[i]=(*stu)[j];
(*stu)[j]=stt;
};
break;
case4:
/*根据数学成绩排序*/
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
if((*stu)[i].math>(*stu)[j].math)
{
stt=(*stu)[i];
(*stu)[i]=(*stu)[j];
(*stu)[j]=stt;
};
break;
case5:
/*根据性别排序*/
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
if((*stu)[i].gen>(*stu)[j].gen)
{
stt=(*stu)[i];
(*stu)[i]=(*stu)[j];
(*stu)[j]=stt;
};
break;
case6:
/*根据姓名排序*/
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
if(strcmp((*stu)[i].name,(*stu)[j].name)>0)
{
stt=(*stu)[i];
(*stu)[i]=(*stu)[j];
(*stu)[j]=stt;
};
break;
default:
;
};
display(n,*stu);
};
voidadd(int*n,structstudent(*stu)[])/*加入条目模块*/
{
structstudentstn;
printf("\nPleasetypethenewitemhere:
");
printf("\nThestudentnumberis");
scanf("%d",&stn.num);
printf("\nWhatisthename?
");
scanf("%s",&stn.name);
printf("\nWhatisthegender?
");
scanf("%d",&stn.gen);
printf("\nThemarksofChineseis:
");
scanf("%d",&stn.ch);
printf("\nThemarksofEnglishis:
");
scanf("%d",&stn.en);
printf("\nThemarksofMathematicsis:
");
scanf("%d",&stn.math);
(*n)++;
(*stu)[*n]=stn;
sumup(n,stu);/*修改后重新计算平均分*/
display(*n,*stu);
};
voiddel(int*n,structstudent(*stu)[])/*删除条目模块*/
{
inti,j,k,b,m;
structstudentstnul={0};
b=0;
printf("\nWhichstudentnumberdoyouwanttodelete?
");
scanf("%d",&m);
for(i=1;i<=*n;i++)
if((*stu)[i].num==m)
{b=1;break;}
if(b==1)
{
for(j=i;j<=*n-1;j++)
(*stu)[j]=(*stu)[j+1];
(*stu)[*n]=stnul;
(*n)--;
}
else
printf("\nCan'tnotfind%d\n",m);
sumup(n,stu);/*修改后重新计算平均分*/
display(*n,*stu);
};
voidedit(int*n,structstudent(*stu)[])/*编辑条目模块*/
{
inti,j,num1;
printf("Whichonedoyouwanttoedit?
Please
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 学生 管理 系统 语言 课程设计 华南理工大学
![提示](https://static.bdocx.com/images/bang_tan.gif)