聪明文档网

聪明文档网

最新最全的文档下载
当前位置: 首页> 32 电气信息类 C1142班 常涛 116276 课程设计报告书 (最终版)

32 电气信息类 C1142班 常涛 116276 课程设计报告书 (最终版)

时间:    下载该word文档
编号:00
河北工业大学计算机软件技术基础(VC2012年课程设计报告
学院班级姓名学号成绩
一、题目
设置成绩等级(32
二、设计思路
1、总体设计1)分析程序的功能
对学生成绩设定成绩等级。在输入学生人数(人数不大于100)后,然后输入每个学生的学号和三门课成绩。计算总分,按照总分设定成绩等级:前20%A级;其后的40%B级;其后的30%C级;最后的10%D级。输出:1按总分由高到低输出:学生的学号、三门课成绩、总分和成绩等级;2按输入顺序输出。
设定成绩等级依据四舍五入的原则:如果计算出的A级为2.6人,即设定为3人;如果为2.4人,则设定为2人。
依据程序要求,采用模块化设计方法,设计六个功能模块来实现。使用结构体数组,对学生进行结构体变量的设定,并对结构体数组中的数组元素中的各个成员学号、成绩、总分、等级进行访问处理。在该程序中调用求和函数、if函数、排序函数等分别对各个元素进行求和,设定等级,排序。最后运行程序依据指令按要求输出结果。
2)系统总体结构:
模块
对输入学生信息的
设定计算总成绩按分数排序设定等级按输入顺序输出结
果的设定按照总分由高到低的顺序输出的设定
内容
依次输入学生的学号三
科成绩
利用求和函数求出每个学生的总成绩SUMSCORE
调用排序函数依照要求分数由高到低
设定等级输入相应的输出函数输入相应的输出函数
1/16

