Новости

C #. Приклад створення двовимірної матриці на формі

  1. зміст

Часто в задачах потрібно ввести числа або інші дані в двовимірний масив (матрицю) і мати можливість їх обробляти.

В роботі реалізований аналог компонента TStringGrid використовуваного в Delphi для представлення даних у вигляді двовимірної таблиці рядків. Для цього в C # використовується двовимірний масив елементів управління типу TextBox.

зміст

Умова задачі

Скласти програму, яка здійснює твір двох матриць розмірністю n. Матриці вводяться з клавіатури в окремій формі і заносяться у внутрішні структури даних. Користувач має можливість переглянути результуючу матрицю.

Також є можливість збереження результуючої матриці в текстовому файлі "Res_Matrix.txt".

виконання

1. Запуск Microsoft Visual Studio. створення проекту

Докладний приклад запуску Microsoft Visual Studio і створення додатка за шаблоном Windows Forms Application описується в темі:

Зберегти проект під будь-яким ім'ям.

2. Створення головної форми Form1

Створити форму, як показано на малюнку 1.

Розмістити на формі елементи управління наступних типів:

  • чотири елементи управління типу Button. Автоматично буде створено чотири об'єкти (змінні) з іменами button1, button2, button3, button4;
  • три елементи керування типу Label з іменами label1, label2, label3;
  • один елемент управління типу TextBox, доступ до якого можна отримати на ім'я textBox1.

Сформувати властивості елементів управління типу Button і Label:

  • в об'єкті button1 властивість Text = "Введення матриці 1 ...«;
  • в об'єкті button2 властивість Text = "Введення матриці 2 ...«;
  • в об'єкті button3 властивість Text = "Результат ...»;
  • в об'єкті button4 властивість Text = "Зберегти в файлі" Res_Matr.txt "";
  • в елементі управління label1 властивість Text = "n =".

Для настройки вигляду і поведінки форми потрібно виконати наступні дії:

  • встановити назву форми. Для цього властивість Text = "Твір матриць";
  • властивість StartPosition = "CenterScreen" (форма розміщується по центру екрана);
  • властивість MaximizeBox = "false" (прибрати кнопку розгортання на весь екран).

Мал. 1. Форма додатка

3. Створення другорядною форми Form2

Під другорядної формі Form2 будуть вводитися дані в матриці і виводитися вихідний результат.

Приклад створення нової форми в MS Visual Studio - C # докладно описаний тут .

Додати нову форму до додатка, викликавши команду

Project -> Add Windows Form ...

У вікні, вибрати «Windows Form». Файл залишити без змін "Form2.cs».

Розмістити на формі в будь-якому місці елемент управління типу Button (рис. 2). В результаті буде отриманий об'єкт з ім'ям button1.

В елементі управління button1 потрібно встановити наступні властивості:

  • властивість Text = "OK";
  • властивість DialogResult = "OK" (рис. 3). Це означає, що при натисканні (кліці «мишкою») на button1, вікно закриється з кодом повернення рівним "OK";
  • властивість Modifiers = "Public". Це означає, що кнопка button1 буде видимою з інших модулів (з форми Form1).

Налаштувати властивості форми Form2:

  • властивість Text = "Введення матриці";
  • властивість StartPosition = "CenterScreen" (форма розміщується по центру екрана);
  • властивість MaximizeBox = "false" (прибрати кнопку розгортання на весь екран).

Мал. 2. Форма Form2 після настройки

Мал. 3. Властивість DialogResult елемента управління button1 форми Form2

4. Введення внутрішніх змінних

Наступний крок - введення внутрішніх змінних в текст модуля "Form1.cs".

Для цього спочатку потрібно активувати модуль "Form1.cs".

У тексті модуля "Form1.cs" додаємо наступний код:

