Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабы по Visual Studio C++ (Волков) - ОТЧЁТЫ с подробным кодом / Лабораторная работа №7 (Индивидуальные задания - ВАРИАНТ 28).docx
Скачиваний:
1
Добавлен:
04.09.2024
Размер:
4.58 Mб
Скачать

1.3 Текст программы индивидуального задания №1

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

{

this->Close(); // Закрытие программы

}

private: System::Void txtNum_KeyPress(System::Object^ sender, System::Windows::Forms::KeyPressEventArgs^ e)

// Обработчик нажатий в поле ввода числа элементов для генерации

{

// Очистка исходной последовательности и результата

txtArray->Text = "";

txtResult->Text = "";

TextBox^ ActiveTextBox = txtNum;

// Объявление переменной активного текстового поля

// Если нажатая клавиша не цифровая.

if (!Char::IsDigit(e->KeyChar))

// Если нажатая клавиша не является клавишей BackSpace.

if (e->KeyChar != (char)Keys::Back)

e->Handled = true; // Запрет ввода

// Запрет ввода повторных нулей в начале числа.

if (e->KeyChar == (char)Keys::D0 || e->KeyChar == (char)Keys::NumPad0)

// Если нажата клавиша 0

if (ActiveTextBox->Text->Length >= 1) // Если строка не пустая

if (ActiveTextBox->Text[0] == '0'

&& ActiveTextBox->SelectionStart < 2)

e->Handled = true; // Запрет ввода

}

private: System::Void txt_KeyPress(System::Object^ sender, System::Windows::Forms::KeyPressEventArgs^ e)

// Обработчик нажатий в поле исходной последовательности

{

// Очистка результата

txtResult->Text = "";

txtNum->Text = "";

// Если нажатая клавиша не backspace, не 0 и не 1.

if (((e->KeyChar < 48) || (e->KeyChar > 49))

&& (e->KeyChar != (char)Keys::Back))

e->Handled = true; // Запрет ввода

}

private: System::Void GenerateBtn_Click(System::Object^ sender, System::EventArgs^ e) // Функция генерация массива

{

int ArrNum;

bool CorrectInput = true;

if (txtNum->Text != "") // Если поля не пустые

{

try // Попытка перевести числа в тип Integer

{

ArrNum = Convert::ToInt16(txtNum->Text);

}

catch (...)

// При некорректном вводе (при ошибке перевода в int)

// - сообщение об ошибке

{

CorrectInput = false;

DialogResult = MessageBox::Show(this,

"Число элементов должно быть от 1 до 1000", "Обработка последовательности из нулей и единиц",

MessageBoxButtons::OK, MessageBoxIcon::Exclamation,

MessageBoxDefaultButton::Button1);

}

if ((ArrNum <= 1000) && (ArrNum > 0))

{

// Массив целых чисел

array<int>^ arr = gcnew array<int>(ArrNum);

// Инициализация датчика случайных чисел

Random^ rnd = gcnew Random();

// Заполнение массива случайными числами от 0 до 1

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

arr[i] = rnd->Next(0, 2);

String^ ArrStr = "";

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

if (i < ArrNum - 1) ArrStr += Convert::ToString(arr[i]);

else ArrStr += Convert::ToString(arr[i]);

txtArray->Text = ArrStr;

// Вывод строки массива в поле "Исходный массив"

}

else if (CorrectInput == true) // Если числа не удовлетворяют условию диапазонов - сообщение пользователю

DialogResult = MessageBox::Show(this,

"Число элементов должно быть от 1 до 1000",

"Обработка последовательности из нулей и единиц",

MessageBoxButtons::OK, MessageBoxIcon::Exclamation,

MessageBoxDefaultButton::Button1);

}

else

// Если хотя бы одно поле для генерации не заполнено

// - сообщение пользователю

DialogResult = MessageBox::Show(this,

"Пожалуйста, введите количество элементов для генерации.", "Обработка последовательности из нулей и единиц",

MessageBoxButtons::OK, MessageBoxIcon::Exclamation,

MessageBoxDefaultButton::Button1);

}

String^ FixString(String^ InputStr)

// Функция для исправления вводимой строки (в формат вывода массива)

