实验六函数与编译预处理答案一、断点的设置和取消、单步执行跟踪进入函数和跳出函数方法练习2、调试练习:要求:模仿示例调试以下程序,直到输出正确结果,源程序名为error6_2.c程序功能:利用函数调用求“1!+2!+3!+4!+...+10!”的值(参见实验教材72页程序填空题第(1)小题)源程序(有错误的程序——不是语法错误,而是算法错误或逻辑错误):改正错误后的源程序:void main(){long s=0,i;long mm(int k);for(i=1;i<=10;i++)s=s+mm(i);printf("1!+2!+3!+...+10!=%ld\n",s);}long mm(int k){long t=1, j;for(j=1;j<=k;j++)t=t*j;return (t);}3、综合调试、改错练习:以下程序有多处错误,请综合运用前面所学过的所有知识和VC++的调试手段,改正程序的各种错误,使其运行出正确的结果。
程序的功能是:利用函数调用求任意两个整数的和。
改正错误后的源程序:main(){int sum(int a,int b);int x,y;scanf("%d,%d",&x,&y);printf("x=%d,y=%d\n",x,y);printf("%d+%d=%d\n",x,y, sum(x,y));}int sum(int a, int b){return (a+b);}二、编程练习利用VC++编写程序,并调试、运行,直到输出正确结果。
编程练习1:注意:这里提供了以填空的形式出现源程序参考清单,目的是给同学们一个思路。
最好不要将此源程序清单复制到VC++中,否则会出现多处语法错误。
同学们可以据此思路来填写有关语句,从而完成程序。
在调试程序时,一定要运用前面学过的方法。
下面函数是实现求[1,3000]能被17或23整除的整数的个数。
请将程序补充完整,并调试运行,直到输出正确结果。
(源文件名为blank6_1.c)完成填空后的源程序:#include <stdio.h>int f(int m, int n){int i, count=0;for(i=m; i<=n; i++)if(i%17==0||i%23==0)count++;return count;}main(){int m, n ;scanf("%d%d", &m, &n);printf("count=%d\n", f(m, n));}编程练习2:(1)编写一函数接受主调函数实参n(这里n==5),并输出如下图形。
n的值通过键盘输入,并由主函数中的语句来由实现。
程序以文件名print_1.c保存。
0***0*0*0***0***0*0*0***0源程序:#include <stdio.h>void printg(int);/* 因为被调函数printg()在主调函数main()之后,需对被调函数声明*/ main ( ){int a;printf("please input a number:\n");scanf("%d", &a);printg(a); /* 在主调函数main()中调用被调函数printg(a) ,其中a为实参*/}void printg(int n){int i,j;for(i=1;i<=n;i++){for(j=1;j<=n;j++)if(i==j||i+j==n+1)printf("0");elseprintf("*");printf("\n");}}(2)写一个判断素数的函数,在主函数输入一个整数,输出是否素数的信息。
源程序以文件名primefun.c保存。
源程序1:prime(int n){int i,j;for(i=2;i<n;i++){j=n%i;if(j==0){printf("%d不是素数\n",n);break;}}if(i==n)printf("%d是素数\n",n );}main(){int n;printf("请输入一个大于2的正整数:\n");label: scanf("%d",&n);if(n<=2) {printf("输入数据错误,请重新输入:\n");goto label;} prime(n);}源程序2:int prime(int n){int i,j,flag;for(i=2;i<n;i++){j=n%i;if(j==0){flag=0;break;}}if(i==n)flag=1;return flag;}main(){int n,f;printf("请输入一个大于2的正整数:\n");label: scanf("%d",&n);if(n<=2) {printf("输入数据错误,请重新输入:\n");goto label;} f=prime(n);if(f==1)printf("%d是素数\n",n );elseprintf("%d不是素数\n",n );}编程练习3:实验教材:(P17-21:实验5 函数与编译预处理)二、实验内容第3题其中第(3)、(4)、(5)为必做题,其余为选做题(3)定义函数int f ( int x) 判断x是否是回文数,若是则函数返回1,否则返回0。
例如12321和2332为回文数。
通过main函数验证之源程序:int f(long x){int c[100],i=1,n=0,k=0,b=1,y=x;while (x>=10) //求出x是几位数,并存于i中{x=x/10;i++; }while(n<i) //从个位开始,将x的每位数字存于数组c中{c[n]=y%10;y=y/10;n++;}while(k<=i/2) //判断x是否是回文数{if (c[k]!=c[i-k-1]){b=0;break;}k++;}if(b==1)return 1;elsereturn 0;}main(){long n; int flag;printf("请输入一个正整数:\n");scanf("%d",&n);flag=f(n);if(flag==1)printf("%d是回文数,函数返回值是1\n",n );elseprintf("%d不是回文数,函数返回值是0\n",n );}(4)定义函数int f ( int n),求n!源程序:int f(int n){int i; long w=1;for (i=1;i<=n;i++)w=w*i;return w;}main(){int n; long j;printf("请输入一个正整数:\n");scanf("%d",&n);j=f(n);printf("%d的阶乘是%ld\n",n,j);}(5)利用题(4)定义函数f,计算 n i!1源程序:int f(int n){int i; long w=1;for (i=1;i<=n;i++)w=w*i;return w;}main(){int i, n; long s=0;printf("请输入一个正整数:\n");scanf("%d",&n);for(i=1;i<=n;i++)s=s+f(i);printf("1!+2!+...+%d!=%ld\n",n,s);}附加编程题(1)定义函数int f ( int x) 判断x是否是奇数,若是则函数返回1,否则返回0。
源程序:int f(int x){if(x%2!=0) /*或写成if(x%2==1)*/return 1;elsereturn 0;}main(){int n,flag;printf("请输入一个正整数:\n");scanf("%d",&n);flag=f(n);if(flag==1)printf("%d是奇数,函数返回值是1\n",n );elseprintf("%d不是奇数,函数返回值是0\n",n );}(2) 定义函数int f (int m, int n) 求m n。
要求用函数递归调用的方法。
源程序:int f(int m, int n){int v;if(n>1) /*或写成if(n!=1)*/v=m*f(m,n-1);elsev=m;return v;}main(){int m,n;printf("请输入两个正整数(第一个为底数,第二个为指数):\n"); scanf("%d%d",&m,&n);printf("%d的%d次方是%d\n",m,n,f(m,n));}(3) 定义函数int f (int n) 求 n i。
要求用函数递归调用的方法。
1源程序:int f(int n){int sum;if(n>1) /*或写成if(n!=1)*/sum=n+f(n-1);elsesum=1;return sum;}main(){int n;printf("请输入一个正整数:\n");label: scanf("%d",&n);if(n<1) {printf("输入数据错误,请重新输入:\n");goto label;} printf("1到%d之间的正整数之和为%d\n",n,f(n));}(4) 定义函数int f ( int a, int b ) 求a, b的最大公约数。
源程序1:int f(int a, int b){int c,i;if(a<b) c=a;else c=b;for(i=c;i>=1;i--)if((a%i==0)&&(b%i==0))return i;}main(){int m,n;printf("请任意输入两个正整数:\n");scanf("%d%d",&m,&n);printf("%d和%d的最大公约数是%d\n",m,n,f(m,n));}源程序2:int f(int a, int b){int i;for(i=a;i>=1;i--) /*或写成for(i=b;i>=1;i--)*/if((a%i==0)&&(b%i==0))return i;}main(){int m,n;printf("请任意输入两个正整数:\n");scanf("%d%d",&m,&n);printf("%d和%d的最大公约数是%d\n",m,n,f(m,n));}思考:如何求两个正整数的最小公倍数?源程序1:int f(int a, int b){int i;for(i=a;i<=a*b;i++) /*或写成for(i=b;i<=a*b;i++)*/ if((i%a==0)&&(i%b==0))return i;}main(){int m,n;printf("请任意输入两个正整数:\n");scanf("%d%d",&m,&n);printf("%d和%d的最小公倍数是%d\n",m,n,f(m,n)); }源程序2:int f(int a, int b){int i,c;if(a>b) c=a;else c=b;for(i=c;i<=a*b;i++)if((i%a==0)&&(i%b==0))return i;}main(){int m,n;printf("请任意输入两个正整数:\n");scanf("%d%d",&m,&n);printf("%d和%d的最小公倍数是%d\n",m,n,f(m,n)); }。