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