2016-06-07 58 views
0

我只是一个使用C初学者所以请与我裸...问题在C数组的最小值和最大值

我做一个程序,将计算输入到一个array数的平均值也打印将最小和最大数字输入array,然后计算标准偏差。

我认为我的平均值和标准偏差部分正常工作,但是当运行一些最终测试时,我注意到当在数组中输入我的数字时,3以上的任何数字都不会显示在最小数字打印中。

因此,举例来说,我可以进入 11,12,13,14,15,16,17,18,19,20 ,我会得到20最大和3中最低。

任何想法,为什么我得到这个。我猜测有些东西正在限制这个变量,但是我看不到。

对不起,如果这是一个愚蠢的问题。

感谢,

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

int main(void) 
{ 
    //variables 
    float num[100]; 
    float average=0; 
    float var=0; 
    float stand=0; 
    float sum=0; 
    float sum1=0; 
    int i=0; 
    int n=10; 
    int min; 
    int max; 

    //ask user to enter numbers 
    printf("Enter 10 numbers\n",n); 
    for(i=0; i<n; i++) 
    { 
     scanf("%f", &num[i]); 
    } 

    //find average of numbers 
    for(i=0; i<n; i++) 
    { 
     sum = sum + num[i]; 
    } 
    average = sum /(float) n; 

    for(i=0; i<n; i++) 
    { 
     //if greater than max 
     if(num[i]>max) 
     { 
      max = num[i]; 
     } 
    } 

    //if smaller than min 
    if(num[i]<min) 
    { 
     min = num[i]; 
    } 

    //calculate standard deviation 
    for(i=0; i<n; i++) 
    { 
     sum1 = sum1 + pow((num[i] - average),2); 
    } 

    stand = sqrt(sum1/n); 

    //print results  
    printf("Average of all numbers = %.2f\n", average); 
    printf("Maximum number   = %d\n", max); 
    printf("Minimum number   = %d\n", min); 
    printf("Standard deviation  = %.2f\n", stand); 

    system("PAUSE"); 
    return 1; 
} 
+4

您并未初始化您的最小和最大变量。您可以在读取 – samgak

+0

中的值后将它们初始化为数组的第一个元素当然!非常感谢你。它现在工作正常! – NolanD

回答

2

这个代码不应该编译。考虑到它正在为你运行,我猜你最初将它们初始化为低于或大于数组值的值。

更改这部分代码看起来像这样:

基于什么@samgak中的评论称

printf("Enter 10 numbers\n",n); 
for(i=0; i<n; i++) 
{ 
    scanf("%f", &num[i]); 
} 
max = min = num[0]; //ADD THIS LINE TO INITIALIZE YOUR MAX AND MIN 
+0

为什么不能编译?可能会有一些警告(缺少'#include','printf'的额外参数),但没有任何致命性。未初始化的变量是允许的,即使它们的初始值不可靠... – Dmitri

+0

你怎么知道'scanf'成功? *始终,总是*验证'scanf'(和'Xscanf'系列的任何函数)的返回值。特别是在接受用户输入时。 –

+0

@Dmitri ...我正在考虑Visual C++编译器如何处理编译。它会抛出一个'未初始化的局部变量使用'错误。 @DavidRankin ...我同意你关于'scanf'结果验证。然而,OP所问的问题不是关于这个问题的,我只是想要在哪里插入代码。 – Ash

1

你是不是你的变量分配值(这在其他语言通常实例化为0)。在像C这样的语言中,它是从RAM中分配的。 我想到的方式是,你在一个房间里被给了一些空间,但你不知道现在在哪里或者里面有什么。只是一些空间,你知道空间的数量是正确的!这不完全正确,但作为初学者,它很好掌握发生的事情。 (至少对我来说)

如果在代码的开头将min设置为3,并且你会发现它在逻辑上是正确的,那么通过代码进行弱点检查。

两个可能的事情可以做的:

min = inf 
max = -inf 

另一种解决方案是使用一个值,你已经知道

min = num[0] 
max = num[0] 
+0

我的网络在我发布之前就崩溃了...... :(damnit – mdave16

1

初始化

即最多=分钟= NUM​​ [之后0];

你需要做小改动 i。Ë 添加如果低于最低逻辑较小的for循环

例如: 代替这个代码

for(i=0; i<n; i++) 
{ 
    //if greater than max 
    if(num[i]>max) 
    { 
     max = num[i]; 
    } 
} 

//if smaller than min 
if(num[i]<min) 
{ 
    min = num[i]; 
} 

使用此代码

for(i=0; i<n; i++) 
{ 
    //if greater than max 
    if(num[i]>max) 
    { 
     max = num[i]; 
    } 

    //if smaller than min 
    if(num[i]<min) 
    { 
     min = num[i]; 
    } 
} 

的现在,你会得到最小值和最大值的阵列。