2015-06-18 3 views
-1

У меня есть задача написать программу, которая принимает некоторые цифры и step в качестве входных данных.
Затем она должна сделать последовательность двоичного представления этих чисел и уничтожить биты в позициях 1, 1*step, 2*step, 3*step ...
Вот код:«myList.Count» меньше количества элементов внутри списка

using System; 
using System.Collections.Generic; 

class BitKiller 
{ 
    static void Main() 
    { 
     int 
      amountNumbers = int.Parse(Console.ReadLine()), 
      step = int.Parse(Console.ReadLine()), 
      counter = 0, 
      number = 0 
     ; 
     int[] 
      numBin= new int[8], 
      numbers = new int[amountNumbers] 
     ; 
     var sequence = new List<int>(); 
     for(int i = 0; i < amountNumbers; i++) 
     { 
      numbers[i] = int.Parse(Console.ReadLine()); 
      numBin = ToBin(numbers[i]); 
      sequence.InsertRange(counter * 8, numBin); 
      foreach(int b in sequence) 
      { 
       Console.Write(b); 
      } 
      Console.WriteLine(""); 
      counter++; 
     } 
     if(step == 1) 
     { 
      Console.WriteLine(0); 
      return; 
     } 
     for(int i = sequence.Count; i >= 0; i--) 
     { 
      if(i % step == 1) 
      { 
       sequence.RemoveAt(i); 
      } 
     } 
     Console.WriteLine("List count = {0}", sequence.Count); 
     if(sequence.Count % 8 != 0) 
     { 
      int padding = 8 - (sequence.Count % 8); 
      for(int i = 0; i < padding; i++) 
      { 
       sequence.Add(0); 
      } 
     } 
     foreach(int b in sequence) 
     { 
      Console.Write(b); 
     } 
     Console.WriteLine(""); 
     for(int i = 7, power = 0, y = 0; y < sequence.Count; i--, y++, power++) 
     { 
      number = number + (sequence[i]) * ToPower(2, power); 
      if(i == 0) 
      { 
       Console.WriteLine("Result = {0}", number); 
       sequence.RemoveRange(0, 8); 
       foreach(int b in sequence) 
       { 
        Console.Write(b); 
       } 
       Console.WriteLine(""); 
       number = 0; 
       i = 7; 
       y = 0; 
       power = 0; 
      } 
     } 
    } 

    static int[] ToBin(int number) 
    { 
     var binSequence = new int[8]; 
     for(int i = 7; i >= 0; number /= 2, i--) 
     { 
      if(number % 2 == 0 || (number == 0 && i >= 0)) 
      { 
       binSequence[i] = 0; 
      } 
      else 
      { 
       binSequence[i] = 1; 
      } 
     } 
     return binSequence; 
    } 

    static int ToPower(int number, int power) 
    { 
     int numberReturn = number; 
     if(power == 0) 
     { 
      return 1; 
     } 
     if(number == 1) 
     { 
      return number; 
     } 
     for(int i = 0; i < power - 1; i++) 
     { 
      numberReturn = numberReturn * number; 
     } 
     return numberReturn; 
    } 
} 

Теперь, есть несколько дополнительных печати так что вы можете видеть, как двоичные числа появляются при вводе чисел.
Короче говоря, моя программа преобразует числа в списки, содержащие только «1» и «0», а затем удаляет значения из этого списка в соответствии с моей формулой.
Мой главный вопрос почему:

sequence.Count 

возвращение 22, когда, очевидно, 24 «1 внутри списка.
Проверьте его на следующий вход: 3,19,255,255,255.
Результат будет: 255, 254, 252, тогда как правильный выход будет 255, 255, 252.

Это происходит из-за этого кода:

if(sequence.Count % 8 != 0) 
{ 
    int padding = 8 - (sequence.Count % 8); 
    for(int i = 0; i < padding; i++) 
    { 
     sequence.Add(0); 
    } 
} 

Поскольку sequence.Count 22 (почему?) Условие истинно, и следующий цикл заменяет двух моих последних «1 'с 2-мя нулями.
Который вызывает неправильный вывод.
Итак, вернемся к делу.
Зачем стоит sequence.Count, если в списке осталось 24 '1.

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

+1

Для вас должно быть очевидно, что 'myList.Count' возвращает _exactly_ количество элементов в списке. Ваша проблема в том, что вы не ожидаете, что количество элементов будет в списке. –

+1

'' myList.Count "меньше количества элементов внутри списка'. Вы проверили список через отладчик, чтобы увидеть, что есть 24 элемента вместо 22? –

+0

Попробуйте вставить это: 'Console.WriteLine (« Счет списка перед циклом = {0} », sequence.Count);' перед этой строкой: 'for (int i = sequence.Count; i> = 0; i--) ', вы увидите, что цикл' for' удаляет 2 элемента из 'sequence'. Причина объясняется в ответе @Ed T ниже. – ekad

ответ

3

Вы удаляете два элемента из списка в этом коде:

for(int i = sequence.Count; i >= 0; i--) 
{ 
    if(i % step == 1) 
    { 
     sequence.RemoveAt(i); 
    } 
} 

С примера ввода вы дали, sequence.RemoveAt вызывается, когда я == 20 и когда я == 1. Были 24 пунктов , то вы удалили 2 из них.

0

Нужно отметить: целый день в программировании влияет на мое базовое исчисление. Счетчик списка, и если условия выполняются должным образом. После еще одного часа тестирования я понял, что проблема в том, что мне нужно установить значение «y» и «i» to-1, потому что они мгновенно увеличиваются на 1, когда они попадают в цикл for. Спасибо за советы.

+0

рад, что вы поняли это. Примите мой ответ, если это будет полезно. –

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