实验4 函数与预处理.docx

上传人:b****7 文档编号:11248169 上传时间:2023-02-26 格式:DOCX 页数:17 大小:18.17KB
下载 相关 举报
实验4 函数与预处理.docx_第1页
第1页 / 共17页
实验4 函数与预处理.docx_第2页
第2页 / 共17页
实验4 函数与预处理.docx_第3页
第3页 / 共17页
实验4 函数与预处理.docx_第4页
第4页 / 共17页
实验4 函数与预处理.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

实验4 函数与预处理.docx

《实验4 函数与预处理.docx》由会员分享,可在线阅读,更多相关《实验4 函数与预处理.docx(17页珍藏版)》请在冰豆网上搜索。

实验4 函数与预处理.docx

实验4函数与预处理

 

中南大学

实验报告

 

课程名称c++程序设计

实验项目名称实验4实验5实验6

指导老师向瑶

实验学生班级电子信息工程1503

实验学生姓名陶韬

学    号0903130309

实验时间2016.4.1至4.10

实验地点校本部科技楼4楼

实验成绩评定

 

实验4函数与预处理

实验4.1

4.1.1题目:

写一个判别素数的函数,在主函数输入一个整数,输出是否为素数的信息。

4.1.2自己写的代码:

#include

usingnamespacestd;

boolisprime(intx);//函数声明

intmain()

{

intx;//定义一个变量来储存等下要输入的数

cout<<"请输入一个整数"<

cin>>x;

if(isprime(x))//用if条件语句根据isprime函数的返回值来输出不同的结果

cout<<"输入的是一个素数"<

else

cout<<"输入的不是一个素数"<

return0;

}

boolisprime(intx)

