2016-06-07 101 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]; 
    } 
} 

的現在,你會得到最小值和最大值的陣列。