【问题标题】:Boolean function does not work properly布尔函数不能正常工作
【发布时间】:2013-04-09 22:05:58
【问题描述】:

我无法按照作业的预期提出布尔函数。我只需要一些解释,因为我想编写自己的代码。我应该编写一个 MIPS 代码,它实际上计算字符串中大写、小写、元音、辅音和数字的数量。我正在用 C++ 编写代码,然后我将翻译成 MIPS 程序集。我粘贴了下面的要求,然后是函数 bool consonant(char c) 的样子(我的教授给出的想法)。问题是我似乎遗漏了一些信息来使该功能正常工作。谁能向我提供有关该功能的更多信息?我不需要代码,只需要缺少的细节。您的帮助将不胜感激。

//下面的赋值要求

要确定 ASCII 字符 c 是元音还是辅音,请编写两个函数 bool vowel(char c) 和 布尔辅音(字符 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;
}

【问题讨论】:

  • 请输入实际代码。另外,为什么要检查 26 个字母的数组中有 30 个元素?最后,您是否意识到您不应该直接将'a''A' 常量作为数组的索引?
  • is_conson 中的元素数量是从哪里得出的 30? (提示 - 30 不够大)
  • 我只是选择 30 用于测试目的,但只要我缺少所有信息,我都会编写正确的代码。实际上是 256。
  • 我们需要一个关于编程的具体问题,而不是请求“提示”或“提示”或“指导”。

标签: c++ arrays function char boolean


【解决方案1】:

由于 ASCII A 为 65,因此您的函数将不起作用,您需要增加数组以覆盖所有 ASCII 字符或减去“A”(给出 A 的 ASCII 值)以将数字缩放为你的阵列。 ASCII a 是 97,所以小写字母必须通过减去 'a' 来缩放

【讨论】:

    【解决方案2】:

    如果您想像consonant('a') 一样调用bool consonant(char c),则需要先将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&lt;char&gt;::min() 使其可移植。

    【讨论】:

    • 让我吃惊的是,检查元音和倒转会更有效地利用时间。
    • @LightnessRacesinOrbit:很有趣的想法,但例如!is_vowel('1') 是怎么回事?
    • 嗯。嗯...使用 troolean!
    【解决方案3】:

    字母在 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,以便它只构造一次,而不是每次调用函数时。

    【讨论】:

      猜你喜欢
      • 2017-12-05
      • 1970-01-01
      • 2015-07-02
      • 2014-01-20
      • 1970-01-01
      • 1970-01-01
      • 2018-06-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多