《C语言学习知识实验二报告.doc》由会员分享,可在线阅读,更多相关《C语言学习知识实验二报告.doc(24页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、.北京电子科技学院(BESTI)实验报告课程:程序设计基础班级:姓名:学号:成绩:指导教师:张晓昆实验日期:实验密级:预习程度:实验时间:15:3018:30仪器组次:必修/选修:必修实验序号:2实验名称:函数编程练习实验目的与要求:主函数通常只处理输入和输出;掌握定义函数的方法;掌握函数实参与形参的对应关系,以及“值传递”的方式;掌握全局变量、局部变量、动态变量、静态变量的概念和使用方法,、了解函数的嵌套调用方法和递归调用方法。观察堆栈窗口call stack,注意函数调用过程堆栈的动态变化。有兴趣的同学可以将几个函数分别放到不同的.C文件中,分别编译,再利用Project建立工程文件,然后
2、连接执行,观察结果。实验内容素数(Prime Number),又称为质数,它是不能被1和它本身以外的其他整数整除的正整数。按照这个定义,负数、0和1都不是素数,而17之所以是素数,是因为除了1和17以外,它不能被216之间的任何整数整除。 任务1:试商法是最简单的判断素数的方法。用i=2m-1之间的整数去试商,若存在某个m能被1与m本身以外的整数i整除(即余数为0),则m不是素数,若上述范围内的所有整数都不能整除m,则m是素数。采用试商法,分别用goto语句、break语句和采用设置标志变量并加强循环测试等三种方法编写素数判断函数IsPrime(),从键盘任意输入一个整数m,判断m是否为素数,
3、如果m是素数,则按%d is a prime numbern格式打印该数是素数,否则按%d is not a prime numbern格式打印该数不是素数。然后分析哪一种方法可读性更好。1、 goto语句#include #include int IsPrime(int n); /判断是否是素数的函数原型int main() int m; printf(Please enter a integer:); scanf(%d, &m); /用户输入欲判断的数 if( IsPrime(m) = 1) /调用判断是否是素数的函数并输出结果 printf(%d is a prime number!n,
4、 m); else printf(%d is not a prime number!n, m); return 0; /返回0 /主函数结束int IsPrime(int n) /判断是否是素数的函数 int i = 2; int j = 0; if(n = 1) /若j大于2,则说明能被2n-1之间的数整除,返回0;否则返回1 return 0; else return 1; /子函数结束2、 break语句#include #include int IsPrime(int n); /判断是否是素数的函数原型int main() int m; printf(Please enter a in
5、teger:); scanf(%d, &m); /用户输入欲判断的数 if( IsPrime(m) = 1) /调用判断是否是素数的函数并输出结果 printf(%d is a prime numbern, m); else printf(%d is not a prime numbern, m); return 0; /返回0 /主函数结束int IsPrime(int n) /判断是否是素数的函数 int i; int j = 0; if( n 2 ) /若n小于2,返回0值 return 0; for(i = 2; i 1) /若j大于2,则说明能被2n-1之间的数整除,返回0;否则返回
6、1 return 0; break; if( j = 0) return 1; /子函数结束3、采用设置标志变量并加强循环测试#include #include int IsPrime(int n); /判断是否是素数的函数原型int main() int m; printf(Please enter a integer:); scanf(%d, &m); /用户输入欲判断的数 if( IsPrime(m) = 1) /调用判断是否是素数的函数并输出结果 printf(%d is a prime numbern, m); else printf(%d is not a prime number
7、n, m); return 0; /返回0 /主函数结束int IsPrime(int n) /判断是否是素数的函数 int i; int j = 0; if( n 2 ) /若n小于2,返回0值 return 0; for(i = 2; i = 1) /若j大于2,则说明能被2n-1之间的数整除,返回0;否则返回1 return 0; else return 1; /子函数结束任务2:用数学的方法可以证明,不能被2(取整)之间的数整除的数,一定不能被1和它本身之外的其他任何整数整除。根据素数的这个性质,通过修改素数判断函数IsPrime()的具体实现,编程完成任务1。#include #in
8、clude #include /因调用 sqrt()函数,故需此预处理命令int IsPrime(int n); /判断是否是素数的函数原型int main() int m; printf(Please enter a integer:); scanf(%d, &m); /用户输入欲判断的数 if( IsPrime(m) = 1) /调用判断是否是素数的函数并输出结果 printf(%d is a prime numbern, m); else printf(%d is not a prime numbern, m); return 0; /返回0 /主函数结束int IsPrime(int
9、n) /判断是否是素数的函数 int i; int j = 0; if( n 2 ) /若n小于2,返回0值 return 0; for(i = 2; i = 1) /若j大于2,则说明能被2n-1之间的数整除,返回0;否则返回1 return 0; else return 1; /子函数结束任务3:从键盘任意输入一个整数n,编程计算并输出1n之间的所有素数之和。#include #include #include /因调用 sqrt()函数,故需此预处理命令int IsPrime(int m); /判断是否是素数并求和的函数原型int main() int n; printf(Please
10、enter a integer:); scanf(%d, &n); /用户输入欲判断的数 /打印输出1n之间的所有素数之和 printf(The sum of all the primes between 1 and the number you enter is: %dn, IsPrime(n); return 0; /返回0 /主函数结束int IsPrime(int m) /判断是否是素数的函数 int i; int j; int sum = 0; for(i = 2; i = m; i+) int k = 0; for(j = 2; j = sqrt(i); j+) if( i % j
11、 = 0) /利用试商法判断是否能被2 n的开方(取整)之间的数整除 k+; if(k = 0) /如果k等于0,说明i是素数,求和 sum = sum +i; return sum; /返回素数之和 /子函数结束任务4:从键盘任意输入一个整数m,若m不是素数,则计算并输出其所有的因子(不包括1),例如对于16,输出2,4,8;否则输出No divisor! It is a prime numbern。 #include #include #include /因调用 sqrt()函数,故需此预处理命令int IsPrime(int n); /判断是否是素数的函数原型int main() int
12、 m; int i; printf(Please enter a integer:); scanf(%d, &m); /用户输入欲判断的数 if(IsPrime(m) = 1) /调用判断是否是素数的函数,若不是素数,打印因子(不包括1) for(i = 2; i = m; i+) if( m % i = 0) /利用试商法判断是否是因子 printf(%d , i); if(IsPrime(m) = 0) /调用判断是否是素数的函数并输出结果 printf(No divisor! It is a prime numbern); return 0; /返回0 /主函数结束int IsPrime
13、(int n) /判断是否是素数的函数 int i; int j = 0; for(i = 2; i = 1) /若j大于2,则说明能被2n-1之间的数整除,返回1;否则返回0 return 1; else return 0; /子函数结束任务5:如果一个正整数m的所有小于m的不同因子(包括1)加起来正好等于m本身,那么就被称它为完全数(Perfect Number)。例如,6就是一个完全数,是因为6 = 1 + 2 + 3。请编写一个判断完全数的函数IsPerfect(),然后判断从键盘输入的整数是否是完全数。#include #include int IsPerfect(int n); /
14、判断输入的整数是否是完全数的函数原型int main() int m; printf(Please enter a integer:); scanf(%d, &m); /用户输入欲判断的数 if(IsPerfect(m) = 1) /调用判断是否是素数的函数,若是,打印语句 printf(The number you enter is a Perfect Number!n); if(IsPerfect(m) = 0) /调用判断是否是素数的函数,若不是,打印语句 printf(The number you enter is not a Perfect Number!n); return 0;
15、/返回0 /主函数结束int IsPerfect(int n) /判断输入的整数是否是完全数的函数 int i; int sum = 0; for(i = 1; i n; i+) if(n % i = 0) /判断是否是因子 sum = sum + i; /求因子之和 if(sum = n) /判断输入的整数是否是完全数 return 1; else return 0; /子函数结束任务6:从键盘任意输入一个整数m,若m不是素数,则对m进行质因数分解,并将m表示为质因数从小到大顺序排列的乘积形式输出,否则输出It is a prime numbern。例如,用户输入90时,程序输出90 = 2
16、 * 3 * 3 * 5;用户输入91时,程序输出It is a prime numbern。#include #include #include /因调用 sqrt()函数,故需此预处理命令int IsPrime1(int x); /判断是否是素数的函数原型int IsPrime2(int y); /判断是否是素数的函数原型int main() int m; int a = 1; /a表示质因数之积 int b; /b表示m与其因数之商 printf(Please enter a integer:); scanf(%d, &m); /用户输入欲判断的数 if(IsPrime1(m) = 1)
17、 /调用判断是否是素数的函数,若是,打印语句 printf(It is a prime number!n); /调用判断是否是素数的函数,若不是将m表示为质因数从小到大顺序排列的乘积形式输出 if(IsPrime1(m) = 0) printf(%d =, m); while(a != m) /判断所有因子之积是否等于m,不等继续运行 b = m / a; printf( %d , IsPrime2(b); /打印因子 a = IsPrime2(b) * a; /m的因子之积 if(a != m) printf(*); /打印乘号 return 0;int IsPrime1(int x) /判
18、断是否是素数的函数 int i; int j = 0; for(i = 1; i = sqrt(x); i+) if(x % i = 0) /利用试商法判断是否能被2 n的开方(取整)之间的数整除 j+; if(j = 1) /若j小于2,则说明能被2 n的开方(取整)之间的数整除,返回1;否则返回0 return 1; else return 0; /子函数结束int IsPrime2(int y) /判断是否是素数的函数 int i; int j; for(i = 2; i = y; i+) /找出2y之间的素数 int k = 0; for(j = 2; j = sqrt(i); j+)
19、 if( i % j = 0) /利用试商法判断是否能被2 i的开方(取整)之间的数整除 k+; if(k = 0 & y % i = 0) return i; 任务7: 验证:2000以内的正偶数都能够分解为两个素数之和(即验证哥德巴赫猜想对2000以内的正偶数成立),正奇数都能够分解为三个素数之和。注意最后要将结果上传之前,请将2000改为500再运行,并注意输出格式,每行5个等式,如:10=3+7;12=5+7;。#include #include #include /因调用 sqrt()函数,故需此预处理命令int IsPrime1(int x); /输出正偶数分解为两个素数之和的函数
20、原型int IsPrime2(int y); /输出正奇数分解为三个素数之和的函数原型int main() int m; /定义整型变量,为偶数 int n; /定义整型变量,为奇数 printf(正偶数等于两素数之和:n); for(m = 2; m = 100; m += 2) /输出正偶数分解为两个素数之和 IsPrime1(m); printf(n正奇数等于三素数之和:n); for(n = 5; n = 100; n += 2) /输出正奇数分解为三个素数之和 IsPrime2(n); return 0; /返回0 /主函数结束int IsPrime1(int x) /输出正偶数分解
21、为两个素数之和的函数 int i; /i表示素数 int j; /j用于判断i是否是素数 int a; /a表示素数 int b; /b用于判断a是否是素数 if(x % 5 = 4) printf(n); for(i = 2; i = x; i+) /判断i是2y之间的素数 int k1 = 0; for(j = 2; j = sqrt(i); j+) if( i % j = 0) k1+; if(k1 = 0) for(b = 2; b = x; b+) /判断b是2y之间的素数 int k2 = 0; for(a = 2; a = sqrt(b); a+) if( b % a = 0)
22、k2+; if( k2 = 0) if(i + b = x) /如果i、b都是素数,求和判断是否等于x,若等打印 printf(%d = %d + %d; , x, i, b); if(i + b = x) return 0; /if结束 /for循环结束 /if结束 /for循环结束 return 0; /返回0 /主函数结束int IsPrime2(int y) /输出正奇数分解为三个素数之和的函数 int i; /i表示素数 int j; /j用于判断i是否是素数 int a; /a表示素数 int b; /b用于判断a是否是素数 int g; /g表示素数 int h; /h用于判断g
23、是否是素数 if(y % 5 = 2) printf(n); for(i = 2; i = y; i+) /判断i是2y之间的素数 int k1 = 0; for(j = 2; j = sqrt(i); j+) if( i % j = 0) k1+; if(k1 = 0) for(b = 2; b = y; b+) /判断b是2y之间的素数 int k2 = 0; for(a = 2; a = sqrt(b); a+) if( b % a = 0) k2+; if( k2 = 0) for(g = 2; g = y; g+) /判断g是2y之间的素数 int k3 = 0; for(h = 2; h = sqrt(g); h+) if( g % h = 0) k3+; if(k3 = 0) if(i + b + g = y) /如果i、b、g都是素数,求和判断是否等于y,若等打印 printf(%d = %d + %d + %d; , y, i, b, g); if(i + b + g = y) /用于终止循环 return 0; /if结束 /for循环结束 / if结束 /for循环结束 /if结束 /for循环结束 return 0; /子函数结束