Сравнение версий

Ключ

  • Эта строка добавлена.
  • Эта строка удалена.
  • Изменено форматирование.
О тестировании

Удобнее всего создать тестовый файл и подавать его на вход программы.

В Windows:

  1. Положите тестовый файл в папку с собранной программой.
  2. Запустите интерпретатор команд:
    Win+R → cmd → Enter
  3. Перейдите в папку с собранной программой. Введите имя диска, затем cd <путь>, например:
    d: → Enter → cd projects\folder → Enter
    Если нужно вывести содержимое текущей папки, введите команду dir.
  4. Запустите программу с тестовым файлом:
    program.exe < test.txt

Не забывайте пересобирать программу, когда меняете её исходный текст.

Если тестируете программу с клавиатуры, конец ввода в Windows – Ctrl+Z, в Unix – Ctrl+D.

Часть 1

Срок выполнения: 23 ноября – 7 декабряСрок выполнения: 25 сентября –

Задание
  1. Постройте конечный автомат (схему переходов), который преобразует входной поток символов в выходной по вашему заданию (варианты ниже).
    Автомат должен распознать во входном потоке все подходящие подпоследовательности; действия над ними означают следующее:
    "удалить" – входной поток копируется на выход целиком, кроме распознанных подпоследовательностей;
    "вывести" – на выход попадают только распознанные подпоследовательности, построчно, то есть после каждой нужно вывести символ перехода на новую строку;
    "заменить" – входной поток копируется на выход целиком, но вместо распознанных подпоследовательностей выводятся указанные по заданию.

  2. Напишите программу на Си++, которая работает по созданному автомату.
    Символы читать со стандартного входа (std::cin), писать на стандартный выход (std::cout).
    Использовать массивы нельзя.
    На одной итерации можно выводить несколько символов (только если это действительно необходимо).
    Символы в кодовых таблицах могут располагаться произвольно, поэтому для работы с диапазонами символов нужно по возможности использовать функции is... и toupper, tolower (http://en.cppreference.com/w/cpp/string/byte). Там, где эти функции не помогают, нужно проверять все символы диапазона явно.

Примеры

Копирование: 01char01-copy.zipcpp

Удаление пробелов: 02.zip char02-del-space.cpp

Удаление пробелов и , табуляций: 03.zip, концов строк: char03-del-space-tab-nl.cpp

Удаление всех пробельных символов: 03char04-del-4whitespace.cpp

Замена пробельных цепочек на один пробел: 04.zip: 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.zipПроверка сбалансированности скобок: par-words.pdf  программы: p-words-1.cpp  p-words-2.cpp

Варианты

Расчёт номера своего варианта см. на странице Успеваемость студентов.

В данной работе:

целое число – строка из десятичных цифр, сразу перед ней может стоять плюс или минус, например: 034023, 656, -0, +534;

тег – строка, обрамлённая угловыми скобками, не может прерываться переходом на новую строку, например: <int>, <>, <<<<q<>, <d d d d >, </>;

комментарий – строка, которая начинается символами /* и заканчивается символами */;

 

0. Вывести целые числа, которые находятся внутри двойных кавычек.

1. Удалить целые числа, которые находятся вне двойных кавычек.

2. Вне комментариев заменить последовательности восклицательных знаков на один восклицательный знак, последовательности вопросительных знаков – на один вопросительный знак, последовательности из восклицательных и вопросительных знаков вперемешку – на ?! .

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

Варианты

Определения последовательностей для данной лабораторной

Комментарий Синачинается: /*
кончается: */
Комментарий Си++

начинается: //
кончается: "перевод строки" (перед которым нет \)

примеры:

// вечный цикл

// Мой дядя самых честных правил, \
Когда не в шутку занемог,     \
   Он уважать себя заставил\
И лучше выдумать не мог.

Строковая константа

начинается: "
кончается: " или "перевод строки" (перед которыми нет \)

примеры:

"Привет, Земля!"

"Это неправильная константа Си++, но мы будем считать её строкой.

"А Балда приговаривал с укоризной: \
\"Не гонялся бы ты, поп, за дешевизной\"."

Целая константа

одно из:
1) последовательность десятичных цифр (0123456789), первая – не 0;
2) последовательность (может, пустая) восьмеричных цифр (01234567) после 0;
3) последовательность шестнадцатеричных цифр (0123456789abcdef) после 0x
(все буквы могут быть строчными и заглавными)

в конце любого варианта могут стоять: l, u, lu или ul (строчные6. )

примеры: 21562216261217659, 02241l, 0, 0x23d1a7u, 875465ul

Расчёт номера своего варианта см. на странице Успеваемость студентов.

0. Вывести целые константы, которые находятся вне комментариев Си.

1. Удалить (со всем содержимым) комментарии Си, которые находятся внутри строковых констант.

2. Внутри комментариев Си++ удалить целые константы3. Посчитать теги внутри комментариев.