{

inti=2;

if(x==2)//特例如果输入的是2直接返回true

returntrue;

if(x==1)

returnfalse;

for(;i

{

if(x%i==0)

returnfalse;

}

returntrue;

}

4.1.3

根据教材优化修改后的代码主要是对素数的算法进行优化-i只需要遍历到x的1/2即可,这样的算法对于输入的数是2也是可以正确执行的,为了便于测试可以加上一个循环结构

#include

usingnamespacestd;

boolisprime(intx);//函数声明

intmain()

{

intx;//定义一个变量来储存等下要输入的数

cout<<"当输入的数不为负数时一直进行循环"<

cout<<"请输入一个整数"<

cin>>x;

while(x>=0)

{

if(isprime(x))//用if条件语句根据isprime函数的返回值来输出不同的结果

cout<<"输入的是一个素数"<

else

cout<<"输入的不是一个素数"<

cout<<"请继续输入一个整数:

"<

cin>>x;

}

return0;

}

boolisprime(intx)

{

inti=2;

if(x==1||x==0)

returnfalse;

for(;i

{

if(x%i==0)

returnfalse;

}

returntrue;

}

4.1.4测试结果

当输入的数不为负数时一直进行循环

请输入一个整数

17

输入的是一个素数

请继续输入一个整数:

34

输入的不是一个素数

请继续输入一个整数:

2

输入的是一个素数

请继续输入一个整数:

1

输入的不是一个素数

请继续输入一个整数:

0

输入的不是一个素数

请继续输入一个整数:

实验4.2

4.2.1题目:

写一个函数验证哥德巴赫猜想,一个不小于6的偶数可以表示为两个素数之和,如6=3+3,8=3+5,10=3+7,。

在主函数中输入一个不小于6的偶数n,然后调用函数gotbaha,在gotbaha函数中再调用prime函数,prime函数的作用是判别一个数是否为素数。

在gotbaha函数中输出以下形式的结果

34=3+31;

运行时输入该偶数的值为6,12,20,458,分析运行结果。

如果输入2,4,会出现什么情况?

修改程序,使之能输出相应的信息

4.2.2代码部分

#include

usingnamespacestd;

boolisprime(intx);//判断一个数是否是素数的函数声明

voidgotbaha(inty);//验证哥德巴赫猜想的函数

intmain()

{

cout<<"请输入一个不小于6的偶数"<

cout<<"当输入的数不为负数时一直循环"<

intx;

cin>>x;

while(x>=0)//循环直到输入的数为负数

{

gotbaha(x);

cout<<"请输入一个新的数据进行验证";

cin>>x;

}

}

boolisprime(intx)

{

inti=2;

if(x==1||x==0)

returnfalse;

for(;i<=x/2;i++)

{

if(x%i==0)

returnfalse;

}

returntrue;

}

voidgotbaha(inty)

{

intx1,x2;

for(x1=2,x2=y-x1;x1<=y/2;x1++,x2=y-x1)/*这里的算法是设出x1那么x2自然也就等于y-x1分别验证这两个数都满足素数即可*/

{

if(isprime(x1)&&isprime(x2))

cout<

else

continue;

}

}

4.2.3运行结果1

请输入一个不小于6的偶数

当输入的数不为负数时一直循环

6

6=3+3

请输入一个新的数据进行验证

12

12=5+7

请输入一个新的数据进行验证

20

20=3+17

20=7+13

请输入一个新的数据进行验证

458

458=19+439

458=37+421

458=61+397

458=79+379

458=109+349

458=127+331

458=151+307

458=181+277

458=229+229

请输入一个新的数据进行验证

4.2.4本题第二问:

如果输入2,和4会输出什么情况?

修改程序使之能输出相应的信息

4.2.5运行结果2

请输入一个不小于6的偶数

当输入的数不为负数时一直循环

2

请输入一个新的数据进行验证4

4=2+2

请输入一个新的数据进行验证

4.2.6修改代码使之能输出相应的信息

分析:

因为哥德巴赫猜想是针对大于或者等于6的偶数而言所以如果用户输入一个小于6的偶数时只要提示其输入错误需要重新输入即可。

4.2.7代码2

#include

usingnamespacestd;

boolisprime(intx);//判断一个数是否是素数的函数声明

voidgotbaha(inty);//验证哥德巴赫猜想的函数

intmain()

{

cout<<"请输入一个不小于6的偶数"<

cout<<"当输入的数大于或者等于6时一直循环"<

intx;

cin>>x;

if(x<6)

cout<<"请根据哥德巴赫猜想的前提条件输入一个大于或者等于6的偶数"<

while(x>=6)//循环直到输入的数为负数

{

gotbaha(x);

cout<<"请输入一个新的数据进行验证";

cin>>x;

if(x<6)

cout<<"请根据哥德巴赫猜想的前提条件输入一个大于或者等于6的偶数"<

}

return0;

}

boolisprime(intx)

{

inti=2;

if(x==1||x==0)

returnfalse;

for(;i<=x/2;i++)

{

if(x%i==0)

returnfalse;

}

returntrue;

}

voidgotbaha(inty)

{

intx1,x2;

for(x1=2,x2=y-x1;x1<=y/2;x1++,x2=y-x1)/*这里的算法是设出x1那么x2自然也就等于y-x1分别验证这两个数都满足素数即可*/

{

if(isprime(x1)&&isprime(x2))

cout<

else

continue;

}

}

4.2.8运行结果

请输入一个不小于6的偶数

当输入的数大于或者等于6时一直循环

6

6=3+3

请输入一个新的数据进行验证4

请根据哥德巴赫猜想的前提条件输入一个大于或者等于6的偶数

Pressanykeytocontinue

实验4.3

4.3.1题目:

解决汉诺塔问题。

古代有一个梵塔,塔内有3个座,A,B,C,开始时A座上有64个盘子,盘子大小不等,大的在下,小的在上。

有一个老和尚想把这64个盘子从A座移到C座,但每次只允许移动一个盘,且在移动过程中在3个座上都始终保持大盘在下小盘在上。

在移动过程中可以利用B座,要求编程序打印出移动的步骤。

在运行时分别指定盘子数为3.,5,7,。

并统计在不同盘子数的情况下,移动盘子多少次。

请试一下如果盘子数为16,在你所用的计算机上要运行多少时间。

设想一下,如果盘子数为63,会出现什么情况?

4.3.2代码

#include

usingnamespacestd;

voidhannuota(intx,charone,chartwo,charthree);//汉诺塔函数表示one座借助two座把x个盘子移动到three座

voidmove(chara,charb);//移动函数输出从a移动到b

inttimes=0;//全局变量用来统计一共搬运了多少次

intmain()

{

cout<<"请输入一共有多少个盘子在A座"<

intx;

cin>>x;

cout<<"具体的操作步骤:

"<

hannuota(x,'A','B','C');

cout<<"一共执行了"<

return0;

}

voidhannuota(intx,charone,chartwo,charthree)

{

if(x==1)

move(one,three);//当盘子数只为1的时候显然只需要从one搬到three

else

{

hannuota(x-1,one,three,two);//递归把x-1个盘子从one借助tree移动到two

move(one,three);//把剩下的一个盘子从one搬到three

hannuota(x-1,two,one,three);//把x-1个盘子从two借助one移动到three

}

}

voidmove(chara,charb)

{

cout<"<

times++;

}

4.3.3运行结果

4.3.3.1当输入3

请输入一共有多少个盘子在A座

3

具体的操作步骤:

A->C

A->B

C->B

A->C

B->A

B->C

A->C

一共执行了7次

Pressanykeytocontinue

4.3.3.2当输入5

请输入一共有多少个盘子在A座

5

具体的操作步骤:

A->C

A->B

C->B

A->C

B->A

B->C

A->C

A->B

C->B

C->A

B->A

C->B

A->C

A->B

C->B

A->C

B->A

B->C

A->C

B->A

C->B

C->A

B->A

B->C

A->C

A->B

C->B

A->C

B->A

B->C

A->C

一共执行了31次

Pressanykeytocontinue

4.3.3.3

考虑篇幅原因就不复制过来当x=7一共搬运127次

如果盘子数为16

在我的pc上需要运行大约5s

4.3.4如果盘子数为16要运行多久?

如果盘子数为64会出现什么情况

如果盘子数为64需要执行(264-1=1084467x1019),将会运行几十分钟左右。

实验4.4

4.4.1题目:

输入一个字母字符,设置条件编译,使之能根据需要将小写字母改写为大写字母输出,或将大写字母改写为小写字母输出。

4.4.2代码:

#include

usingnamespacestd;

//#defineUPPER//如果需要将大写改为小写把这一行注释即可

intmain()

{

charc;

cout<<"请输入一个字符字母"<

cin>>c;

#ifdefUPPER

if(c>='a'&&c<='z')

c-=32;

#else

if(c>='A'&&c<='Z')

c+=32;

#endif

cout<

}

4.4.3运行结果

请输入一个字符字母

A

a

Pressanykeytocontinue

请输入一个字符字母

a

A

Pressanykeytocontinue

实验4.5

4.5.1题目:

求a×b和am的值,其中b的值在程序中给出,a和m值由键盘输入,卸一个power函数求am的值,在主函数中求a×b,并调用power函数得到am的值。

要求将主函数和power函数分别写成两个文件file1.cpp和file2.cpp,用extern将外部变量作用域扩展到其他文件。

建立一个项目文件,包含file1.cpp和file2.cpp,按照本书第2部分中介绍的对包含多文件的程序的处理办法,对包含多文件的程序进行编译、连接和运行。

通过这个简单的程序,初步掌握处理包含多文件程序的方法。

4.5.2file1.cpp的代码

#include

usingnamespacestd;

inta;

externintpower(int);

intmain()

{

intb=2;

cout<<"请输入a和m的值"<

intm;

cin>>a>>m;

cout<

intresult;

result=power(m);

cout<

}

4.5.3file2的代码

externa;

intpower(intm)

{

inti=1,result=1;

for(i=1;i<=m;i++)

result*=a;

returnresult;

}

4.5.4运行结果

externa;

intpower(intm)

{

inti=1,result=1;

for(i=1;i<=m;i++)

result*=a;

returnresult;

}

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

当前位置:首页 > 职业教育 > 其它

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

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