Примеры решения типовых задач Рассмотрим несколько примеров решения типовых задач. Работа с матрицами Задача состоит в том, чтобы создать визуальное приложение, при помощи которого можно вводить значение элементов квадратной матрицы заданной размерности и находить сумму ее элементов или среднее арифметическое ее элементов. Создаем новый проект. В свойствах главной формы подписываем ее как: Matrix. Помещаем на форму элемент NumericUpDown и подписваем его при помощи элемента Label. Элемент NumericUpDown будет служить для изменения размерности матрицы. В свойствах NumericUpDown даем ему программное имя – matrixsize, минимальное допустимое значение устанавливаем равное 1, а максимальное 20. Помещаем на форму элемент GroupBox, а в него два элемента RadioButton и подписываем их все соответствующим образом. В свойствах RadioButton-ов даем им программные имена rb1 и rb2 соответственно. Помещаем на форму элемент DataGridView и подписваем его при помощи элемента Label. Элемент DataGridView будет служить таблицей для ввода значений матрицы. В свойствах DataGridView даем ему программное имя – matrix_table, а также устанавливаем свойства AllowUserToAddRows, AllowUserToDeleteRows, AllowUserToResizeColumns, AllowUserToResizeRows, ColumnHeadersVisible, RowHeadersVisible в false, тем самым мы запрещаем пользователю вручную добавлять и удалять строки, изменять размер столбцов и строк, а также скрываем заглавные строку и столбец. Свойство ColumnHeadersHeightSizeMode устанавливаем в AutoSize. Добавляем на форму элементы Button и RichTextBox, которые будут служить для выполнения выбранной операции и вывода результата соответственно. В свойствах даем им программные имена - start_button и RTB. После этих действий дизайн нашего приложения должен иметь вид, показанный на рисунке 3.1.  Рисунок 3.1 – Дизайн приложения из примера 1 Дизайн готов, осталось написать программный код. Событию Load нашей главной формы зададим следующий код. matrix_table->ColumnCount = 1; // начальное число столбцов и строк matrix_table->RowCount = 1; matrix_table->AutoResizeColumns();//выравнивание ячеек Этот код позволит задать начальную размерность таблицы для ввода матрицы, которая совпадает с начальным значением элемента NumericUpDown, а также установить автовыравнивание ширины ячеек таблицы. Событию ValueChanged элемента NumericUpDown зададим такой код. matrix_table->ColumnCount = Convert::ToInt32(matrixsize->Value); //изменяем размерность таблицы matrix_table->RowCount = Convert::ToInt32(matrixsize->Value); matrix_table->AutoResizeColumns(); //выравнивание ячеек Он позволит изменять размерность таблицы пропорционально и автоматически выравнивать ячейки по ширине. Для считывания значений из таблицы и записи их в матрицу для последующей обработки целесообразно создать отдельную функцию. Назовем ее scanmatrix и вставим в наш исходный код, например, после строчки #pragma endregion. private: void scanmatrix(int size,int **matrix){// size размерность матрицы, **matrix – указатель на указатель типа int (собственно сама матрица) for (int i = 0; i < size; i++){ for (int j = 0; j < size; j++){ matrix[i][j] = Convert::ToInt32(matrix_table->Rows[i]->Cells[j]->Value); // записываем в матрицы значения ячеек таблицы, предварительно конвертировав их в тип int } } } Как видим, данная функция производит считывание элементов из ячеек таблицы и записывает их по соответствующим индексам в двумерном массиве. Зададим обработчик события CellValueChanged элемента DataGridView, который будет выравнивать ширину ячеек после каждого ввода. matrix_table->AutoResizeColumns(); //выравнивание ячеек Осталось создать обработчик события Click элемента Button. int Msize = Convert::ToInt32(matrixsize->Value); // записываем в переменную Msize значение matrixsize (размерность матрицы) int **matrixvar = new int *[Msize]; for (int i = 0; i < Msize; i++){ //создаем динамический двумерный массив matrixvar[i] = new int[Msize]; } scanmatrix(Msize, matrixvar); //записываем в наш двумерный массив значения из таблицы if (rb1->Checked){ // если выбрали искать сумму элементов int sum = 0; for (int i = 0; i < Msize; i++){ // находим сумму for (int j = 0; j < Msize; j++){ sum += matrixvar[i][j]; } } RTB->Text = Convert::ToString(sum); // и записываем в текстовое поле } else if (rb2->Checked) { // если среднее арифметическое double avg = 0; for (int i = 0; i < Msize; i++){ // находим его for (int j = 0; j < Msize; j++){ avg += matrixvar[i][j]; } } avg = avg / (Msize*Msize); RTB->Text = Convert::ToString(avg);// и записываем в текстовое поле } else { RTB->Text = "Нужно выбрать операцию"; //если ничего не выбрали } Из исходного кода видно, что при клике на элемент Button, динамически создается массив, после чего в него вносятся данные из таблицы и выполняется выбранная операция. Ее результат выводится в текстовое поле. Результаты работы показаны на рисунке 3.2  Рисунок 3.2 – Результаты работы программы из примера 1 (среднее арифметическое) |