Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторные_работы_АИП.docx
Скачиваний:
6
Добавлен:
14.06.2024
Размер:
2.25 Mб
Скачать

Лабораторная работа №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 – Результаты выполнения проекта