kolodach
@kolodach

Помогите найти ошибку в программе C#, массивы

Постановка задачи: Нужно найти минимальный элемент массива (будем считать что таков - единственный) и переместить столбец с этим элементом на место первого;
Проблема: 1) Неправильно находит минимум
2) Не меняет столбцы

PS простите за быдлокод, я только учусь :)

int[,] A = new int[n, n];
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < n; j++)
                    A[i, j] = Convert.ToInt32(dataGridView1.Rows[i].Cells[j].Value);
            }

            int min = A[0, 0], min_j = -1;
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < n; j++)
                    if (min < A[i, j])
                    {
                        min = A[i, j];
                        min_j = j;
                    }
            }

            if (min_j != 0) ;
            {
                int rez;
                for (int i = 0; i < n; i++)
                {
                    rez = A[i, 0];
                    A[i, 0] = A[i, min_j];
                    A[i, min_j] = rez;
                    label1.Text = Convert.ToString(min);

                }
            }
  • Вопрос задан
  • 3679 просмотров
Пригласить эксперта
Ответы на вопрос 5
P_Zeger
@P_Zeger
В IDE у каждой строки кода можно нажать F9 и пошагово посмотреть где именно закралась ошибка.Плюс Error List при нажатии на ошибку направит на нужную строку.

В строке if (min_j != 0) ; нужно убрать точку с запятой, если не ошибаюсь.
Ответ написан
Комментировать
@Teacher
Вложенный цикл вам не нужен.
Внешний делаете от 1 до n.
Замены производите по алгоритму:
rez = A[i, min_j];
A[i, min_j] = A[i, 0];
A[i, 0] = rez;
Ответ написан
if (min < A[i, j])
Почему меньше? Если минимум меньше какого-то значения, это нормально. Для поиска минимума нужно всё же (min > A[i, j])

int min = A[0, 0], min_j = -1;
...
 if (min_j != 0) ;

Так же обратите внимание, что при некоторых условиях (сразу угадали минимальный элемент), min_j так и останется -1, что вполне удовлетворяет условию min_j != 0, но вызывает исключение. Более корректная проверка выглядит скорее
if (min_j > 0)
И, как уже сказали выше, точка с запятой совсем лишние.
Ответ написан
Комментировать
kolodach
@kolodach Автор вопроса
Спасибо большое! осталось решить проблему из сменой столбцов, я пробовал приментиь следующий алгоритм (осторожно быдлокод):
<code lang="cs">
            if (min_j > 0)
            {
                int rez;
                for (int i = 0; i > -1; i--)
                {
                    for (int j = min_j; j > -1; j--)
                    {
                            rez = A[i, j];
                            A[i, j] = A[i, j + 1];
                            A[i, j + 1] = rez;
                    }

                }

            }

</code>


Я немного изменил его по сравнению с представленный выше, так как сдвиг должен быть цикличным, но всеровно мои попытки безуспешны
Ответ написан
Комментировать
@llirikkkk
if(min_j > 0)
{
   int rez;
   for(i = 0; i<n; i++)
   {
     rez = A[i, min_j];
     A[i, min_j] = A[i, 0];
     A[i, 0] = rez;
   }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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