Курсовой проект. Обработка текстовой информации
![]()
|
Тестирование замены строкиИсходные данные в массиве, берем из предыдущего пункта. ![]() Переход на 4 строчки вперед Заменяем строку на «Not say goodbye» Сохрани результат в файл Ожидаемый результат: В файл будет сохранены строки: Hello I'm sure, what LETI TOP Not say goodbye Результат работы программы представлен на рисунке 5.6.1. ![]() Рисунок 5.6.1 – Результат работы программы в шестом тестовом варианте ЗаключениеВ курсовой работе мы углубили свои знаний в технологии программирования типовых задач обработки текстовых данных. Также были проведены тесты, которые показали, что программа работает корректно в различных ситуациях. Список использованных источников1. Страуструп Б. Язык программирования C++. Специальное издание. М.: Бином; СПб.: Невский диалект, 2008. - 1104 с. 2. Дейтел Х.М., Дейтел П.Дж. Как программировать на C++. 5-е издание. Перевод с англ. - М.: ООО «Бином-Пресс», 2008. - 1456 с. 3. Калмычков В.А., Чугунов Л.А. Представление и обработка математических данных на языке С++: Учебное пособие. - СПб.: Издательтство СПбГЭТУ «ЛЭТИ», 2010. 4. Павловская Т.А. С/С++. Программирование на языке высокого уровня. СПб.: Лидер, 2010. - 461 с. 5. Павловская Т.А., Щипак Ю.А. С/С++. Структурное программирование: Практикум. - СПб.: Питер, 2004, 2005, 2007. - 240 с. ПРИЛОЖЕНИЕ 1 ИСХОДНЫЙ КОД ПРОГРАММЫ Файл head_ku.h: #include #include #include #include #include #include using namespace std; void separator(); /** * Данная функция требуется чтобы запросить у пользователя число. * * @param outputString - текст, который будет выводиться для запроса числа, * @return число, которое ввел пользователь. * */ int read(string outputString); /** * Данная функция запрашивает у пользователя комманду, которую он хочет выполнить над строками. * * @return номер команды, для редавктирования строк. * */ int readEditType(); /** * Данная функция нужна для того, чтобы понять сколько строк в файле. * Дело в том, что массив нужно создавать с заданным размером. И именно поэтому * нам требуется понять сколько там строк. В теории на это можно было бы забить и * сделать алгоритм основанный на большом массиве или созжать массив из одного элемента * и затем, при считывание строчки содавать новый массив с размером на один элемент больше, * но я посчитал, что лучше потратить время на считывание строк, чем тратить лишнюю память. * * @param fin - доступ к файлу со строками, * @return количество строк в файле. * */ int getLineCount(ifstream& fin); /** * Данная фунуция загружает все строки в @param arr. * * @param fin - доступ к файлу, * @return дополнительный указатель на редактируеммый массив. * */ string* read(ifstream& fin, string* arr); /** * Функция для упрощенного вывода массива данных. * Она нужна для 6 команды и для дебагинга (тестирования), чтобы вывести строки, которые нужно проверить. * * @param arr - массив, который нужно вывести, * @param lineStart - строка с которой нужно выводить, * @param lineCount - количество строк, которое требуется вывести, * @return ВНИМАНИЕ - функция не выводит, она возвращает строку, которую нужно вывести. * Это сделано для того, чтобы используя эту команду можно было получить весь массив строк * и записать их в файл. * */ string printLines(string* arr, int lineStart, int lineCount); /** * Данная фунцкция вставляет новый массив в старый, после определенной строки. * * @param init_array - начальный массив, который мы будем редактировать, * @param init_array_size - размер массива, * @param past_array - массив, который будет добавляться в старый массив, * @param past_array_size - размер вставляемого массива, * @param edit_array - массив в который будет сохраняться отредактируемый массив, * @param pos - номер строки с которой вставляется новый массив. * */ void addLines(string* init_array, int init_array_size, string* paste_array, int past_array_size, string* edit_array, int pos); /** * Функция для удаления строк из массива. * * @param editArray - редактируемый массив, * @param lineCount - количество строк в исходном массиве, * @param count_delete - количество строк, которые требуется удалить, * @param pos - позиция с которой нужно удалять * * @return новый размер массива. * */ void deleteStrings(string* editString, int lineCount, int count_delete, int pos, string* edit_array); /** * Редактирование строки на заданную. * * @param editString - редактируемый массив, * @param pos - позтция строки, которую требуется отредактировать, * @param pastLine - строка на которую нужно заменить. * */ void set(string* editString, int pos, string pastLines); /** * Сохранение информации в файл. * * @param fileName - имя файла, в который требуется сохранить, * @param loadString - строка, которую требуется загрузить. * * @return - результат записи: успешно записан (true), или проблемы с файлом (false) * */ bool saveStringInFile(string fileName, string loadString); /** * Добавление срок с запросом на их ввод. * * @param editString - исходный массив значений, * @param lineCount - размер исходного массива, с возможностью его изменять, * @param pos - строчка до которой нужно вставить значение. * * @return новый массив с добавленными строчками. * */ string* addStringWithRequest(string* editString, int& lineCount, int pos); Файл курсач.срр: #include "head_ku.h" /** * Данная функция требуется чтобы запросить у пользователя число. * * @param outputString - текст, который будет выводиться для запроса числа, * @return число, которое ввел пользователь. * */ int read(string outputString) { cout << outputString; while (1) { int n; if (cin >> n) return n; cin.clear(); string e; getline(cin, e); cout << "Неккоректный ввод. Игнорируйте [" << e << "]. Введите заново: "; } } /** * Данная функция запрашивает у пользователя комманду, которую он хочет выполнить над строками. * * @return номер команды, для редавктирования строк. * */ int readEditType() { cout << "-----------------------" << endl; cout << "Доступные команды: " << endl; cout << "0 - Выйти из программы;" << endl; cout << "1 - Вставить последовательность строк, заданных в команде, после текущей строки;" << endl; cout << "2 - Вставить последовательность строк, заданных в команде, перед текущей строкой;" << endl; cout << "3 - Удалить заданное число строк, начиная (заканчивая) текущей строкой;" << endl; cout << "4 - Заменить текущую строку на строку, указанную в команде;" << endl; cout << "5 - Перейти на заданное число строк вверх (вниз) относительно текущей строки;" << endl; cout << "6 - Вывести на экран заданное число строк, начиная с текущей строки;" << endl; cout << "7 - Записать текст в файл с именем, указанным в команде." << endl; return read("Введите номер команады, чтобы ее выполнить: "); } /** * Данная функция нужна для того, чтобы понять сколько строк в файле. * Дело в том, что массив нужно создавать с заданным размером. И именно поэтому * нам требуется понять сколько там строк. В теории на это можно было бы забить и * сделать алгоритм основанный на большом массиве или созжать массив из одного элемента * и затем, при считывание строчки содавать новый массив с размером на один элемент больше, * но я посчитал, что лучше потратить время на считывание строк, чем тратить лишнюю память. * * @param fin - доступ к файлу со строками, * @return количество строк в файле. * */ int getLineCount(ifstream& fin) { int i = 0; string line = ""; while (getline(fin, line)) { i++; } // Так как мы переместились в конец файла, вернемся в начало, чтобы // потом не держать в голове, что мы в конце файла fin.clear(); fin.seekg(0); return i; } /** * Данная фунуция загружает все строки в @param arr. * * @param fin - доступ к файлу, * @return дополнительный указатель на редактируеммый массив. * */ string* read(ifstream& fin, string* arr) { string line; int i = 0; while (getline(fin, line)) { *(arr + i) = line; i++; } // Так как мы переместились в конец файла, вернемся в начало, чтобы // потом не держать в голове, что мы в конце файла fin.clear(); fin.seekg(0); return arr; } /** * Функция для упрощенного вывода массива данных. * Она нужна для 6 команды и для дебагинга (тестирования), чтобы вывести строки, которые нужно проверить. * * @param arr - массив, который нужно вывести, * @param lineStart - строка с которой нужно выводить, * @param lineCount - количество строк, которое требуется вывести, * @return ВНИМАНИЕ - функция не выводит, она возвращает строку, которую нужно вывести. * Это сделано для того, чтобы используя эту команду можно было получить весь массив строк * и записать их в файл. * */ string printLines(string* arr, int lineStart, int lineCount) { string stringOut = ""; for (int i = 0; i < lineCount; i++) { stringOut += *(arr + (lineStart + i)) + "\n"; } return stringOut; } /** * Данная фунцкция вставляет новый массив в старый, после определенной строки. * * @param init_array - начальный массив, который мы будем редактировать, * @param init_array_size - размер массива, * @param past_array - массив, который будет добавляться в старый массив, * @param past_array_size - размер вставляемого массива, * @param edit_array - массив в который будет сохраняться отредактируемый массив, * @param pos - номер строки с которой вставляется новый массив. * */ void addLines(string* init_array, int init_array_size, string* paste_array, int past_array_size, string* edit_array, int pos) { int edit_array_pos = 0; for (size_t i = 0; i < pos; i++) { *(edit_array + edit_array_pos) = *(init_array + i); edit_array_pos += 1; } for (size_t i = 0; i < past_array_size; i++) { *(edit_array + edit_array_pos) = *(paste_array + i); edit_array_pos += 1; } for (size_t i = pos; i < init_array_size; i++) { *(edit_array + edit_array_pos) = *(init_array + i); edit_array_pos += 1; } } /** * Функция для удаления строк из массива. * * @param editArray - редактируемый массив, * @param lineCount - количество строк в исходном массиве, * @param count_delete - количество строк, которые требуется удалить, * @param pos - позиция с которой нужно удалять * * @return новый размер массива. * */ void deleteStrings(string* editString, int lineCount, int count_delete, int pos, string* edit_array) { int new_array_pos = 0; // Данное условие связано с тем, чтобы понять, что мы удвляем данные до исходной позиции или после if (count_delete < 0) { size_t new_count_delete = 1; // Если до, то в начале копируем все данные до даначала данных, которые требуется удалить if ((pos + count_delete) > 0) new_count_delete = pos + count_delete; for (int i = 0; i < new_count_delete; i++) { *(edit_array + new_array_pos) = *(editString + i); new_array_pos++; } // Затем пропустив удаленные данные, вставляем оставшиеся for (int i = (pos + 1); i < lineCount; i++) { *(edit_array + new_array_pos) = *(editString + i); new_array_pos++; } } else { // Если мы удаляем после позиции, то копируем все после нее for (int i = 0; i < pos; i++) { *(edit_array + new_array_pos) = *(editString + i); new_array_pos++; } // А затем копируем все что после строк, которые нужно удалить for (int i = pos + abs(count_delete); i < lineCount; i++) { *(edit_array + new_array_pos) = *(editString + i); new_array_pos++; } } } /** * Редактирование строки на заданную. * * @param editString - редактируемый массив, * @param pos - позтция строки, которую требуется отредактировать, * @param pastLine - строка на которую нужно заменить. * */ void set(string* editString, int pos, string pastLines) { *(editString + pos) = pastLines; } /** * Сохранение информации в файл. * * @param fileName - имя файла, в который требуется сохранить, * @param loadString - строка, которую требуется загрузить. * * @return - результат записи: успешно записан (true), или проблемы с файлом (false) * */ bool saveStringInFile(string fileName, string loadString) { bool isLoadGood = true; ofstream fout; fout.open(fileName); if (!fout.is_open()) { isLoadGood = false; } else { fout << loadString; } fout.close(); return isLoadGood; } /** * Добавление срок с запросом на их ввод. * * @param editString - исходный массив значений, * @param lineCount - размер исходного массива, с возможностью его изменять, * @param pos - строчка до которой нужно вставить значение. * * @return новый массив с добавленными строчками. * */ string* addStringWithRequest(string* editString, int& lineCount, int pos) { int countLines = 0; do { if (countLines < 0) cout << "Введите положиельное число" << endl; countLines = read("Введите количество строк, которое хотите вставить: "); } while (countLines < 0); string* lines = new string[countLines]; cout << "Введите строчки" << endl; for (int i = 0; i < countLines; i++) { string text; do { getline(cin, text); } while (text == ""); *(lines + i) = text; } string* new_arr = new string[lineCount + countLines]; addLines(editString, lineCount, lines, countLines, new_arr, pos); lineCount += countLines; return new_arr; } /** * Точка входа в программу. * */ int main() { setlocale(LC_ALL, "Russian"); ifstream fin; cout << "Введите имя файла, из которого будут браться строки: "; string fileName = ""; cin >> fileName; fin.open(fileName); if (!fin.is_open()) { cout << "Ошибка открытия файла" << endl; } else { // Получаем количество строк в файле и создаем массив для этого количества строк int lineCount = getLineCount(fin); string* arr = new string[lineCount]; // Получаем массив строк из файла string* editString = read(fin, arr); // Закрываем файл, потому что он нам больше не нужен. Дальше работаем с массивом fin.close(); // Начинается обработка данных int type = -1; int pos = 0; // Запрашиваем команды у пользователя, пока он не введет 0. while (type != 0) { // Запрашиваем команду у пользователя type = readEditType(); // Тут мы начинаем анализировать, что ввел ползователь. switch (type) { case 0: { cout << "Спасибо, что воспользовались нашей программой" << endl; break; } // Если ползователь ввел "1", то нам требуется |