程序设计与问题求解II实验报告.docx

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

程序设计与问题求解II实验报告.docx

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

程序设计与问题求解II实验报告.docx

程序设计与问题求解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(

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

当前位置:首页 > 幼儿教育 > 育儿理论经验

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

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