davidmou 发表于 2023-9-28 00:01:49

牛顿迭代法

#include <stdio.h>
float ma(int a, int n, int x1, int count)
{
        short calulator_jishu = 0;
        short panduan = 1;
        if (panduan)
        {
                printf("请输入底数:");
                scanf_s("%d", &a);
                printf("请输入开几次方:");
                scanf_s("%d", &n);
                printf("请输入x1,默认是1":);
                scanf_s("%d", &x1);
                printf("请输入迭代次数");
                scanf_s("%d", &count);
                panduan = 0;
        }

        x1 = ((n - 1) * x1 + a / (x1 * *(n - 1))) / n;
        calulator_jishum++;

        if (calulator_jishu == count)
        {
                return x1;
        }
        ma(a, n, x1);
}

int main(void)

{
        int a = 0;
        int x1 = 0;
        int n = 0;
        int count = 0;
        float result;

        result = ma(a, n, x1, count);
        printf("%f", result);
        return 0;
}
这段代码的目的是通过牛顿迭代法求解根号的,能给代码指以下错误吗,x1 = ((n - 1) * x1 + a / (x1 * *(n - 1))) / n 的逻辑尽量保留

isdkz 发表于 2023-9-28 00:02:26

这段代码中存在以下错误:

1. 缺少头文件:需要包含<stdio.h>头文件以使用printf和scanf_s函数。

2. 变量未初始化:在main函数中,变量a 、 x1 、 n和count都没有被初始化,导致在调用ma函数时传递的参数值是未定义的。

3. 函数返回类型不匹配: ma函数声明为返回float类型,但没有在递归调用时返回值。

4. 递归终止条件不正确: calulator_jishu是一个局部变量,每次递归调用时都会被重新初始化为 0,因此无法正确地判断是否达到迭代次数。

5. 递归调用参数不正确:在递归调用ma函数时,缺少参数count 。

6. 缺少递归终止语句:即使calulator_jishu的判断条件正确,也没有提供递归终止的语句,导致函数无法正常结束。

以下是修改后的代码,修复了上述错误:

#include <stdio.h>

float ma(int a, int n, int x1, int count, int calulator_jishu)
{
    if (count == 0) {
      return x1;
    }
   
    if (calulator_jishu == 0)
    {
      printf("请输入底数:");
      scanf_s("%d", &a);
      printf("请输入开几次方:");
      scanf_s("%d", &n);
      printf("请输入x1,默认是1:");
      scanf_s("%d", &x1);
      printf("请输入迭代次数:");
      scanf_s("%d", &count);
    }

    x1 = ((n - 1) * x1 + a / (x1 * (n - 1))) / n;
    calulator_jishu++;

    return ma(a, n, x1, count - 1, calulator_jishu);
}

int main(void)
{
    int a = 0;
    int x1 = 0;
    int n = 0;
    int count = 0;
    int calulator_jishu = 0;
    float result;

    result = ma(a, n, x1, count, calulator_jishu);
    printf("%f", result);
    return 0;
}


在修改后的代码中,我添加了一个额外的参数calulator_jishu用于记录迭代次数,同时修复了其他错误。

Mike_python小 发表于 2023-9-28 00:02:56

代码问题修正和改进示例

在你提供的代码中,有一些错误和改进的地方。我将逐步指出并进行修改,同时给出一些改进建议。

首先,我注意到以下几个问题:

1. 在输入提示中,冒号(:)的中英文字符不匹配。
2. 函数ma需要返回一个浮点数类型的值,但没有在所有分支中都有返回语句。
3. 在迭代过程中,使用了一个未定义的变量calulator_jishum,应该改为calulator_jishu。
4. 递归调用ma时,没有传递count参数。

以下是修正后的代码:


#include <stdio.h>

float ma(int a, int n, int x1, int count) {
    static short calculator_jishu = 0;
    static short panduan = 1;

    if (panduan) {
      printf("请输入底数:");
      scanf("%d", &a);
      printf("请输入开几次方:");
      scanf("%d", &n);
      printf("请输入x1,默认是1:");
      scanf("%d", &x1);
      printf("请输入迭代次数:");
      scanf("%d", &count);
      panduan = 0;
    }

    x1 = ((n - 1) * x1 + a / (x1 * (n - 1))) / n;
    calculator_jishu++;

    if (calculator_jishu == count) {
      return (float)x1;
    }

    return ma(a, n, x1, count);
}

int main(void) {
    int a = 0;
    int x1 = 0;
    int n = 0;
    int count = 0;
    float result;

    result = ma(a, n, x1, count);
    printf("%f\n", result);

    return 0;
}


修改和改进的内容包括:

1. 将calulator_jishu和panduan声明为静态变量,使其在递归调用中保持状态。
2. 更正输入提示中冒号的中英文字符不匹配问题。
3. 将scanf_s改为scanf,因为在此示例中不需要特定的安全性检查。
4. 添加了缺失的返回语句,在所有分支中都有返回值。
5. 修改了calculator_jishum为calculator_jishu,以修复未定义变量的问题。

希望这些修改能帮助你解决问题,并使代码更加健壮和可读。如果还有其他问题,请随时提问。

球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}
页: [1]
查看完整版本: 牛顿迭代法