Главная страница
Навигация по странице:

  • Ожидаемый результат

  • ИСХОДНЫЙ КОД ПРОГРАММЫ Файл head _ ku . h

  • Курсовой проект. Обработка текстовой информации


    Скачать 0.57 Mb.
    НазваниеОбработка текстовой информации
    Дата30.11.2021
    Размер0.57 Mb.
    Формат файлаdocx
    Имя файлаКурсовой проект.docx
    ТипКурсовая
    #286796
    страница5 из 6
    1   2   3   4   5   6

    Тестирование замены строки


    Исходные данные в массиве, берем из предыдущего пункта.



    1. Переход на 4 строчки вперед

    2. Заменяем строку на «Not say goodbye»

    3. Сохрани результат в файл

    Ожидаемый результат:

    В файл будет сохранены строки:

    Hello

    I'm sure,

    what

    LETI TOP

    Not say goodbye

    Результат работы программы представлен на рисунке 5.6.1.



    Рисунок 5.6.1 – Результат работы программы в шестом тестовом варианте
    1. Заключение


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

    Также были проведены тесты, которые показали, что программа работает корректно в различных ситуациях.
    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", то нам требуется
    1   2   3   4   5   6


    написать администратору сайта