布尔函数无法正常工作

时间:2013-04-17 08:21:26

标签: c++ arrays function char boolean

我无法按照分配的预期提出布尔函数。我只需要一些解释,因为我想编写自己的代码。我应该写一个MIPS代码,实际上计算一个字符串中的大写,小写,元音,辅音和数字的数量。我用C ++编写代码,然后我将转换为MIPS汇编。我粘贴了下面的要求,接着是函数bool consonant(char c)的样子(我的教授给出的想法)。问题是我似乎缺少一些信息来使这个功能起作用。任何人都可以提供有关该功能的更多信息吗?我不需要代码,只需要缺少细节。非常感谢您的帮助。

//下面的任务要求

要确定ASCII字符c是元音还是辅音,请写两个函数bool vowel(char c)和 bool consonant(char c)。使用堆栈将字符参数传递给这些函数。避免长条件 测试角色作为元音和辅音时的表达式。相反,使用两个全局数组 (表)包含实现元音()和辅音()的布尔标志。例如,一个名为的数组 is_vowel对于字符'a'和'A'都是true,对'b'和'B'是false。

// function that returns 0 if c is a consonant, or 1 if c is not a consonant
bool consonant(char c)
{
const bool is_conson[30]={0,0,...1,1,1,0,0...};

return is_conson[c];

}

//Here is The Code (C++) that I wrote for testing purpose only using Dev-C++

#include <iostream>
#include <math.h>
#include <cstdlib>

using namespace std;

bool consonant(char c)
{
const bool is_conso[30]= {1,1,1,1,0,0,0,0,0,1,0,1,1,0,0,0,1,0,1,0,1,1,1,1,0,1,0,1,0,1};

return is_conso[c];

}


int main()
{
int i;
 bool result;
char c;
char sentence[]="aaaabbbbb";

cout<<"the array: ";
cout<<sentence<<endl;
for (i=0; i<9; i++)
{
    c=sentence[i];

    result=consonant(c);
    if (result==0)

        cout<<c<<"  is a Consonant"<<endl;      
}

return 0;
}

3 个答案:

答案 0 :(得分:2)

如果您想像bool consonant(char c)那样致电consonant('a'),那么您需要先将c翻译成索引(因为'a'!= 0)或使用另一种方法。

在便携式C ++中,您可以使用大switch

来完成
switch(c) {
case 'b': case'B': case 'c': case 'C': .... return true;
default: return false;
}

在非便携式C ++中,您可以偏移c

c = lower_case(c); // <-- left as exercise
const auto array_size = std::end(is_conson) - std::begin(is_conson);
if (c>=0 && c<array_size)
    return is_conson[c - 'a']

throw std::logic_error(...);

这是不可移植的,因为C ++标准不要求字符[a..z]是连续的。我不知道你手头的编译器是否支持这个。

第三种非可移植变体需要单独进行一些特殊初始化,但允许直接索引:

std::array<bool,std::numeric_limits<char>::max()> meh() {
    std::array<bool,std::numeric_limits<char>::max()> ret;
    ret['a'] = true;
    ret['A'] = true;
    ...
    return ret;
}

....

    static const auto is_conson = meh();
    if (c >= begin(is_conson) && c<= end(is_conson))
        return is_conson[c];
    throw std::logic_error(....);

非便携式,因为它假设所有辅音都是正面的。然而,它比先前的变体更便携。您还可以通过引入std::numeric_limits<char>::min()来使其变得可移植。

答案 1 :(得分:0)

目前你的功能不起作用,因为ASCII A是65,你需要增加你的数组以覆盖所有的ASCII字符或减去'A'(它给出A的ASCII值)来将数字缩放到你的阵列。 ASCII a为97,因此必须通过减去'a'

来缩放小写字母

答案 2 :(得分:0)

字母由ASCII中的值65到90(大写)和97到122(小写)表示。您正在使用数组,就像它们从索引0开始一样。执行以下操作:

if (c >= 'A' && c <= 'Z')
    return is_conson[c-'A'];
if (c >= 'a' && c <= 'z')
    return is_conson[c-'a'];
return false;

此外,您应该将is_conson数组声明为static,以便它只构造一次而不是每次调用该函数。