2012-12-21 36 views
-2

使用同一臺機器和IDE作爲下文稱在我的其他問題(在Problems in code or my IDE/comp is bugged?第三段)一個簡單的「的」使用命令不工作只stdio庫

我嘗試運行這段代碼:

#include <stdio.h> 
#define n 3 
int main() 
{ 
    int i; 
    float values[n],sumval,svmean,tmp; 
    for(i=0;i<n;++i) 
    { 
     scanf("%f",&tmp); 
     values[i]=tmp; 
     sumval = sumval + values[i]; 
    } 
    svmean = sumval/n; 
    printf("%f \n",svmean); 
    return(0); 
} 

上面的代碼應該運行該式

http://img850.imageshack.us/img850/6894/95871186.jpg

這意味着,它必須增加一些值,併除以第結果總數。

正如你在上面看到的,我用隨機n職位做了一個數組,然後我要求用戶爲每個職位填寫一個值,然後將他們全部加起來並將其分開。

問題是它不起作用。無論iput是什麼,它只輸出結果7。

但如果我包含stdlib.h到代碼工作正常。

所以

  • 質疑:爲什麼代碼不會僅使用 stdio.h中圖書館正常工作?哪些代碼元素確實需要stdlib.h 庫?

正如你所看到的陣列values[n]似乎有一個隨機n細胞數量,但實際上我已經設置此NUMER等於3(使用#define

  • 問題B:是有一種方法可以使用相同的porpuse運行代碼,但允許用戶定義數組的大小values[n]或換句話說讓用戶輸入一個整數,該整數將的值設置爲values[n]

回答

2

首先,你忘了初始化sumval。您希望它在開始時爲0

如果你想在數組的大小在運行時決定,你必須給它分配動態使用malloc,例如像這樣:

int n; 
float *values,sumval=0,svmean,tmp; 
scanf("%d", &n); 
values = (float *) malloc (n * sizeof(float)); 

之後,你應該釋放通過調用free分配的內存:

free(values); 
+0

我在相同代碼的其他試驗中做了這些,但它似乎沒有改變任何東西(我認爲編譯器接受sumval默認值爲0),即使沒有sumval使用stdlib.h進行初始化,它工作正常。感謝您的答覆。 – John

+2

@John錯誤的猜測。 'sumval'是一個自動變量(分配在堆棧上),這意味着它不保證被初始化爲任何特定的值,它通常會包含一些「垃圾」。 – piokuc

0

將sumVal初始化爲o。因爲對於第一次迭代,它會將garbage + values [i]添加到sumValue中。

#include <stdio.h> 
#define n 3 
int main() 
{ 
int i; 
float values[n],sumval=0,svmean,tmp; 
for(i=0;i<n;++i){ 
scanf("%f",&tmp); 
values[i]=tmp; 
sumval = sumval + values[i]; 
} 
    sumean = sumval/n; 
    printf("%f \n",svmean); 
    return(0); 

}

0

的問題是,你不初始化sumval。您應在for循環之前將其設置爲0.0

包括時/不包括stdio.h發生的變化可能是由於使用堆棧,並在內存中改變值,輸入您的函數之前,和它發生,這種存儲器用於您sumval變量一些初始化功能。

但是你應該不是依靠這個。

0

可以在程序類似的堆中分配具有可變大小的數組:

#include <stdio.h> 
int main(int argc, char **argv) 
{ 
    int i; 
    //Get the size of the array from input parameter 
    int n = atoi(argv[1]);     
    float sumval,svmean,tmp; 
    //Allocate the array of values 
    float *values = malloc(sizeof(float)*n); 
    // Initialize sumval 
    for(sumval=0,i=0;i<n;++i){ 
     scanf("%f",&tmp); 
     values[i]=tmp; 
     sumval = sumval + values[i]; 
    } 
    svmean = sumval/n; 
    printf("%f \n",svmean); 
    //Free it 
    free(values);    
    return(0); 
    } 

還需要初始化sumval爲0的數組的大小的參數啓動時傳遞程序(如果你使用IDE,你應該檢查一下這是如何)

+0

Genis感謝您的代碼......但1)我無法讓它運行......首先調試器要求定義n個var,並且需要一個「;」在第9行,我定義了n,但是再次沒有任何內容...... 2)main中的參數究竟是什麼?也沒有scanf獲取陣列的大小..我也加了一個,但它又不工作.. – John

+0

好吧,你是對的,我留下了一個「;」並沒有宣佈「n」,但這些都是微不足道的修正,不是嗎?關於scanf獲取數組大小,它不掃描它,但從命令行中的參數中獲取它,但是如果你喜歡,可以改變它。 –

0

問題進行回答 在您發佈沒有必要stdlib.h中的代碼。如果使用動態分配內存的函數(如malloc()),則需要此庫。

問題B回答: 這是一種方式做你想要什麼:

#include <stdio.h> 

int main() 
{ 
    int i, choice; 
    float *values,sumval,svmean,tmp; 
    printf("Please enter the size of the array: "); 
    scanf("%d", &choice); 
    values = (float*) malloc(choice*sizeof(float)); 
    for(i=0;i<n;i++){ 
     scanf("%f",&tmp); 
     values[i]=tmp; 
     sumval = sumval + values[i]; 
    } 
    svmean = sumval/n; 
    printf("%f \n",svmean); 
    free(values); 
    return 0; 
} 

而且,我修改了我的遞增,for語句運行循環之後增加。

+1

謝謝popanik我看到你正在使用的指針,我不記得幾乎任何關於他們的「機制」...運行你的代碼,但通過我的GNU GCC編譯器爲第10行導致錯誤「 錯誤:'n'未申報(首次在此功能中使用) || ===構建完成:1個錯誤,4個警告(0分鐘,0秒)=== | – John

+0

它似乎不運行「錯誤:'n'未在此範圍內聲明「在第10行和第15行:/ – John

+0

是的,我的不好,實際上,我不是使用變量選項,所以在發生錯誤的時候,只需將n替換爲選項,一切都可以正常工作。 –

0

嘗試此..

#include <stdio.h> 

int main() 
{ 
    int i = 0; 
    int n = 0; 
    float sumval = 0; 
    float svmean = 0; 
    float tmp = 0; 

    printf("Enter count : "); 
    scanf("%d", &n); 

    for (i = 0; i < n; ++i) { 
     scanf("%f", &tmp); 
     sumval = sumval + tmp; 
    } 

    svmean = sumval/n; 
    printf("%f \n",svmean); 

    return(0); 
} 

在代碼中,值[]數組是不需要計算輸出。你是否因任何原因存儲了值?..