2010-11-20 2 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); 

     } 
    } 
} 

Где я застрял отображает отсчет каждого значения. Я пробовал настроить if с помощью счетчика, а также создавать случаи с перерывами и не увенчались успехом. Мы еще не начали использовать LINQ. Любые предложения или подсказки будут высоко оценены.

Спасибо,

Jason

+0

Ixnay на 'ArrayList'. Это устаревший класс (предоставляется только для обратной совместимости), который теперь полностью заменяется новыми родовыми коллекциями в течение 6 лет. –

+0

@Ben Voigt: Нет, класс 'ArrayList' фактически не устарел. Он практически устарел, но по-прежнему не отмечен как устаревший (по какой-то причине). – Guffa

+0

@ Guffa: В любом случае, он не должен использоваться в новом коде, и любой профессор, который его обучает, должен быть немедленно отстранен и отправлен, чтобы освежить свои навыки. .NET 2.0 и generics были выпущены в ноябре 2005 года (так что всего пять лет назад, а не шесть, как я сказал, но бета-версия была общедоступной за 10 месяцев до того, что достаточно близко к шести годам), нет никаких оправданий, 'ArrayList'. –

ответ

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

Массив будет намного лучше, чем «Словарь» для данного конкретного случая (ключи являются целыми и последовательными). –

+1

Я думаю, что показать почти полное решение вопросов, помеченных как домашнее задание, не самая полезная вещь ... –

+0

Это не полное решение, но один из способов решения проблемы. Посмотрите на комментарии, и вы узнаете, что есть другие (еще более лучшие) решения, и нет необходимости, чтобы автор вопроса выберет мой. – derelict

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. Тогда вы хотели бы найти все уникальные элементы в списке и их количество.

Чтобы сделать это, вы можете перебрать массив и

  • запомнить текущее значение чтения
  • вы как раз
  • помню, сколько раз значение оказалось до сих пор

тогда, когда текущее значение изменится, вы будете печатать предыдущее значение и количество раз, когда вы его видели. Это определенно будет работать, и вы должны быть в состоянии закончить домашнее задание таким образом.

Несколько несвязанные примечания:

  • Лучше использовать 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 в конце цикла и выйдет. Вместо этого вы должны использовать do {} while() цикл, в котором вы выйдете, если значение 11.

  • Не извлекайте значение 11, вместо того, чтобы избежать добавления значения, если это 11.

  • Если вы используете подход для сортировки в списке, сделайте это после цикла, а не сортировки его снова и снова.

  • Вы можете сохранить список целых пар, чтобы отслеживать значения и количество событий, или вы можете сохранить все значения в списке, отсортировать его и затем подсчитать, когда вы показываете результат. A Dictionary<int, int> хорош для хранения списка целых пар.

  • Поскольку допустимые значения ограничены 0,10, вы также можете использовать массив из одиннадцати элементов для подсчета количества событий. Когда вы показываете результат, вы пропускаете значения, в которых счетчик равен нулю.

Смежные вопросы