【项目任务】
编写一个程序,求圆的面积
【设计思路】
求圆面积时,要有到圆周率这个常数,可以将其定义成一个符号常量。
【程序代码】
#include <stdio.h>
#define PI 3.1415926 /*定义不带参数的宏*/
main()
{
float r=4.5,area;
area=PI*r*r;
printf("area=%.2f\n",area);
}
【运行结果】
area=63.62
【知识拓展】
这是一个不带参数的宏定义,一般形式为:
#define标识符 字符串
#define PI 3.1415926,它的作用是:在编译预处理时,用3.1415926这个字符串来代替程序中所有出现的PI标识符。这种方法可以使用户用一个简单的名字来代替一个复杂的字符串,增加程序的可读性。这个标识符称为宏名,在编译预处理时用字符串替换宏名的过程称为宏展开。
宏定义只是用宏名代替一个字符串,以增加程序的可读性,编译器是不做任何检查工作的,跟函数刚好相反。
注意:不要将#define PI 3.1415926写成#define PI=3.1415926。
【项目任务】
编写一个程序,求三角形的面积
【设计思路】
要将计算三角形面积的公式写成带参数的宏定义,先回忆一下求三角形面积的公式。
三角形的面积计算可以使用海伦公式:
area=
其中a、b、c为三角形的边长,s=是三角形的半周长,area为三角形的面积。
【程序代码】
#include <stdio.h>
#include <math.h>
#define S(a,b,c) 1.0/2*(a+b+c) /*定义带参数的宏*/
#define AREA(a,b,c) sqrt(S(a,b,c)*(S(a,b,c)-a)*(S(a,b,c)-b)*(S(a,b,c)-c))
main()
{
float x;
x=AREA(3,4,5);
printf("area=%.2f\n",x);
}
【运行结果】
area=6.00
【知识拓展】
宏定义可以分成两种类型:一种是不带参数的宏定义;另一种是带参数的宏定义。不带参数的宏定义只是简单的字符串替换;而带参数的宏定义不仅要作字符串替换,还要作参数替换。带参数的宏展开的过程,是用语句中宏名后括号内的实参代替#define命令行中的形参。
比较以下两个程序,体会其中的差异。
/*程序1*/
#include <stdio.h>
#define F(x) x*x
main()
{
int a,b;
a=F(2); /*宏展开为(2*2)*/
b=F(2+2); /*宏展开为(2+2*2+2)*/
printf("%d,%d\n",a,b);
}
运行结果:4,8。
/*程序2*/
#include <stdio.h>
#define F(x) (x)*(x)
main()
{
int a,b;
a=F(2); /*宏展开为(2*2)*/
b=F(2+2); /*宏展开为(2+2)*(2+2)*/
printf("%d,%d\n",a,b);
}
运行结果:4,16。
注意:带参数的宏定义与函数的区别是:函数调用时,先求实参的值,而且会作类型检查等工作;而宏定义只是作字符串和行参的替换工作,不作任何检查。所以在使用宏定义时,一定要确保所定义的宏的正确性。