我必须读取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;
}
答案 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]);