
- •«Московский технический университет связи и информатики»
- •Отчёт по лабораторной работе №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
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);
}