Как я могу посчитать, сколько согласных в строке до сих пор у меня есть это - PullRequest
0 голосов
/ 06 июня 2011
int countConsonant(string str, int consonant)
{
    int length = str.length();
     consonant = 0;

        for (int i = 0; i < length; i++)
        {
            if(str[i] == 'b'&& str[i] == 'c' && str[i] == 'd'&& str[i] == 'f'
                && str[i] == 'g'&& str[i] == 'h'&& str[i] == 'j' && str[i] == 'k'&& str[i] == 'l'&& str[i] == 'm'
                && str[i] == 'n'&& str[i] == 'p'&& str[i] == 'q'&& str[i] == 'r'&& str[i] == 's'&& str[i] == 't'
                && str[i] == 'v'&& str[i] == 'w'&& str[i] == 'x'&& str[i] == 'y'&& str[i] == 'z')

                consonant = consonant + 1;
        }
        return consonant;
}

Ответы [ 8 ]

8 голосов
/ 06 июня 2011

Вы были близки, но должны проверить с помощью логического или ||, а не логического-и && (str[i] просто не может быть равным двум разным вещам).

C ++03 Стандарт позволяет вам использовать ключевые слова and и or - и not, xor и т. Д. - вместо этих загадочных (для новых программистов) символов, но это не получило широкого распространения - возможно, потому что Microsoftв этом отношении компилятор по умолчанию не соответствует стандарту - по-видимому, чтобы не нарушать существующий клиентский код с переменными, функциями, типами и т. д. с этими именами.Таким образом, из-за переносимости и простоты многие библиотеки и учебники также избегают этих ключевых слов.

Другой подход, который может быть немного более кратким, - это использовать isalpha() из <cctype>, а затем проверить, что это не гласная.Более быстрые подходы, как правило, используют массивы от символьного значения до bool, но остерегайтесь индексации вне массива из-за знаковых символьных значений или> = 128-битных не-ASCII-значений.Если есть также заглавные / строчные буквы - вы можете использовать tolower() для своего персонажа перед тестированием (т.е. char c = tolower(str[i])); if (c == '...).

Другие примечания: ваша функция должна:

  • принимает свой аргумент std::string по ссылке const (т. Е. const std::string& str), чтобы избежать ненужного и трудоемкого копирования значения из вызывающего контекста в отдельную переменную, локальную для этой функции.Копирование не приносит никакого реального функционального вреда, но в этом нет необходимости.
  • делает consonant локальной переменной, а не параметром функции, так как любое введенное значение немедленно перекрывается 0, а результат возвращаетсяфункция, а не записанная в consonant (что было бы невозможно, поскольку она передается по значению, а не по указателю / ссылке).
3 голосов
/ 06 июня 2011

Как насчет этого:

#include <algorithm>
#include <iostream>
#include <string>


bool isVowel(char c)
{
    switch (c)
    {
        case 'a':
        case 'e':
        case 'i':
        case 'o':
        case 'u':
        {
            return true;
        }
        default:
        {
            return false;
        }
    }
}


bool isConsonant(char c)
{
    return !isVowel(c);
}


int main(int argc, char *argv[])
{
    std::string test = "hello";
    std::size_t numVowels = std::count_if(test.begin(), test.end(), isConsonant);
    std::cout << "Number of vowels is: " << numVowels << std::endl;
    return 0;
}
2 голосов
/ 06 июня 2011

Первый: && будет проверять все , пока что-то не вернется false или пока не будет достигнут конец.Вам нужно ||, которое будет проверяться до тех пор, пока условие не станет true.
Второе: что короче?Тестирование на согласные или тестирование на гласные?Гласные конечно.Просто поместите этот тест в дополнительную функцию (примечание: здесь я принимаю правильную алфавитную строку ввода):

function is_vowel(c) : bool
  for each vowel test
    if c == that vowel
      return true
  return false

После этого просто замените ваш большой условный оператор на простой !is_vowel(str[i]).:) И последнее, но не менее важное: вы хотите увеличить вашу consonant переменную, и для этого есть специальный оператор: оператор приращения!(Классное имя, да?)

++consonant; // better than consonant = consonant + 1; but same result
0 голосов
/ 09 сентября 2018

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

int main()
{
    char a[20];
    int consonants; 
    gets(a);
    cout<<a<<endl;
    if(a[i]>=0 && a[i]<=9)  //  consonants
    {
        consonants++;
    }
    cout<<"Total Consonats are: "<<consonants;
}
0 голосов
/ 06 июня 2011

Излишний путь для этой домашней работы, но только для справки - объектно-ориентированный подход:

struct Consonants
{
    bool x_[256];

    Consonants()
    {
        // constructor sets x_[i] to true or false to indicate
        // whether character with ASCII number i is a consonant...

        for (int i = 0; i < 256; ++i)
            x_ = false;

        // note: ASCIIZ string finishes with NUL, so *p becomes false
        //       and for loop exits
        for (const char* p = "bcdfghjklmnpqrstvwxyz"
                             "BCDFGHJKLMNPQRSTVWXYZ"; *p; ++p)
            x_[*p] = true;
    };

    int in(const std::string& str) const
    {
        int result = 0;
        for (int i = 0; i < str.size(); ++i)
            if (x_[(unsigned char)str[i]])
                ++result;
        return result;
    }
};

Использование:

Consonants consonants;  // create an "utility" object once

int c1 = consonants.in("hello world");   // use as often as desired
int c2 = consonants.in("goodbye cruel world");
0 голосов
/ 06 июня 2011
#include <iostream>
#include <string>
#include <cctype>
using namespace std;

size_t countConsonant(const string& s) {
    const string vowels("aeiou");
    size_t count = 0;
    for (string::const_iterator i = s.begin(); i != s.end(); ++i) {
        if (vowels.find(tolower(*i)) == string::npos) {
            ++count;
        }
    }
    return count;
}

int main() {
    cout << countConsonant("abcd") << endl;
}

Или, если вы не хотите, чтобы не-альфа-материал совпадал, вы можете сделать это так:

#include <iostream>
#include <string>
#include <cctype>
using namespace std;

size_t countConsonant(const string& s) {
    const string cons("bcdfghjklmnpqrstvwxyz");
    size_t count = 0;
    for (string::const_iterator i = s.begin(); i != s.end(); ++i) {
        if (cons.find(tolower(*i)) != string::npos) {
            ++count;
        }
    }
    return count;
}

int main() {
    cout << countConsonant("abcd") << endl;
}
0 голосов
/ 06 июня 2011

Для начинающих вы используете && (и), что в данном случае является логической ошибкой.Вы хотите использовать || (или).

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

int countConsonant(string str, int consonant)
{
    int length = str.length();
    int consonant = 0;

    for (int i = 0; i < length; i++)
    {
        if(!(str[i] == 'a' || str[i] == 'e' || str[i] == 'i' || str[i] == 'o' ||
            str[i] == 'u'))

        consonant = consonant + 1;
    }
    return consonant;
}

Кто-то уже опубликовалАльтернативная форма этого кода в виде функции, в которой вы просто передаете переменную, которую хотите проверить.

0 голосов
/ 06 июня 2011

Посмотрите на регулярные выражения.Позволяет указать список символов для проверки.Вы проверяете каждый символ в строке по списку и увеличиваете свой счетчик.

http://www.johndcook.com/cpp_regex.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...