实验4 函数与预处理.docx
- 文档编号:11248169
- 上传时间:2023-02-26
- 格式:DOCX
- 页数:17
- 大小:18.17KB
实验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;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验4 函数与预处理 实验 函数 预处理