
Лабораторная работа №11
Создание приложений Windows Forms для формирования
и обработки двумерных массивов
ИНДИВИДУАЛЬНОЕ ЗАДАНИЕ НА РАЗРАБОТКУ ПРОЕКТА\
Создать проект решения следующей задачи:
Сформировать и вывести в список формы динамический двумерный массива из случайных целых чисел;
Создать новый массив преобразованием старого массива перестановкой столбцов;
Вывести новый массив в список формы.
ФОРМАЛИЗАЦИЯ ЗАДАЧИ
Из условия задания следует, что его выполнение распадается наследующие этапы, реализуемые соответствующими функциями приложения:
ввод исходных данных (размеры исходного массива и границы
диапазона случайных чисел) – функция GetInt
формирование исходного массива – функция input
вывод исходного массива в заданный список (элемент управления
ListBox) формы – функция output
преобразование исходного массива перестановкой столбцов первого с последним, второго с предпоследним – функция task; эта функция использует функцию revers для перестановки элементов в одной строке исходного массива
вывод нового массива – функция output
освобождение памяти сформированных массивов – функция del.
Вызов функций формирования и вывода динамических массивов
производится в событийной процедуре по нажатию кнопки Решить.
РАЗРАБОТКА ГРАФИЧЕСКОГО ИНТЕРФЕЙСА ПОЛЬЗОВАТЕЛЯ ПРИЛОЖЕНИЯ
Графический интерфейс проекта изображен на рисунке 1. В верхней части формы расположены текстовые поля для ввода исходных данных: количества строк массива (txtM), количества столбцов массива (txtN) и границ диапазона случайных чисел (txtA) и (txtB). Ниже расположены два списка ListBox: список lstMatr1 для вывода исходного массива и список lstMatr2 – для вывода нового массива. На форме также имеются две кнопки: кнопка Решить (cmdTask) для запуска программы на выполнение и кнопка Выход (cmdExit) для завершения ее выполнения.
Рисунок 1 – Графический интерфейс проекта
ТАБЛИЦА ИСПОЛЬЗУЕМЫХ ОБЪЕКТОВ И ИХ СВОЙСТВА
В таблице 1 приведены объекты формы с их свойствами.
Таблица 1
Объект |
Класс объекта |
Свойство |
Значение свойсвта |
Форма |
Form |
Name |
Form1 |
Text |
Динамические двумерные массивы |
||
BackColor |
ActiveCaption |
||
Метка |
Label |
Name |
label1 |
Text |
Приложение создает двумерный массив заданного размера, заполняет его случайными целыми числами в заданном диапазоне. Преобразуйте массив перестановкой столбцов: первого с последним, второго с предпоследним и т.д. |
||
NextAlign |
MiddleCenter |
||
Font |
Microsoft Sans Serif; 7,8pt |
||
ForeColor |
HotTrack |
||
BorderStyle |
FixedSingle |
||
Метка |
Label |
Name |
label2 |
Text |
Размер исходной матрицы: |
||
NextAlign |
MiddleCenter |
||
Font |
Microsoft Sans Serif; 7,8pt |
||
ForeColor |
ControlText |
||
Метка |
Label |
Name |
label3 |
Text |
число строк m |
||
NextAlign |
MiddleCenter |
||
Font |
Microsoft Sans Serif; 7,8pt |
||
ForeColor |
HotTrack |
||
Метка |
Label |
Name |
Label4 |
Text |
число столбцов n |
||
NextAlign |
MiddleCenter |
||
Font |
Microsoft Sans Serif; 7,8pt |
||
ForeColor |
ControlText |
||
Метка |
Label |
Name |
Label5 |
Text |
Диапазон случайных чисел |
||
NextAlign |
MiddleCenter |
||
Font |
Microsoft Sans Serif; 7,8pt |
||
ForeColor |
HotTrack |
||
Метка |
Label |
Name |
Label6 |
Text |
число левая граница а |
||
NextAlign |
MiddleCenter |
||
Font |
Microsoft Sans Serif; 7,8pt |
||
ForeColor |
ControlText |
||
Метка |
Label |
Name |
Label7 |
Text |
правая граница b |
||
NextAlign |
MiddleCenter |
||
Font |
Microsoft Sans Serif; 7,8pt |
||
ForeColor |
ControlText |
||
Метка |
Label |
Name |
Label8 |
Text |
Исходная матрица |
||
NextAlign |
MiddleCenter |
||
Font |
Microsoft Sans Serif; 7,8pt |
||
ForeColor |
ControlText |
||
Метка |
Label |
Name |
Label9 |
Text |
Полученная матрица |
||
NextAlign |
MiddleCenter |
||
Font |
Microsoft Sans Serif; 7,8pt |
||
ForeColor |
ControlText |
||
|
|
||
Список |
ListBox |
Name |
lstMatr1 |
Text |
“”(Пусто) |
||
Кнопка |
Button |
Name |
cmdTask |
Text |
Решить |
||
Font |
Microsoft Sans Serif; 7,8pt |
||
Кнопка |
Button |
Name |
cmdExit |
Text |
Завершить |
||
Font |
Microsoft Sans Serif; 7,8pt |
||
Список |
ListBox |
Name |
lstMatr2 |
Text |
“”(Пусто) |
РАЗРАБОТКА СХЕМ АЛГОРИТМОВ ФУНКЦИЙ
Рисунок 2 – Блок-схема функции revers
Рисунок 3 – Блок-схема функции task
РАЗРАБОТКА ПРОГРАММНОГО КОДА ПРИЛОЖЕНИЯ
В данном проекте в соответствии с заданием, помимо автоматически сгенерированных системой файлов, создается два файла с программным кодом функций пользователя:
• файл GetPut.cpp с функциями для ввода, вывода и освобождения динамической памяти (т.е. с функциями GetInt, input, output и del), программный код которого приведен на рис. 4;
• файл task.cpp, содержащий две функции, необходимых для решения задачи, программный код которого приведен на рисунок 5.
#include "stdafx.h" int** input(int m, int n, int a, int b) { int** matr = new int* [m]; if (a > b) { int t=a; a=b; b=t;}
Random^ rnd = gcnew Random; for (int i=0; i <m; i++) { *(matr+i) = new int[n]; for (int j=0; j<n; j++) *(*(matr+i)+j) = rnd->Next(a,b); } return matr; }
bool GetInt(int& x, TextBox^ Tx, String^ s) { if (Tx->Text->Length==0) { MessageBox::Show(s, "Ошибка", MessageBoxButtons::OK, MessageBoxIcon::Error); Tx->Focus(); return false; } x= Convert:: ToInt32(Tx->Text); if (x<1) { MessageBox::Show(s, "Ошибка", MessageBoxButtons::OK, MessageBoxIcon::Error); Tx->Focus(); return false; } return true; }
void output(int** mas, int m, int n, ListBox^ Lb) { Lb->Items->Clear(); for (int i=0; i<m; i++) { String^ s=""; for (int j=0; j<n; j++) s = s + String::Format("{0,-5:D2}", *(*(mas+i)+j)); Lb->Items->Add(s); } }
void del(int** a, int m) { for (int i=0; i<m; i++) delete[] *(a+i); delete[] a; }
|
Рисунок 4 – Программный код файла GetPut.cpp
Функция input имеет 4 входных целочисленных параметра: число
строк m, число столбцов n, и a, b – границы диапазона случайных чисел и
возвращаемое значение типа «указатель на указатель на int».
Сначала в теле функции объявляется переменная matr типа «указатель на указатель на int» и выделяется память под массив указателей на int. Количество элементов в массиве указателей равно m – количеству строк в
создаваемой матрице и в них будут храниться адреса строк массива.
После создания объекта типа Random для формирования случайных
чисел, организуется вложенный цикл. Во внешнем цикле динамически
выделяется память для каждой строки массива (каждая строка состоит из n
элементов типа int) – выделяется память под n вещественных чисел типа
int, т.е. под столбцы в очередной строке. Адрес начала участка выделенной
памяти запоминается в соответствующем элементе массива указателей.
Далее во внутреннем цикле из случайных чисел формируются
значения n элементов текущей i-ой строки. После завершения внутреннего
цикла происходит изменение значения параметра внешнего цикла i и
переход к новой строке – все описанные действия повторяются для
очередной строки массива. По окончании внешнего цикла функция оператором return возвращает указатель на сформированный массив.
Функция output предназначена для построчного вывода двумерного
массива в заданный список ListBox и имеет 4 параметра – указатель на динамический двумерный массив, число строк и столбцов массива и указатель на список, в который будет производиться вывод.
Функция GetInt для ввода целого положительного числа из текстового поля уже неоднократно использовалась нами в предыдущих работах.
Функция del имеет два параметра: указатель на двумерный массив и число строк в массиве. В цикле по числу строк освобождается память, выделенная элементам текущей строки, а после его завершения освобождается память, занятая массивом указателей на строки.
Первая функция файла task.cpp – функция revers, переворачивающая столбцы массива.
#include "stdafx.h" void revers(int* a, int n) { int tak; int end=n-1; int k=0; int j=n/2; for (int i=0; i<j; i++) { tak=*(a+end-i); *(a+end-i)=*(a+k); *(a+k)=tak; k++; } }
int** task(int** matr, int m, int n) { int k=0; for (int i=0; i<m; i++) { revers(*(matr+i),n); k++; } return matr; }
|
Рисунок 5 – Программный код файла task.cp
В файл task.h из файлов исходного кода переносятся директивы using и записываются прототипы используемых функций. Затем редактируется
системный заголовочный файл stdafx.h добавлением в него директивы
компилятора для подключения созданного заголовочного файла task.h. На
рисунке 6 приведен программный код созданного заголовочного файла task.h
и системного заголовочного файла stdafx.h.
using namespace System; using namespace System::Windows::Forms;
int** input(int m, int n, int a, int b); bool GetInt(int&, TextBox^, String^); void output(int**, int m, int n, ListBox^); int** task(int**, int, int); void del(int**, int);
|
#pragma once #include "task.h" |
Рисунок 6 – Программные коды заголовочных файлов
На рисунке 7 приведены коды событийных процедур, вставляемых в файл Form1.h после директивы #pragma endregion. 16 В событийной процедуре нажатия на кнопку Решить (cmdTask_Click) объявляются четыре переменные, которые с помощью функции ввода GetInt с контролем непустого текстового поля получают значения числа строк m и столбцов массива n, а также a и b – границ диапазона случайных натуральных чисел. Затем вызывается функция input создания динамического двумерного массива и заполнения его случайными натуральными числами. После вывода исходного массива функцией output в заданный список формы вызывается функция task создания нового массива согласно условию задачи. Если результат работы функции task не равен нулю, то новый массив создан, и полученный массив выводится в форму функцией output, а затем вызывается функция del освобождения динамической памяти, которая выделялась новому массиву. Если же функция task вернула ноль, то новый массив не создан, и выводится соответствующее сообщение. Последний оператор событийной процедуры – оператор вызова функции del для освобождения динамической памяти, которая выделялась исходному массиву.
private: System::Void cmdTask_Click(System::Object^ sender, System::EventArgs^ e) { lstMatr1->Items->Clear(); lstMatr2->Items->Clear(); int m, n; int a, b; if (!GetInt(m, txtM, "Введите число строк матрицы")) return; if (!GetInt(n, txtN, "Введите число столбцов матрицы")) return; if (!GetInt(a, txtA, "Введите левую границу диапазона")) return; if (!GetInt(b, txtB, "Введите правую границу диапазона")) return; int** matr = input(m,n,a,b); output(matr, m, n, lstMatr1); matr= task(matr, m,n); output(matr, m,n, lstMatr2); del(matr, m); } private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) { this->Close(); } |
Рисунок 7 – Программный код событийных процедур
РЕЗУЛЬТАТЫ ВЫПОЛНЕНИЯ ПРИЛОЖЕНИЯ
На рисунке 8 приведен результат выполнения программы.
Рисунок 8 – Результаты выполнения проекта