2010-01-30 53 views
2

目前我的程序允許用戶輸入5個用於創建平均數的整數。這被設置爲5,因爲在輸入第五個數字之後,循環被破壞。跳轉循環,同時添加到動態數組 - C

我試圖實現一種方法,它將讓用戶繼續添加儘可能多的數字,因爲他們喜歡的數組,然後我可以使用它來創建一個平均沒有數量的限制可以輸入。

我遇到了一些問題,首先我不能創建一個數組,因爲我不知道用戶可能希望輸入多少個數字,這意味着我不能給它一個確定的大小。

其次,我的程序當前創建平均值的方式是循環遍歷數組中的元素,並將其連續添加到一個整數,從中得出平均值。如果我無法確定數組,則無法指定循環的限制以繼續運行。

希望我的例子能更好地解釋這一點。

#include <stdio.h> 
#include <string.h> 

void main() 
{ 
    int i = 0; 
    int arrayNum[5]; 
    int temp = 1; 
    int anotherTemp = 0; 
    int answer = 0; 


    printf("Enter as many numbers as you like, when finished enter a negative number\n"); 

    for(i = 0; i < 5; i++) 
    { 
     scanf("%d", &temp); 

     arrayNum[i] = temp; 

     anotherTemp = anotherTemp + arrayNum[i]; 
    } 

    answer = anotherTemp/5; 

    printf("Average of %d,%d,%d,%d,%d = %d",arrayNum[0],arrayNum[1],arrayNum[2],arrayNum[3],arrayNum[4],answer); 
} 

雖然這可能不是實現它的最好方法,但它在預先指定數量的數量時工作。

解決此問題並允許用戶輸入儘可能多的數字的最佳方法是什麼?

編輯:雖然我需要使用一個數組,但我決定這不是必須的,因爲解決方案在不受限制的情況下簡單得多。

+0

你真的有三個問題在這裏。一個是處理未指定長度的輸入,第二個處理動態數組,第三個是如何最好地形成平均值(答案是你不需要爲* this *目的存儲數據)。我認爲所有這些觀點都在下面的答案中得到了解答,並且在網站的其他地方肯定會涉及。 – dmckee 2010-01-30 23:33:45

+0

我知道我不需要將數字存儲在數組中以形成平均值,我只是簡單地指示嘗試使用數組來完成它。 – 2010-01-31 17:47:04

回答

3

在代碼簡單性方面,您可能需要檢查realloc()函數;你可以分配一個初始數組,如果用戶輸入太多的數字,請撥打realloc()以獲得更大的陣列並從那裏繼續。

你不這樣做,但是,實際上需要,保持數字,你走在所有至少如果你只關心平均:

int input; 
int sum = 0; 
int count = 0; 
int average; 

while (1) { 
    scanf("%d", &input); 
    if (input < 0) { 
     break; 
    } 
    sum += input; 
    count++; 
} 

average = sum/count; 
+0

似乎最簡單的解決方案,我不想過度複雜它。謝謝。 – 2010-01-30 22:01:43

+0

在計算平均值時,我似乎有一個額外的價值,我已經設法解決這個問題,只需從計數中刪除1以獲得正確的金額。你能提出更好的解決方案嗎? – 2010-01-30 22:10:59

+1

減去一個沒有問題。也許你可以改變循環結尾的語句測試順序和用於增加變量的語句。 – 2010-01-30 22:41:01

0

使用動態數組,像Java中的Vector(java.util.Vector)。

您可以實現輕鬆這樣一個動態數組自己:

  • 儘快分配的大小N排列的,因爲你需要N多的元素,分配一個新的更大的陣列(例如,具有尺寸N + 10 ),將舊數組的內容複製到新數組中,並將您的工作引用設置爲新數組,並將您的數組大小變量N設置爲新大小(例如N + 10)。釋放舊的數組。
+1

這個問題被標記爲C!沒有這樣的奢侈品。 – 2010-01-30 21:40:01

+0

@ Mehrdad Afshari:這就是爲什麼我添加了「你可以輕鬆實現這樣一個動態數組」並解釋它! – Curd 2010-01-30 21:41:29

+0

卡爾和其他人似乎都認同最簡單最簡單的方法就是完全忽略數組。 – 2010-01-30 22:00:40

2

基本上你開始用一個固定大小的一個動態分配的數組,然後分配一個新的數組,它是更大(比如說,兩倍大初始大小),並從舊的陣列複製的東西到新每當你用完空間。

對於問題的第二部分,請記下用戶輸入的項目數並在平均時使用它。

類似於this

3

如果您嘗試計算平均值,則不需要保存數字。爲自己省下擔心陣列的工作。只需將每個數字累加(添加)到一個總數中,對每個數字進行計數,然後在完成時進行分割。兩個變量都是你需要的。

使用這種方法,你是不是在你的溢出陣列的任何風險,所以你可以使用while循環......而(溫度!= -1)

+0

我有同樣的想法,請參閱我的編輯=] – 2010-01-30 21:38:39