【问题标题】:Calculating percentual of the elements of an array计算数组元素的百分比
【发布时间】:2014-01-29 23:45:50
【问题描述】:

我必须读取 10 个整数,计算每个值的 90%,以倒序打印它们,最后打印我获得的各种值的中间值。

但它不起作用,它只打印零。另一件事是,在我输入了 10 个值之后,它仍然需要另一个输入才能开始打印。我是 C 新手,所以我可能犯了一个愚蠢的错误......

#include <stdio.h>

int main ()
{
    int n = 10;           //number of numbers
    float array[10];

    for(int i = 0 ; i < n ; i++) {                 
        scanf("%d \n", &array[i] ) ;   //read the keyboard input and memorize it in the array
    }

    for( int i = 9; i > -1 ; i-- ) {
        array[i] = array[i]*90.0/100.0;        //calculate the 90% of every value 
        printf("%f \n", array[i]);         //prints the values in opposite order
    }

    float s = 0;                         
    for(int i = 0 ; i < 10 ; i++){
        s = s+array[i];                    //add up all the values
    }

    float m =s/n;                          //calculate the mid value
    printf("%f \n",m);                     //prints it
    system("PAUSE");

    return 0;
}

【问题讨论】:

  • 90/100 是整数运算,结果为 0。使用 90.0/100.0
  • 不是 C++代码。您的意思是使用C 标签吗?如果您想要 C++ 答案,惯用的方式会更加简洁。此外,您将超出 array 的范围。
  • @OldProgrammer:应该不是问题,因为表达式的从左到右求值(float*90/100 保持浮动)...
  • 我已经制作了 10 个元素的数组而不是 9 个元素,并且我在 90.0 和 100.0 中转换了 90 和 100,但仍然无法正常工作
  • @ninilo1: 也许scanf%d 不适用于float 参数(但我真的不知道这些C 函数)。尝试将%f 与scanf 一起使用,并在浮点数处输入整数,如4.0。

标签: c arrays printf scanf percentage


【解决方案1】:

这可能是你的问题:

scanf("%d \n", &array[i] ) ;   //read the keyboard input and memorize it in the array

array 元素的类型为 float,并且您被告知 scanf 读取一个整数。那里有未定义的行为。试试这个:

scanf("%f \n", &array[i] ) ;   //read the keyboard input and memorize it in the array

【讨论】:

  • @ninilo1:我不认为这是你唯一的一个,但是找到其余的很有趣。 8v)
【解决方案2】:

注意:此答案是为原始问题的代码编写的。


使用具有良好诊断消息的编译器将极大地帮助您学习 C++。 clang 为您的程序生成的诊断突出显示了几个问题,包括给您带来问题的核心问题。

main.cpp:3:2: error: C++ requires a type specifier for all declarations
 main ()
 ^~~~

这是因为函数声明必须包含返回类型。对于main,它应该是int,所以你应该写int main()

main.cpp:12:19: warning: format specifies type 'int *' but the argument has type 'float *' [-Wformat]
   scanf("%d \n", &array[i] ) ;   //read the keyboard input and memorize it in the array
          ~~      ^~~~~~~~~
          %f

您的数组是一个浮点数组,但您告诉scanf 读取整数(“%d”表示int,“%f”表示float)。这将导致未定义的行为,并且可能是您描述的奇怪行为的原因(打印零而不是预期值)。

由于您的分配涉及整数数组,您可能应该将数组更改为使用int 而不是float。如果您进行了更改,那么您需要更改printf 格式字符串以指示ints 而不是float

您还对数组的大小感到困惑。当您实际上需要 10 个值时,您已声明该数组包含 9 个值。大概让你感到困惑的是访问第 n 个元素的索引是n-1,所以要访问第十个元素你写array[9]。这适用于访问元素时,而不是声明数组时。要声明一个包含十个元素的数组,您可以说int array[10];。在您的情况下,您有一个变量 n 用于遍历数组;在循环和声明数组时使用相同的变量是正确且良好的做法,如下代码 sn-p 所示:

const int n = 10;
int array[n];
for (int i=0; i<n; ++i)

由于您的代码尝试将第十个值读入由九个元素组成的数组,因此程序再次表现出未定义的行为。


main.cpp:28:6: error: use of undeclared identifier 'system'
     system("PAUSE");
     ^

您没有为system() 函数添加正确的标题。你应该 #include &lt;stdlib.h&gt; (或者在 C++ 的良好实践中你应该 #include &lt;cstdlib&gt; 并明确地将 system 限定为 std::system("PAUSE")


一旦你解决了这些问题,你的程序似乎就可以正常工作了。

【讨论】:

  • @ninilo1 clang 是免费提供的,在 Linux、BSD 和 OS X 上运行良好。它还不能很好地支持 Windows。您可以在rextester.com/runcode 之类的网站上在线试用(选择“C++(clang)”)。不幸的是,VC++ 没有这样有用的诊断,并且非常允许不正确的代码。如果您想在 Windows 上安装具有良好诊断功能的编译器,那么您可能应该使用最新可用的 gcc 版本。
【解决方案3】:

OP 的第一个问题,scanf() 中不匹配的格式说明符由@bames53 和@Fred Larson 很好地解决。

float array[10];
...
// bad scanf("%d \n", &array[i] )
scanf("%f", &array[i]);

OP的第二个问题的答案如下:

“另一件事是,在我输入了 10 个值之后,它仍然需要另一个输入才能开始打印。”

关于scanf("%d \n",...' ''\n' 做同样的事情,可能不是你想要的。这些要求您在scanf() 返回之前的数字之后输入非空白数据。建议:

scanf("%f", &array[i]);
// or
char buf[100];
fgets(buf, sizeof buf, stdin);
sscanf(buf, "%f", &array[i]);

【讨论】:

    猜你喜欢
    • 2017-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多