
- •«Московский технический университет связи и информатики»
- •Отчёт по лабораторной работе №7
- •2.1 Постановка задачи индивидульного задания №2 30
- •3.1 Постановка задачи индивидульного задания №3 46
- •4.1 Постановка задачи индивидульного задания №4 64
- •1.1 Постановка задачи индивидульного задания №1
- •23. Последовательность a1, a2, ..., аn состоит из нулей и единиц. Поставить в начало этой последовательности нули, а затем единицы.
- •1.2 Схемы алгоритмов индивидуального задания №1
- •1.3 Текст программы индивидуального задания №1
- •1.4 Результаты тестирования программы индивидуального задания №1
- •Выводы о выполнении индивидуального задания №1
- •2.1 Постановка задачи индивидульного задания №2
- •83. Сформировать квадратную матрицу порядка n по заданному образцу (рисунок 22)
- •2.2 Схемы алгоритмов индивидуального задания №2
- •2.3 Текст программы индивидуального задания №2
- •2.4 Результаты тестирования программы индивидуального задания №2
- •Выводы о выполнении индивидуального задания №2
- •3.1 Постановка задачи индивидульного задания №3
- •159. Дано простое число. Составить функцию, которая будет выводить следующее за ним простое число.
- •3.2 Схемы алгоритмов индивидуального задания №3
- •3.3 Текст программы индивидуального задания №3
- •3.4 Результаты тестирования программы индивидуального задания №3
- •Выводы о выполнении индивидуального задания №3
- •4.1 Постановка задачи индивидульного задания №4
- •220. В строке имеется одна точка с запятой (;). Подсчитать количество символов до точки с запятой и после неё.
- •3.2 Схемы алгоритмов индивидуального задания №3
- •4.3 Текст программы индивидуального задания №4
- •4.4 Результаты тестирования программы индивидуального задания №4
- •Выводы о выполнении индивидуального задания №4
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);
}