计算数组元素的百分比

时间:2014-01-10 20:32:29

标签: c arrays printf scanf percentage

我必须读取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;
}

3 个答案:

答案 0 :(得分:0)

这可能是你的问题:

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

答案 1 :(得分:0)

注意:这个答案是针对原始问题的代码编写的。


使用具有良好诊断消息的编译器将帮助您学习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格式字符串以指示int而不是float

你也对阵列的大小感到困惑。当你实际上想要10时,你已经声明数组保存9个值。据推测,让你困惑的是访问第n个元素的索引是n-1,所以要访问你编写的第十个元素array[9]。这在访问元素时适用,而不是在声明数组时适用。要声明一个包含十个元素的数组,请说int array[10];。在您的情况下,您有一个变量n,用于迭代数组;在循环和声明数组中使用相同的变量是正确和良好的做法,如下面的代码片段所示:

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 <stdlib.h>(或者你认为C ++的良好做法是#include <cstdlib>,并明确将system定为std::system("PAUSE")


一旦你解决了这些问题,你的程序似乎运行正常。

答案 2 :(得分:0)

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]);