2011-05-05 37 views
1

我有這樣的家庭作業的問題:陣列功課問題

編寫和測試的程序,在n個整數讀(對於n最大值爲20),每個整數具有

的值0到100之間的包容性。然後,程序應該在輸入數字和這些值的計數中打印出唯一值

樣品輸入:

Enter a the number of integers = 8 
Enter 8 integers: 5 6 7 6 6 17 17 35 

輸出示例:

Number 5: 1 
Number 6: 3 
Number 7: 1 
Number 17: 2 
Number 35: 1 

這是我做過什麼:

#include<iostream> 

using namespace std; 

int main(){ 
    int a[20], n; 

    cout<< "Please enter the number of integers= "; 
    cin>> n; 
    cout<<"Please enter"<< n<<" integers: "; 

    for (int i=0; i<n; i++) 
    cin >> a[i]; 

    for (int k=0; k< n; k++){ 
    int sum=0; 
    for (int i=0; i< n; i++){ 
     if (a[i]==a[k]) 
     sum= sum+1; 
    } 

    cout<< "Number "<< a[k]<<" : "<< sum<< endl; 
    } 
} 
+0

問題我得到的數字輸出重複! – Doooo 2011-05-05 16:53:38

+1

請務必詢問現有解決方案的任何其他問題,並在使用解決方案時接受答案。 – Cooper 2011-05-05 19:06:04

回答

0

你必須讓你在處理項目的運行計數一個單獨的數組,並在運行你的內部循環來計算項目之前,檢查你想要計算的項目是不是我你的第二個數組已經。

+0

嗯,我想有第二個數組,但說實話我試過了,然後它錯過了! – Doooo 2011-05-05 17:11:09

0

之前打印結果,請檢查您是否已經打印了該號碼

+0

是啊,我想要做什麼,但我沒有弄清楚會是什麼代碼呢? – Doooo 2011-05-05 17:09:28

2

想想看,當你通過你的列表進行迭代,你要檢查所有值都與我和k。所以本質上來說,如果你有一個1 1 2 2的列表,那麼第一個將自己計數,而1在a [1]。第二個1將計算第一個1和它本身,給你重複的輸出。

一種簡化這種做法的方法是利用hash_map或類似的結構(我不熟悉C++)將鍵映射到值並且不允許重複。這將允許您將唯一的數字記錄爲關鍵字,並在列表中只添加一個關鍵字。使用hashMap的好處是你可以使你的程序成爲線性的(儘管我不認爲這是真正關心的問題)。

然而,解決問題的最簡單方法是使用Bin排序技術。這裏的基本想法是,你的數字範圍只是0到100,這意味着你可以創建0到100的分箱,並增加每個分箱。再次,這是Java代碼,並沒有任何實際的輸入。

// Count is the key, it uses indexes from 0 to 100, with null values of 
// 0 after initialized. Simply iterate the loop, and use the value of 
// a[k] to increment the corresponding count in the count array. 
// Finally, print the results 
int[] a = new int[20]; 
int[] count = new int [101]; 

for (int k = 0; k < a.length; k++){ 
    count[a[k]]++; 

for (int i = 0; i < count.length; i++){ 
    if (count[i] > 0) 
     System.out.println(i + ": " + count[i]); 
} 
+0

對不起,我們沒有學習hash_map! – Doooo 2011-05-05 17:09:56

+0

好的,檢查更新後的解決方案。我沒有親自測試它,但我很肯定這是沒有散列的最簡單最優雅的解決方案。 – Cooper 2011-05-05 17:19:36

+0

在C++中,'std :: map'使用'operator []',如果它尚不存在,它會創建映射條目(具有默認值)。因此,'for(int i = 0; i 2011-05-05 17:24:38

0

另一種實現(和更多的內存飢餓與當前的20個輸入值的限制)。將創建的100的陣列「計數」值。爲每個輸入值遞增適當的項目,然後遍歷輸出非零值的計數數組。

顯然,這樣的描述還不夠好......也許一些代碼將有助於(注:此代碼是未經測試,但應該夠你理解的概念):

#include<iostream> 

using namespace std; 

int main(){ 
    int a[101], n, v; 

    cout<< "Please enter the number of integers= "; 
    cin>> n; 
    cout<<"Please enter"<< n<<" integers: "; 

    for (int i=0; i<n; i++) 
    { 
    cin >> v; 
    a[v] ++; 
    } 

    for (int k=0; k< 100; k++){ 
    if (a[k] > 0) 
     { 
     cout<< "Number "<< k + 1 <<" : "<< a[k] << endl; 
     } 
    } 
    } 
} 
+0

當然,正如其他人所提到的,你也可以使用某種字典/哈希映射機制,這將是一個更好的選擇......我只是不知道你是否已經瞭解了它們。 ;-) – 2011-05-05 17:05:00

+0

正如我前面提到的,我們還沒有研究這些結構。 – Doooo 2011-05-05 17:11:39

+0

我的初步答案沒有提及那些結構,因爲我猜你可能沒有。我已經添加了一些示例代碼來顯示我正在嘗試建議的內容。 – 2011-05-05 20:21:45

0

這是我的新嘗試。

快速修復(儘管不是最專業的)將在打印之前創建另一個循環檢查重複。

我把你目前的大循環變成了一個更大的怪物。

我也測試過它,它適用於我。= D

for (int k=0; k< n; k++){ 
    int sum=0; 
    for (int i=0; i< n; i++) 
    { 
     if (a[i]==a[k])  
      sum= sum+1; 
    } 

    bool repeat = false; 
    for(int i = 0; i < k; i++) 
    { 
     if(a[k] == a[i]) 
     { 
      repeat = true; 
     } 
    } 
    if(!repeat) 
     cout<< "Number "<< a[k]<<" : "<< sum<< endl; 

} 
+0

讓我試試你說的 – Doooo 2011-05-05 17:14:06

+0

對不起,但我不知道如何比較總和與其他人,而它會被改變? – Doooo 2011-05-05 17:17:10

+0

它的工作,但只是爲6和17的重複數字,但不是5,7和35 – Doooo 2011-05-05 17:28:22

1

加另一個bool b[20],用true初始化它。然後,每當您檢測到a[k]是一個騙局,您設置b[k] = false。只打印a[k]如果b[k] == true

for (int k = 0; k < n; k++) { 
    if (!b[k]) { 
     continue; 
    } 
    int sum = 0; 
    for (int i = 0; i < n; i++) { 
     if (a[i] == a[k]) { 
      sum = sum + 1; 
      b[i] = false; 
     } 
    } 

    cout << "Number " << a[k] << " : " << sum << endl; 
} 
+0

多數民衆贊成在錯誤...它重複k,所以爲什麼b [k]永遠是真的在開始。實際上你也需要初始化它,所以除非你這樣做,否則可能會發生; D – Mene 2011-05-05 22:54:50

+0

請重新閱讀我寫的內容,我已經提到過。 – Dikei 2011-05-06 04:30:58

0

越來越熟悉斯坦達特模板庫的關鍵是在我的愚見編寫好的程序,因爲這是一門功課,你做了0和100的控制;-))

#include <iostream> 
#include <map> 

using std::cin; 
using std::map; 
using std::cout; 
using std::endl; 

int main() 
{ 
    int limit = 20; 
    int cnt=0; 
    int n; 
    map<int, int> counters; 

    while(cnt++ < limit) 
    { 
    cin >> n; 
    ++counters[n]; 
    } 
    for(map<int, int>::iterator it = counters.begin(); 
      it!=counters.end(); ++ it) 
    cout << it->first << " " << it->second << endl; 
    return 0; 
}