0

我很难想出作业所期望的布尔函数。我只需要一些解释,因为我想编写自己的代码。我应该编写一个 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;
}
4

3 回答 3

2

如果要调用bool consonant(char c)like 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().

于 2013-04-17T08:30:13.017 回答
0

Letters are represented by values 65 through 90 (uppercase) and 97 through 122 (lowercase) in ASCII. You're using the array as if they were starting at index 0. Do something like this:

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

Also, you should declare the is_conson array as static, so that it's only constructed once and not each time the function is called.

于 2013-04-17T08:33:14.450 回答
0

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

于 2013-04-17T08:29:19.823 回答