5.4 实验五 函数与预处理
一、实验目的与要求
1. 掌握C语言函数的定义方法、函数的声明及函数的调用方法。 2. 理解函数实参与形参的对应关系以及“值传递”的方式。
3. 掌握全局变量和局部变量动态变量、静态变量的概念和使用方法。 4. 掌握动态存储分配的方法。
5. 掌握宏定义和文件包含处理方法。 6. 实验4学时
二、实验内容
1.程序验证与改错题
(1) 程序验证题
① 下面程序执行的结果是什么 void swap(int 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
void swap(int &x, int &y) { int temp; temp=x;
x=y; y=temp; }
void main() { int a,b; scanf(\ swap(a,b); //if语句被去掉// printf(\}
因为调用函数中改变的是形参而非实参,加上&,其意义是改变实参的地址。 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=1-2+3-4+?+9-10。
答:
#include
int m=0,i;
for (i=1;i<=n;i++) {
if(i%2==1) m+=i; else
m-=i;
}
return m; }
void main() {
printf(\}
(2)程序改错题
下列程序的功能是利用自定义函数计算一无符号的整数各位数字的乘积。
#include
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
unsigned f(unsigned num) {
unsigned k=1; do {
k*=num; num/=10;
}while(num!=0); return k; }
void main() {
int x;
printf(\ scanf(\&x);
printf(\}
2.一般编程题
编程题1 编写一函数,把输入的4个数字字符转换成一个int数据存放,如输入4123这字符转换为4123这个整数,并通过主函数验证结果。 答:
#include
void main() { int a,b=0; char c; while((c=getchar())!='\\n') { a=f(c); b=b*10+a; } printf(\ printf(\ printf(\}
编程题2 编写程序求:1*1*1+2*2*2+3*3*3+4*4*4+5*5*5
提示:主函数用来现实结果,f1( )函数用来求一个数的立方,f2( )函数用来求和。 #include
int f2(int m) { …… }
void main() {
…… } 答:
1解(使用库函数) #include
int i=4; char temp; int result=0; temp=getchar(); while(temp!='\\n') { result*=10; result+=((int)temp-48); temp=getchar(); }
printf(\ printf(\}
2解(使用stdlib 库函数中的atoi ()函数) # include
int num; char str[30]; gets(str);
num = atoi(str);
printf(\}
编程题3 定义两个带参数的宏,将两个参数的值相加和相减,并写出程序,输入两个数作为使用宏时的实参。输出相加和相减后的和与差。 答:
#include