А812б

Задача: Дан текст, каждый символ которого может быть малой буквой, цифрой или одним из знаков «+», «-«, «*». Группой букв будем называть такую совокупность последовательно расположенных букв, которой непосредственно не предшествует и за которой непосредственно не следует буква. Аналогично определим группу цифр и группу знаков.

Выяснить, верно ли, что в данном тексте больше групп букв, чем групп знаков.

Задача решена в двух вариантах — с использованием класса string и и с использованием массива символов, завершающихся нулём ( char[], null terminated string ).

Тесты ( для двух вариантов ):

тестовые данные количество посчитанных слов результат по условию задачи
1.  afsf1213**++  letterWordCount = 1
digitWordCount  = 1
symbolWordCount = 1
 в данном тексте одинаковое количество групп букв и групп знаков
2.  afsf1213**++asfs2434gfh21+++—dhf**++vg  letterWordCount = 5
digitWordCount  = 3
symbolWordCount = 3
 в данном тексте больше групп букв, чем групп знаков
3.  abcd+++—123efgh**++—123367++**-sdf—+754*+-bmwazs++834hello++—****  letterWordCount = 5
digitWordCount  = 4
symbolWordCount = 7
 в данном тексте групп букв меньше, чем групп знаков

Вариант 1: решение с использованием класса string

Код программы :

Код программы на Java:

Ссылка на ideone.com: http://ideone.com/MS3BKc

План программы:

  1. Объявление переменных — флаги и счетчики для всех видов слов
  2. Функция завершения чтения слова и увеличение счетчика слова на единицу
  3. Стандартный строковый объект класса string
  4. Ввод текст из стандартного потока ввода
  5. Проход по символам текста
  6. Анализ символов: к какой группе они относятся и проверка состояний
  7. Проверка принадлежности к данному типу символов ( +, — , * / цифра / буква )
  8. Финальное завершение текущего слова
  9. Вывод количества посчитанных слов
  10. Вычисление конечного результата

В программе используется переменная text типа string, которая позволяет хранить текст переменной длины. Переменная text заполняется символами из стандартного потока ввода. Подразумевается, что символ с значением «ноль» введён быть не может, по этому нулевой символ в конце текста является завершающим.

Цикл выполняется по всем символам string, вплоть до нулевого символа и анализирует принадлежность каждого символа к группе символов. Согласно условию задачи это — мал. буквы, цифры и символы + , — , * . В программе использованы 3 переменных-флага, описывающих текущие состояние чтение одного слова данной группы. Также есть переменные-счётчики для каждой группы слов. Каждый счётчик наращивается при сбрасывании флага, то есть, по завершении чтения группы.

Для проверки типа символа используются стандартные макросы isdigit и islower из библиотеки ctype .

Ссылка на ideone.com: http://ideone.com/fork/RiwQTO

Вариант 2: решене с использованием строки символов с завершающим нулём char[]

Код программы :

Код программы на Java:

Ссылка на ideone.com: http://ideone.com/uaQucV

План программы:

  1. Объявление символьного массива для загрузки текста
  2. Объявление переменных — флаги и счетчики для всех видов слов
  3. Функция завершения чтения слова и увеличение счетчика слова на единицу
  4. Загрузка текста в массив — цикл считывания одного символа текста
  5. Завершение нулевым символом
  6. Проход по символам текста загруженного в массив
  7. Анализ символов: к какой группе они относятся и проверка состояний
  8. Проверка принадлежности к данному типу символов ( +, — , * / цифра / буква )
  9. Финальное завершение текущего слова
  10. Вывод количества посчитанных слов
  11. Вычисление конечного результата

Программа читает непрерывный поток текстовых символов и загружает их в символьный массив text . По окончанию ввода добавляется нулевой символ, чтобы символьный массив выглядел, как строка, завершающаяся нулём (null terminated string). При вводе учитывается возможность появления мулевого символа, что также прекращает ввод.

Цикл выполняется по символьному массиву, вплоть до нулевого символа и анализирует принадлежность каждого символа к группе символов. Согласно условию задачи это — мал. буквы, цифры и символы + , — , * . В программе использованы 3 переменных-флага, описывающих текущие состояние чтение одного слова данной группы. Также есть переменные- счётчики для каждой группы слов. Каждый счётчик наращивается при сбрасывании флага, то есть, по завершении чтения группы.

Для проверки типа символа используются стандартные макросы isdigit и islower из библиотеки ctype .

Ссылка на ideone.com: http://ideone.com/LXiyTn

Швандт Максим Альбертович
Швандт Максим Альбертович

Latest posts by Швандт Максим Альбертович (see all)

4 thoughts on “А812б

  1. Вы первый, кто взялся за задачи этого блока. Молодец. Хорошее добротное решение.
    Я бы его с удовольствием зачёл, но оно не подходит не под рубрику string, ни под рубрику cstring. Вам необходимо найти способ решить задачу с использованием методов класса string и другое решение — с использованием строк языка Си (char *). В Вашем случае переделки могут быть совсем небольшие. Подразумевается, что будет сделан один общий отчёт для обоих задач, но это не обязательно. Можно и два отдельных. Здесь об этом чуть подробнее.

  2. — Зачем вы храните весь текст?
    — Использовать одновременно два стиля и iostream, и stdio.h (в C++ — cstdio) в одной программе не рекомендуется. Такой необходимости не может возникнуть.
    — «string text; // символьный массив для загрузки текста» — это не массив.

    Зачёл, но не могу удержаться от замечания:
    У Вас часто получается слишком громоздкий код. Решение простой задачи у Вас заняло чуть не в полтора раза больше строк, чем интерпретатор простого языка программирования. И это с учётом того, что Игорь всё что только можно было выносил в отдельную строку. Я набросал код для первой Вашей задачи. Выходит существенно лаконичнее:

    Конечно, ничего переделывать нет необходимости. Просто обратите внимание на эту склонность к «многословности» кода.

Добавить комментарий