{

array<char>^ Arr = gcnew array<char>(InputStr->Length);

// Создание нового массива типа integer

String^ NewStr = ""; // Переменная новой строки

Arr = ToArr(InputStr); // Обращение к функции перевода строки в массив

for (int i = 0; i < Arr->Length; i++)

NewStr += Char::ToString(Arr[i]);

// Добавление элементов массива

return(NewStr); // Возвращает исправленную строку

}

array<char>^ ToArr(String^ InputStr)

// Функция перевода строки в массив (делит строку посимвольно,

// заполняя массив, и через функцию исправления возвращает новый массив)

{

array<char>^ ArrChar = gcnew array<char>(InputStr->Length);

// Массив из элементов char

for (int n = 0; n < InputStr->Length; n++)

ArrChar[n] = (char)(InputStr[n]);

// Ввод символов строки в элементы массива как char

return(FixArr(ArrChar));

// Отправляет в функцию исправления,

// возвращает новый массив без лишних символов

}

array<char>^ FixArr(array<char>^ InputArr) // Функция исправления массива

{

array<char>^ ArrChar = gcnew array<char>(InputArr->Length);

array<char>^ ArrNew = gcnew array<char>(InputArr->Length);

int p = 0;

for (int i = 0; i < InputArr->Length; i++)

// Заполнение массива Arr элементами переданного

// в функцию массива InputArr

ArrChar[i] = ((char)(InputArr[i]));

for (int n = 0; n <= (ArrChar->Length - 1); n++)

{

if ((ArrChar[n] == (char)48) || ((ArrChar[n] == (char)49)))

{

ArrNew[p] = ArrChar[n];

p += 1;

}

}

array<char>^ Arr = gcnew array<char>(InputArr->Length);

for (int n = 0; n <= (p - 1); n++) // Заполняем новый массив

Arr[n] = ArrNew[n];

return (Arr); // Функция возвращает новый массив

}

private: System::Void FileInputBtn_Click(System::Object^ sender, System::EventArgs^ e) // Открытие файла при нажатии "Ввод из файла"

{

IO::Stream^ myStream;

OpenFileDialog^ openFileDialog1 = gcnew OpenFileDialog;

// Создание элемента диалогового окна открытия файла

openFileDialog1->Title = "Открытие файла"; // Название окна

openFileDialog1->Filter = "txt files (*.txt)|*.txt";

// Выбор фильтра файлов

openFileDialog1->RestoreDirectory = false;

// Отключение восстановления директории

String^ Username = Environment::UserName;

// Получение имени пользователя

String^ FileDirectory = "c:\\Users\\" + Username + "\\Desktop\\";

// Директория

openFileDialog1->InitialDirectory = (FileDirectory);

// Присвоение директории

if (txtFileInput->Text == "") openFileDialog1->FileName

= FileDirectory;

// Если своё имя файла не введено –

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

else openFileDialog1->FileName = txtFileInput->Text;

// Если введено имя файла - его ввод

if (openFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK) // Если файл успешно выбран

{

if ((myStream = openFileDialog1->OpenFile()) != nullptr)

// Если файл успешно открыт

{

StreamReader^ sr =

gcnew StreamReader(openFileDialog1->FileName);

String^ ReadedStr = sr->ReadToEnd();

// Чтение всего файла в строку

txtArray->Text = FixString(ReadedStr);

// С помощью функции FixString представление содержимого

// файла в виде массива выводится в поле "Исходный массив"

txtResult->Text = ""; // Очистка результата

txtFileInput->Text = openFileDialog1->FileName;

// Запись имени файла в соответстующее поле

sr->Close();

myStream->Close();

}

}

}

private: System::Void txtArray_Leave(System::Object^ sender, System::EventArgs^ e) // Функция при покидании поля исходного массива

{

if (txtArray->Text != "") // Если поле не пустое

{

String^ InStr = txtArray->Text;

txtArray->Text = FixString(InStr);

// Исправление введённой строки последовательности

}

}

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

