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

Лабораторная работа №10

Создание приложений Windows Forms для формирования и обработки динамических одномерных массивов

ИНДИВИДУАЛЬНОЕ ЗАДАНИЕ НА РАЗРАБОТКУ ПРОЕКТА

Создать проект решения следующей задачи:

  1. Создать динамический одномерный массив из чисел, записанных в многострочном текстовом поле textbox формы

  2. Вычислить произведение элементов массива, расположенных между максимальным и минимальными элементами, сформировать из этих чисел новый массив.

  3. Вывести оба массива в списки формы.

ФОРМАЛИЗАЦИЯ ЗАДАЧИ

Из условия задачи следует, что его выполнение распадается на следующие этапы, реализуемые соответствующими функциями приложения:

  1. Формирование исходного массива чтением чисел из многострочного текстового поля формы – функция input

  2. Формирование нового массива, в котором находятся числа между максимальными и минимальными элементами исходного массива – функция task;

  3. Вывод нового массива в заданный список (элемент ListBox) формы – функция output.

  4. Вывод произведения чисел нового массива в текстовое поле txtPr

Для вычисления максимального и минимального элемента напишем вспомогательную функцию MinMax.

Вызов функций формирования динамических массивов и вывода нового массива производится в событийной процедуре по нажатию кнопки Решить задачу.

РАЗРАБОТКА ГРАФИЧЕСКОГО ИНТЕРФЕЙСА ПОЛЬЗОВАТЕЛЯ ПРИЛОЖЕНИЯ

Графический интерфейс проекта изображен на рисунке 1.

Рисунок 1 – Графический интерфейс проекта

На форме создано многострочное текстовое поле txtMas1 для ввода значений элементов исходного массива mas1 и список ListBox с именем lstMas2 – для вывода сформированного массива mas2, а также текстовое поле txtPr – выводящая произведение чисел из mas2.

Числа для исходного массива будут во время работы приложения записываться в многострочное текстовое поле (элемент управления TextBox). Для создания многострочного текстового поля, необходимо изменить значение его свойства Multiline, заданное по умолчанию, с False на True, и затем растянуть его по высоте.

Также на форме расположены кнопки Решить задачу (cmdTask) для

запуска программы на выполнение, и Завершить(cmdExit) для останова ее

выполнения.

ТАБЛИЦА ИСПОЛЬЗУЕМЫХ ОБЪЕКТОВ И ИХ СВОЙСТВА

В таблице 1 приведены объекты формы с их свойствами.

Таблица 1

Объект

Класс объекта

Свойство

Значение свойсвта

Форма

Form

Name

Form1

Text

Одномерные автоматические массивы

BackColor

ActiveCaption

Метка

Label

Name

label1

Text

Ввести одномерный массив целых чисел. Вычислить

произведение элементов массива, расположенных

между максимальным и минимальным элементами.

Сформировать из этих элементов новый массив

NextAlign

MiddleCenter

Font

Microsoft Sans Serif; 10,2pt; style=Bold

ForeColor

Highlight

BorderStyle

FixedSingle

Метка

Label

Name

label2

Text

Исходный массив

NextAlign

MiddleCenter

Font

Microsoft Sans Serif; 7,8pt

ForeColor

HotTrack

Метка

Label

Name

label3

Text

Новый массив

NextAlign

MiddleCenter

Font

Microsoft Sans Serif; 7,8pt

ForeColor

HotTrack

Метка

Label

Name

Label4

Text

Произведение

NextAlign

MiddleCenter

Font

Microsoft Sans Serif; 7,8pt

ForeColor

HotTrack

Текстовое поле

TextBox

Name

txtMas1

Text

“”(Пусто)

Текстовое поле

TextBox

Name

txtPr

Text

“”(Пусто)

Список

ListBox

Name

lstMas2

Text

“”(Пусто)

Кнопка

Button

Name

cmdTask

Text

Решить

Font

Microsoft Sans Serif; 7,8pt

Кнопка

Button

Name

cmdExit

Text

Завершить

Font

Microsoft Sans Serif; 7,8pt

РАЗРАБОТКА СХЕМ АЛГОРИТМОВ ФУНКЦИЙ

Схема алгоритма MinMax берется из лабораторной работы 9. Схема алгоритма функции task приведена на рисунке 2.

Рисунок 2 – Схема алгоритма функции task

Функция task создает новый динамический массив, состоящих из чисел, находящихся между максимальными и минимальными элементами исходного массива.

РАЗРАБОТКА ПРОГРАММНОГО КОДА ПРИЛОЖЕНИЯ

В данном проекте в соответствии с заданием, помимо автоматически сгенерированных системой файлов, создается два файла с программным кодом функций пользователя:

• файл GetPut_din.cpp с функциями для ввода и вывода;

• файл task_din.cpp, содержащий функции, необходимые для решения задачи.

Программный код файла GetPut_din.cpp приведен на рисунке 3. Функция input предназначена для ввода исходного массива из многострочного текстового поля. Она имеет 2 формальных параметра: указатель TextBox^ TB на текстовое поле, в которое записываются элементы массива, и n – параметр по ссылке, в который будет записываться количество элементов в массиве. Возвращаемое функцией значение типа указатель на int – адрес первого элемента массива. Значение параметра n в теле функции определяется как число строк в многострочном TextBox с помощью свойства Length. С помощью этого же свойства осуществляется контроль непустого текстового поля. Если число строк в многострочном текстовом поле равно нулю (n=TB->Lines->Length==0), то возникает окно сообщений MessageBox, в которое выводится подсказка о необходимости заполнения текстового поля, и в вызывающую функцию (событийную процедуру) оператором return возвращается ноль как признак того, что массив не создан. Если же число строк n в текстовом поле не равно нулю, т.е. в него записаны какие-то числа, то далее, в теле функции, происходит выделение памяти под n элементов целого типа int, и адрес начала этой памяти присваивается созданному указателю mas. Затем в цикле каждая строка из текстового поля конвертируется в целое число, которое и присваивается очередному элементу массива mas. По окончании цикла функция возвращает оператором return указатель на созданный массив, как возвращаемое значение в событийную процедуру. Функция output выводит массив в список формы. Она имеет 3 формальных параметра: указатель на массив, число выводимых элементов и указатель на объект типа ListBox, в который требуется произвести вывод. Функция отличается от рассмотренной ранее в лабораторной работе 9 тем,

