МИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
Кафедра Вычислительной техники
КУРСОВАЯ работа
по дисциплине «Программирование»
Тема: «Обработка текстовой информации»
Студент гр. - |
|
- |
Преподаватель |
|
Хахаев И. А. |
Санкт-Петербург
2022
Оглавление
Введение 3
Постановка задачи и описание решения 3
Структура вызовов функций 4
Описание функций 4
Описание переменных 5
Cхемы алгоритмов 7
Контрольные примеры 16
Текст программы 18
Примеры работы программы 23
Заключение 24
Введение
Цель работы: законченное поэтапное решение содержательной задачи (постановка задачи, спецификация, выбор структур данных и разработка алгоритма, программная реализация, тестирование).
Задание (вариант 99): разработать алгоритм и написать программу, заменяющую в тексте программ на Си комментарии в стиле С++ ( // comment text ) на комментарии в стиле Си ( /* comment text */ ) с сохранением текста комментария.
Постановка задачи и описание решения
Прежде всего нужно уяснить, что комментарий не может быть частью строки (внутри кавычек) и не может быть частью другого комментария. Иначе говоря, если на вход подаётся текст с кодом Си и комментариями С++, на выходе должен остаться полностью компилируемый код Си с неизменным содержанием комментариев. Так же в C++ зачастую могут встречаться многострочные комментарии Си, поэтому алгоритм должен уметь их определять и игнорировать их содержимое, даже если внутри такого комментария есть начало комментария С++. Поскольку пустые комментарии — всё-таки тоже комментарии, они тоже должны быть обработаны алгоритмом.
Для оптимизации работы с памятью максимальный размер строк и текста в программе будет задаваться идентификатором MAXLEN, а связанные с этим ограничения будут выводиться программой при старте. Весь код главной функции находится в цикле, что позволяет без перезапуска тестировать разные варианты входных данных, а так же отследить возможные утечки памяти, которые обязательно дадут о себе знать на большом количестве тестов.
После начального диалога с пользователем программа создаёт массив размером MAXLEN * MAXLEN и записывает туда текст с помощью функции, соответствующей выбранному типу ввода. Функции ввода устроены таким образом, чтобы гарантировать, что текст будет заканчиваться нулём. Затем размер массива сокращается до минимально возможного с помощью realloc и отправляется сначала на подчёркивание комментариев (этот этап существует только для демонстрации алгоритма определения комментария), а потом и на вывод в файл или консоль с сопутствующей заменой всех комментариев.
Структура вызовов функций
Описание функций
size_t read_from_console(char *buffer, size_t size, char *last_str)
Считывает строки с консоли в промежуточный массив размером MAXLEN, пока отдельно не будет введена строка last_str, и затем записывает в массив buffer, проверяя переполнение с помощью размера size. В обязательном порядке ставит нуль-терминатор в конец полученного текста. Возвращает размер данных, записанных в buffer.
size_t read_from_file(char *buffer, size_t size, FILE *file)
Считывает данные из файла file в массив buffer размера size, пока не наткнётся на нулевой байт или конец файла. В обязательном порядке ставит нуль-терминатор в конец полученного текста. Возвращает размер данных, записанных в buffer.
void print_line_of_chars(size_t n, char c)
Вспомогательная функция для вывода в консоль линий длиной n из символов с при подчёркивании комментариев.
void write_result(char *buffer, FILE *file)
Функция замены комментариев устроена достаточно просто — используется посимвольный проход по всему тексту с непосредственной записью символов в цикле. Можно было бы искать первое вхождение “//” в каждой строке и так определять начало комментария, однако в случае проверки дополнительных условий такой подход не состоятелен.
На вход принимает массив buffer – текст с нулём в конце и file – дескриптор потокого вывода, будь то файл или консоль.
void print_analysis(char *buffer)
Эта функция устроена практически так же, как и write_result, но в отличие от неё выводит содержимое buffer в консоль в неизменном виде, подчёркивая комментарии для замены.