关于#c语言#的问题,请各位专家解答!


#include <stdio.h>
#include <math.h>
#define f(x) 1-x-sin(x)
#define e 0.00005

int main()
{
   float x, a = 0, b = 1;
   if(f(0) * f(1) >= 0)
   {
       printf("the range is error");
       return 0;
   }
   else
   {
       while (b - a > e)
       {
           x = (a + b) / 2;
           if(f(a) * f(x) < 0)
           {
               b = x;
           }
           else
           {
               a = x;
           }
       }
   }
   x = (a + b) / 2;
   printf("answer = %f", x);

    return 0;
}

二分法求根感觉有点问题

目测判断条件有问题

#include <stdio.h>
#include <math.h>
#include <stdlib.h>

float f(float x)
{
    return 1 - x - sin(x);
}

#define e 0.00005

int main()
{
    float x, a = 0, b = 1;
    if(f(a) * f(b) >= 0)
    {
        printf("The range is invalid.");
        return 0;
    }
    else
    {
        while (b - a > e)
        {
            x = (a + b) / 2;
            if(f(a) * f(x) < 0)
            {
                b = x;
            }
            else
            {
                a = x;
            }
        }
    }
    x = (a + b) / 2;
    printf("Answer = %f", x);

    return 0;
}

来自GPT的回答:

在您提供的代码中,使用了二分法来求解方程的根。然而,我注意到您在定义函数f(x)时使用了sin(x),而sin()函数的参数应该是弧度制而非角度制。

如果您希望在角度制下计算sin(x),可以使用sin()函数之前先将角度转换为弧度,例如使用sin(x * M_PI / 180),其中M_PI是一个宏定义,表示π(pi)的值。这样可以确保正确计算函数值。

此外,您的代码中没有明确设置迭代的终止条件。根据您的代码逻辑,可以设置迭代次数作为一个终止条件,以防止无限循环。

以下是修正后的代码示例:

c
Copy code
#include <stdio.h>
#include <math.h>
#define f(x) (1 - x - sin(x * M_PI / 180))
#define e 0.00005
#define MAX_ITERATIONS 1000

int main()
{
    float x, a = 0, b = 1;
    if (f(a) * f(b) >= 0)
    {
        printf("The range is invalid.\n");
        return 0;
    }
    else
    {
        int iterations = 0;
        while (iterations < MAX_ITERATIONS && b - a > e)
        {
            x = (a + b) / 2;
            if (f(a) * f(x) < 0)
            {
                b = x;
            }
            else
            {
                a = x;
            }
            iterations++;
        }
    }
    x = (a + b) / 2;
    printf("Root = %f\n", x);

    return 0;
}
请注意,上述修正仅针对您提供的代码逻辑进行了修改。如果方程的特性或求解需求有其他要求,请提供更多详细信息,以便进一步帮助您。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7549377
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:C语言如何把两个二维数组中的重复行去掉?欢迎大家推荐优化方案。
  • 除此之外, 这篇博客: 用c语言实现三子棋,它来了!!中的 判定胜负关系 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
    char iswin(char ChessBoard[MAX_ROW][MAX_COL]){//判定胜负
    	for (int row = 0; row < MAX_ROW; row++){//判定行
    
    		if (ChessBoard[row][0] != ' ' &&ChessBoard[row][0] == ChessBoard[row][1] &&
    			ChessBoard[row][0] == ChessBoard[row][2]){
    			return ChessBoard[row][0];
    		}
    	}
    	for (int col = 0; col < MAX_COL; col++){//判定列
    		if (ChessBoard[col][0] != ' ' &&ChessBoard[col][0] == ChessBoard[col][1] &&
    			ChessBoard[col][0] == ChessBoard[col][2]){
    			return ChessBoard[col][0];
    		}
    	}
    	if (ChessBoard[0][0] !=' '  && ChessBoard[0][0] == ChessBoard[1][1] &&
    		ChessBoard[0][0] == ChessBoard[2][2]){
    		return ChessBoard[0][0];
    	}
    	if (ChessBoard[2][0] != ' ' && ChessBoard[2][0] == ChessBoard[1][1] &&
    		ChessBoard[2][0] == ChessBoard[0][2]){
    		return ChessBoard[2][0];
    	}
    	if (isfull(ChessBoard)){
    		return 'q';
    	}
    	return ' ';
    }
    

      在游戏介绍中我们知道三子棋获胜的方式就是在一条直线上有3个相同的元素,这样则判定为胜利。

  • 您还可以看一下 李老师老师的C语言版数据结构入门课程中的 数据结构入门简介小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    答案:

    问题出在二分法的循环条件上。当r-l小于等于1e-6时,应该停止循环,但是当前代码只考虑了r-l大于1e-6的情况。所以需要修改while循环的条件,将大于改为小于等于即可。

    修改后的代码如下:

    #include <stdio.h>
    
    double f(double x) {
        return x*x - 2;
    }
    
    double find_root(double l, double r) {
        double mid;
        while(r - l > 1e-6) {
            mid = (l + r) / 2;
            if(f(mid) > 0) r = mid;
            else l = mid;
        }
        return mid;
    }
    
    int main() {
        double root = find_root(1, 2);
        printf("root = %lf", root);
        return 0;
    }
    

    修正意见:将while循环的条件修改为r - l <= 1e-6。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^