Лабораторная работа №5 Программирование алгоритмов формирования и обработки статических одномерных массивов. ЗБИН2151_Ванин А.П._лр5. Лабораторная работа 5 Программирование алгоритмов формирования и обработки статических одномерных массивов
Скачать 243.7 Kb.
|
|
#pragma once // Максимальная размерность входного массива #define N_MASS 50 extern void InitMassRandom(int m[], int n, int a, int b); extern void InitMassPosRise(int m[], int n, int a, int b); extern int CopyMassPosRise(int m[], int ms[], int n, int s); |
Листинг 1
Листинг файла InitMass.cpp (Листинг 2)
#include "stdafx.h" #include "InitMass.h" using namespace System; // Инициализация одномерного массива случайными числами в заданном диапазоне void InitMassRandom(int m[], int n, int a, int b) { Random ^r = gcnew Random(); for (int i=0;i m[i] = r->Next(a,b); } delete r; } // Инициализация одномерного массива случайными возрастающими числами void InitMassPosRise(int m[], int n, int a, int b) { Random ^r = gcnew Random(); int inc = (b - a)/n; for (int i=0;i m[i] = r->Next(a, a+inc); a += inc; } delete r; } // Копирование масива с учетом числа S согласно задания int CopyMassPosRise(int m[], int ms[], int n, int s) { bool rise = true; int j=0; for (int i=0;i if (rise && (s < m[i])) { rise = false; ms[j++] = s; } if (m[i] > 0) { ms[j++] = m[i]; } } if (rise) ms[j++] = s; return j; } |
Листинг 2
Блок-схема алгоритма функции InitMassRandom() приведена на Блок-схеме 1:
Блок-схема 1
Блок-схема алгоритма функции InitMassPosRise() приведена на Блок-схеме 2:
Блок-схема 2
Блок-схема алгоритма функции CopyMassPosRise() приведена на Блок-схеме 3:
Блок-схема 3
Реализация графического интерфейса для решения поставленной задачи
Создадим графический интерфейс для решения (Рисунок 1).
Рисунок 1
Первым шагом добавим компонент NumericUpDown, который будет устанавливать размерность входного массива. Добавим текстовое поле для ввода числа s, и также текстовое поле для ручного ввода числа во входной компонент ListBox. Добавим две кнопки – одна из них будет создавать и инициализировать массив целых чисел случайными значениями в указанном диапазоне, другая – строго возрастающими случайными значениями. Добавим текстовые поля для указания границ для автоматической генерации значений.
Добавим два компонента ListBox. Один из них будет отображать состояние введенной вручную и(или) автоматически входной последовательности, другая – для отображения выходной последовательности согласно задания. Добавим кнопку между этими компонентами для выполнения копирования значений.
Подключим хидер-файл InitMass.h.
Обработка событий графического интерфейса
Для удобства выполним инициализацию необходимых графических коспонентов в конструкторе формы (Листинг 3):
Form1(void) { InitializeComponent(); // //TODO: добавьте код конструктора // numericUpDownN->Maximum = N_MASS; numericUpDownN->Value = N_MASS/2; textBoxA->Text = "0"; textBoxS->Text = "0"; textBoxB->Text = "1000"; } |
Листинг 3
Добавим два метода в класс – инициализацию экземпляра listBoxIn сгенерированным автоматически массивом, и добавлением значения вручную (две функции ToListIn() в Листинге 8).
Далее создадим события на нажатие кнопки добавления вручную (Листинг 4):
// Событие добавления значения из UI private: System::Void buttonAdd_Click(System::Object^ sender, System::EventArgs^ e) { ToListIn(); } |
Листинг 4
Добавим событие на автоматическую инициализацию массива случайными числами (Листинг 5). Метод создает стековый массив максимальной размерности, принимает размерность заданную, границы формирования, вызывает ранее реализованную функцию инициализации массива случайными значениями в указанном диапазоне InitMassRandom(), и заполняет входной компонент listBoxIn. В случае ошибки задания параметров генерируется исключение с выводом уведомления пользователю:
// Формирование и выгрузка массива из случайных чисел private: System::Void buttonR_Click(System::Object^ sender, System::EventArgs^ e) { int m[N_MASS]; int n = Convert::ToInt32(numericUpDownN->Value); try { int a = Convert::ToInt32(textBoxA->Text); int b = Convert::ToInt32(textBoxB->Text); if (b <= a) throw gcnew Exception("b <= a"); InitMassRandom(m,n,a,b); ToListIn(m,n); } catch (Exception ^ex) { MessageBox::Show("Границы формирования: "+ex->Message); } } |
Листинг 5
Добавим событие на автоматическую инициализацию массива случайными числами со строгим возрастанием (Листинг 6). Метод аналогичен предыдущему, за исключением вызова другого метода (InitMassPosRise()):
// Формирование и выгрузка мсассива из упорядоченных чисел private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { int m[N_MASS]; int n = Convert::ToInt32(numericUpDownN->Value); try { int a = Convert::ToInt32(textBoxA->Text); int b = Convert::ToInt32(textBoxB->Text); if (b <= a) throw gcnew Exception("b <= a"); InitMassPosRise(m,n,a,b); ToListIn(m,n); } catch (Exception ^ex) { MessageBox::Show("Границы формирования: "+ex->Message); } } |
Листинг 6
В конце реализуем метод копирования в выходной компонент listBoxOut согласно заданию (Листинг 7). Метод проверяет состояние входного списка, принимает число s, создает входной стековый массив максимальной размерности, и выходной максимальной размерности+1. Далее метод формирует входной массив из входного компонента listBoxIn, проверяя получаемые компоненты на строгое возрастание. Если строгого возрастания нет, метод завершается с уведомлением. Если строгое возрастание определено, вызывается ранее реализованный метод CopyMassPosRise(), и значения результирующего массива ms переносятся в компонент listBoxOut.
// Событие копирования данных согласно задания private: System::Void buttonOut_Click(System::Object^ sender, System::EventArgs^ e) { // Проверка на пустой входной массив if (!listBoxIn->Items->Count) { MessageBox::Show("Входной список пуст"); return; } bool rise = true; int last, S; // Прием числа S try { S = Convert::ToInt32(textBoxS->Text); } catch (Exception ^ex) { MessageBox::Show(ex->Message); return; } int m[N_MASS]; int ms[N_MASS+1]; int n = listBoxIn->Items->Count; // Анализ входного списка на возрастание for (int i=0;i int v = Convert::ToInt32(listBoxIn->Items[i]); if ((i > 0) && (v <= last)) { rise = false; break; } last = m[i] = v; } if (!rise) { MessageBox::Show("Последовательность не строго возрастающая"); return; } // Копирование списка с вставкой числа S int ns = CopyMassPosRise(m,ms,n,S); listBoxOut->Items->Clear(); for (int i=0;i listBoxOut->Items->Add(ms[i]); } } |
Листинг 7
Полный текст основной формы приведен в Листинге 8:
#pragma once #include "InitMass.h" namespace MassS { using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; /// /// Сводка для Form1 /// public ref class Form1 : public System::Windows::Forms::Form { public: Form1(void) { InitializeComponent(); // //TODO: добавьте код конструктора // numericUpDownN->Maximum = N_MASS; numericUpDownN->Value = N_MASS/2; textBoxA->Text = "0"; textBoxS->Text = "0"; textBoxB->Text = "1000"; } protected: /// /// Освободить все используемые ресурсы. /// Form1() { if (components) { delete components; } } private: System::Windows::Forms::NumericUpDown^ numericUpDownN; private: System::Windows::Forms::Label^ labelN; private: System::Windows::Forms::Button^ buttonR; private: System::Windows::Forms::Button^ button1; private: System::Windows::Forms::Button^ buttonOut; private: System::Windows::Forms::Label^ labelAdd; private: System::Windows::Forms::TextBox^ textBoxAdd; private: System::Windows::Forms::ListBox^ listBoxIn; private: System::Windows::Forms::ListBox^ listBoxOut; private: System::Windows::Forms::TextBox^ textBoxS; private: System::Windows::Forms::Label^ labelS; private: System::Windows::Forms::Button^ buttonAdd; private: System::Windows::Forms::Label^ labelA; private: System::Windows::Forms::TextBox^ textBoxA; private: System::Windows::Forms::TextBox^ textBoxB; private: System::Windows::Forms::Label^ labelB; private: /// /// Требуется переменная конструктора. /// System::ComponentModel::Container ^components; #pragma region Windows Form Designer generated code /// /// Обязательный метод для поддержки конструктора - не изменяйте /// содержимое данного метода при помощи редактора кода. /// void InitializeComponent(void) { this->numericUpDownN = (gcnew System::Windows::Forms::NumericUpDown()); this->labelN = (gcnew System::Windows::Forms::Label()); this->buttonR = (gcnew System::Windows::Forms::Button()); this->button1 = (gcnew System::Windows::Forms::Button()); this->buttonOut = (gcnew System::Windows::Forms::Button()); this->labelAdd = (gcnew System::Windows::Forms::Label()); this->textBoxAdd = (gcnew System::Windows::Forms::TextBox()); this->listBoxIn = (gcnew System::Windows::Forms::ListBox()); this->listBoxOut = (gcnew System::Windows::Forms::ListBox()); this->textBoxS = (gcnew System::Windows::Forms::TextBox()); this->labelS = (gcnew System::Windows::Forms::Label()); this->buttonAdd = (gcnew System::Windows::Forms::Button()); this->labelA = (gcnew System::Windows::Forms::Label()); this->textBoxA = (gcnew System::Windows::Forms::TextBox()); this->textBoxB = (gcnew System::Windows::Forms::TextBox()); this->labelB = (gcnew System::Windows::Forms::Label()); (cli::safe_cast this->SuspendLayout(); // // numericUpDownN // this->numericUpDownN->Location = System::Drawing::Point(214, 15); this->numericUpDownN->Name = L"numericUpDownN"; this->numericUpDownN->Size = System::Drawing::Size(120, 20); this->numericUpDownN->TabIndex = 0; // // labelN // this->labelN->AutoSize = true; this->labelN->Location = System::Drawing::Point(3, 18); this->labelN->Name = L"labelN"; this->labelN->Size = System::Drawing::Size(196, 13); this->labelN->TabIndex = 1; this->labelN->Text = L"Размерность статического массива:"; // // buttonR // this->buttonR->Location = System::Drawing::Point(13, 103); this->buttonR->Name = L"buttonR"; this->buttonR->Size = System::Drawing::Size(321, 23); this->buttonR->TabIndex = 2; this->buttonR->Text = L"Инициализировать случайной последовательностью"; this->buttonR->UseVisualStyleBackColor = true; this->buttonR->Click += gcnew System::EventHandler(this, &Form1::buttonR_Click); // // button1 // this->button1->Location = System::Drawing::Point(13, 132); this->button1->Name = L"button1"; this->button1->Size = System::Drawing::Size(321, 23); this->button1->TabIndex = 3; this->button1->Text = L"Инициализировать возрастающей последовательностью"; this->button1->UseVisualStyleBackColor = true; this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click); // // buttonOut // this->buttonOut->Location = System::Drawing::Point(152, 229); this->buttonOut->Name = L"buttonOut"; this->buttonOut->Size = System::Drawing::Size(40, 25); this->buttonOut->TabIndex = 4; this->buttonOut->Text = L"=>"; this->buttonOut->UseVisualStyleBackColor = true; this->buttonOut->Click += gcnew System::EventHandler(this, &Form1::buttonOut_Click); // // labelAdd // this->labelAdd->AutoSize = true; this->labelAdd->Location = System::Drawing::Point(3, 70); this->labelAdd->Name = L"labelAdd"; this->labelAdd->Size = System::Drawing::Size(104, 13); this->labelAdd->TabIndex = 5; this->labelAdd->Text = L"Добавить вручную:"; // // textBoxAdd // this->textBoxAdd->Location = System::Drawing::Point(214, 67); this->textBoxAdd->Name = L"textBoxAdd"; this->textBoxAdd->Size = System::Drawing::Size(74, 20); this->textBoxAdd->TabIndex = 6; // // listBoxIn // this->listBoxIn->FormattingEnabled = true; this->listBoxIn->Location = System::Drawing::Point(13, 173); this->listBoxIn->Name = L"listBoxIn"; this->listBoxIn->Size = System::Drawing::Size(110, 147); this->listBoxIn->TabIndex = 7; // // listBoxOut // this->listBoxOut->FormattingEnabled = true; this->listBoxOut->Location = System::Drawing::Point(224, 173); this->listBoxOut->Name = L"listBoxOut"; this->listBoxOut->Size = System::Drawing::Size(110, 147); this->listBoxOut->TabIndex = 8; // // textBoxS // this->textBoxS->Location = System::Drawing::Point(214, 41); this->textBoxS->Name = L"textBoxS"; this->textBoxS->Size = System::Drawing::Size(120, 20); this->textBoxS->TabIndex = 10; // // labelS // this->labelS->AutoSize = true; this->labelS->Location = System::Drawing::Point(3, 44); this->labelS->Name = L"labelS"; this->labelS->Size = System::Drawing::Size(59, 13); this->labelS->TabIndex = 9; this->labelS->Text = L"Число \"S\""; // // buttonAdd // this->buttonAdd->Location = System::Drawing::Point(294, 64); this->buttonAdd->Name = L"buttonAdd"; this->buttonAdd->Size = System::Drawing::Size(40, 25); this->buttonAdd->TabIndex = 11; this->buttonAdd->Text = L"=>"; this->buttonAdd->UseVisualStyleBackColor = true; this->buttonAdd->Click += gcnew System::EventHandler(this, &Form1::buttonAdd_Click); // // labelA // this->labelA->AutoSize = true; this->labelA->Location = System::Drawing::Point(341, 109); this->labelA->Name = L"labelA"; this->labelA->Size = System::Drawing::Size(17, 13); this->labelA->TabIndex = 12; this->labelA->Text = L"A:"; // // textBoxA // this->textBoxA->Location = System::Drawing::Point(364, 105); this->textBoxA->Name = L"textBoxA"; this->textBoxA->Size = System::Drawing::Size(74, 20); this->textBoxA->TabIndex = 13; // // textBoxB // this->textBoxB->Location = System::Drawing::Point(364, 134); this->textBoxB->Name = L"textBoxB"; this->textBoxB->Size = System::Drawing::Size(74, 20); this->textBoxB->TabIndex = 15; // // labelB // this->labelB->AutoSize = true; this->labelB->Location = System::Drawing::Point(341, 138); this->labelB->Name = L"labelB"; this->labelB->Size = System::Drawing::Size(17, 13); this->labelB->TabIndex = 14; this->labelB->Text = L"B:"; // // Form1 // this->AutoScaleDimensions = System::Drawing::SizeF(6, 13); this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; this->ClientSize = System::Drawing::Size(457, 336); this->Controls->Add(this->textBoxB); this->Controls->Add(this->labelB); this->Controls->Add(this->textBoxA); this->Controls->Add(this->labelA); this->Controls->Add(this->buttonAdd); this->Controls->Add(this->textBoxS); this->Controls->Add(this->labelS); this->Controls->Add(this->listBoxOut); this->Controls->Add(this->listBoxIn); this->Controls->Add(this->textBoxAdd); this->Controls->Add(this->labelAdd); this->Controls->Add(this->buttonOut); this->Controls->Add(this->button1); this->Controls->Add(this->buttonR); this->Controls->Add(this->labelN); this->Controls->Add(this->numericUpDownN); this->Name = L"Form1"; this->Text = L"Form1"; (cli::safe_cast this->ResumeLayout(false); this->PerformLayout(); } #pragma endregion // Выгрузка в ListBox автоматически-сформированного массива private: void ToListIn(int m[], int n) { listBoxIn->Items->Clear(); for (int i=0;i } // Загрузка в ListBox значения, введенного через UI private: void ToListIn() { try { if (listBoxIn->Items->Count < numericUpDownN->Maximum) { int v = Convert::ToInt32(textBoxAdd->Text); listBoxIn->Items->Add(textBoxAdd->Text); numericUpDownN->Value = listBoxIn->Items->Count; } else { MessageBox::Show("Достигнута максимальная размерность"); } } catch (Exception ^ex) { MessageBox::Show(ex->Message); } } // Формирование и выгрузка мсассива из случайных чисел private: System::Void buttonR_Click(System::Object^ sender, System::EventArgs^ e) { int m[N_MASS]; int n = Convert::ToInt32(numericUpDownN->Value); try { int a = Convert::ToInt32(textBoxA->Text); int b = Convert::ToInt32(textBoxB->Text); if (b <= a) throw gcnew Exception("b <= a"); InitMassRandom(m,n,a,b); ToListIn(m,n); } catch (Exception ^ex) { MessageBox::Show("Границы формирования: "+ex->Message); } } // Формирование и выгрузка мсассива из упорядоченных чисел private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { int m[N_MASS]; int n = Convert::ToInt32(numericUpDownN->Value); try { int a = Convert::ToInt32(textBoxA->Text); int b = Convert::ToInt32(textBoxB->Text); if (b <= a) throw gcnew Exception("b <= a"); InitMassPosRise(m,n,a,b); ToListIn(m,n); } catch (Exception ^ex) { MessageBox::Show("Границы формирования: "+ex->Message); } } // Событие добавления значения из UI private: System::Void buttonAdd_Click(System::Object^ sender, System::EventArgs^ e) { ToListIn(); } // Событие копирования данных согласно задания private: System::Void buttonOut_Click(System::Object^ sender, System::EventArgs^ e) { // Проверка на пустой входной массив if (!listBoxIn->Items->Count) { MessageBox::Show("Входной список пуст"); return; } bool rise = true; int last, S; // Прием числа S try { S = Convert::ToInt32(textBoxS->Text); } catch (Exception ^ex) { MessageBox::Show(ex->Message); return; } int m[N_MASS]; int ms[N_MASS+1]; int n = listBoxIn->Items->Count; // Анализ входного списка на возрастание for (int i=0;i int v = Convert::ToInt32(listBoxIn->Items[i]); if ((i > 0) && (v <= last)) { rise = false; break; } last = m[i] = v; } if (!rise) { MessageBox::Show("Последовательность не строго возрастающая"); return; } // Копирование списка с вставкой числа S int ns = CopyMassPosRise(m,ms,n,S); listBoxOut->Items->Clear(); for (int i=0;i listBoxOut->Items->Add(ms[i]); } } }; } |
Листинг 8
Тестирование программы
Приведем несколько вариантов выполнения программы (Рисунок 2-4):
Рисунок 2 – ошибка ввода
Рисунок 3 – не строго возрастающая последовательность
Рисунок 4 – строго возрастающая последовательность c отрицательными и положительными значениями