
Лабораторная работа №9
Создание приложений Windows Forms для формирования и обработки автоматических одномерных массивов
ИНДИВИДУАЛЬНОЕ ЗАДАНИЕ НА РАЗРАБОТКУ ПРОЕКТА
Создать проект решения следующей задачи:
Сформировать автоматический массив заданного размера из случайных целых чисел в заданном диапазоне;
Вычислить произведение элементов массива, расположенных между максимальным и минимальными элементами, сформировать из этих чисел новый массив.
Вывести оба массива в списки формы.
Разработать схемы алгоритмов и программные коды двух функций:
Функции Xmin, Xmax, которые определяют максимальный и минимальный элемент массива.
Функции task решения задачи формирования нового массива.
ФОРМАЛИЗАЦИЯ ЗАДАЧИ
Из условия задания следует, что его выполнение распадается на следующие этапы, реализуемые соответствующими функциями приложения:
Формирование исходного массива из случайных целых чисел – функция input;
Формирование нового массива, в котором находятся числа между максимальными и минимальными элементами исходного массива – функция task;
Вывод нового массива в заданный список (элемент ListBox) формы – функция output.
Для вычисления максимального и минимального элемента напишем вспомогательные функции Xmin и Xmax.
Вызов функции формирования массивов и вывода нового массив производится в событийной процедуре по нажатию кнопки Решение.
РАЗРАБОТКА ГРАФИЧЕСКОГО ИНТЕРФЕЙСА ПОЛЬЗОВАТЕЛЯ ПРИЛОЖЕНИЯ
Графический интерфейс проекта изображен на рисунке 1.
Форма содержит текстовые поля TextBox для ввода исходных данных (размера массива и диапазона случайных чисел), два списка ListBox для вывода значений исходного и нового массивов, а также кнопки Button для запуска приложения на выполнение и для выхода из приложения.
Рисунок 1 – Графический интерфейс проекта
ТАБЛИЦА ИСПОЛЬЗУЕМЫХ ОБЪЕКТОВ И ИХ СВОЙСТВА
В таблице 1 приведены объекты формы с их свойствами.
Таблица 1
Объект |
Класс объекта |
Свойство |
Значение свойсвта |
Форма |
Form |
Name |
Form1 |
Text |
Одномерные автоматические массивы |
||
BackColor |
ActiveCaption |
||
Текстовое поле |
TextBox |
Name |
txtN |
Text |
“”(Пусто) |
||
Текстовое поле |
TextBox |
Name |
txtA |
Text |
“”(Пусто) |
||
Текстовое поле |
TextBox |
Name |
txtB |
Text |
“”(Пусто) |
||
Метка |
Label |
Name |
label1 |
Text |
Приложение заполняет исходный массив заданного размера случайными целыми числами из заданного диапазона и вычисляет произведение элементов массива, расположенных между максимальным и минимальными элементами. Далее формирует их этих элементов новый массив. |
||
NextAlign |
MiddleCenter |
||
Font |
Microsoft Sans Serif; 10,2pt |
||
ForeColor |
Blue |
||
BorderStyle |
FixedSingle |
||
Метка |
Label |
Name |
label2 |
Text |
Размер исходного массива |
||
NextAlign |
MiddleCenter |
||
Font |
Microsoft Sans Serif; 9pt |
||
ForeColor |
Blue |
||
Метка |
Label |
Name |
label3 |
Text |
Диапазон случайных чисел |
||
NextAlign |
MiddleCenter |
||
Font |
Microsoft Sans Serif; 9pt |
||
ForeColor |
Blue |
||
Метка |
Label |
Name |
label4 |
Text |
Исходный массив |
||
NextAlign |
MiddleCenter |
||
Font |
Microsoft Sans Serif; 9pt |
||
ForeColor |
Blue |
||
Метка |
Label |
Name |
label5 |
Text |
Полученный массив |
||
NextAlign |
MiddleCenter |
||
Font |
Microsoft Sans Serif; 9pt |
||
ForeColor |
Blue |
||
Метка |
Label |
Name |
label6 |
Text |
a |
||
NextAlign |
MiddleCenter |
||
Font |
Microsoft Sans Serif; 12pt |
||
ForeColor |
Blue |
||
Метка |
Label |
Name |
label7 |
Text |
b |
||
NextAlign |
MiddleCenter |
||
Font |
Microsoft Sans Serif; 12pt |
||
ForeColor |
Blue |
||
Кнопка |
Button |
Name |
cmdTask |
Text |
Решение |
||
Font |
Microsoft Sans Serif; 9pt |
||
Кнопка |
Button |
Name |
cmdExit |
Text |
Выход |
||
Font |
Microsoft Sans Serif; 9pt |
||
Список |
ListBox |
Name |
lstMas1 |
Список |
ListBox |
Name |
lstMas2 |
РАЗРАБОТКА СХЕМ АЛГОРИТМОВ ФУНКЦИЙ
Схемы алгоритмов функций Xmax, Xmin и task изображены на рис. 2-4.
Рисунок 2 – Схема алгоритма функции Xmax
Рисунок 3 – Схема алгоритма функции Xmin
Рисунок 4 – Схема алгоритма функции task
РАЗРАБОТКА ПРОГРАММНОГО КОДА ПРИЛОЖЕНИЯ
В данном проекте в соответствии с заданием создаётся два файла с программным кодом функции пользователя:
Файл GetPut.cpp, содержащий функцию GetInt для ввода из текстового поля формы и преобразования в целое число, функцию input формирования массива из случайных целых чисел в элемент управления ListBox формы;
Файл task.cpp, содержащий функции Xmax и Xmin, вычисляющие максимальное и минимальное значения массива, а также функцию task, с новым массивом, состоящим из чисел, находящихся между максимальным и минимальным элементами.
На рисунке 5 приведён программный код файла GetPut.cpp.
Функция input заполняет массив случайными натуральными числами и имеет 4 формальных параметра: сам массив mas[], количество элементов в массиве n, диапазон случайных чисел a, b. В теле функции для генерации случайных чисел создается объект класса Random, а затем в цикле с помощью метода Next этого объекта генерируется случайное число и присваивается очередному элементу массива.
Функция output выводит массив в заданный список на форме и имеет 3 формальных параметра: массив, число выводимых элементов и указатель на объект типа ListBox, в который требуется произвести вывод.
Следующая функция в этом файле GetInt служит для ввода целого числа из текстового поля формы и имеет 4 формальных параметра. Первый параметр const int MaxVal типа целая константа – это максимальное число, которое пользователь имеет право ввести в текстовое поле, второй – само текстовое поле (вернее, указатель на него).
Третий параметр – это строка, которая выводится в окно сообщений MessageBox в случае ошибочного ввода, т.е. в том случае, когда текстовое полу пусто, либо если введенное в него значение превышает заданное в параметре MaxVal максимально возможное число, или, наоборот, введенное число меньше 1.
Четвёртый параметр функции передаётся по ссылке, и в него записывается введённое число в случае успешного ввода. Функция возвращает значение логического типа (true или false), показывающее, был ли произведён успешный ввод значения или нет.
#include "stdafx.h"
void input(int mas[], int n, int a, int b) { Random^ rnd= gcnew Random; for (int i=0; i<n; i++) mas[i]=rnd->Next(a,b); }
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); } }
bool GetInt(const int MaxVal, TextBox^ Tx, String^ s, int& x) { if (Tx->Text->Length==0) { MessageBox::Show(s,"Ошибка ввода", MessageBoxButtons::OK,MessageBoxIcon::Error); Tx->Focus(); return false; } x = Convert::ToInt32(Tx->Text); if (x<1 || x>MaxVal) { MessageBox::Show(s,"Ошибка ввода", MessageBoxButtons::OK,MessageBoxIcon::Error); Tx->Focus(); return false; } return true; }
|
Рисунок 5 – Программный код файла GetPut.cpp
На рисунке 6 приведён программный код файла task.cpp, содержащий необходимые функции для решения задачи.
Функции Xmin, Xmax, и task практически полностью соответствуют схемам алгоритмов на рисунках 2-4.
#include "stdafx.h" int Xmin(int mas[], int n) { int xmin=mas[0]; int k=0; for (int i=1; i<n; i++){ if (mas[i]<xmin) { xmin=mas[i]; k=i; } } return k; } int Xmax(int mas[], int n) { int xmax=mas[0]; int k=0; for (int i=1; i<n; i++) if (mas[i]>xmax) { xmax=mas[i]; k=i; } return k; } int task(int mas[], int n, int newmas[]) { int k=0; int pr=1; int Kmin = Xmin(mas, n); int Kmax = Xmax(mas, n); if (Kmax < Kmin) { int tak = Imax; Kmax = Kmin; Kmin = tak; } for (int i=Kmin+1; i<Kmax;i++) { newmas[k+1]=mas[i]; pr*=newmas[k+1]; k++; } if (pr==1) return 0; newmas[0]=pr; return k+1; }
|
Рисунок 6 – Программный код файла task.cpp
Программные коды заголовочного файла task.h и отредактированного системного заголовочного файла stdafx.h (Рисунки 7-8)
using namespace System; using namespace System::Windows::Forms;
void input(int mas[], int n, int a, int b); bool GetInt(const int MaxVal, TextBox^ Tx, String^ s, int& x); int Xmin(int mas[], int n); int Xmax(int mas[], int n); void output(int mas[], int n, ListBox^ Lb); int task(int mas[], int n, int newmas[]); |
Рисунок 7 – Программный код заголовочного файла task.h
#pragma once
#include "task.h" |
Рисунок 8 – Программный код заголовочного файла stdafx.h
В данной работе создаются две событийные процедуры, вызываемые при нажатии кнопок cmdTask (Решение) и cmdExit (Выход).
На рисунке 9 приведён код этих процедур, вставляемых в файл Лаба9 после директивы #pragma endregion.
private: System::Void cmdTask_Click(System::Object^ sender, System::EventArgs^ e) { const int N=100; int mas1[N], mas2[N]; int n1, n2; int a,b; lstMas1->Items->Clear(); lstMas2->Items->Clear(); if (!GetInt(N, txtN, "Введите число элементов массива 1<=n<=100", n1)) return; if (!GetInt(10000, txtB, "Введите b-конечное значение отрезка 1<=b<=10000", b)) return; if (!GetInt(b, txtA, "Введите а-начальное значение отрезка 1<=a<=b", a)) return; input(mas1, n1, a, b); output(mas1, n1, lstMas1); n2=task(mas1, n1, mas2); if (n2==0) return; output(mas2,n2, lstMas2); }
|
Рисунок 9 – Программный код событийных процедур в файле Лаба9
РЕЗУЛЬТАТЫ ВЫПОЛНЕНИЯ ПРИЛОЖЕНИЯ
На рисунке 10 приведен результат выполнения приложения.
Рисунок 9 – Результат выполнения проекта
ДОКАЗАТЕЛЬСТВО ПРАВИЛЬНОСТИ РЕЗУЛЬТАТОВ
Минимальный элемент массива равен - 1, максимальный – 87. Между ними находятся числа 78, 81. Произведение этих чисел – 6318. Программа работает корректно.