@vrnvorona
Студент

Как решить ошибку CS7036?

В общем нужно сформировать очередь из двадцати случайных элементов диапазона [-40, 40], вывести ее в dataGridView1, потом из списка удалить все отрицательные значения и вывести в dataGridView2. Для этого я пользуюсь формой и классом, в классе два метода.
Класс:
public class Queue
    {

        public int[] FirstQueue()  //Первый метод
        {
            Queue<int> first = new Queue<int>(); //Очередь
            Random ran = new Random();  //Рандом
            for (int i = 0; i < 20; i++)  //Заполняю очередь
            {
                first.Enqueue(ran.Next(-40, 40));
            }
            int[] array = first.ToArray();  //Делаю из очереди массив чтобы вывести в форму
            SecondQueue(first);  //Передаю очередь на второй метод
            return array; //Вывожу массив
        }        
        public int[] SecondQueue(Queue<int> input)  //Второй метод
        {

            ArrayList second = new ArrayList();   //Создаю список
            for (int i = 0; i < 20; i++)  
            { 
                if (second.Add(input.Dequeue()) >= 0)   //Пихаю в список только неотрицательные элементы
                {
                    second.Add(input.Dequeue());
                }
                else
                {
                    input.Dequeue();
                }
            }            
            int[] array2 = (int[])second.ToArray(typeof(int));  //Делаю из списка массив чтобы вывести в форму
            return array2;  //Вывожу
        }
    }

Форма:
public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            dataGridView1.RowCount = dataGridView2.RowCount = 1;  //Задаю количество и размеры строк и колонок и их размеры
            dataGridView1.ColumnCount = 20;
            for (int i = 0; i < dataGridView1.Columns.Count; i++)
            {
                dataGridView1.Columns[i].Width = 40;
            }
            for (int i = 0; i < dataGridView2.Columns.Count; i++)
            {
                dataGridView2.Columns[i].Width = 40;
            }
        }

        Queue first = new Queue(); //Ссылка на класс
        
        private void ButtonRun_Click(object sender, EventArgs e)  //Первая кнопка
        {

            int[] array = first.FirstQueue();  //Присваиваю значение массива из первого метода
            for (int i = 0; i < 20; i++)
            {
                dataGridView1.Rows[0].Cells[i].Value = array[i];  //Вывожу в ячейки dataGridView через цикл
            }
        }

        private void ButtonDelete_Click(object sender, EventArgs e)
        {
            int[] array2 = first.SecondQueue();  //Пытаюсь присвоить массив, но пишет ошибку "Ошибка CS7036  Отсутствует аргумент, соответствующий требуемому формальному параметру "input" из "Queue.SecondQueue(Queue<int>)". "
            
            for (int i = 0; i < array2.Length; i++)  //Вывод
            {
                dataGridView2.Rows[0].Cells[i].Value = array2[i];
            }
        }

        private void ButtonClose_Click(object sender, EventArgs e)
        {
            Close();
        }
    }

Сразу скажу что я студент первого курса, пока очень плохо разбираюсь как в языке, так и с ООП и вообще в программировании. Работает только вывод очереди, вывод отредактированного списка нет, соответственно.
Спасибо за внимание, буду признателен любой помощи.
  • Вопрос задан
  • 1907 просмотров
Пригласить эксперта
Ответы на вопрос 1
@kodwi
https://moikrug.ru/kodwi
// разбор ошибок:
//допустим в очереди 20 элементов
for (int i = 0; i < 20; i++)
{
  // в условии ты извлекаешь элемент и тут же добавляешь его в список еще до проверки на ноль, т.е. уже в очереди на 1 элемент меньше
  // затем метод Add у списка возвращает индекс добавленного элемента, а не сам элемент. И ты этот индекс сравниваешь с нулем.
  if (second.Add(input.Dequeue()) >= 0)
  {
    // начиная со второй итерации цикла этот код будет выполняться, т.к. индекс будет всегда > 0.
    // и тут ты еще раз извлекаешь элемент из очереди и суешь в список.
    second.Add(input.Dequeue());
  }
  else
  {
    // тут тоже произойдет извлечение элемента, только на первой итерации цикла.
    input.Dequeue();
  }
}

// итого: на каждой 2+  итерации ты извлекаешь элементы по 2 раза, на 1ой итерации - 3 раза
// а в очереди у тебя всего 20 элементов, а не 41.
// код по сути должен вообще упасть на Dequeue из пустой очереди


// рабочий вариант:
List<int> second = new List<int>();

// пока очередь не пуста
while (input.Count != 0)
{
  int item = input.Dequeue();

  if (item >= 0)
  {
    second.Add(item);
  }
}

return second.ToArray();
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы