我不能让这(简单)循环正常工作

时间:2014-02-27 21:18:32

标签: c visual-studio while-loop

我现在正在编程课程中,并被要求创建一个程序来计算用户输入多个数字的总和 - 然后计算总和的第n个根。如果他们输入的数字小于0,则循环应该丢弃小于0的数字,然后再次询问。

不幸的是,无论我输入什么号码,它都会显示“价值需要大于零!”我尝试在循环中添加fflush(stdin);语句,但似乎没有做任何事情。

这是我的代码。我非常感谢任何帮助。

#include "stdafx.h"
#include <stdio.h>
#include <math.h>

int main() {

int mTotalNums, mNth; //amount of numbers in set
float mProd = 1, x, mNroot;

printf("How many numbers are in the set?\n");
scanf("%i", &mTotalNums);

mNth = mTotalNums; //set the value of mTotalNums equal to mNth becuase we'll lose the original value of mTotalNums after the loop

while (mTotalNums > 0) {
    printf("Input number: ");
    scanf("%lf", &x);
    if (x > 0) {
        mProd *= x;
    } else
        printf("\nValue needs to be greater than zero!\n");
}

mNroot = pow(mProd, (1 / mNth));

printf("\nThe nth root of the product of %i terms is: %.2f\n", mNth, mNroot);

return 0;
}

4 个答案:

答案 0 :(得分:2)

"%lf"double的scanf格式,但x被声明为float。 要扫描浮动,您必须使用%f格式。

另请注意,mTotalNums在循环中不会递减,因此永远不会 终止。

答案 1 :(得分:2)

阅读scanf(3)的文档。由于x被声明为float,因此请使用%f作为scanf格式控制字符串。另外,请考虑scanf的结果(如果成功读取一个项目,则为1)。

您应该在编译器中启用所有警告和调试信息,然后学习如何使用调试器(特别是逐步运行程序,显示局部变量等等。)。

(在Linux上,如果使用gcc -Wall -g进行编译,则会收到有用的警告,并且gdb调试器会有所帮助......)

答案 2 :(得分:1)

在逻辑语句中检查变量之前,添加printf命令以查看变量包含的内容。

你还需要做一些事情来为你的while循环增加/减少变量...目前没有什么东西在改变mTotalNums,所以它将是一个无限循环。

  while (mTotalNums > 0) {
      printf("Input number: ");
      scanf("%lf", &x);
      printf("x=%d", x);
      if (x > 0) {
          mProd *= x;
      } else
          printf("\nValue needs to be greater than zero!\n");
      mTotalNums--;
  }

答案 3 :(得分:1)

尝试对您的程序进行这些修改(添加评论并进行更改)

#include "stdafx.h"
#include <stdio.h>
#include <math.h>

int main() {

    //amount of numbers in set
    int mTotalNums, mNth; 
    // Change to double for added precision
    double mProd = 1.0, x, mNroot;

    printf("How many numbers are in the set?\n");
    scanf("%i", &mTotalNums);

    // Set the value of mTotalNums equal to mNth becuase
    // we'll lose the original value of mTotalNums after the loop
    mNth = mTotalNums; 

    // Don't forget to decrement the loop counter
    while (mTotalNums-- > 0) {
        printf("Input number: ");
        scanf("%lf", &x);
        if (x > 0) {
            mProd *= x;
        } else {
            printf("\nValue needs to be greater than zero!\n");
        }

    }

    // Change to 1.0 to force compiler to treat as a double
    mNroot = pow(mProd, (1.0 / mNth));

    printf("\nThe nth root of the product of %i terms is: %.2f\n", mNth, mNroot);

    return 0;
}

您提及&#34; 计算总和的第n个根&#34;,但您的循环显然是累计产品。要更改它以计算总和,请尝试以下添加:

// Declare a sum variable
double sum =  0;
// Sum inside your while loop
sum += x;
// Calculate the nth root of the sum instead
mNroot = pow(sum, (1.0 / mNth));