1

Подскажите в чем ошибка, считает 2x2, 3x3 матрицы, но 2x3 выдает ошибки, что выход за индексы

Программа считает все положительные строки и если их нету сортирует матрицу по возрастанию

namespace WinAPP
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
    }

   public class Data
    {
        public static int Value1 { get; set; }
        public static int Value2 { get; set; }
    }
    private void button1_Click(object sender, EventArgs e)
    {
        {
            dataGridView1.Rows.Clear();
            int n = Data.Value1;
            int m = Data.Value2;
            dataGridView1.ColumnCount = n;
            dataGridView1.RowCount = m;
            button2.Enabled = true;
        }
    }

    private void button2_Click(object sender, EventArgs e)
    {
        dataGridView2.Rows.Clear();
        int n = Data.Value1;
        int m = Data.Value2;
        int k;
        int p = 0;
        float[,] array = new float[n, m];
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < m; j++)
            {
                array[i, j] = Convert.ToSingle(dataGridView1.Rows[i].Cells[j].Value);
            }
        }

        for (int i = 0; i < n; i++)
        {
            k = 1;
            for (int j = 0; j < m; j++)
            { 
                if (array[j, i] <= 0)
                {
                    k = 0; break;

                }
            }
            if (k != 0) p++;

        }
        label1.Text = "P = " + p.ToString();
        dataGridView2.ColumnCount = dataGridView1.ColumnCount;
        dataGridView2.RowCount = dataGridView1.RowCount;
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < m; j++)
                dataGridView2.Rows[i].Cells[j].Value = array[i, j];

        }
        if(p <= 0)
        {
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < m; j++)
                {
                    dataGridView2.Sort(dataGridView2.Columns[0], ListSortDirection.Descending);
                }
            }
            MessageBox.Show("P <Выполнена сортировка!");
        }
    }
    private void Form1_Load(object sender, EventArgs e)
    {
        Form2 fr2 = new Form2();
        fr2.Show();
    }

    private void button3_Click(object sender, EventArgs e)
    {

    }

    private void button3_Click_1(object sender, EventArgs e)
    {
        DialogResult dialogResult = MessageBox.Show("Закрыть программу?", "Подтвердите действие", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
        if (dialogResult == DialogResult.Yes)
        {
            Close();
        }
        else if (dialogResult == DialogResult.No)
        {
            dialogResult = DialogResult.None;
        }
    }
}

}

private void numericUpDown1_ValueChanged(object sender, EventArgs e)
{
    Form1.Data.Value1 = Convert.ToInt32(row.Value);
}

введите сюда описание изображения введите сюда описание изображения

aepot
  • 49,560
ev2dz
  • 33
  • 6
  • В одном месте у вас array[i, j], в другом - array[j, i] – Alexander Petrov Jan 22 '21 at 03:28
  • он считает по строкам тогда, а мне над было по столбцам. Поэтому так он начал считать правильно – ev2dz Jan 22 '21 at 07:33

1 Answers1

1

Вы перепутали индексы i и j при обращении к массиву.

Запомните просто, что массив - это array[строки, колонки] или array[высота, ширина], а не наоборот.

Например вот так с счетчиками array[i,j], или вот так с координатами array[y,x] или вот так array[n,m], где m - ширина, а n - высота. В индексаторах первое всегда обозначает высоту, а второе - ширину.

И циклы перебора когда вы организовываете, получается что-то типа

for (int row = 0; row < rowsCount; row++)
    for (int column = 0; column < columnsCount; column++)
    {
        array[row, column] = ...;
    }

Строки и колонки для понимания просты и привычно в индексаторах видеть сначала строки, потом колонки, а не наоборот. Попробуйте привыкнуть к этому и перестанете путаться.

aepot
  • 49,560
  • 1
    спасибо пересмотрел правильность и вроде проблема прошла – ev2dz Jan 22 '21 at 10:32
  • @ev2dz Бонус: есть еще сверхсекретная технолония - привязка данных. Очень сильно упрощает разработку, но почему-то 99% тех, кто пришет под Winforms, про нее не знают. Освойте эту технологию, и не сможете без нее жить, а то как вы сейчас это делаете - покажется вам сложным и непонятным. – aepot Jan 22 '21 at 10:40
  • @ev2dz вот кстати примерно то же самое что вы делаете, только WPF. Обратите внимание, что я там использую DataTable, которая к DataGridView.DataSource точно так же вяжется в Winforms, как к DataGrid.ItemsSource в WPF. – aepot Jan 22 '21 at 10:48
  • а если мне нужно выполнить сортировку данных элементов если P<0. По возрастанию, так как я преобразовывал DataViewGrid, мне нужно использовать метод "Сортировки пузырьком"? Или же можно использовать dataGridView2.Sort, но тогда сортировка у меня почему то выполняется криво, если матрица 3x3 то 1 столбец не сортируется, остальные 2 сортируются по возрастанию – ev2dz Jan 22 '21 at 12:14
  • @ev2dz отсортируйте массив и перезаполните таблицу заново. Да, можете пузырьком, если хотите. Сортировать данные прямо в таблице - это медленно и неудобно, сортируйте лучше данные в массиве. – aepot Jan 22 '21 at 12:20
  • Не получается найти похожий алгоритм, сортировки по возрастанию столбцов. В интернете одни по строкам for (int f = m - 1; f > j; f--) if (array[i, f] > array[i, f - 1]) { float tmp = array[i, f]; array[i, f] = array[i, f - 1]; array[i, f - 1] = tmp; – ev2dz Jan 22 '21 at 14:06
  • @ev2dz ну задайте тогда отдельный вопрос, покажите там свои попытки. Задача очень простая. – aepot Jan 22 '21 at 14:13
  • Добавил в конец этого, код с которым сейчас трудности, ошибки нету, но опять выход за пределы индексов – ev2dz Jan 22 '21 at 14:25
  • @ev2dz этот вопрос уже отвечен, удалите из него лишний код и задайте пожалуйста отдельный вопрос в отдельном посте. – aepot Jan 22 '21 at 14:54