Скачиваний:
3
Добавлен:
25.01.2023
Размер:
568.23 Кб
Скачать

МИНОБРНАУКИ РОССИИ

Санкт-Петербургский государственный

электротехнический университет

«ЛЭТИ» им. В.И. Ульянова (Ленина)

Кафедра Вычислительной техники

КУРСОВАЯ работа

по дисциплине «Программирование»

Тема: «Обработка текстовой информации»

Студент гр. -

-

Преподаватель

Хахаев И. А.

Санкт-Петербург

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 в консоль в неизменном виде, подчёркивая комментарии для замены.

Соседние файлы в папке Курсовая про замену комментариев