Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我的C代码计算k的最小值,其和大于用户输入n,这并没有给我预期的结果?_C_Loops_Trace - Fatal编程技术网

我的C代码计算k的最小值,其和大于用户输入n,这并没有给我预期的结果?

我的C代码计算k的最小值,其和大于用户输入n,这并没有给我预期的结果?,c,loops,trace,C,Loops,Trace,我正在为即将到来的考试练习编写C代码。提示为: 编写一个程序来计算k的最小值,对于该值,下面的和大于n。获取用户输入n并编写一个循环来计算和。请注意,n可以是一个浮点数 (1/1+1/2+1/3+…+1/k)>n 因此n=2.0应该返回k=4,因为(1/1+1/2+1/3+1/4)=2.08>2 我不确定我做错了什么,因为当我运行程序时,它不会打印任何内容 #include <stdio.h> #include <math.h> int main() { int

我正在为即将到来的考试练习编写C代码。提示为:

  • 编写一个程序来计算k的最小值,对于该值,下面的和大于n。获取用户输入n并编写一个循环来计算和。请注意,n可以是一个浮点数
  • (1/1+1/2+1/3+…+1/k)>n

    因此n=2.0应该返回k=4,因为(1/1+1/2+1/3+1/4)=2.08>2

    我不确定我做错了什么,因为当我运行程序时,它不会打印任何内容

    #include <stdio.h>
    #include <math.h>
    int main()
    {
        int k=1;    
        double n, sum;  
        printf("Enter a value ");
        scanf("%lf", &n); //n=2     
    
        while(sum>=0 && sum<=n) //when n=2, 1=<1<2
        {
            sum= (1/k); 
            sum=sum++;  
            k++;        //when sum= 0    -> sum = 1 ,               k=1
                        //when sum= 1    -> sum = 1+ 1/2  = 1.5,    k=2
                        //when sum= 1.5  -> sum = 1.5 + 1/3 = 1.83, k=3
                        //when sum= 1.83 -> sum = 1.83 +1/4 = 2.8,  k=4
                        //sum is now 2.8 
                        //2.8>2 , k=4 so loop terminates    
        }
    
        printf("%d\n", k); //4  but it doesn't print anything???    
        return 0;           
    }
    
    #包括
    #包括
    int main()
    {
    int k=1;
    双n,和;
    printf(“输入值”);
    scanf(“%lf”,&n);//n=2
    而(sum>=0&&sum=1.5+1/3=1.83,k=3
    //当sum=1.83->sum=1.83+1/4=2.8时,k=4
    //总和现在是2.8
    //2.8>2,k=4,因此循环终止
    }
    printf(“%d\n”,k);//4但它不打印任何内容???
    返回0;
    }
    

    除了我的代码之外,我还在注释中写下了我的预期结果。

    您的程序有很多错误:

    • while
      条件下,程序读取
      sum
      的值,但该变量以前从未初始化过

      此错误已经意味着您没有将编译器警告设置得足够高。现代编译器可以全面分析此情况并向您发出警告

    • sum=1/k

      这会将总和初始化为0.0,因为k的类型为
      int

    • sum=sum++

      由于在一条语句中向
      sum
      变量写入两个值,因此再次出现未定义的行为


    作为一般建议,除了C之外,还有其他编程语言可以通过拒绝运行此程序来防止上述所有错误。最好先用这样一种安全的语言编写程序,完成后将其翻译成C。(Java、Go、Kotlin是更安全的编程语言的示例。)您的程序有许多错误:

    • while
      条件下,程序读取
      sum
      的值,但该变量以前从未初始化过

      此错误已经意味着您没有将编译器警告设置得足够高。现代编译器可以全面分析此情况并向您发出警告

    • sum=1/k

      这会将总和初始化为0.0,因为k的类型为
      int

    • sum=sum++

      由于在一条语句中向
      sum
      变量写入两个值,因此再次出现未定义的行为


    作为一般建议,除了C之外,还有其他编程语言可以通过拒绝运行此程序来防止上述所有错误。最好先用这样一种安全的语言编写程序,完成后将其翻译成C。(Java、Go、Kotlin是更安全的编程语言的示例。)您的代码有几个问题

    sum=(1/k);
    计算1除以k的整数,它总是给出0。将其转换为double以获得正确的值

    sum=sum++;
    不确定您想做什么。
    sum++
    表示已经
    sum=sum+1

    也许你想做的是

    sum=sum+(1.0/k)
    1.0确保除法的结果是双精度的

    sum缺少初始化

    另外,您还计算了一次额外的迭代。最好从k=0开始,并在循环开始时递增

    #include <stdio.h>
    #include <math.h>
    int main()
    {
        int k=0;    
        double n, sum=0.0;  
        printf("Enter a value ");
        scanf("%lf", &n); //n=2     
    
        while(sum>=0 && sum<=n) //when n=2, 1=<1<2
        {
            k++;        
            sum+=(1.0/k); 
                        //when sum= 0    -> sum = 1 ,               k=1
                        //when sum= 1    -> sum = 1+ 1/2  = 1.5,    k=2
                        //when sum= 1.5  -> sum = 1.5 + 1/3 = 1.83, k=3
                        //when sum= 1.83 -> sum = 1.83 +1/4 = 2.8,  k=4
                        //sum is now 2.8 
                        //2.8>2 , k=4 so loop terminates    
        }
    
        printf("%d\n", k); //4  but it doesn't print anything???    
        return 0;           
    }
    
    #包括
    #包括
    int main()
    {
    int k=0;
    双n,和=0.0;
    printf(“输入值”);
    scanf(“%lf”,&n);//n=2
    而(sum>=0&&sum=1.5+1/3=1.83,k=3
    //当sum=1.83->sum=1.83+1/4=2.8时,k=4
    //总和现在是2.8
    //2.8>2,k=4,因此循环终止
    }
    printf(“%d\n”,k);//4但它不打印任何内容???
    返回0;
    }
    
    您的代码有几个问题

    sum=(1/k);
    计算1除以k的整数,它总是给出0。将其转换为double以获得正确的值

    sum=sum++;
    不确定您想做什么。
    sum++
    表示已经
    sum=sum+1

    也许你想做的是

    sum=sum+(1.0/k)
    1.0确保除法的结果是双精度的

    sum缺少初始化

    另外,您还计算了一次额外的迭代。最好从k=0开始,并在循环开始时递增

    #include <stdio.h>
    #include <math.h>
    int main()
    {
        int k=0;    
        double n, sum=0.0;  
        printf("Enter a value ");
        scanf("%lf", &n); //n=2     
    
        while(sum>=0 && sum<=n) //when n=2, 1=<1<2
        {
            k++;        
            sum+=(1.0/k); 
                        //when sum= 0    -> sum = 1 ,               k=1
                        //when sum= 1    -> sum = 1+ 1/2  = 1.5,    k=2
                        //when sum= 1.5  -> sum = 1.5 + 1/3 = 1.83, k=3
                        //when sum= 1.83 -> sum = 1.83 +1/4 = 2.8,  k=4
                        //sum is now 2.8 
                        //2.8>2 , k=4 so loop terminates    
        }
    
        printf("%d\n", k); //4  but it doesn't print anything???    
        return 0;           
    }
    
    #包括
    #包括
    int main()
    {
    int k=0;
    双n,和=0.0;
    printf(“输入值”);
    scanf(“%lf”,&n);//n=2
    而(sum>=0&&sum=1.5+1/3=1.83,k=3
    //当sum=1.83->sum=1.83+1/4=2.8时,k=4
    //总和现在是2.8
    //2.8>2,k=4,因此循环终止
    }
    printf(“%d\n”,k);//4但它不打印任何内容???
    返回0;
    }
    
    我已经一年多没学过java了。我要花很长时间才能把所有事情都弄清楚。这是你的选择。如果你继续用C语言那样编程,你会无数次地自食其果。请注意。我已经一年多没学过java了。我要花很长时间才能把所有事情都弄清楚。这是你的选择。你会自食其果的如果你继续在C语言中那样编程,我们会陷入困境无数次。只是要得到警告。非常感谢你指出我所有的错误,甚至给出解释!!我将k初始化为1,因为我不想被0除,我从来没有想过先增加k。我为sum建立了一个方程式,然后我想更新sum通过在每次迭代后添加旧的总和。我太多余了,现在我注意到添加1没有任何意义。我