что в случае пустого массива (если число его элементов равно нулю) осуществляет вывод в ListBox строки с соответствующим сообщением.

#include "stdafx.h"

int* input(int& n, TextBox^ TB)

{

if ((n=TB->Lines->Length) == 0)

{

MessageBox::Show("Заполните числами текстовое поле",

"Ошибка",MessageBoxButtons::OK, MessageBoxIcon::Error);

TB->Focus();

return 0;

}

int* mas=new int[n];

for (int i=0; i<n; i++)

{

String^ s = TB->Lines[i];

*(mas+i)=Convert::ToInt32(s);

}

return mas;

}

void output(int* mas, int n, ListBox^ Lb)

{

Lb->Items->Clear();

for (int i=0; i<n; i++)

{

String^ s = mas[i].ToString();

Lb->Items->Add(s);

}

if (!n) Lb->Items->Add("Массив пуст");

}

Рисунок 3 – Программный код файла GetPut_din.cpp

Программный код файла Task_din.cpp приведен на рисунке 4. Первая функция MinMax вычисляет индексы максимального и минимального элементов массива. Последняя функция в файле task_din.cpp – функция task создает новый динамический массив, в котором находятся числа между максимальными и минимальными элементами исходного массива.

Код функции полностью соответствует схеме алгоритма на рис.2. Новый массив создается с помощью операции new. Доступ к элементам обоих массивов осуществляется через операции разыменования соответствующих указателей.

#include "stdafx.h"

int MinMax(int mas[], int n, bool flag)

{

int minmax=mas[0];

int k=0;

for (int i=1; i<n; i++){

if (flag)

{

if (mas[i]<minmax)

{

minmax=mas[i];

k=i;

}

}

else

{

if (mas[i]>minmax)

{

minmax=mas[i];

k=i;

}

}

}

return k;

}

int* task(int* mas, int n, int& k, int& pr)

{

pr = 1;

int Imin = MinMax(mas, n, true);

int Imax = MinMax(mas, n, false);

if (Imax < Imin) { int buf = Imax; Imax = Imin; Imin = buf; }

k = Imax - Imin - 1;

int* newmas = new int[k];

k = 0;

for (int i=Imin+1; i<Imax; i++)

{

newmas[k]=mas[i];

pr*=newmas[k];

k++;

}

if (k<=0) return 0;

return newmas;

}

Рисунок 4 – Программный код файла Task_din.cpp

В файл task_din.h из файлов исходного кода переносятся директивы using и записываются прототипы используемых функций. Затем редактируется системный заголовочный файл stdafx.h добавлением в него директивы компилятора для подключения созданного заголовочного файла task_din.h. На рисунке 5 приведен программный код созданного заголовочного файла task_din.h.

using namespace System;

using namespace System::Windows::Forms;

int* input(int&, TextBox^);

void output(int*, int, ListBox^);

int* task(int*, int, int&, int&);

Рисунок 5 – Программный код заголовочного файла task_din.h

На рисунке 6 приведены коды событийных процедур, вставляемых в файл Form1.h после директивы #pragma endregion.

private: System::Void cmdTask_Click(System::Object^ sender, System::EventArgs^ e)

{

lstMas2->Items->Clear();

int n, k, pr;

int* mas = input(n, txtMas1);

if (!mas) return;

int* newmas = task(mas, n, k, pr);

if (k != 0)

{

output(newmas, k, lstMas2);

txtPr->Text = pr.ToString();

}

else

{

MessageBox::Show("Новый массив не создан",

"Ошибка",MessageBoxButtons::OK, MessageBoxIcon::Error);

}

if (mas) delete[] mas;

if (newmas) delete[] newmas;

}

private: System::Void cmdExit_Click(System::Object^ sender, System::EventArgs^ e)

{

this->Close();

}

Рисунок 6 – Программный код событийных процедур в файле Form1.h

В событийной процедуре нажатия на кнопку Решить задачу (cmdTask_Click) объявляются три переменных целого типа, в которых будут храниться размеры массивов и произведение. Затем вызывается функция input создания динамического массива и заполнения его числами из многострочного текстового поля. Если текстовое поле txtMas1 пусто, то функция input возвращает ноль (исходный динамический массив не создан), и происходит выход из событийной процедуры. В противном случае вызывается функция task создания нового массива из простых чисел исходного массива, а затем функция output вывода полученного массива в предназначенный список на форме.

В текстовое поле txtPr выводится произведение чисел нового массива.

Далее очищается память, занятая массивами, но только после проверки, существуют ли эти массивы (т.е. выделялась ли под них динамическая память).

РЕЗУЛЬТАТЫ ВЫПОЛНЕНИЯ ПРИЛОЖЕНИЯ

На рисунках 7-8 приведены результаты выполнения приложения при различных исходных данных.

Рисунок 7 – Результаты выполнения проекта при наличии чисел между максимальными и минимальными элементами исходного массива

Рисунок 8 – Результаты выполнения проекта при отсутствии чисел между максимальными и минимальными элементами исходного массива