Задача на преобразование последовательности символов - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Есть задача: пусть во входном потоке находится последовательность символов, заканчивающаяся точкой (кодировка ASCII). Вывести в выходной поток последовательность символов, оставив только те группы цифр, которые составлены из подряд идущих цифр с возрастающими значениями; все остальные цифры и группы цифр удалить ( другие символы копировать в выходной поток без изменения). Пока получилось вот это:
    char x = 0, y = 0;
    char flag = 0;
    x = getchar();
    while ((y = getchar()) != '.')
    {
        if (isdigit(x) && isdigit(y))
        {
            flag = 1;
        }
 
        if (flag)
        {
            while (y - x == 1)
            {
                putchar(x);
                
                x = y;
            }
        }
        
        if (!isdigit(x)) putchar(x);
        
        x = y;
    }
Проблема: не выводится последняя цифра из удовлетворяющей последовательности, т.е. при вводе 1234asf87123 программа выводит 123asf12, хотя должна 1234asf123. Надеюсь на вашу помощь!

Решение задачи: «Задача на преобразование последовательности символов»

textual
Листинг программы
#include <stdio.h>
#include <ctype.h>
 
int main() {
    int x, y;
    int seq = 0, cur;
 
    x = getchar();
    while (x != '.') {
        y = getchar();
 
        if (isdigit(x)) {
            cur = (isdigit(y) && (y - x == 1));
            if (seq || cur) {
                putchar(x);
            }
            seq = cur;
        }
        else {
            putchar(x);
        }
 
        x = y;
    }
 
    return 0;
}

Объяснение кода листинга программы

В этом коде считываются два символа за раз из стандартного ввода, и они сравниваются. Если первый символ является числом и второй символ является следующим числом в последовательности (на единицу больше), то оба символа выводятся на стандартный вывод. Если первый символ не является числом, он также выводится на стандартный вывод. После этого два символа считываются снова, и процесс повторяется до тех пор, пока не будет введен конечный символ (в данном случае точка). Вот список ключевых моментов кода с номерами:

  1. Ввод двух символов: x = getchar(); y = getchar();
  2. Проверка, является ли первый символ числом: if (isdigit(x)) {
  3. Проверка, является ли второй символ следующим числом в последовательности: cur = (isdigit(y) && (y - x == 1));
  4. Условие для вывода символов: if (seq || cur) {
  5. Вывод символа: putchar(x);
  6. Обновление значения seq: seq = cur;
  7. Условие для вывода символа, если первый символ не является числом: else {
  8. Вывод символа: putchar(x);
  9. Обновление значений x и y: x = y;
  10. Цикл продолжается до тех пор, пока не будет введен конечный символ: while (x != '.') {
  11. Ввод двух символов: x = getchar(); y = getchar();
  12. Проверка, является ли первый символ числом: if (isdigit(x)) {
  13. Проверка, является ли второй символ следующим числом в последовательности: cur = (isdigit(y) && (y - x == 1));
  14. Условие для вывода символов: if (seq || cur) {
  15. Вывод символа: putchar(x);
  16. Обновление значения seq: seq = cur;
  17. Условие для вывода символа, если первый символ не является числом: else {
  18. Вывод символа: putchar(x);
  19. Обновление значений x и y: x = y;
  20. Конец цикла: }
  21. Возврат 0, чтобы указать, что программа успешно завершилась: return 0; Обратите внимание, что этот код не включает обработку ошибок или проверку границ для ввода символов.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4 из 5
Похожие ответы