2、各功能模块的设计:说明各功能模块的实现方法1)对输入学生信息的设定模块#include#include#include
structstudents定义结构体类型{intsNo;intscore[3];intsumScore;
chargrade;
};//输入boolsameNo(students*sIn,intn{//检查重复学号for(inti=0;i{for(intj=i+1;j{if(sIn[i].sNo==sIn[j].sNo
returntrue;
}
}
returnfalse;
}
students*getStudents(intn
{
//申请存储输入学生的空间students*allStudents=newstudents[n];

cout<<"输入所有学生信息(学号成绩)"<
编号:00
2/16

编号:00

cin>>allStudents[i].sNo>>allStudents[i].score[0]>>allStudents[i].score[1
for(inti=0;i{
//依次输入n个学生的学号三个成绩
]>>allStudents[i].score[2];

//计算总成绩
allStudents[i].sumScore
=
allStudents[i].score[0]
+
allStudents[i].score[1]+allStudents[i].score[2];

}
while(sameNo(allStudents,n{
cout<<"有错误,重新输入:"<for(inti=0;i{
//依次输入n个学生的学号三科成绩
cin>>allStudents[i].sNo>>allStudents[i].score[0]>>allStudents[i].score[1
]>>allStudents[i].score[2];
2)计算总成绩模块//计算总成绩

allStudents[i].sumScore
=
allStudents[i].score[0]
+
allStudents[i].score[1]+allStudents[i].score[2];

returnallStudents;
3/16
}
}
3)按分数排序模块

编号:00
按分数排序
students*sortByScore(students*sIn,intn{
//存储排序后的n个学生
students*sSorted=newstudents[n];
for(inti=0;i{//存入学生信息}
intno,sum,temp;for(i=0;i{


sSorted[j-1].sNo=no;sSorted[j-1].sumScore=sum;
4/16
sSorted[i].sNo=sIn[i].sNo;
sSorted[i].sumScore=sIn[i].sumScore;for(intj=0;j<3;j++
sSorted[i].score[j]=sIn[i].score[j];
for(intj=n-1;j>i;j--{
if(sSorted[j].sumScore>sSorted[j-1].sumScore{//后面大于前面则交换
no=sSorted[j].sNo;sum=sSorted[j].sumScore;
sSorted[j].sNo=sSorted[j-1].sNo;
sSorted[j].sumScore=sSorted[j-1].sumScore;

编号:00
}
returnsSorted;}
4)设定等级模块/设置等级
intround(doublen{//四舍五入}
voidgrade(students*sSorted,intn
{//此处的分级规则有问题。用四舍五入的话容易产生两个带0.5导致总人数多一人等问题。

//采取的解决办法是,如果将四个等级人数求和后于总人数不符,则在D类里if((n-floor(n<0.5
return(intn;
}
}
for(intk=0;k<3;k++{}
temp=sSorted[j].score[k];
sSorted[j].score[k]=sSorted[j-1].score[k];sSorted[j-1].score[k]=temp;
else
return(int(floor(n+1;
面多退少补。此方法不甚合理,有待改进。

if(n==1//只有一人,则默认为A{
5/16

sSorted[0].grade='A';return;
}
elseif(n==2{sSorted[0].grade='A';sSorted[1].grade='B';return;
}
//a,b,c,d存储各类的人数inta=round(n*0.2;intb=round(n*0.4;intc=round(n*0.3;intd=round(n*0.1;
intnn=a+b+c+d;if(nn>n
{//总和多了,从D类中扣除,D类不够则从C类中继续扣除if(nn-n>d{d=0;
c=c-(nn-n-d;
}else
d=d-(nn-n;}
if(nn
{//总和少了都补充到D类;
d=d+(n-nn;
编号:00
6/16

}
//设置级别,存入sSorted数组的gradeinti;
for(i=0;i{sSorted[i].grade='A';
}
for(i=a;i{sSorted[i].grade='B';}
for(i=a+b;i{sSorted[i].grade='C';}
for(i=a+b+c;i{sSorted[i].grade='D';}
}
5)按输入顺序输出模块
/设置按输入顺序排列的学生的等级
voidgradeOfInput(students*sIn,students*sSorted,intn{//复制sorted中每个学号对应的等级到sInfor(inti=0;i{

for(intj=0;j
编号:00
7/16

编号:00
}
//输出函数
voidoutputStudents(students*sIn,students*sSorted,intn{
cout<
cout<<"按照总分由高到低的学生成绩:"<for(inti=0;i{}
{}
if(sIn[i].sNo==sSorted[j].sNo{
sIn[i].grade=sSorted[j].grade;
}
1]<<"\t"<


<<"\t"<}
cout<
6)按照总分由高到低的顺序输出模块cout<<"按照输入顺序的学生成绩:"<
cout<
for(i=0;i{
n[i].score[2]<<"\t"


<<"\t"<
8/16

编号:00
}
7)创新设计部分
1.输入成绩等级的设置方式:等级数目;每个等级人数的百分比较便利。
2.在学生的等级处理过程中采用了较便利的处理方法避免了一些数据差异带来的
不便
3.该程序在运行过程中对学号、人数的输入管理较为适宜为附加功能
}

3、设计中的主要困难及解决方案
在该程序的编辑过程中如何实现对总分按所要求的标准进行等级的设定及实现对结果分别按输入顺序及分数由高到低的的输出较为困难。
针对上述问题采用如果用四舍五入的话产生了两个带0.5的导致总人数多一人等问题将使四个等级人数求和后于总人数不符,则在D类里面多退少补

4、你所设计的程序最终完成的功能1)说明你编制的程序能完成的功能
对输入的一定数量的学生的成绩进行处理实现:1)按总分由高到低输出:学生的学号、三门课成绩、总分和成绩等级;2)按输入顺序输出。
2)准备的测试数据及运行结果
3
9/16

编号:00

三、程序清单
#include#include#include
structstudents//定义结构体类型{intsNo;//学号intscore[3];//三门课程的成绩intsumScore;//总分chargrade;//成绩等级};boolsameNo(students*sIn,intn{for(inti=0;i{for(intj=i+1;j{if(sIn[i].sNo==sIn[j].sNoreturntrue;}}returnfalse;}
students*getStudents(intn{
10/16

编号:00
//申请存储输入学生信息的地点students*allStudents=newstudents[n];cout<<"输入学生信息(学号三科成绩)"<for(inti=0;i{//依次输入n个学生的学号三科成绩cin>>allStudents[i].sNo>>allStudents[i].score[0]>>allStudents[i].score[1]>>allStudents[i].score[2];//计算总成绩allStudents[i].sumScore=allStudents[i].score[0]+allStudents[i].score[1]+allStudents[i].score[2];}while(sameNo(allStudents,n{cout<<"有错误,重新输入:"<for(inti=0;i{//依次输入n个学生的学号三科成绩cin>>allStudents[i].sNo>>allStudents[i].score[0]>>allStudents[i].score[1]>>allStudents[i].score[2];//计算总成绩allStudents[i].sumScore=allStudents[i].score[0]+allStudents[i].score[1]+allStudents[i].score[2];}}returnallStudents;}
//按分数排序
students*sortByScore(students*sIn,intn{//存储排序后的n个学生信息students*sSorted=newstudents[n];for(inti=0;i{//存入学生信息(学号三科成绩总分等级)sSorted[i].sNo=sIn[i].sNo;sSorted[i].sumScore=sIn[i].sumScore;for(intj=0;j<3;j++sSorted[i].score[j]=sIn[i].score[j];
11/16

}

intno,sum,temp;for(i=0;i{for(intj=n-1;j>i;j--{if(sSorted[j].sumScore>sSorted[j-1].sumScore{//后者大于前者则交换no=sSorted[j].sNo;sum=sSorted[j].sumScore;sSorted[j].sNo=sSorted[j-1].sNo;sSorted[j].sumScore=sSorted[j-1].sumScore;sSorted[j-1].sNo=no;sSorted[j-1].sumScore=sum;for(intk=0;k<3;k++{temp=sSorted[j].score[k];sSorted[j].score[k]=sSorted[j-1].score[k];sSorted[j-1].score[k]=temp;}}}}
returnsSorted;
}

//设置等级
intround(doublen{/if((n-floor(n<0.5return(intn;elsereturn(int(floor(n+1;}
voidgrade(students*sSorted,intn{if(n==1{
编号:00
12/16

sSorted[0].grade='A';return;}
elseif(n==2{sSorted[0].grade='A';sSorted[1].grade='B';return;}
//a,b,c,d存储三类等级的人数inta=round(n*0.2;intb=round(n*0.4;intc=round(n*0.3;intd=round(n*0.1;
intnn=a+b+c+d;if(nn>n
{//总人数多了,从D类中扣除,D类不够则从C类中继续扣除if(nn-n>d{d=0;c=c-(nn-n-d;}elsed=d-(nn-n;}
if(nn
{//总和少了都补充到D类;d=d+(n-nn;}
//设置级别,存入sSorted数组的gradeinti;
for(i=0;i{sSorted[i].grade='A';}
for(i=a;i{sSorted[i].grade='B';}
for(i=a+b;i{sSorted[i].grade='C';
编号:00
13/16


编号:00
}for(i=a+b+c;i{sSorted[i].grade='D';}}
//设置按输入顺序排列的学生的等级
voidgradeOfInput(students*sIn,students*sSorted,intn{//复制sorted中每个学号对应的等级到sInfor(inti=0;i{for(intj=0;j{if(sIn[i].sNo==sSorted[j].sNo{sIn[i].grade=sSorted[j].grade;}}}}
//输出函数
voidoutputStudents(students*sIn,students*sSorted,intn{cout<<"按照总分由高到低的学生成绩:"<for(inti=0;i{cout<2]<<"\t"<<"\t"<}cout<cout<<"按照输入顺序的学生成绩:"<for(i=0;i{cout<<<"\t"<}}
voidmain(
14/16

编号:00
{}
intn=0;
cout<<"输入总人数(不大于100"<cin>>n;
while(n<1||n>100{cout<<"有错误,重新输入!"<cin>>n;}
students*sInput=getStudents(n;
students*sSorted=sortByScore(sInput,n;grade(sSorted,n;
gradeOfInput(sInput,sSorted,n;outputStudents(sInput,sSorted,n;system("pause";
四、对该设计题目有何更完善的方案
1、对自己完成程序进行自我评价。
我所设计的程序可以顺利运行并能输出正确的结果,这是对自己的学习成果的积极的肯定,自己对此感到自豪与欣慰。
2、对课题提出更完善的方案
在该程序中对于学生的等级设置部分可做出近一步的优化,已实现对各种大小的人数的处理而能够更为合理用四舍五入的方法去判定成绩等级。
五、收获及心得体会
经过近一周的努力,我终于编辑出了符合课题要求的C++程序。在这几天里自己付出了很多,同样也收获了很多。自己能够运用所学的知识去解决最为实际的问题,虽然我所做的仍然存在着很大不足,但也是自己的一分成果。在这个过程中,我在心态思维等各个方面得到了锻炼,自己能够发现问题,解决问题为自己将来真正的走向社会解决问题也做作了铺垫。做为一名工科学校的大学生实践动手的能力是我
15/16

编号:00
们必须具有的。将自己课堂上所学的理论知识应用于实践学以致用才是有意义的。当然自己在这次课程设计中也暴露出很多的缺陷比如对于各类函数的应用对于数据差异的处理及对程序的细微格式的设置问题等等,自己在以后的学习生活中会做出进一步的改进,加强对各科知识的由其是计算机课程的学习力度并在平时多多练习广泛实践,力争让自己在计算机应用上能够游刃有余,同时在此也希望老师能够给予我一个积极的肯定给我一个合适的分数,在此谢谢老师。
日期:2012627
16/16

  • 29.8

    ¥45 每天只需1.0元
    1个月 推荐
  • 9.9

    ¥15
    1天
  • 59.8

    ¥90
    3个月

选择支付方式

  • 微信付款
郑重提醒:支付后,系统自动为您完成注册

请使用微信扫码支付(元)

订单号:
支付后,系统自动为您完成注册
遇到问题请联系 在线客服

常用手机号:
用于找回密码
图片验证码:
看不清?点击更换
短信验证码:
新密码:
 
绑定后可用手机号登录
请不要关闭本页面,支付完成后请点击【支付完成】按钮
遇到问题请联系 在线客服