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

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

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

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

Для запрета некорректного ввода в поле txtInPrime (вводимое простое число) реализован алгоритм функции txt_KeyPress3, его схема представлена на рисунке 35.

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

При нажатии на кнопку «Выполнить» алгоритм, представленный на рисунке 36, обращается к двум функциям – подсчёта делителей CountDiv() и поиска ближайшего простого числа – FindPrime(), и если введённое число не было простым – вводит ближайшее следующее простое число. В обратном случае – выводит найденное ближайшее (следующее) простое число.

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

На рисунках 37 и 38 показаны непосредственно алгоритмы функций CountDiv() и FindPrime(). CountDiv ищет число делителей при помощи квадратного корня, а FindPrime(), обращаясь к ней, проверяет ближайшие следующие числа на то, простые ли они (по числу делителей).

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

Рисунок 38 – Схема алгоритма функции поиска ближайшего следующего простого числа FindPrime()

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

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

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

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

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

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

{

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

}

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

{

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

txtResult3->Text = "";

TextBox^ ActiveTextBox = txtInPrime; // Объявление активного поля

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

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

{

if (txtInPrime->Text != "")

{

txtResult3->Text = "";

Int32 InNum = Convert::ToInt32(txtInPrime->Text);

int DivNum = CountDiv(InNum);

int PrimeNum = FindPrime(InNum);

String^ PrimeNumStr = Convert::ToString(PrimeNum);

if (DivNum != 2)

{

DialogResult = MessageBox::Show(this,

"Введённое число - не простое, введено ближайшее (следующее) простое число - " + PrimeNumStr,

"Поиск следующего простого числа",

MessageBoxButtons::OK, MessageBoxIcon::Exclamation,

MessageBoxDefaultButton::Button1);

txtInPrime->Text = PrimeNumStr;

txtResult3->Text = "";

}

else txtResult3->Text = PrimeNumStr;

}

else // Если ввод пустой

DialogResult = MessageBox::Show(this,

"Пожалуйста, введите простое число",

"Поиск следующего простого числа",

MessageBoxButtons::OK, MessageBoxIcon::Exclamation,

MessageBoxDefaultButton::Button1);

}

int CountDiv(Int32 Num) // Функция нахождения числа делителей

{

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

int DivCount = 0;

// Находим квадратный корень из числа

Int32 SqrtNum = Int32(Math::Sqrt(Num));

// Проверяем числа от 1 до квадратного корня num

for (int i = 1; i < SqrtNum + 1; i++)

{

if ((Num % i) == 0)

{

DivCount += 1;

// Если i является делителем, увеличиваем счетчик на 1

// Проверяем, является ли num/i также делителем

// (чтобы избежать дублирования)

if (i != (Num / i))

DivCount += 1;

}

}

return DivCount;

}

int FindPrime(Int32 InputNum) // Функция нахождения простых чискел

{

int DivNum = 0;

int i = 0;

while (DivNum != 2)

{

i += 1;

DivNum = CountDiv(InputNum + i);

}

int PrimeNum = InputNum + i;

return (PrimeNum);

}

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

saveFileDialog1->FileName = FileDirectory;

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

else saveFileDialog1->FileName = txtFileOutput3->Text;

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

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

{

if (saveFileDialog1->ShowDialog()

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

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

{

txtFileOutput3->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, ("Введённое простое число: " + txtInPrime->Text)); // Переменная индекса строки исходного массива в файле

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

{

ArrLines->Resize(ArrLines, 2);

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

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

ArrLines[0] = "Введённое простое число: " + txtInPrime->Text;

ArrLines[1] = ("Следующее простое число: " + txtResult3->Text);

}

else if (InIndex == -1)

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

{

ArrLines->Resize(ArrLines, ArrLines->Length

+ 3); // Смена размеров массива

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

// Разделитель

ArrLines[ArrLines->Length - 2] =

"Введённое простое число: " +

txtInPrime->Text;

ArrLines[ArrLines->Length - 1] =

("Следующее простое число: " +

txtResult3->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("Введённое простое число: "

+ txtInPrime->Text);

sw->WriteLine("Следующее простое число: "

+ txtResult3->Text);

sw->Close();

}

}

}

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

DialogResult = MessageBox::Show(this,

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

"Поиск следующего простого числа",

MessageBoxButtons::OK, MessageBoxIcon::Exclamation,

MessageBoxDefaultButton::Button1);

}