资源描述
5.4 实验五 函数与预处理
一、实验目的与要求
1. 掌握C语言函数的定义方法、函数的声明及函数的调用方法。
2. 理解函数实参与形参的对应关系以及“值传递”的方式。
3. 掌握全局变量与局部变量动态变量、静态变量的概念与使用方法。
4. 掌握动态存储分配的方法。
5. 掌握宏定义与文件包含处理方法。
6. 实验4学时
二、实验内容
1.程序验证与改错题
(1) 程序验证题
① 下面程序执行的结果是什么
void s x, int y)
int temp;
temp=x;
x=y;
y=temp;
void main()
int a,b;
scanf(“%d%d”, &a,&b);
if(a>b)
swap(a, b);
printf(“%d\t %d”, a,b);
思考:为什么a,b的值没有交换?
答:
修改后的函数为
#include<stdio.h>
void s &x, int &y)
int temp;
temp=x;
x=y;
y=temp;
void main()
int a,b;
scanf("%d%d",&a,&b);
s); //if语句被去掉//
printf("%d\t %d\n", a,b);
因为调用函数中改变的是形参而非实参,加上&,其意义是改变实参的地址。
If语句中,只有当a>b时才交换a,b的值 去掉后 在任何情况下都交换a,b的值
② 调用函数fun计算:m=1+2+3+4+…+9+10,并输出结果。请验证下面的程序是否符合题目要求。
#include”stdio.h”
int fun(int n)
int m, i;
for (i=1; i<=n; i++)
m+=i;
return m;
void main()
printf("m=%d\n", fun(10));
在上面程序的基础上,修改程序. 计算m=1-2+3-4+…+9-10。
答:
#include<stdio.h>
int fun(int n)
int m=0,i;
for (i=1;i<=n;i++)
if(i%2==1)
m+=i;
else
m-=i;
return m;
void main()
printf("m=%d\n",fun(10));
(2)程序改错题
下列程序的功能是利用自定义函数计算一无符号的整数各位数字的乘积。
#include<stdio.h>
unsigned f(unsigned num)
unsigned k=0;
do
k*=num/10;
num/=10;
}while(k);
return k;
void main()
int x;
printf(“input x=:\n”);
scanf(“%d”, x);
printf(“%d”, f(x));
答:
#include<stdio.h>
unsigned f(unsigned num)
unsigned k=1;
do
k*=num%10;
num/=10;
}while(num!=0);
return k;
void main()
int x;
printf("input x=:\n");
scanf("%d",&x);
printf("%d", f(x));
2.一般编程题
编程题1 编写一函数,把输入的4个数字字符转换成一个int数据存放,如输入4123这字符转换为4123这个整数,并通过主函数验证结果。
答:
#include<stdio.h>
int f(char c)
int a;
a=int(c)-48;
return a;
void main()
int a,b=0;
char c;
while((c=getchar())!='\n')
a=f(c);
b=b*10+a;
printf("%d\n",b);
printf("%d+%d=%d\n",b,b,b+b);
printf("\n");
编程题2 编写程序求:1*1*1+2*2*2+3*3*3+4*4*4+5*5*5
提示:主函数用来现实结果,f1( )函数用来求一个数的立方,f2( )函数用来求与。
#include <stdio.h>
int f1(int n)
int f2(int m)
void main()
答:
1解(使用库函数)
#include<stdio.h>
void main()
int i=4;
char temp;
int result=0;
temp=getchar();
while(temp!='\n')
result*=10;
result+=((int)temp-48);
temp=getchar();
printf("%c\n",temp);
printf("%d\n",result);
2解(使用stdlib 库函数中的atoi ()函数)
# include <stdio.h>
# include <stdlib.h>
void main ()
int num;
char str[30];
gets(str);
num = atoi(str);
printf("num to int:%d\n",num);
编程题3 定义两个带参数的宏,将两个参数的值相加与相减,并写出程序,输入两个数作为使用宏时的实参。输出相加与相减后的与与差。
答:
#include <stdio.h>
#define P(m,n) m+n;
#define Q(m,n) m-n;
void main()
int m,n,p,q;
scanf("%d %d",&m,&n);
p=P(m,n);
q=Q(m,n);
printf("%d=%d+%d\n",p,m,n);
printf("%d=%d-%d\n",q,m,n);
编程题4
编程输出2到10000之间的所有完数。所谓完数是指因子之与与它本身相等的数。如6=1+2+3,6是一个完数。
要求:定义函数 factor(m) 判断m是否为完数;由主函数调用它,来对所有2到10000之间的所有数进行判断。
#include <stdio.h>
#include <math.h>
int factor(int m)
int i,s=0;
void main()
int i,m,sum;
答:
#include <stdio.h>
#include <math.h>
int factor(int m)
int i,s=0;
for(i=1;i<m;i++)
if(m%i==0)
s+=i;
if(s==m)
return s;
else
return 0;
void main()
int i,m,sum;
m=10000;
for(i=2;i<=m;i++)
sum=factor(i);
if(sum>0)
printf("%d ",sum);
printf("\n");
3.较难编程题
编程题1 用函数调用实现求两个数的最大公因子与最小公倍数
答:
#include <stdio.h>
#include <math.h>
int f(int m,int n)
int i;
for(i=1;;i++)
if(m==n)break;
if(m>n)
m=m-n;
else
n=n-m;
return n;
int g(int x,int y,int z)
int i;
i=x*y/z;
return i;
void main()
int a,b,c,d;
scanf("%d %d",&a,&b);
c=f(a,b);
d=g(a,b,c);
printf("最大公因子:%d\n",c);
printf("最小公倍数:%d\n",d);
编程题2 用递归方法求1+2+3+...+n并将其中素数去除后之与。
#include <stdio.h>
#include <math.h>
int isprime (int number)
long fact(int n)
void main()
int m,sum;
答:
#include <stdio.h>
#include <math.h>
int isprime (int number)
int i;
for(i=2;i<number;i++)
if(number%i==0)break;
if(i==number)
return 0;
else
return number;
long fact(int n)
long result,a;
if(n==1)
result=1;
else
a=isprime(n);
result=a+fact(n-1);
return result;
void main()
int m,sum;
scanf("%d",&m);
sum=fact(m);
printf("%d\n",sum);
第 12 页
展开阅读全文