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