2010-11-20 31 views
1

問題是: 編寫一個程序,將數據讀入int類型的數組。有效的輸入是從0到10.你的程序應該確定輸入了多少個值。輸出不同條目的列表以及該條目發生次數的計數。關於C#作業問題,請

我到目前爲止有:

using System; 
using System.Collections; 
namespace ConsoleApplication25 
{ 
class Program 
{ 
    static void Main() 
    { 
     ArrayList list = new ArrayList(); 
     string inValue; 

     Console.WriteLine("Please enter a value from 0-10"); 
     Console.WriteLine("To end the program, type 11"); 
     for (int i = 0; i < 11; i++) 
     { 
      Console.Write("Enter Value:", i); 
      inValue = Console.ReadLine(); 
      i = int.Parse(inValue); 
      list.Add(i); 
      list.Remove(11); 
      list.Sort(); 
     } 
     int[] c = list.ToArray(typeof(int)) as int[]; 

     foreach (int value in c) 
     { 
      Console.WriteLine(value); 
     } 
     Console.WriteLine("There are {0} values.", list.Count); 

     } 
    } 
} 

當我被困在正在顯示的每個值的計數。我已經嘗試設置一個如果與一個櫃檯,並設置案件休息和不成功。我們還沒有開始使用LINQ。任何建議或提示將不勝感激。

感謝,

傑森

+0

Ixnay在'ArrayList'。這是一個棄用的類(僅爲向後兼容提供),現在已經被新的通用集合完全替代了6年。 – 2010-11-20 23:01:21

+0

@Ben福格特:沒有,'ArrayList'類實際上沒有過時。它實際上已經過時,但仍未標記爲過時(出於某種原因)。 – Guffa 2010-11-20 23:07:59

+0

@Guffa:無論哪種方式,它不應該在新的代碼中使用了,誰教它,應立即停用並送刷上自己的技能任何教授。 .NET 2.0和泛型是在2005年11月發佈的(所以僅在五年前,並非如我所說的那樣,但測試版在10個月前已公開可用,已足夠接近六年),但仍然沒有任何藉口'ArrayList'。 – 2010-11-21 00:56:43

回答

3

使用Dictionary<int, int>到它多少次發生儲值和計數。短例如:

Dictionary<int, int> values = new Dictionary<int, int>(); 
... 
Console.Write("Enter Value:", i); 
inValue = Console.ReadLine(); 
i = int.Parse(inValue); 
if(values.ContainsKey(i)) 
{ 
    values[i]++; 
} 
else 
{ 
    values.Add(i, 1); 
} 
... 
+2

對於這種特殊情況,數組將比'Dictionary'好得多(鍵是不可分割的且連續的)。 – 2010-11-20 22:59:39

+1

我認爲,對於標記爲家庭作業的問題,顯示幾乎完整的解決方案並不是最有用的事情...... – 2010-11-20 23:03:14

+0

這不是一個完整的解決方案,而是解決問題的方法之一。看看評論,你會發現還有其他(甚至更好)的解決方案,這個問題的作者不需要選擇我的。 – derelict 2010-11-20 23:19:08

0

提示:

generic dictionaries的數據結構,將持有兩個用於輸入的數據,並且每個產生的數量。

3
  1. 從用戶持續獲得輸入的方法是使用一個循環,而不是爲環路在你改變所有的時間。代碼應該是這樣的:

    int i = 0; 
    while (i < 11) 
        get i, put it in the array 
    
  2. 沒有理由進行排序數組列表,絕對沒有理由每次你得到一個新的輸入時間排序。

  3. 如果您的輸入被限制爲0..10,請設置一個11個元素的數組,然後重新輸入您的輸入項並添加到計數中。僞代碼應該是這樣的:

    foreach input 
        count[input]++ 
    

    然後你就會有結果中的每個計數細胞。

0

只是複述,你目前的做法是將所有輸入的號碼加入到一個列表,然後對列表進行排序,讓你喜歡的東西1,2,2,3,4,4,4。然後你想找到列表中的所有獨特的項目和他們的計數。

要做到這一點,你可以迭代這個數組和

  • 記住當前值your're閱讀
  • 記得次數值出現至今

然後,當前值發生變化時,您將打印前一個值和您看過的次數。這一定會奏效,你應該能夠以這種方式完成作業。

幾個不相關的注意事項:

  • 這是更好地使用List<int>,而不是ArrayList,因爲你並不需要將其轉換爲int[] - 你可以用列表操作和使用list[i]獲得整數值超出它。
  • 你應該叫Sort只有一次你讀所有的輸入
  • 後使用for循環閱讀的內容,您只能讀取11(固定計數)項目
  • 而不是總是試圖祛瘀值11,你只能打電話Add如果值不是11

正如其他人所提到的,你可以使用Dictionary<int, int>計數的項目數「當您去」,但是這是該辦法的一個徹底的改變。我認爲這是完成你開始做一個好主意......

0

你可以使用一個數組來代替存儲計數的實際整數和使用數組的指數法爲值0 - 10。然後,當你輸出唯一值,你可以檢查哪些索引沒有count = 0;例如,數組[1]存儲輸入值1

0

一些技巧計數:

  • 不要使用ArrayList類,它實際上已經過時。如果要存儲整數列表,請使用List<int>

  • 你的循環邏輯不能正常工作。如果輸入值10,則在循環結束並退出時將增加到11。相反,你退出,如果值是11

  • 不要刪除值11,你應該使用一個do {} while()循環,而不是避免增加值,如果是11

  • 如果您使用的方法進行排序該列表在循環之後執行,而不是一遍又一遍地排序。

  • 您可以保留整數對的列表以記錄值和出現次數,也可以將所有值保留在列表中,對其進行排序,然後在顯示結果時對發生次數進行計數。 A Dictionary<int, int>適合保存整數對的列表。

  • 由於有效值限制爲0..10,您還可以使用一個包含11個項目的數組來計算出現次數。當您顯示結果時,您會跳過計數爲零的值。