Задача взята с сайта e-olymp.com.
Постановка задачи
Вам необходимо преобразовать множество старых программ для новой версии компилятора. Для этого необходимо заменить «->» на «.» везде, кроме комментариев. Комментарии в данном языке программирования начинаются с символов «//» и продолжаются до конца строки. Напишите программу, выполняющую такое преобразование.
Входные данные
Входной файл содержит от 1 до 500 строк длиной не более 50 символов с ASCII-кодами от 32 до 127 – текст программы, которую нужно преобразовать.
Выходные данные
В выходной файл вывести преобразованный текст программы.
Тесты
Исходный текст программы | Преобразованный текст программы | ||||
|
|
||||
|
|
||||
|
|
Реализация
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
#include <iostream> #include <stdio.h> using namespace std; int main() { int c; int a; char b; c = getchar(); while ((a = getchar()) != EOF) { if (c == '-') { //проверяем на наличие комбинации "->" if (a == '>') { cout << "."; a = getchar(); } else { putchar(c); } } else if (c == '/') { //проверяем на наличие комбинации "//" putchar(c); if (a == '/') { putchar(a); while ((b = getchar()) != '\n') { putchar(b); //печатаем комментарий не изменяя до конца строки } cout << endl; a = getchar(); } } else putchar(c); c = a; } } |
Код на ideone.com
Засчитанное решение на e-olymp.com
Ход решения
Для решения данной задачи используем функцию getchar, так как данная функция может работать с управляющими символами (когда программа находит комментарий, необходимо печатать без изменений до конца строки). Так как по условию задачи нам нужно найти такие комбинации символов, как «//» и «->» , мы при каждом проходе цикла, сравнивая символы входных данных с теми, что надо найти, запоминаем два соседних символа.
Данную задачу стоило бы решать конечным автоматом. Разумеется, это не отменяет аксепта, но общий подход такой. Потому что, если добавится еще 5-6 условий, при которых нужно или не нужно заменять одни подстроки на другие, то так просто if-ами и while-ами не справиться. По данному коду хотелось бы чуть более осмысленных названий переменных, чем a и c.