C++ 向量和字符串,计算元音字母数量

3

这个程序应该读取文本并计算元音和辅音的数量,它应该忽略任何非字母字符。结果应该像这样:

Enter your text: I have to TURN this..in before midnight!!
 a,  e,  i,  o,  u,  y
 1,  3,  5,  2,  1,  0
There are 19 consonants.

但是我的代码的结果是:
Enter your text: I have to TURN this..in before midnight!!
 a,  e,  i,  o,  u,  y
 1,  3,  4,  2,  0,  0
There are 31 consonants.

我不知道发生了什么事情!!这是一个任务,我必须使用所有这些函数,我不能添加或删除它们!我阅读了几种其他计算和显示数字的方法,但不幸的是模板已经给定...

#include <iostream>
#include <iomanip>
#include <string>
#include <vector>

using namespace std;

// FUNCTION PROTOTYPES GO HERE:
void init_vectors(vector<char> & vowels, vector<int> & frequencies);
string read_text(const string & prompt);
bool is_alphabetic(const char character);
void create_list(const string & str_text, vector<char> & vec_text);
bool is_member(const vector<char> & list, char character);
int find_index(const vector<char> & list, char character);
int compute_vowel_freqs(const vector<char> & text, const vector<char> & vowels, vector<int> & freqs);
void display_characters(const vector<char> & characters, const int colwidth);
void display_freqs(const vector<int> & freqs, const int colwidth);

int main()
{
    vector<char> vowels;
    vector<int> freqs;
    string input;
    vector<char> text;
    int consonants(0);

    const int COLUMNWIDTH = 2;
    init_vectors(vowels, freqs);
    input=read_text("Enter your text: ");

    create_list(input, text);
    compute_vowel_freqs(text, vowels, freqs);

    display_characters(vowels, COLUMNWIDTH);
    display_freqs(freqs, COLUMNWIDTH);

    consonants = compute_vowel_freqs(text, vowels, freqs);
    cout<<"There are "<< consonants<< " consonants."<<endl;
    return 0;
}

void init_vectors(vector<char> & vowels, vector<int> & frequencies)
{

    for (int i(0); i<6; i++) //i is loop variable
    {
        frequencies.push_back(0);
    }
    vowels.push_back('a');
    vowels.push_back('e');
    vowels.push_back('i');
    vowels.push_back('o');
    vowels.push_back('u');
    vowels.push_back('y');
}

string read_text(const string & prompt)
{
    string phrase;
    cout<<prompt;
    getline(cin,phrase);
    return phrase;
}


bool is_alphabetic(const char character)
{
    bool alphabet;
    if ((character > 'a' && character < 'z')||(character > 'A' && character < 'Z'))
    {
        alphabet = true;
    }
    return alphabet;
}

void create_list(const string & str_text, vector<char> & vec_text)
{
    for( int i = 0 ; i < str_text.length() ; i++)
    {
        if(is_alphabetic(str_text[i]))
            vec_text.push_back(str_text[i]);
    }
}

bool is_member(const vector<char> & list, char character)
{
    bool vowel;
    for (int i(0); i<list.size(); i++)
    {
        if (character == list[i])
        {
            vowel=true;
        }
    }
    return vowel;
}

int find_index(const vector<char> & list, char character)
{
    int index = -1;
    for(int i=0; i<list.size(); i++)
    {
        if(character == list[i])
        {
            index = i;
            break;
        }
    }
    return index;
}

int compute_vowel_freqs(const vector<char> & text, const vector<char> & vowels, vector<int> & freqs)
{
    int num_cons(0);
    for(int i = 0 ; i < text.size() ; i++)
    {
        int index;
        if(is_member(vowels, text[i]))
        {
            index = find_index(vowels , tolower(text[i]));
            freqs[index]++;
        }
        else
            num_cons++;
    }

    return num_cons;
}

void display_characters(const vector<char> & characters, const int colwidth)
{
    for(int i=0; i<characters.size(); i++)
    {
        cout<<setw(colwidth)<<characters[i];
        if((i+1)<characters.size())
        {
            cout<<",";
        }
    }
    cout<<endl;
    return;
}

void display_freqs(const vector<int> & freqs, const int colwidth)
{
    for(int i=0; i<freqs.size(); i++)
    {
        cout<<setw(colwidth)<<freqs[i];

        if((i+1)<freqs.size())
            cout<<",";
    }
    cout<<endl;
    return;
}

你的意思是不允许更改函数的声明(也称为签名),但可以更改它们的定义吗? - undefined
我的意思是教练给了我们模板、函数原型以及允许使用的变量数量和类型! - undefined
2个回答

3
如果你在测试代码之前写了数百行代码,那么你注定会失败。要从小而简单的开始,逐步增加复杂性,每一步都进行测试,并且永远不要添加到不起作用的代码。
应该在编写功能时逐个测试它们。这是第一个问题:
bool is_alphabetic(const char character)
{
  bool alphabet;
  if ((character > 'a' && character < 'z')||(character > 'A' && character < 'Z'))
    {
      alphabet = true;
    }
  return false;
}

这个函数总是返回false,因此没有任何文本被识别。

编辑:

第二个问题:is_member也有完全相同的错误,解决方法也相同。

编辑:

第三个问题:我没有注意到在is_alphabetic中的这一行:

if ((character > 'a' && character < 'z')||(character > 'A' && character < 'Z'))

您正在使用'>'和'<',而应该使用">="和"<="。根据此函数,'a'和'z'不是字母。

看,您仍然试图将整个程序作为一个整体进行测试和修复。您必须逐个部分地测试它。选择主要代码中的一个位置,并打印出到那时应该已经被赋值的每个变量。这个函数可能很有用:

void printVector(const vector<char> &V)
{
  for(vector<char>::const_iterator citr=V.begin(); citr!=V.end(); ++citr)
    cout << *citr;
  cout << endl;
}

然后检查结果。如果一个变量不包含它应该包含的内容,那么在这个点上面的某个地方出了问题。追踪问题回到一个函数,其中好的东西进去了,但是坏的东西出来了。修复它,然后再次查看输出。我再次强调: 不要试图一次性修复所有问题。


谢谢,我已经进行了修改,但现在的问题是它没有正确地计算它们,我已经更新了问题并附上了新的示例代码。 - undefined
显然它不计算大写字母。 - undefined
@user2841098:很好的发现!现在追溯问题的根源,修复它,然后再看一遍。 - undefined
@user2841098:这段代码在 compute_vowel_freqs 中;正确的 text 被传入,但结果中的 freqs 是错误的。我建议你创建一个局部变量 char c=tolower(text[i]); 并使用它。 - undefined
是的,我刚刚发现并在截止时间前4分钟提交了作业!返回部分对我来说总是令人困惑。感谢你的帮助。但对于tolower,在is_member和find_index的字符中,我添加了tolower。 - undefined

1
你的 is_member 总是为 false,因此没有字符是元音字母。这导致计数为 0。
bool is_member(const vector<char> & list, char character)
{
    bool vowel = false;   # this fix is not obligatory, I just made code look clearer
    for (int i(0); i<list.size(); i++)
    {
        if (character == list[i])
        {
            vowel=true;
        }
    }
    return vowel;  # this should be fixed
}

顺便提一下,同样的问题也存在于函数“is_alphabetic”中。它总是为假。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接