{

txtResult->Text = "";

int count_0 = 0;

int count_1 = 0;

if (txtArray->Text != "")

// Если поле исходной последовательности не пустое

{

array<char>^ Arr = gcnew array<char>(txtArray->Text->Length);

Arr = ToArr(txtArray->Text);

for (int n = 0; n <= (txtArray->Text->Length - 1); n++)

{

if (Arr[n] == (char)48) count_0 += 1;

else count_1 += 1;

}

for (int i = 0; i <= (count_0 - 1); i++)

txtResult->Text += "0";

for (int j = 0; j <= (count_1 - 1); j++)

txtResult->Text += "1";

count_0 = 0;

count_1 = 0;

}

else // Если исходного массива нет - сообщение пользователю

DialogResult = MessageBox::Show(this,

"Пожалуйста, введите последовательность нулей и единиц", "Обработка последовательности из нулей и единиц",

MessageBoxButtons::OK, MessageBoxIcon::Exclamation,

MessageBoxDefaultButton::Button1);

}

private: System::Void FileOutputBtn_Click(System::Object^ sender, System::EventArgs^ e) // Сохранение файла при нажатии "Сохранить в файл"

{

SaveFileDialog^ saveFileDialog1 = gcnew SaveFileDialog;

// Новый элемент диалогового окна сохранения файла

saveFileDialog1->Title = "Сохранение файла"; // Название окна

saveFileDialog1->Filter = "txt files (*.txt)|*.txt";

// Фильтр - текстовые файлы

String^ Username = Environment::UserName;

// Получение имени пользователя и его ввод в путь директории

String^ FileDirectory = "c:\\Users\\" + Username + "\\Desktop\\";

saveFileDialog1->InitialDirectory = (FileDirectory);

if (txtFileOutput->Text == "")

saveFileDialog1->FileName = FileDirectory;

// Если поле имени файла вывода пустое,

// имя файла - сама директория

else saveFileDialog1->FileName = txtFileOutput->Text;

// Если заполнено имя файла ввода - выбор этого имени файла

if (txtResult->Text != "") // Если есть результат операции

{

if (saveFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK)

// Если файл сохранения успешно выбран

{

txtFileOutput->Text = saveFileDialog1->FileName;

// Вывод названия файла сохранения в соотвествующее поле

if (IO::File::Exists(saveFileDialog1->FileName))

// Если файл существует

{

StreamReader^ sr =

File::OpenText(saveFileDialog1->FileName);

array<String^>^ ArrLines = File::ReadAllLines(saveFileDialog1->FileName);

// Чтение всех строк файла в архив

sr->Close();

int InArrIndex =

ArrLines->IndexOf(ArrLines,

"Исходная последовательность: " + txtArray->Text);

// Переменная индекса строки исходного

// массива в файле

if (ArrLines->Length == 0) // Если файл пустой

{

ArrLines->Resize(ArrLines, 2);

// Смена размера массива

// Запись строк в массив, выбор стартовой

// позиции поиска текущей операции

ArrLines[0] = "Исходная последовательность: " + txtArray->Text;

ArrLines[1] = ("Результат сортировки: "

+ txtResult->Text);

}

else if (InArrIndex == -1)

// Если не найден текущий исходный массив

{

ArrLines->Resize(ArrLines,

ArrLines->Length + 3);

// Смена размеров массива

ArrLines[ArrLines->Length - 3] = "";

// Разделитель между массивами

// Запись строк нового исходного и

// результата в массив, изменение

// стартовой позиции поиска текущей операции

ArrLines[ArrLines->Length - 2] =

"Исходная последовательность: "

+ txtArray->Text;

ArrLines[ArrLines->Length - 1] =

("Результат сортировки: " + txtResult->Text);

}

StreamWriter^ sw =

File::CreateText(saveFileDialog1->FileName);

// Создание текста в файле (запись)

for (int i = 0; i < ArrLines->Length; i++)

sw->WriteLine(ArrLines[i]);

// Построчная запись в файл из массива

sw->Close();

}

else // Если файл не существует

{

StreamWriter^ sw =

File::CreateText(saveFileDialog1->FileName);

// Создание текста в файле (запись)

// Построчная запись в файл

sw->WriteLine("Исходная последовательность: "

+ txtArray->Text);

sw->WriteLine("Результат сортировки: "

+ txtResult->Text);

sw->Close();

}

}

}

else // Если нет результата операции - сообщение пользователю

DialogResult = MessageBox::Show(this,

"Пожалуйста, выполните операцию перед сохранением",

Обработка последовательности из нулей и единиц",

MessageBoxButtons::OK, MessageBoxIcon::Exclamation,

MessageBoxDefaultButton::Button1);

}