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