Файл: Лабораторная работа 5 Программирование алгоритмов формирования и обработки статических одномерных массивов.docx
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 12.01.2024
Просмотров: 47
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Лабораторная работа №5
«Программирование алгоритмов формирования и обработки статических одномерных массивов»
Вариант 5
Выполнил студент: Ванин А.П. БИН2151
Проверил преподаватель:
Задание на разработку проекта
Создать проект для заполнения статического массива заданного размера случайными числами. Ввести одномерный массив и число s. Если элементы массива образуют возрастающую последовательность, то создать новый массив только из положительных элементов исходного, а затем вставить в него число s так, чтобы не нарушилась упорядоченность.
Решение
Для решения данного задания создадим проект Windows Forms C++ MassS решение MassST в среде Visual Studio 2010.
Методы работы со статическими массивами
Создадим хидер- и исходный файлы InitMass.h и InitMass.cpp, и реализуем необходимые функции для решения задания:
-
InitMassRandom() – инициализация массива указанной размерности случайными числами в указанном диапазоне. В цикле функция инициализирует все значения входного массива по индексу случайной величиной в диапазоне [a, b].
-
InitMassPosRise() - инициализация массива указанной размерности случайными числами в указанном диапазоне со строгим возрастанием. Функция разбивает входной отрезок [a, b] на равные n-отрезков, и вызывает генерацию случайной величины каждый раз на новом отрезке.
-
CopyMassPosRise() – функция делает копию входного массива со строгим возрастанием, добавляя непревышающее следующий элемент значение параметра s. Массив назначения должен быть размерностью большей n.
Добавим объявления в хидер-файл. Также в хидер-файле укажем максимально допустимую размерность входного массива.
Листинг файла InitMass.h (Листинг 1)
InitMassRandom() – инициализация массива указанной размерности случайными числами в указанном диапазоне. В цикле функция инициализирует все значения входного массива по индексу случайной величиной в диапазоне [a, b].
InitMassPosRise() - инициализация массива указанной размерности случайными числами в указанном диапазоне со строгим возрастанием. Функция разбивает входной отрезок [a, b] на равные n-отрезков, и вызывает генерацию случайной величины каждый раз на новом отрезке.
CopyMassPosRise() – функция делает копию входного массива со строгим возрастанием, добавляя непревышающее следующий элемент значение параметра s. Массив назначения должен быть размерностью большей n.
#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<:componentmodel::isupportinitialize>(this->numericUpDownN))->BeginInit(); 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<:componentmodel::isupportinitialize>(this->numericUpDownN))->EndInit(); 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 отрицательными и положительными значениями