程序设计与问题求解下实验答案.docx

上传人:b****6 文档编号:5842239 上传时间:2023-01-01 格式:DOCX 页数:44 大小:24.65KB
下载 相关 举报
程序设计与问题求解下实验答案.docx_第1页
第1页 / 共44页
程序设计与问题求解下实验答案.docx_第2页
第2页 / 共44页
程序设计与问题求解下实验答案.docx_第3页
第3页 / 共44页
程序设计与问题求解下实验答案.docx_第4页
第4页 / 共44页
程序设计与问题求解下实验答案.docx_第5页
第5页 / 共44页
点击查看更多>>
下载资源
资源描述

程序设计与问题求解下实验答案.docx

《程序设计与问题求解下实验答案.docx》由会员分享,可在线阅读,更多相关《程序设计与问题求解下实验答案.docx(44页珍藏版)》请在冰豆网上搜索。

程序设计与问题求解下实验答案.docx

程序设计与问题求解下实验答案

实验数组、结构体和函数综合编程练习

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=newNod

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1