Кажется, у меня проблема с подсчетом гласных и согласных в C ++, как мне заставить это работать? - PullRequest
0 голосов
/ 06 ноября 2018

Мне нужно написать программу, которая использует массив для хранения значения введенной пользователем строки и поиска гласных и согласных с использованием массива гласных и массива согласных. Также и советы по написанию кода в целом приветствуется. Проблема, с которой я сталкиваюсь, заключается в том, что при подсчете кажется, что это происходит только в случае А, но выход из дела Е, кажется, работает нормально. И когда дело касается А, это не считается. Спасибо!

#include <iostream>
#include <iomanip>
#include <cstdlib>


int vowelsCount(char *); //count the vowels
int consonantCount(char *); //count the consonants
int totalString(char *); //count how big the word is
void endProgram(); //goodbye function

//Used as the main menu
int main(int argc, char** argv) {

const int VOWEL_SIZE = 10; //amount of vowels
const int CONS_SIZE = 44; //amount of consonants
const int USER_STRING_SIZE = 51; //max character limit

char userString[USER_STRING_SIZE]; //User entered string
char uEndInput = 'y';   
char uAns; // user menu answer



//Get a word from user
std::cout << "Please enter a string (up to 50 characters)" << std::endl;
std::cin.getline(userString, USER_STRING_SIZE); //get the sting from the console


//menu
std::cout <<  "\n\n Please select what you would like to do:\n";
std::cout << "\t A)  Count the vowels of a string.\n";
std::cout << "\t B)  Count the consonants of a string.\n";
std::cout << "\t C)  Count both vowels and consonants of a string.\n" ;
std::cout << "\t D)  Enter another string.\n"; 
std::cout << "\t E)  Exit Program.\n" << std::endl;

std::cin >> uAns; // user inputs answer 

switch(uAns){

case 'A': 
case 'a':{
    std::cout << "The total vowel count is: " << vowelsCount(userString) << " \n";
    break;
}
case 'B':
case 'b':{
    std::cout << "The total consonant count is: " << 
consonantCount(userString) << " \n";
    break;
}
case 'C':
case 'c':   
    std::cout << "The total word count is: " << totalString(userString) << " 
\n";
    break;

/*case 'd':
  case 'D': 
    return main();
    break;
}*/
case 'E':
case 'e':{
    return 0;
    break;
}

    }


return 0;
}

int vowelsCount(char *userVowelPtr ){
char vowelsArray[] = {'A', 'a', 'E', 'e', 'I', 'i', 'O', 'o', 'U', 'u', 
'\0'};
char *vArrayPtr = vowelsArray;
int numVowels = 0;

while(*userVowelPtr != '\0')
{
    if (*userVowelPtr == *vArrayPtr ){

            numVowels++; //Add one to the count

    }
    userVowelPtr++; //point to next character
    vArrayPtr++; //point to next vowel
    vArrayPtr = vowelsArray; //set vowelsPtr to first element again
}
std::cout << "\n\n";
return numVowels;
}



int consonantCount(char *consPtr ){
char consonantArray[] = {'B', 'b', 'C', 'c', 'D', 'd', 'F', 'f', 'G', 'g', 'H', 'h', 'J', 'j', 'K', 'k', 'L','l', 'M', 'm', 'N', 'n', 
                        'P', 'p', 'Q', 'q', 'R', 'r', 'S', 's', 'T', 't', 'V', 'v', 'W', 'w', 'X', 'x', 'Y', 'y', 'Z', 'z', '\0'};
char *cArrayPtr = consonantArray;
int numCons = 0;


while(*consPtr != '\0')
{
    if (*consPtr == *cArrayPtr ){

            numCons++; //Add one to count

    }
    cArrayPtr++;//point to next consonant
    consPtr++;//point to next character
    cArrayPtr = consonantArray; //set vowelsPtr to first element again
}
std::cout << "\n\n";
return numCons;
}


int totalString(char *totalPtr ){
int letters = 0;

while (*totalPtr != '\0'){
    letters++;  
}
std::cout << "The total letter is:" << letters << std::endl;
return letters;
}



void endProgram(){
std::cout << "THank you for using the letter counter, have a good day." << 
std::endl;
}

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Предложения к рассмотрению:

  1. разработайте код так, чтобы один проход по строке имел значение согласные и гласные.

  2. есть функция, которая принимает символ и возвращает ли это символ гласный или согласный

  3. рассмотрим логику того, что определяет, является ли что-то гласным или согласный (является согласным символ, если это не гласный? про пробелы, знаки препинания?) - эти соображения могут вам помочь разработайте свои решения.

  4. Каждая функция должна быть либо функцией управления, либо операцией функция - т. е. одна функция не может выполнять обе функции.

  5. использовать стандартные инструменты библиотеки - std :: string - полезный способ хранение символов и намного меньше подвержено ошибкам, чем массивы символов. Вы затем можно использовать алгоритмы, так как это контейнер STL.

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

const std::string vowelsArray("AaEeIiOoUu");
const std::string consonantArray("BCDFGHJKLMNPQRSTVWXYZ");
const std::locale loc;


bool isVowel(char c)
{
    return (vowelsArray.find(c) != std::string::npos);
}

bool isConsonant(char c)
{
    return (vowelsArray.find(std::toupper(c, loc)) != std::string::npos);
}

void countChars(std::string userInput, int& vowelCount, int& consonantCount)
{
    for (auto c : userInput)
    {
        if (isVowel(c))
            vowelCount++;
        else if (isConsonant(c))
            consonantCount++;
    }
}

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

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

0 голосов
/ 06 ноября 2018

Кажется, проблема в том, что вы продолжаете сбрасывать указатель каждый раз, когда он будет работать, а не просто увеличивать его. Я бы лично порекомендовал изменить код, чтобы в функции было два цикла while.

while(*userVowelPtr != '\0')
{

     while(*vArrayPtr != '\0')
           {
                if(*userVowelPtr == *vArrayPtr )
                {
                       numVowels++; //Add one to the count
                }

                vArrayPtr++
           }

     userVowelPtr++; //point to next character
     vArrayPtr -= sizeof(vArrayPtr); //set vowelsPtr to first element again
}

Это сделано для того, чтобы функция выполняла все значения указателя vArray, сравнивая его с каждым отдельным значением userVowelPtr.

...