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

2.2 Схемы алгоритмов индивидуального задания №2

Прежде всего, на рисунке 22 представлена схема алгоритма обработчика нажатия на кнопку закрытия программы btnClose_Click, который выполняет закрытие программы.

Рисунок 22 – Схема алгоритма функции обработчика нажатия на кнопку «Закрыть» (btnClose_Click)

Для запрета некорректного ввода в поле txtN (вводимый порядок N) реализован алгоритм функции txt_KeyPress2, его схема представлена на рисунке 23.

Рисунок 23 – Схема алгоритма функции обработки ввода txt_KeyPress2

При нажатии на кнопку «Выполнить» выполняется алгоритм расчёта двумерного массива (и вывода его в виде матрицы в поле вывода), представленный на рисунке 24

Рисунок 24 – Схема алгоритма функции обработки нажатия на кнопку «Выполнить» RunBtn2_Click

На рисунке 25 показан алгоритм обработчика выбора вкладки, который при выборе вкладки данного задания включает возможность разворачивания окна приложения на полный экран.

Рисунок 25 – Схема алгоритма функции подсчёта делителей числа CountDiv()

Наконец, при нажатии на кнопку «Сохранить в файл» алгоритм, схема которого представлена на рисунках 26 – 27, выполняет сохранение порядка n и результата в виде матрицы в файл методом дозаписи.

Рисунок 26 – Схема алгоритма функции обработки нажатия на кнопку «Сохранить в файл» FileOutputBtn_Click2

Рисунок 27 – Схема алгоритма функции обработки нажатия на кнопку «Сохранить в файл» FileOutputBtn_Click2, продолжение

Рисунок 28 – Схема алгоритма функции обработки нажатия на кнопку «Сохранить в файл» FileOutputBtn_Click2, продолжение

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

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

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

{

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

txtResult2->Text = "";

TextBox^ ActiveTextBox = txtN;

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

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

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 RunBtn2_Click(System::Object^ sender, System::EventArgs^ e)

{

txtResult2->Text = "";

if (txtN->Text != "")

{

int InN = Convert::ToInt64(txtN->Text);

if ((InN <= 70) && (InN > 0))

{

array<Int64, 2>^ Arr = gcnew array<Int64, 2>(InN, InN);

Int64 n = 0;

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

{

for (int j = 0; j < InN; j++)

{

if (i == j)

{

n += 1;

Arr[i, j] = n * (n + 1);

}

txtResult2->Text += String::Format("{0, 5}",

Convert::ToString(Arr[i, j]));

}

txtResult2->Text += "\n";

}

}

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

DialogResult = MessageBox::Show(this,

"Значение n слишком велико,

оно должно не превышать 70 и быть больше 0",

"Формирование матрицы",

MessageBoxButtons::OK, MessageBoxIcon::Exclamation,

MessageBoxDefaultButton::Button1);

}

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

DialogResult = MessageBox::Show(this,

"Пожалуйста, введите значение n", "Формирование матрицы",

MessageBoxButtons::OK, MessageBoxIcon::Exclamation,

MessageBoxDefaultButton::Button1);

}

private: System::Void tabControl1_SelectedIndexChanged

(System::Object^ sender, System::EventArgs^ e)

{

if ((this->tabControl1->SelectedIndex == 1) ||

(this->tabControl1->SelectedIndex == 3)) {

this->MaximizeBox = true;

}

else {

this->MaximizeBox = false;

this->WindowState = FormWindowState::Normal;

}

}

private: System::Void FileOutputBtn_Click2(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 (txtFileOutput2->Text == "")

saveFileDialog1->FileName = FileDirectory;

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

else saveFileDialog1->FileName = txtFileOutput2->Text;

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

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

{

if (saveFileDialog1->ShowDialog() ==

System::Windows::Forms::DialogResult::OK)

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

{

txtFileOutput2->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 InIndex = ArrLines->IndexOf(ArrLines,

"Для n = " + txtN->Text + " матрица: ");

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

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

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

{

ArrLines->Resize(ArrLines, 2);

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

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

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

ArrLines[0] = "Для n = " + txtN->Text +

" матрица: ";

ArrLines[1] = (txtResult2->Text);

}

else if (InIndex == -1)

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

{

ArrLines->Resize(ArrLines,

ArrLines->Length + 3);

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

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

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

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

// в массив, изменение стартовой

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

ArrLines[ArrLines->Length - 2] = "Для n = " +

txtN->Text + " матрица: ";

ArrLines[ArrLines->Length - 1] =

(txtResult2->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("Для n = " + txtN->Text +

" матрица: ");

sw->WriteLine(txtResult2->Text);

sw->Close();

}

}

}

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

DialogResult = MessageBox::Show(this,

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

"Формирование матрицы",

MessageBoxButtons::OK, MessageBoxIcon::Exclamation,

MessageBoxDefaultButton::Button1);

}