程序设计与问题求解下实验答案.docx
《程序设计与问题求解下实验答案.docx》由会员分享,可在线阅读,更多相关《程序设计与问题求解下实验答案.docx(43页珍藏版)》请在冰豆网上搜索。
程序设计与问题求解下实验答案
实验数组、结构体和函数综合编程练习
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<no<<""<name<<""<perform<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();