1、实验4 函数与预处理中 南 大 学实 验 报 告课程名称 c+程序设计 实验项目名称 实验4 实验5 实验6 指导老师 向瑶 实验学生班级 电子信息工程1503 实验学生姓名 陶韬 学号 0903130309 实验时间 2016.4.1至4.10 实验地点 校本部科技楼4楼实验成绩评定 实验4 函数与预处理实验4.14.1.1题目: 写一个判别素数的函数,在主函数输入一个整数,输出是否为素数的信息。4.1.2自己写的代码:#includeusing namespace std;bool isprime(int x);/函数声明int main() int x;/定义一个变量来储存等下要输入的数
2、 cout请输入一个整数x; if(isprime(x)/用if条件语句根据isprime函数的返回值来输出不同的结果 cout输入的是一个素数endl; else cout输入的不是一个素数endl; return 0;bool isprime(int x) int i=2; if(x=2)/特例 如果输入的是2 直接返回true return true; if(x=1) return false; for(;ix;i+) if(x%i=0) return false; return true;4.1.3根据教材优化修改后的代码 主要是对素数的算法进行优化-i只需要遍历到x的1/2即可,这样
3、的算法对于输入的数是2也是可以正确执行的,为了便于测试可以加上一个循环结构#includeusing namespace std;bool isprime(int x);/函数声明int main() int x;/定义一个变量来储存等下要输入的数 cout当输入的数不为负数时一直进行循环endl; cout请输入一个整数x; while(x=0) if(isprime(x)/用if条件语句根据isprime函数的返回值来输出不同的结果 cout输入的是一个素数endl; else cout输入的不是一个素数endl; cout请继续输入一个整数:x; return 0;bool isprim
4、e(int x) int i=2; if(x=1|x=0) return false; for(;ix/2;i+) if(x%i=0) return false; return true; 4.1.4测试结果当输入的数不为负数时一直进行循环请输入一个整数17输入的是一个素数请继续输入一个整数:34输入的不是一个素数请继续输入一个整数:2输入的是一个素数请继续输入一个整数:1输入的不是一个素数请继续输入一个整数:0输入的不是一个素数请继续输入一个整数:实验4.2 4.2.1题目:写一个函数验证哥德巴赫猜想,一个不小于6的偶数可以表示为两个素数之和,如6=3+3,8=3+5,10=3+7,。在主函
5、数中输入一个不小于6的偶数n,然后调用函数gotbaha,在gotbaha函数中再调用prime函数,prime函数的作用是判别一个数是否为素数。在gotbaha函数中输出以下形式的结果 34=3+31;运行时输入该偶数的值为6,12,20,458,分析运行结果。如果输入2,4,会出现什么情况?修改程序 ,使之能输出相应的信息4.2.2代码部分#includeusing namespace std;bool isprime(int x);/判断一个数是否是素数的函数声明void gotbaha(int y);/验证哥德巴赫猜想的函数int main() cout请输入一个不小于6的偶数endl
6、; cout当输入的数不为负数时一直循环x; while(x=0)/循环直到输入的数为负数 gotbaha(x); coutx; bool isprime(int x) int i=2; if(x=1|x=0) return false; for(;i=x/2;i+) if(x%i=0) return false; return true;void gotbaha(int y) int x1,x2; for(x1=2,x2=y-x1;x1=y/2;x1+,x2=y-x1)/*这里的算法是设出x1 那么x2自然也就等于y-x1分别验证这两个数都满足素数即可*/ if(isprime(x1)&is
7、prime(x2) couty=x1+x2endl; else continue; 4.2.3运行结果1 请输入一个不小于6的偶数当输入的数不为负数时一直循环66=3+3请输入一个新的数据进行验证1212=5+7请输入一个新的数据进行验证2020=3+1720=7+13请输入一个新的数据进行验证458458=19+439458=37+421458=61+397458=79+379458=109+349458=127+331458=151+307458=181+277458=229+229请输入一个新的数据进行验证4.2.4本题第二问:如果输入2,和4 会输出什么情况 ?修改程序使之能输出相应的
8、信息4.2.5运行结果2 请输入一个不小于6的偶数当输入的数不为负数时一直循环2请输入一个新的数据进行验证44=2+2请输入一个新的数据进行验证4.2.6修改代码 使之能输出相应的信息分析 :因为哥德巴赫猜想是针对大于或者等于6的偶数而言 所以如果用户输入一个小于6的偶数时只要提示其输入错误 需要重新输入即可。4.2.7代码2#includeusing namespace std;bool isprime(int x);/判断一个数是否是素数的函数声明void gotbaha(int y);/验证哥德巴赫猜想的函数int main() cout请输入一个不小于6的偶数endl; cout当输入
9、的数大于或者等于6时一直循环x; if(x6) cout请根据哥德巴赫猜想的前提条件输入一个大于或者等于6的偶数=6)/循环直到输入的数为负数 gotbaha(x); coutx; if(x6) cout请根据哥德巴赫猜想的前提条件输入一个大于或者等于6的偶数endl; return 0;bool isprime(int x) int i=2; if(x=1|x=0) return false; for(;i=x/2;i+) if(x%i=0) return false; return true;void gotbaha(int y) int x1,x2; for(x1=2,x2=y-x1;x
10、1=y/2;x1+,x2=y-x1)/*这里的算法是设出x1 那么x2自然也就等于y-x1分别验证这两个数都满足素数即可*/ if(isprime(x1)&isprime(x2) couty=x1+x2endl; else continue; 4.2.8 运行结果请输入一个不小于6的偶数当输入的数大于或者等于6时一直循环66=3+3请输入一个新的数据进行验证4请根据哥德巴赫猜想的前提条件输入一个大于或者等于6的偶数Press any key to continue实验4.34.3.1题目: 解决汉诺塔问题。古代有一个梵塔,塔内有3个座,A,B,C,开始时A座上有64个盘子,盘子大小不等,大的在
11、下,小的在上。有一个老和尚想把这64个盘子从A座移到C座,但每次只允许移动一个盘,且在移动过程中在3个座上都始终保持大盘在下 小盘在上。在移动过程中可以利用B座,要求编程序打印出移动的步骤。 在运行时分别指定盘子数为3.,5,7,。并统计在不同盘子数的情况下,移动盘子多少次。请试一下如果盘子数为16,在你所用的计算机上要运行多少时间。设想一下,如果盘子数为63,会出现什么情况?4.3.2代码#includeusing namespace std;void hannuota(int x,char one,char two,char three);/汉诺塔函数表示one座借助two座把x个盘子移动
12、到three座void move(char a,char b);/移动函数 输出从a移动到bint times=0;/全局变量用来统计一共搬运了多少次int main() cout请输入一共有多少个盘子在A座x; cout具体的操作步骤:endl; hannuota(x,A,B,C); cout一共执行了times次endl; return 0;void hannuota(int x,char one, char two,char three) if(x=1) move(one,three);/当盘子数只为1的时候显然只需要从one搬到three else hannuota(x-1,one,t
13、hree,two);/递归把x-1个盘子从one借助tree移动到two move(one,three);/把剩下的一个盘子从one搬到three hannuota(x-1,two,one,three);/把x-1个盘子从two借助one移动到three void move(char a,char b) coutabCA-BC-BA-CB-AB-CA-C一共执行了7次Press any key to continue4.3.3.2当输入5请输入一共有多少个盘子在A座5具体的操作步骤:A-CA-BC-BA-CB-AB-CA-CA-BC-BC-AB-AC-BA-CA-BC-BA-CB-AB-CA-
14、CB-AC-BC-AB-AB-CA-CA-BC-BA-CB-AB-CA-C一共执行了31次Press any key to continue4.3.3.3考虑篇幅原因就不复制过来 当x=7 一共搬运 127次如果盘子数为16在我的pc上需要运行大约5s4.3.4 如果盘子数为16 要运行多久?如果盘子数为64 会出现什么情况如果盘子数为64 需要执行(264-1=1084467x1019),将会运行几十分钟左右。实验4.44.4.1题目:输入一个字母字符,设置条件编译,使之能根据需要将小写字母改写为大写字母输出,或将大写字母改写为小写字母输出。4.4.2代码:#includeusing nam
15、espace std;/#define UPPER/ 如果需要将大写改为小写把这一行注释即可int main() char c; cout请输入一个字符字母c;#ifdef UPPER if(c=a&c=A&c=Z) c+=32;#endif coutcendl;4.4.3 运行结果请输入一个字符字母AaPress any key to continue请输入一个字符字母aAPress any key to continue实验4.54.5.1题目:求ab和am的值,其中b的值在程序中给出,a和m值由键盘输入,卸一个power函数求am的值,在主函数中求ab,并调用power函数得到am的值。
16、要求将主函数和power函数分别写成两个文件file1.cpp和file2.cpp,用extern将外部变量作用域扩展到其他文件。建立一个项目文件,包含file1.cpp和file2.cpp,按照本书第2部分中介绍的对包含多文件的程序的处理办法,对包含多文件的程序进行编译、连接和运行。通过这个简单的程序,初步掌握处理包含多文件程序的方法。4.5.2 file1.cpp的代码#includeusing namespace std;int a;extern int power(int);int main() int b=2; cout请输入a和m的值am; couta*b=a*bendl; int result; result=power(m); couta的m次方=resultendl; 4.5.3 file2的代码extern a;int power(int m) int i=1,result=1; for(i=1;i=m;i+) result*=a; return result;4.5.4运行结果extern a;int power(int m) int i=1,result=1; for(i=1;i=m;i+) result*=a; return result;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1