C 计算数组元素的百分比

C 计算数组元素的百分比,c,arrays,printf,scanf,percentage,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 <

我必须读取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;
}
#包括
int main()
{
int n=10;//数字的个数
浮点数组[10];
对于(int i=0;i-1;i--){
array[i]=array[i]*90.0/100.0;//计算每个值的90%
printf(“%f\n”,数组[i]);//按相反顺序打印值
}
浮点数s=0;
对于(int i=0;i<10;i++){
s=s+array[i];//将所有值相加
}
浮点m=s/n;//计算中间值
printf(“%f\n”,m);//打印它
系统(“暂停”);
返回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

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


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

main.cpp:3:2: error: C++ requires a type specifier for all declarations
 main ()
 ^~~~
这是因为函数声明必须包含返回类型。对于
main
它应该是
int
,因此您应该编写
int main()

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

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

此外,您还对数组的大小感到困惑。您已经声明数组包含9个值,而实际上需要10个值。大概让您感到困惑的是,访问第n个元素的索引是
n-1
,因此要访问第10个元素,您需要编写
数组[9]
。这在访问元素时适用,而不是在声明数组时适用。要声明一个由十个元素组成的数组,可以说
intarray[10]。在您的例子中,有一个变量
n
,用于迭代数组;在循环和声明数组中使用相同的变量是正确且良好的做法,如下代码段所示:

const int n = 10;
int array[n];
for (int i=0; i<n; ++i)
您没有为
system()
函数包含正确的标题。你应该<代码>包含< <代码>(或者在C++中被认为是好的实践中,你应该<代码> >包含< /COD>并明确限定<代码>系统<代码>为<代码> STD::系统(暂停)< /COD> .<

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

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

90/100是整数运算,结果是0。使用90.0/100.0这不是C++代码。你是指使用<代码> C<代码>标签吗?如果你想要C++答案,习惯用法会更简洁。而且,你要越过你的代码>数组< /代码>的界限。@ OLDDeal程序员:从左到右的表达式的评价不应该是个问题。在(float*90/100仍然是float)…我制作了由10个元素组成的数组,而不是9个元素,我在90.0和100.0中转换了90和100,仍然不起作用though@ninilo1:可能
scanf
%d
不能与
float
参数一起工作(但我并不真正了解这些C函数)。试着用scanf使用
%f
,然后像4.0一样在float中输入整数。@ninilo1:我认为这不是你唯一的一个整数,但找到其余的就很有趣了。8v)@ninilo1 clang是免费的,在Linux、BSD和OS X上运行良好。它还不太支持Windows。你可以在类似的网站上在线尝试(选择“C++(clang)”)不幸的是,.VC++没有这样有用的诊断功能,并且非常允许使用不正确的代码。如果您想在Windows上安装具有良好诊断功能的编译器,那么您可能应该使用最新版本的gcc。
float array[10];
...
// bad scanf("%d \n", &array[i] )
scanf("%f", &array[i]);
scanf("%f", &array[i]);
// or
char buf[100];
fgets(buf, sizeof buf, stdin);
sscanf(buf, "%f", &array[i]);