为什么宏定义pi3.145 pi代替的是字符,想不明白求解答一下为啥是字符串
宏定义是在编译阶段替换的
所以数值其实都是常量
到底是字符串常量还是double类型的常量,就看你加没加引号
宏定义中,pi代表的是一个字符串常量,而不是字符常量。这是因为宏定义的字符串常量可以由多个字符组成,而字符常量只能由一个字符组成。
在定义宏时,可以使用双引号来将多个字符括起来,形成一个字符串常量,例如:
#define PI "3.14159"
在使用宏时,直接使用宏名即可,例如:
double r = 5.0;
double area = r * r * PI;
在这个例子中,宏PI被替换成了字符串常量"3.14159",因此在计算面积时,可以直接使用宏PI来代替圆周率。
核心问题:
解决方法:
具体程序
/*
原理:基于简单的概率定律
在单位方形内随机生成点,达到一定数量后,这些点肯定是均匀地分布在方形中;
自然就会有一些点落在了1/4圆中;
在方形内随机点,落在方形里面的1/4圆的概率一样,但面积上的关系是:恰好是一个古典概率,即两个的面积比
实验假设,如果
圆的半径为单位r=1,则
1 则1/4圆的面积:AreaCircle = pi*r*r/4 = pi/4
2 则方形的面积:AreaSquare = r*r = 1
3 上下作比值,得pi的算法 pi = (4*AreaCircle)/AreaSquare
4 随机生成N个(x,y)坐标,然后测面积比,即概率比,即测这个点是否在圆内
具体实验:
落在方形中的次数,即实验次数
落在1/4圆中的次数,即计算得到的计数
两个比值,应该就是面积比,反推即可以计算PI
显然,次数越多,概率越准,PI就计算得越精确
*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
int main(void)
{
int p, circle, square, toss, rm, i;
float PI, x, y, r;
char ch;
srand((unsigned int)time(NULL));
rm = RAND_MAX; // #define RAND_MAX 0x7fff (即十进制32767 二进制01111111 11111111)
do{
circle = 0;
// 输入实验次数
do{
printf("Enter the number of tosses(2<=N<=5000) : ");
scanf("%d", &toss);
} while (toss < 2 || toss > 50000); // end of in do-while
// 总实验次数
square = toss;
for ( i = 0; i < toss; i++)
{
p = rand();
x = (float)p / rm; // 生成坐标x,一定是一个[0,1]之间的数
p = rand();
y = (float)p / rm; // 生成坐标y,一定是一个[0,1]之间的数
r = sqrt((x * x) + (y * y)); // 计算离原点的距离
if (r<=1) // 判断点落在圆中的次数
{
circle++;
}
}
PI = 4 * (float)circle / square;
printf("the value of PI is : %f\n\n", PI);
printf("Do you want to continue?(Y/N): ");
getchar(); // 先读到回车符
ch = getchar();
} while ((ch == 'y') || (ch == 'Y')); //end of out do-while
printf("Thank you\n");
return 0;
}
详见程序中的注释,主要是几个库函数的应用
如果扩展到整个圆,可以参考如下的流程图进行程序编写