О тестировании
Удобнее всего создать тестовый файл и подавать его на вход программы.
В Windows:
- Положите тестовый файл в папку с собранной программой.
- Запустите интерпретатор команд:
Win+R → cmd → Enter - Перейдите в папку с собранной программой. Введите имя диска, затем cd <путь>, например:
d: → Enter → cd projects\folder → Enter
Если нужно вывести содержимое текущей папки, введите команду dir. - Запустите программу с тестовым файлом:
program.exe < test.txt
Не забывайте пересобирать программу, когда меняете её исходный текст.
Если тестируете программу с клавиатуры, конец ввода в Windows – Ctrl+Z, в Unix – Ctrl+D.
Часть 1
Срок выполнения: 23 ноября – 7 декабря
Задание
- Постройте конечный автомат (схему переходов), который преобразует входной поток символов в выходной по вашему заданию (варианты ниже).
Автомат должен распознать во входном потоке все подходящие подпоследовательности. Напишите программу на Си++, которая работает по созданному автомату.
Символы читать со стандартного входа (std::cin), писать на стандартный выход (std::cout).
Использовать массивы нельзя.
На одной итерации можно выводить несколько символов (только если это действительно необходимо).
Символы в кодовых таблицах могут располагаться произвольно, поэтому для работы с диапазонами символов нужно по возможности использовать функции is... и toupper, tolower (http://en.cppreference.com/w/cpp/string/byte). Там, где эти функции не помогают, нужно проверять все символы диапазона явно.
Примеры
Копирование: char01-copy.cpp
Удаление пробелов: char02-del-space.cpp
Удаление пробелов, табуляций, концов строк: char03-del-space-tab-nl.cpp
Удаление всех пробельных символов: char04-del-whitespace.cpp
Замена пробельных цепочек на один пробел: char05.pdf char05-compress-ws.cpp
Автоматы
Схема автомата для копирования (программа выше): 01-copy.pdf
Автомат удаления пробелов (программа выше): 02-remove-space.pdf
Автомат удаления пробелов и табуляций (программа выше): 03-remove-space-tab.pdf вариации программы: 03-1.cpp 03-3.cpp 03-4.cpp
Вывод слов, ограниченных пробелами и начинающихся с p
: p-words.pdf программы: p-words-1.cpp p-words-2.cpp
Варианты
Расчёт номера своего варианта см. на странице Успеваемость студентов.
0. Выведите весь входной текст, кроме цепочек десятичных цифр, которые находятся внутри парных двойных кавычек. Если последняя двойная кавычка непарная, цепочки после неё тоже исключите.
Пример входа: abc"bca10 230 " 67 " 4g ""sb 90" sd fdsd4"567
Соответствующий выход: abc"bca " 67 " g ""sb " sd fdsd4"
1. Выведите весь входной текст, кроме цепочек, начинающихся с /* и заканчивающихся на */ или концом ввода. Обратите внимание, что перед /* могут стоять символы /, а перед */ – символы *.
Пример входа:
rigj gre/* grei*//*****/ f-fge*32/4 d s /*
ddd*/yyy/*
Соответствующий выход:
rigj gre f-fge*32/4 d s yyy
2. Выведите весь входной текст, за следующими исключениями:
вместо последовательности восклицательных знаков выведите один восклицательный знак,
вместо последовательности вопросительных знаков – один вопросительный знак,
вместо последовательности из восклицательных и вопросительных знаков вперемешку выведите ?!
.
Пример входа: 56mimpo,m! ???ku!!! M?1000!??!=!!!!?!?
Соответствующий выход: 56mimpo,m! ?ku! M?1000?!=?!
Часть 2
Срок выполнения: 30 ноября – 14 декабря
Загрузить flex для Windows можно здесь: https://sourceforge.net/projects/winflexbison/
Документация по flex: http://www.delorie.com/gnu/docs/flex/flex_toc.html
Задание
Напишите программу для flex (действия на Си++) согласно варианту.
Примеры
Скелетный проект для Creator, копирование входа на выход; flex уже настроен для сборки прямо из среды, см. pro-файл: lex-sample.zip
Удаление пробельных символов: remove-space.l remove-all-space.l
"Сжатие" пробельных последовательностей: compress-space.l
Вывод целых чисел, возможно со знаком: integers.l
Десятичные дроби: real.l
Удаление текста в кавычках: rm-string.l
Удаление экранированных символов в строках: rm-esc-in-str.l
Варианты
Определения последовательностей для данной лабораторной
Комментарий Си | начинается: /* кончается: */ |
Комментарий Си++ | начинается: примеры:
|
Строковая константа | начинается: примеры:
|
Целая константа | одно из: в конце любого варианта могут стоять: примеры: |
Расчёт номера своего варианта см. на странице Успеваемость студентов.
0. Вывести целые константы, которые находятся вне комментариев Си.
1. Удалить (со всем содержимым) комментарии Си, которые находятся внутри строковых констант.
2. Внутри комментариев Си++ удалить целые константы.