... namespace WindowsFormsApplication1 {public partial class Form1: Form {const int MaxN = 10; // максимально допустима розмірність матриці int n = 3; // поточна розмірність матриці TextBox [,] MatrText = null; // матриця елементів типу TextBox double [,] Matr1 = new double [MaxN, MaxN]; // матриця 1 чисел з плаваючою точкою double [,] Matr2 = new double [MaxN, MaxN]; // матриця 2 чисел з плаваючою точкою double [,] Matr3 = new double [MaxN, MaxN]; // матриця результатів bool f1; // прапорець, який вказує про введення даних в матрицю Matr1 bool f2; // прапорець, який вказує про введення даних в матрицю Matr2 int dx = 40, dy = 20; // ширина і висота осередку в MatrText [,] Form2 form2 = null; // екземпляр (об'єкт) класу форми Form2 public Form1 () {InitializeComponent (); }}} ...

Пояснимо деякі значення змінних:

  • Max - максимально-допустима розмірність матриці;
  • n - розмірність матриці, введена користувачем з клавіатури в елементі управління TextBox1;
  • MatrText - двовимірна матриця елементів управління типу TextBox. У цю матрицю будуть вводитися елементи матриці у вигляді рядків. Введення даних буде формуватися у формі Form2;
  • Matr1, Matr2 - матриці елементів типу double, в які будуть копіюватися дані з матриці MatrText;
  • Matr3 - результуюча матриця, яка дорівнює добутку матриць Matr1 і Matr2;
  • f1, f2 - змінні, що визначають чи були введені дані відповідно в матриці Matr1 і Matr2;
  • dx, dy - габарити одного осередку типу TextBox в матриці MatrText;
  • form2 - об'єкт класу форми Form2, по коториму дістане доступ до цієї форми.

5. Програмування події Load форми Form1

Процес програмування будь-якої події в Microsoft Visual C # докладно описаний тут .

Лістинг обробника події Load форми Form1 наступний:

private void Form1_Load (object sender, EventArgs e) {// І. Ініціалізація елементів управління і внутрішніх змінних textBox1.Text = ""; f1 = f2 = false; // матриці ще не заповнені label2.Text = "false"; label3.Text = "false"; // ІІ. Виділення пам'яті і настройка MatrText int i, j; // 1. Виділення пам'яті для форми Form2 form2 = new Form2 (); // 2. Виділення пам'яті під саму матрицю MatrText = new TextBox [MaxN, MaxN]; // 3. Виділення пам'яті для кожного осередку матриці і її налаштування for (i = 0; i <MaxN; i ++) for (j = 0; j <MaxN; j ++) {// 3.1. Виділити пам'ять MatrText [i, j] = new TextBox (); // 3.2. Обнулити цей осередок MatrText [i, j] .Text = "0"; // 3.3. Встановити позицію осередку в формі Form2 MatrText [i, j] .Location = new System.Drawing. Point (10 + i * dx, 10 + j * dy); // 3.4. Встановити розмір осередку MatrText [i, j] .Size = new System.Drawing. Size (dx, dy); // 3.5. Поки що заховати осередок MatrText [i, j] .Visible = false; // 3.6. Додати MatrText [i, j] в форму form2 form2.Controls.Add (MatrText [i, j]); }}

Пояснимо деякі фрагменти коду в методі Form1_Load ().

Подія Load генерується (викликається) в момент завантаження будь-якої форми. Оскільки форма Form1 є головною формою додатка, то подія Load форми Form1 буде викликатися відразу після запуску програми на виконання. Тому, тут доцільно ввести початкову ініціалізацію глобальних елементів управління і внутрішніх змінних програми. Ці елементи управління можуть бути викликані з інших методів класу.

У обробнику події Form1_Load () виділяється пам'ять для двовимірної матриці рядків MatrText один лише раз. При завершенні програми ця пам'ять буде автоматично звільнена.

Пам'ять виділяється в два етапи:

  • для самої матриці MatrText - як двовимірного масиву;
  • для кожного елемента матриці, який є складним об'єктом типу TextBox.

Після виділення пам'яті для будь-якого об'єкта здійснюється настройка основних внутрішніх властивостей (позиція, розмір, текст, видимість в деякій формі).

Також кожна створена осередок додається (розміщується) на форму Form2 за допомогою методу Add () з класу Controls. Кожна нова осередок може бути додана в будь-яку іншу форму додатка.

6. Розробка додатковий метод обнулення даних в матриці MatrText

В майбутньому, щоб багаторазово не використовувати код обнулення рядків матриці MatrText, потрібно створити власний метод (наприклад, Clear_MatrText ()) реалізує цей код.

Лістинг методу Clear_MatText () наступний:

private void Clear_MatrText () {// Обнулення осередків MatrText for (int i = 0; i <n; i ++) for (int j = 0; j <n; j ++) MatrText [i, j] .Text = "0"; }

7. Програмування події кліка на кнопці button1 ( «Введення матриці 1 ...»)

При натисканні (кліці) на button1 має викликатися вікно введення нової матриці. Розмір матриці залежить від значення n.

Лістинг обробника події кліка на кнопці button1 наступний:

private void button1_Click (object sender, EventArgs e) {// 1. Читання розмірності матриці if (textBox1.Text == "") return; n = int .Parse (textBox1.Text); // 2. Обнулення осередку MatrText Clear_MatrText (); // 3. Налаштування властивостей осередків матриці MatrText // з прив'язкою до значення n і формі Form2 for (int i = 0; i <n; i ++) for (int j = 0; j <n; j ++) {// 3.1. Порядок табуляції MatrText [i, j] .TabIndex = i * n + j + 1; // 3.2. Зробити осередок видимої MatrText [i, j] .Visible = true; } // 4. Коригування розмірів форми form2.Width = 10 + n * dx + 20; form2.Height = 10 + n * dy + form2.button1.Height + 50; // 5. Коригування позиції і розмірів кнопки на формі Form2 form2.button1.Left = 10; form2.button1.Top = 10 + n * dy + 10; form2.button1.Width = form2.Width - 30; // 6. Виклик форми Form2 if (form2.ShowDialog () == DialogResult .OK) {// 7. Перенесення рядків з форми Form2 в матрицю Matr1 for (int i = 0; i <n; i ++) for (int j = 0; j <n; j ++) if (MatrText [i, j] .Text! = "") Matr1 [i, j] = Double .Parse (MatrText [i, j] .Text); else Matr1 [i, j] = 0; // 8. Дані в матрицю Matr1 внесені f1 = true; label2.Text = "true"; }}

У наведеному вище лістингу читається значення n. Після цього здійснюється настройка осередків матриці рядків MatrText.

На основі введеного значення n формуються розміри форми form2 і позиція кнопки button1.

Якщо в формі Form2 користувач натиснув на кнопку OK (button2), то рядки з MatrText переносяться в двовимірну матрицю дійсних чисел Matr1. Перетворення з рядка в відповідне дійсне число виконується методом Parse () з класу Double.

Також формується змінна f1, яка вказує що дані в матрицю Matr1 внесені.

8. Програмування події кліка на кнопці button2 ( "Введення матриці 2 ...«)

Лістинг обробника події кліка на кнопці button2 подібний лістингу обробника події кліка на кнопці button1. Тільки він відрізняється кроками 7-8. На цій ділянці формуються матриця Matr2 і змінна f2.

private void button2_Click (object sender, EventArgs e) {// 1. Читання розмірності матриці if (textBox1.Text == "") return; n = int .Parse (textBox1.Text); // 2. Обнулити осередку MatrText Clear_MatrText (); // 3. Налаштування властивостей осередків матриці MatrText // з прив'язкою до значення n і формі Form2 for (int i = 0; i <n; i ++) for (int j = 0; j <n; j ++) {// 3.1. Порядок табуляції MatrText [i, j] .TabIndex = i * n + j + 1; // 3.2. Зробити осередок видимої MatrText [i, j] .Visible = true; } // 4. Коригування розмірів форми form2.Width = 10 + n * dx + 20; form2.Height = 10 + n * dy + form2.button1.Height + 50; // 5. Коригування позиції і розмірів кнопки на формі Form2 form2.button1.Left = 10; form2.button1.Top = 10 + n * dy + 10; form2.button1.Width = form2.Width - 30; // 6. Виклик форми Form2 if (form2.ShowDialog () == DialogResult .OK) {// 7. Перенесення рядків з форми Form2 в матрицю Matr2 for (int i = 0; i <n; i ++) for (int j = 0; j <n; j ++) Matr2 [i, j] = Double .Parse (MatrText [i, j] .Text); // 8. Матриця Matr2 сформована f2 = true; label3.Text = "true"; }}

9. Програмування події Leave втрати фокусу введення елементом управління textBox1

У додатку може виникнути ситуація, коли користувач змінює значення n на нове. У цьому випадку повинні заново формуватися прапорці f1 і f2. Також змінюється розмір матриці MatrText, яка виводиться в формі Form2.

Зміна значення n можна проконтролювати за допомогою події Leave елемента управління textBox1. Подія Leave генерується в момент втрати фокусу введення елементом управління textBox1 (рис. 4).

Мал. 4. Подія Leave елемента управління textBox1

Лістинг обробника події Leave наступний:

private void textBox1_Leave (object sender, EventArgs e) {int nn; nn = Int16 .Parse (textBox1.Text); if (nn! = n) {f1 = f2 = false; label2.Text = "false"; label3.Text = "false"; }}

10. Програмування події кліка на кнопці button3 ( «Результат»)

Висновок результату буде здійснюватися в ту ж форму, в якій вводилися матриці Matr1 і Matr2. Спочатку твір цих матриць буде сформовано в матриці Matr3. Потім значення з Matr3 переноситься в MatrText і відображається на формі Form2.

Лістинг обробника події кліка на кнопці button3.

private void button3_Click (object sender, EventArgs e) {// 1. Перевірка, чи введені дані в обох матрицях if (! ((f1 == true) && (f2 == true))) return; // 2. Обчислення твори матриць. Результат в Matr3 for (int i = 0; i <n; i ++) for (int j = 0; j <n; j ++) {Matr3 [j, i] = 0; for (int k = 0; k <n; k ++) Matr3 [j, i] = Matr3 [j, i] + Matr1 [k, i] * Matr2 [j, k]; } // 3. Внесення даних в MatrText for (int i = 0; i <n; i ++) for (int j = 0; j <n; j ++) {// 3.1. Порядок табуляції MatrText [i, j] .TabIndex = i * n + j + 1; // 3.2. Перевести число в рядок MatrText [i, j] .Text = Matr3 [i, j] .ToString (); } // 4. Висновок форми form2.ShowDialog (); }

11. Програмування події кліка на кнопці button4 ( «Зберегти у файлі« Res_Matr.txt "")

Для збереження результуючої матриці Matr3 можна скористатися наявними можливостями класу FileStream.

Клас FileStream описаний в модулі System.IO. Тому на початку програми потрібно додати наступний код:

using System.IO;

Лістинг обробника події кліка на кнопці button4 наступний:

private void button4_Click (object sender, EventArgs e) {FileStream fw = null; string msg; byte [] msgByte = null; // байтовий масив // 1. Відкрити файл для запису fw = new FileStream ( "Res_Matr.txt", FileMode .Create); // 2. Запис матриці результату в файл // 2.1. Спочатку записати число елементів матриці Matr3 msg = n.ToString () + "\ r \ n"; // новий рядок msg в байтовий масив msgByte msgByte = Encoding .Default.GetBytes (msg); // запис масиву msgByte в файл fw.Write (msgByte, 0, msgByte.Length); // 2.2. Тепер записати саму матрицю msg = ""; for (int i = 0; i <n; i ++) {// формуємо рядок msg з елементів матриці for (int j = 0; j <n; j ++) msg ​​= msg + Matr3 [i, j] .ToString () + ""; msg = msg + "\ r \ n"; // додати новий рядок} // 3. Переклад рядка msg в байтовий масив msgByte msgByte = Encoding .Default.GetBytes (msg); // 4. запис рядків матриці в файл fw.Write (msgByte, 0, msgByte.Length); // 5. Закрити файл if (fw! = Null) fw.Close (); }

12. Запуск програми на виконання

Після цього можна запускати додаток на виконання і тестувати його роботу.

Уважаемые партнеры, если Вас заинтересовала наша продукция, мы готовы с Вами сотрудничать. Вам необходимо заполнить эту форму и отправить нам. Наши менеджеры в оперативном режиме обработают Вашу заявку, свяжутся с Вами и ответят на все интересующее Вас вопросы.

Или позвоните нам по телефонам: (048) 823-25-64

Организация (обязательно) *

Адрес доставки

Объем

Как с вами связаться:

Имя

Телефон (обязательно) *

Мобильный телефон

Ваш E-Mail

Дополнительная информация: