程序设计与问题求解II实验报告.docx
《程序设计与问题求解II实验报告.docx》由会员分享,可在线阅读,更多相关《程序设计与问题求解II实验报告.docx(52页珍藏版)》请在冰豆网上搜索。
程序设计与问题求解II实验报告
实验一数组、结构体和函数综合编程练习
一、实验目的
1.复习数组,结构体和函数的相关知识
2.掌握利用数组存储数据和进行编程的方法
3.进一步掌握函数的编写
二、实验内容
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
usingnamespacestd;
#defineN30
structstudent
{
longnum;//学生学号
floatscore;//学生分数
};
studentstu[N];
intReadscore(studentstu[])//从键盘输入一个班学生某门课的成绩及其学号
当输入成绩为负值时,输入结束
{
cout<<"请依次输入学生的成绩(百分制)及其学号"<intn=0;
for(inti=0;i{
cin>>stu[i].score>>stu[i].num;
if(stu[i].score<0)
{
break;
}
n++;
}
returnn;
}
intGetfail(studentstu[],intn)//统计不及格人数并打印不及格学生名单
{
inta=0;
for(inti=0;i{
if(stu[i].score>0&&stu[i].score<=60)//保证大于零,成绩为负值的就不会输出了
{
cout<a++;
}
}
returna;
}
floatGetaver(studentstu[],intn)//计算全班平均分
{
floata=0;
for(inti=0;i{
a=stu[i].score+a;
}
returna/n;
}
intGetaboveaver(studentstu[],intn,floataver)//统计成绩在全班平均分及平均分之上的学生人数并打印其学生名单
{
intm=0;
for(inti=0;i{
if(stu[i].score>=aver)
{
m++;
cout<}
}
returnm;
}
voidGetdetail(studentstu[],intn)//统计各分数段的人数及所占的百分比
{
floatduan[6]={0,0,0,0,0,0};
for(inti=0;i{
switch(int((stu[i].score)/10))
{
case10:
duan[5]++;
break;
case9:
duan[4]++;
break;
case8:
duan[3]++;
break;
case7:
duan[2]++;
break;
case6:
duan[1]++;
break;
default:
duan[0]++;
}
}
cout<<"六十分以下的人数为:
"<"<cout<<"60-69的人数为:
"<"<cout<<"70-79的人数为:
"<"<cout<<"80-89的人数为:
"<"<cout<<"90-99的人数为:
"<"<cout<<"满分的人数为:
"<"<}
intmain()
{
//studentstu[N];
intnum=Readscore(stu);
cout<<"------------不及格名单-----------------------------"<intnum1=Getfail(stu,num);
cout<<"-------------平均分---------------------------------"<floataverage=Getaver(stu,num);
cout<cout<<"----------------高于平均分名单---------------------"<Getaboveaver(stu,num,average);
cout<<"----------------------------------------------------"<Getdetail(stu,num);
cout<<"----------------------------------------------------"<return0;
}
输入输出:
请依次输入学生的成绩(百分制)及其学号
891
342
643
784
-55
------------不及格名单-----------------------------
234
-------------平均分---------------------------------
65
----------------高于平均分名单---------------------
189
478
----------------------------------------------------
六十分以下的人数为:
1所占百分比为:
25%
60-69的人数为:
1所占百分比为:
25%
70-79的人数为:
1所占百分比为:
25%
80-89的人数为:
1所占百分比为:
25%
90-99的人数为:
0所占百分比为:
0%
满分的人数为:
0所占百分比为:
0%
----------------------------------------------------
2.成绩排名次
某班期末考试科目为数学(MT)、英语(EN)和物理(PH),有最多不超过30人参加考试。
要求:
(1)计算每个学生的总分和平均分;
(2)按总分成绩由高到低排出成绩的名次;
(3)打印出名次表,表格内包括学生编号、各科分数、总分和平均分;
(4)任意输入一个学号,能够查找出该学生在班级中的排名及其考试分数
编程要求:
良好的用户输入输出提示信息
使用子函数实现各个功能
必须用结构体数组实现
三、实验结果与分析
将源程序、运行结果和分析以及实验中遇到的问题和解决问题的方法,写在实验报告上
源程序:
#include
#defineN2
usingnamespacestd;
doublezongfen[N];
doublepingjun[N];
structMARK
{
doublemath;
doubleen;
doubleph;
intnum;
};//要加分号才行!
!
!
!
voidjisuanchengji(MARKa[])
{
cout<<"----------排序前的成绩单----------"<for(inti=0;i{
zongfen[i]=a[i].math+a[i].en+a[i].ph;
pingjun[i]=(a[i].math+a[i].en+a[i].ph)/3;
cout<
总分:
"<"<}
}
voidpaixu(doublezongfen1[],doublepingjun[],MARKb[])
{
//doublemax=zongfen1[0];
MARKe;
for(intj=0;j{
doublemax=zongfen1[0];
doubleaver=pingjun[0];
for(inti=0;i{
if(zongfen1[i]{max=zongfen1[i];zongfen1[i]=zongfen1[i+1];zongfen1[i+1]=max;
e=b[i];
b[i]=b[i+1];
b[i+1]=e;
aver=pingjun[i];
pingjun[i]=pingjun[i+1];
pingjun[i+1]=aver;
}
}
}
}
voidprint(MARKf[],doublezongfen[],doublepingjun[])
{
cout<<"----------排序后的成绩单----------"<cout<<"名次\t";
cout<<"学号"<<"\t数学成绩"<<"\t英语成绩"<<"\t物理成绩"<<"\t平均分"<<"\t总分"<for(inti=0;i{
cout<
cout<<"\t\t"<cout<<"\t"<}
}
voidmyfind(MARKf[],doublezongfen[],doublepingjunfen[])
{
intnumber;
cout<<"请输入要查找的学生学号"<cin>>number;
for(inti=0;i{if(number==f[i].num)
{cout<<"名次"<<"\t学号"<<"\t数学成绩"<<"\t英语成绩"<<"\t物理成绩"<<"\t平均分"<<"\t总分"<cout<
cout<<"\t\t"<}
}
}
intmain()
{
//doublezongfen[N];
//doublepingjun[N];
MARKmymark[N];
cout<<"请依次输入学生的学号,数学成绩,英语成绩,物理成绩"<for(intj=0;j{
cin>>mymark[j].num>>mymark[j].math>>mymark[j].en>>mymark[j].ph;
}
jisuanchengji(mymark);//主函数中调用函数时就不要再加【】
paixu(zongfen,pingjun,mymark);
print(mymark,zongfen,pingjun);
myfind(mymark,zongfen,pingjun);
return0;
}
输入输出:
请依次输入学生的学号,数学成绩,英语成绩,物理成绩
101758578
102788934
----------排序前的成绩单----------
1:
总分:
238平均分:
79.3333
2:
总分:
201平均分:
67
----------排序后的成绩单----------
名次学号数学成绩英语成绩物理成绩平均分总分
110175857879.3333238
210278893467201
请输入要查找的学生学号
101
名次学号数学成绩英语成绩物理成绩平均分总分
110175857879.3333238
实验小结:
通过这次试验用结构体重新编写了上学期做过的两个题目,相比之下,现在的方法更为简单,让自己有一种豁然开朗的感觉。
灵活的运用结构体可以简化不少问题。
实验二链表编程
一、实验目的:
1.掌握建立链表中指针的运用、插入删除节点的方法;
二、实验准备:
1.复习链表的概念;建立链表的过程;链表节点的插入与删除;
2.预习实验内容,并在预习报告上写出程序流程图(或源代码);
3.上机输入源程序,调试运行并记录运行结果;
4.将源程序存在自己的软盘上,课后按要求写实验报告。
三、实验内容:
【编写程序】:
编写函数,实现以下有关链表的各项功能
1.建立一个单链表212325272931,并输出该链表;
2.输入序号n,查找序号为n的结点,并输出;
4.输入值x,查找值为x的结点,并输出;
5.插入结点:
输入序号n和值x。
在序号为n的结点后插入x,并输出该链表;
6.删除结点:
输入序号n,册除序号为n的结点,并输出该链表。
程序运行结果:
该链表为:
212325272931
输入序号:
3
输出值为:
25
输入值:
29
输出序号:
5
插入结点:
3,26
输出链表:
21232526272931
删除结点:
3
输出链表:
212326272931
源程序:
#include
usingnamespacestd;
structstudent
{
intscore;
intnum;
structstudent*next;
};
voidprint(structstudent*head)
{
structstudent*p;
cout<<"建立的链表如下:
"<p=head;
if(head!
=NULL)
{
do
{
cout<num<<"\n";
p=p->next;
}while(p!
=NULL);
}
}
voidfind(structstudent*head,intn)
{structstudent*p,*p1;
inti=0,j=0;
cout<<"输入序号为:
"<cin>>j;
p=head;
for(i=1;i{
if(i!
=j&&p->next!
=NULL)
{p1=p;p=p->next;}
else{cout<<"输出值为:
"<num<}
}
voidfind1(structstudent*head,intn)
{structstudent*p;
inti,j;
cout<<"输入值为:
"<cin>>j;
p=head;
for(i=1;i{
if(p->next!
=NULL)
{
if((j!
=p->num))
{
p=p->next;
}
else
{
cout<<"输出序号为:
"<
break;
}
}
}
}
structstudent*insert(structstudent*head,structstudent*stu1)
{intn=0;
structstudent*p0,*p1,*p2;
p1=head;
p0=stu1;
if(head==NULL)
{
head=p0;
p0->next=NULL;
}
else
{while((p0->num>p1->num)&&(p1->next!
=NULL))
{
p2=p1;p1=p1->next;
}if(p0->num<=p1->num)
{
if(head==p1)
{head=p0;}
else
{
p2->next=p0;p0->next=p1;
}
}
else
{
p1->next=p0;p0->next=NULL;
}
}
n=n+1;print(head);return(head);
}
structstudent*del(structstudent*head,intn)
{
inti=0;
structstudent*p1,*p2;
if(head==NULL)
{
cout<<"链表为空"<return(head);
}
p1=head;
for(i=1;i<=6;i++)
{
if(i!
=n&&p1->next!
=NULL)
{
p2=p1;p1=p1->next;
}
else
{
if(p1==head)
{head=p1->next;}
else
{p2->next=p1->next;}
cout<<"删除结点为:
"<n=n-1;
}
}
print(head);
return(head);
}
structstudent*mycreat(structstudentstu[],structstudent*head)
{
intj;
for(inti=0;i<6;i++)
{stu[i].num=21+i*2;}
head=&stu[0];
for(j=0;j<5;j++)
{stu[j].next=&stu[j+1];}
stu[j].next=NULL;returnhead;
}
intmain()
{
inti=0,n=0;structstudent*head;studentstu[6],stu1;
head=mycreat(stu,head);//改为head=mycreat()
print(head);
find(head,6);
find1(head,6);
cout<<"输入插入的结点(序号+数值)"<cin>>stu1.score>>stu1.num;
head=insert(head,&stu1);
cout<<"输入删除的结点的序号"<cin>>n;
head=del(head,n);
return0;
}
运行结果:
建立的链表如下:
21
23
25
27
29
31
输入序号为:
3
输出值为:
25
输入值为:
21
输出序号为:
1
输入插入的结点(序号+数值)
326
建立的链表如下:
21
23
25
26
27
29
31
输入删除的结点的序号
3
删除结点为:
3
建立的链表如下:
21
23
26
27
29
31
实验三结构、链表综合编程
一、实验目的:
1.掌握建立链表中指针的运用、插入删除节点的方法;
2.掌握链表的合并与排序方法。
二、实验准备:
1.复习建立链表的过程;链表节点的插入与删除;链表的合并、排序等;
2.预习实验内容,并在预习报告上写出程序流程图(或源代码);
3.上机输入源程序,调试运行并记录运行结果;
4.将源程序存在自己的软盘上,课后按要求写实验报告。
三、实验内容:
【编写程序】:
建立多个班级学生成绩链表,其中,每个结点包含下面这些信息:
学号、姓名、成绩
要求完成下面的功能:
1.建立2个班学生成绩的无序链表,其中每个班包含10个结点数据(输入或从文件中读取每个同学的信息),将每个班的成绩链表按成绩高低排序后分别输出该链表;
2.将2个班级学生成绩合并(按成绩高低排序)后输出;
3.查找学生成绩:
通过输入同学的学号,将该同学从链表中找出,并输出该同学信息;如果找不到,则输出“无此学生”。
源程序:
#include
usingnamespacestd;
#defineN2
structstuscore
{
intnum;charname[20];doublescore;stuscore*next;};
stuscore*mycreat(stuscore*head)
{stuscore*p,*q;
for(inti=0;i{p=newstuscore;
cout<<"请输入成绩"<cin>>p->score;
cout<<"请输入此同学的学号"<cin>>p->num;
cout<<"请输入此同学的姓名"<cin>>p->name;
//p->next=NULL;老师加上的,有无均可
if(