为什么宏定义pi3.145 pi代替的是字符串

为什么宏定义pi3.145 pi代替的是字符,想不明白求解答一下为啥是字符串

宏定义是在编译阶段替换的
所以数值其实都是常量
到底是字符串常量还是double类型的常量,就看你加没加引号

宏定义中,pi代表的是一个字符串常量,而不是字符常量。这是因为宏定义的字符串常量可以由多个字符组成,而字符常量只能由一个字符组成。

在定义宏时,可以使用双引号来将多个字符括起来,形成一个字符串常量,例如:

#define PI "3.14159"

在使用宏时,直接使用宏名即可,例如:

double r = 5.0;
double area = r * r * PI;

在这个例子中,宏PI被替换成了字符串常量"3.14159",因此在计算面积时,可以直接使用宏PI来代替圆周率。

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7459350
  • 这篇博客也不错, 你可以看下永磁同步电机控制之直接离散域设计电流PI调节器(解耦电流环,无刷直流电机等交流电机同样适用)
  • 除此之外, 这篇博客: 20201216-成信大-C语言程序设计-20201学期《C语言程序设计B》平时自主学习-基于蒙特卡洛方法计算圆周率PI中的 3 编程实现 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 核心问题:

    1. 随机点如何生成
    2. 如何判断随机点落在了圆中
    3. 循环计数
    4. 扩大实验次数
    5. 更进一步:使用计算机进行多次模拟,然后取均值,是不是会更准确

    解决方法:

    1. 使用srand()植入随机种子,使用rand()生成随机数
    2. 生成一对坐标后,映射到[0,1]区间上,即可进行到原点[0,0]的距离判断
    3. 控制循环终点,每次做一次模拟投豆子,找落点
    4. 多次测试,即可以搞定,也可以自动化测试
    5. 自动化测试过程中,再累计结果后再做均值处理

    具体程序

    /*
        原理:基于简单的概率定律
            在单位方形内随机生成点,达到一定数量后,这些点肯定是均匀地分布在方形中;
            自然就会有一些点落在了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;
    }
    
    
    

    详见程序中的注释,主要是几个库函数的应用

    • srand()
    • rand()
    • time()
    • 这里,程序用的是1/4圆,也可以扩展到整个圆,当然,计数区间会有变化

    如果扩展到整个圆,可以参考如下的流程图进行程序编写

    在这里插入图片描述