Программа для получения количества слов, начинающихся с гласных и согласных, возвращает неправильные ответы

#c

#c

Вопрос:

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

 using namespace std;

int main()
{

    char ch;
    int count = 0;
    int vowel = 0;
    int cons = 0;
    int noalph = 0;

    bool inword = 1;
    bool space = 0;

    while (cin.get(ch)) {
        if (ch != ' ') {
            inword = 1;
        }
        if (isspace(ch)) {
            space = 1;
        }
        else if (space amp;amp; inword) {
            count  ;
            space = 0;
            inword = 0;

            if (ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u' || 
                ch == 'A' || ch == 'E' || ch == 'I' || ch == 'O' || ch == 'U' || 
                ch == 'y' || ch == 'Y') {
                vowel  ;
            }

            if (ch != 'a' amp;amp; ch != 'e' amp;amp; ch != 'i' amp;amp; ch != 'o' amp;amp; ch != 'u' amp;amp; 
                ch != 'A' amp;amp; ch != 'E' amp;amp; ch != 'I' amp;amp; ch != 'O' amp;amp; ch != 'U' amp;amp; 
                ch != 'y' amp;amp; ch != 'Y'
                amp;amp; isalpha(ch)) {
                cons  ;
            }

            if (ispunct(ch) || isdigit(ch)) {
                noalph  ;
            }
        }
    }

    if (count > 0) {
        count  ;
    }
    //--------------------------------------------

    cout << "Total Number of Words = " << count << endl;
    cout << "Number of Words Beginning with a Vowel = " << vowel << endl;
    cout << "Number of Words Beginning with a Consonant = " << cons << endl;
    cout << "Number of Words Beginning with a Non-Alpha = " << noalph << endl;

    return 0;
}
  

Пример 1 (
Ввод:———————————————————————

supercalifragilisticexpialidocious Бессмысленное слово, используемое, особенно, детьми, теперь в основном выражающее восторженное одобрение: фантастический, замечательный. Стал популярным благодаря фильму Уолта Диснея «Мэри Поппинс» в 1964 году. Песня, содержащая слово, была предметом иска о нарушении авторских прав, возбужденного в 1965 году против создателей фильма компанией Life Music Co. и двух авторов песен: cf. quots. 1949, 1951. Ввиду более раннего устного использования слова, приведенного к присяге под присягой, и различий между песнями судья вынес решение против истцов.

Взято из OED.

Вывод:———————————————————————

Общее количество слов = 86

Количество слов, начинающихся с гласной = 25

Количество слов, начинающихся с согласной = 55

Количество слов, начинающихся с не-Альфа = 5

Ожидаемый:——————————————————————

Общее количество слов = 86

Количество слов, начинающихся с гласной = 25

Количество слов, начинающихся с согласной = 56

Количество слов, начинающихся с не-Альфа = 5

)

Пример 2 (ввод:———————————————————————

1996 бутылка 12345 радар Toyota Мадам, я Адам, я видел крысу? Норма такая же самоотверженная, как и я, Рон. Человек, план, канал — Панама! Тарзан вырастил крысу Дези Арназ. Ханна, я жил непристойно, и зло, которое я делал. Выдержки из «Дзен программирования» Мэри сказала: «Мне нравится STL».

Вывод:———————————————————————

Общее количество слов = 56

Количество слов, начинающихся с гласной = 20

Количество слов, начинающихся с согласной = 31

Количество слов, начинающихся с не-Альфа = 4

Ожидаемый:——————————————————————

Общее количество слов = 56

Количество слов, начинающихся с гласной = 20

Количество слов, начинающихся с согласной = 31

Количество слов, начинающихся с не-Альфа = 5

)

Как вы можете видеть, он ломается в разных точках, может быть, это что-то простое, может быть, это не так, я просто хотел бы получить помощь в понимании того, что происходит, спасибо!

Комментарии:

1. Вы пробовали (намного, намного) меньшие вещи? Как насчет просто «cat» или «angry cat» и подобных, чтобы посмотреть, станет ли это более очевидным. Постарайтесь сделать ввод намного меньше

2. нет, но, но не забывайте, что входные данные установлены и не могут быть изменены, поэтому я должен написать для этих входных данных @Tas

3. При отладке лучше начать с небольшого примера.

4. Я буквально погуглил Y , считается ли это гласной или нет? Я никогда не знал. Но в вашем случае вы рассматриваете это исключительно как гласную.

5. на самом деле, поскольку эта программа проверяет только гласные первого символа, а y всегда является гласной, если это первый символ, так что да, в моем случае это всегда гласная, эта программа проверяет только гласные и другие элементы в начале слова и нигде больше. @aep

Ответ №1:

Хорошо, вы не следовали советам в комментариях, поэтому давайте сделаем это явно. Вы пропускаете первое слово. Причина инициализации в этой строке:

 bool space = 0;
  

вы должны инициализировать его как true

 bool space = true;
  

(да, используйте true и false для логического значения).

вы должны увидеть, что причина, по которой вы добавили эти строки

 if (count > 0) {
    count  ;
}
  

чтобы решить эту проблему. Итак, удалите их.

Вы также пропустили #include <iostream> директиву.

Комментарии:

1. хорошо, я просто запустил код, он сработал! но я пробовал меньшие входные данные прямо перед сном, чтобы попытаться изолировать ошибку, но я ничего не видел на меньших выходных данных, может быть, я просто устал. Но спасибо за помощь. @все