程序设计及问题求解下实验答案.docx
- 文档编号:4978082
- 上传时间:2022-12-12
- 格式:DOCX
- 页数:44
- 大小:24.63KB
程序设计及问题求解下实验答案.docx
《程序设计及问题求解下实验答案.docx》由会员分享,可在线阅读,更多相关《程序设计及问题求解下实验答案.docx(44页珍藏版)》请在冰豆网上搜索。
程序设计及问题求解下实验答案
实验数组、结构体和函数综合编程练习
1.学生成绩统计
从键盘输入一个班(全班最多不超过30人)学生某门课的成绩,当输入成绩为负值时,输入结束,分别实现下列功能:
(1)统计不及格人数并打印不及格学生;
(2)统计成绩在全班平均分及平均分之上的学生人数,并打印这些学生的;
(3)统计各分数段的学生人数及所占的百分比。
注:
将成绩分为六个分数段,60分以下为第0段,60~69为第1段,70~79为第2段,80~89为第3段,90~99为第4段,100分为第5段。
编程要求:
1.较好的用户输入输出提示信息
2.使用子函数来实现上述各个功能,并且要使用结构体数组来实现,该结构体中包括学生学号和成绩
3.最好不要使用全局变量
#include
#defineARR_SIZE30
typedefstructtagStudent
{
longnum;//学生学号
floatscore;//学生分数
}Student;
intReadScore(Studentstu[]);
intGetFail(Studentstu[],intn);
floatGetAver(Studentstu[],intn);
intGetAboveAver(Studentstu[],intn);
voidGetDetail(Studentstu[],intn);
main()
{
intn,fail,aboveAver;
Studentstu[ARR_SIZE];
printf("Pleaseenternumandscoreuntilscore<0:
\n");
n=ReadScore(stu);
printf("Totalstudents:
%d\n",n);
fail=GetFail(stu,n);
printf("Failstudents=%d\n",fail);
aboveAver=GetAboveAver(stu,n);
printf("Aboveaverstudents=%d\n",aboveAver);
GetDetail(stu,n);
}
/*函数功能:
从键盘输入一个班学生某门课的成绩及其学号
当输入成绩为负值时,输入结束
函数参数:
存放学生信息的Student结构体数组
函数返回值:
学生总数
*/
intReadScore(Studentstu[])
{
inti=0;
scanf("%ld%f",&stu[i].num,&stu[i].score);
while(stu[i].score>=0)
{
i++;
scanf("%ld%f",&stu[i].num,&stu[i].score);
}
returni;
}
/*函数功能:
统计不及格人数并打印不及格学生
函数参数:
存放学生信息的Student结构体数组
整型变量n,存放学生总数
函数返回值:
不及格人数
*/
intGetFail(Studentstu[],intn)
{
inti,count;
printf("Fail:
\nnumber--score\n");
count=0;
for(i=0;i { if(stu[i].score<60) { printf("%ld------%.0f\n",stu[i].num,stu[i].score); count++; } } returncount; } /*函数功能: 计算全班平均分 函数参数: 存放学生信息的Student结构体数组 整型变量n,存放学生总数 函数返回值: 平均分 */ floatGetAver(Studentstu[],intn) { inti; floatsum=0; for(i=0;i { sum=sum+stu[i].score; } returnsum/n; } /*函数功能: 统计成绩在全班平均分及平均分之上的学生人数并打印其学生 函数参数: 存放学生信息的Student结构体数组 整型变量n,存放学生总数 函数返回值: 成绩在全班平均分及平均分之上的学生人数 */ intGetAboveAver(Studentstu[],intn) { inti,count; floataver; aver=GetAver(stu,n); printf("aver=%f\n",aver); printf("Aboveaver: \nnumber--score\n"); count=0; for(i=0;i { if(stu[i].score>=aver) { printf("%ld------%.0f\n",stu[i].num,stu[i].score); count++; } } returncount; } /*函数功能: 统计各分数段的学生人数及所占的百分比 函数参数: 存放学生信息的Student结构体数组 整型变量n,存放学生总数 函数返回值: 无 */ voidGetDetail(Studentstu[],intn) { inti,j,stuLevel[6]; for(i=0;i<6;i++) { stuLevel[i]=0; } for(i=0;i { if(stu[i].score<60) { j=0; } else { j=((int)stu[i].score-50)/10; } stuLevel[j]++; } for(i=0;i<6;i++) { if(i==0) { printf("<60%d%.2f%%\n",stuLevel[i], (float)stuLevel[i]/(float)n*100); } elseif(i==5) { printf("%d%d%.2f%%\n",(i+5)*10,stuLevel[i], (float)stuLevel[i]/(float)n*100); } else { printf("%d--%d%d%.2f%%\n",(i+5)*10,(i+5)*10+9, stuLevel[i],(float)stuLevel[i]/(float)n*100); } } } 2.成绩排名次 某班期末考试科目为数学(MT)、英语(EN)和物理(PH),有最多不超过30人参加考试。 要求: (1)计算每个学生的总分和平均分; (2)按总分成绩由高到低排出成绩的名次; (3)打印出名次表,表格包括学生编号、各科分数、总分和平均分; (4)任意输入一个学号,能够查找出该学生在班级中的排名及其考试分数 #include #defineSTU30 typedefstructtagStudent { longnum;//学号 floataver;//平均分 intsum;//总分 intmath;//数学(MT) intenglish;//英语(EN) intphysics;//物理(PH) }Student; voidInput(Studentstu[],intn); voidGetSumAver(Studentstu[],intn); voidSort(Studentstu[],intn); voidPrint(Studentstu[],intn); intSearch(Studentstu[],intn,longx); main() { intn,pos; longx; Studentstu[STU]; printf("Pleaseenterthetotalnumberofthestudents(n<=30): "); scanf("%d",&n);/*输入参加考试的学生人数*/ printf("EnterNo.andscoreas: MTENPH\n"); Input(stu,n);/*输入学生成绩*/ GetSumAver(stu,n);/*计算总分和平均分*/ printf("Beforesort: \n"); Print(stu,n); Sort(stu,n);/*排名次*/ printf("Aftersort: \n"); Print(stu,n); printf("Pleaseentersearchingnumber: "); scanf("%ld",&x);/*以长整型格式输入待查找学生的学号*/ pos=Search(stu,n,x);/*名次查询*/ if(pos! =-1) { printf("position: \tNO\tMT\tEN\tPH\tSUM\tAVER\n"); printf("%8d\t%4ld\t%4d\t%4d\t%4d\t%5d\t%5.0f\n", pos+1,stu[pos].num,stu[pos].math,stu[pos].english, stu[pos].physics,stu[pos].sum,stu[pos].aver); } else { printf("Notfound! \n"); } } /*函数功能: 输入某班学生期末考试三门课程成绩 函数参数: 结构体数组stu,存放学生信息 整型变量n,存放学生人数 函数返回值: 无 */ voidInput(Studentstu[],intn) { inti; for(i=0;i { scanf("%ld",&stu[i].num); scanf("%d",&stu[i].math); scanf("%d",&stu[i].english); scanf("%d",&stu[i].physics); } } /*函数功能: 计算每个学生的总分和平均分 函数参数: 结构体数组stu,存放学生信息 整型变量n,存放学生人数 函数返回值: 无 */ voidGetSumAver(Studentstu[],intn) { inti; for(i=0;i { stu[i].sum=stu[i].english+stu[i].math+stu[i].physics; stu[i].aver=(float)stu[i].sum/3; } } /*函数功能: 按总分成绩由高到低排出成绩的名次 函数参数: 结构体数组stu,存放学生信息 整型变量n,存放学生人数 函数返回值: 无 */ voidSort(Studentstu[],intn) { inti,j,k; StudenttempStu; for(i=0;i { k=i; for(j=i+1;j { if(stu[j].sum>stu[k].sum)k=j; } if(k! =i) { tempStu=stu[i]; stu[i]=stu[k]; stu[k]=tempStu; } } } /*函数功能: 打印名次表,表格包括学生编号、各科分数、总分和平均分 函数参数: 结构体数组stu,存放学生信息 整型变量n,存放学生人数 函数返回值: 无 */ voidPrint(Studentstu[],intn) { inti; printf("NO\t|MT\tEN\tPH\tSUM\tAVER\n"); printf("----------------------------------------------------\n"); for(i=0;i { printf("%ld\t|",stu[i].num); printf("%4d\t%4d\t%4d\t",stu[i].math,stu[i].english,stu[i].physics); printf("%5d\t%5.0f\n",stu[i].sum,stu[i].aver); } } /*函数功能: 查找学生的学号 函数参数: 结构体数组stu,存放学生信息 整型变量n,存放学生人数 长整型变量x,存放待查找学生的学号 函数返回值: 找到时,返回学生学号在数组中的下标位置,否则返回值-1 */ intSearch(Studentstu[],intn,longx) { inti; for(i=0;i { if(stu[i].num==x)return(i); } return(-1); } 实验递归程序设计 求游戏人员的年龄 1.求游戏人员的年龄 #include intage(intn); intmain() { intage5; age5=age(5); printf("第5个人的年龄为%d\n",age5); } intage(intn) { if(n==1) return10; else returnage(n-1)+2; } 求最大公约数 #include intgcd(intx,inty); intmain() { intx,y; intgcdResult; printf("输入要计算最大公约数的两个数: "); scanf("%d%d",&x,&y); gcdResult=gcd(x,y); printf("最大公约数为%d\n",gcdResult); } intgcd(intx,inty) { if(x==y) returnx; elseif(x>y) returngcd(x-y,y); elsereturngcd(x,y-x);/*x } 实验链表编程 //注: 该程序并没有出错控制,假设用户输入都是正常的围 #include usingnamespacestd; structNode { intdata; Node*next; }; voidcreateList(Node*head,intnum); intfindByNo(Node*head,intnum); intfindByData(Node*head,intdata); voidinsertData(Node*head,intdata,intnum); voiddeleteData(Node*head,intnum); voidprintOut(Node*head); voidmain() { //inta[6]={21,23,25,27,29,31}; intnum; intdata; Node*head=newNode(); cout<<"请输入6个结点的值: "; createList(head,6); cout<<"该链表为: "; printOut(head); printf("请输入要查找的结点的序号(1-6): "); cin>>num; data=findByNo(head,num); cout<<"查找到的结点的值为"< printf("请输入要查找的结点的值: "); cin>>data; num=findByData(head,data); cout<<"查找到的结点的序号为: "< cout<<"插入结点位置: "; cin>>num; cout<<"插入结点的值: "; cin>>data; insertData(head,data,num); cout<<"请输入要删除的结点序号: "; cin>>num; deleteData(head,num); } intfindByNo(Node*head,intnum) { intcount=0; Node*p=head; while(p->next! =NULL) { p=p->next; count++; if(count==num) { returnp->data; } } } intfindByData(Node*head,intdata) { Node*p=head; intcount=0; while(p->next! =NULL) { p=p->next; count++; if(p->data==data) { returncount; } } } //输入序号num和值data。 在序号为num的结点后插入data,并输出该链表 voidinsertData(Node*head,intdata,intnum) { intcount=0; Node*p=head; while(p->next! =NULL) { p=p->next; count++; if(count==num) { Node*q=newNode(); q->data=data; q->next=p->next; p->next=q; printOut(head); return; } } } //输入序号num,删除序号为num的结点,并输出该链表 voiddeleteData(Node*head,intnum) { intcount=0; Node*p=head->next; Node*pre=head; while(p! =NULL) { count++; if(count==num)//删除节点 { pre->next=p->next; deletep; printOut(head); return; } else { pre=p; p=p->next; } } } voidprintOut(Node*head) { Node*p=head->next; while(p! =NULL) { printf("%d",p->data); p=p->next; } cout< } voidcreateList(Node*head,intnum) { Node*p; Node*q=head; for(inti=0;i { p=newNode(); cin>>p->data; p->next=NULL; q->next=p; q=q->next; } } 实验结构、链表综合编程 注意: 下面的代码用到了文件,但是学生编程并不要求使用文件 【编写程序】: 建立多个班级学生成绩链表,其中,每个结点包含下面这些信息: 学号、、成绩 要求完成下面的功能: 1.建立2个班学生成绩的无序链表,其中每个班包含10个结点数据(输入或从文件中读取每个同学的信息),将每个班的成绩链表按成绩高低排序后分别输出该链表; 2.将2个班级学生成绩合并(按成绩高低排序)后输出; 3.查找学生成绩: 通过输入同学的学号,将该同学从链表中找出,并输出该同学信息;如果找不到,则输出“无此学生”。 //class1.txt 101a56 102b78 103c69 104d26 105e60 106f66 107g70 108h90 109i92 110j99 //class2.txt 201aa26 202bb55 203cc78 204dd46 205ee89 206ff65 207gg99 208hh85 209ii73 210jj96 代码如下: #include usingnamespacestd; #include structNode { charno[5]; charname[6]; doubleperform; Node*next; }; voidprintOut(Node*head) { Node*p=head->next; while(p! =NULL) { cout< p=p->next; } cout< } voidmain() { Node*q; Node*p; inti; //读入班级1,构成链表 Node*headClass1=newNode(); q=headClass1; ifstreamfin1("class1.txt"); if(! fin1) { cout<<"文件1打开失败! "< return; } for(i=0;i<10;i++) { p=newNode(); fin1>>p->no>>p->name>>p->perform; p->next=NULL; q->next=p; q=q->next; } cout<<"班级1原始数据为: "< printOut(headClass1); //读入班级2,构成链表 Node*headClass2=newNode();
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序设计 问题 求解 实验 答案