Булева функция не работает должным образом

У меня возникла проблема придумать логическую функцию, как и ожидалось по заданию. Мне просто нужны объяснения, поскольку я хочу написать свой собственный код. Я должен написать код MIPS, который фактически подсчитывает количество верхних, нижних, гласных, согласных и цифр в строке. Я пишу код в C++, затем перейду на сборку MIPS. Я вставил это требование ниже, а затем, как должна выглядеть функция bool consonant (char c) (идея моего профессора). Проблема в том, что мне кажется, что мне не хватает информации, чтобы эта функция работала. Может ли кто-нибудь предоставить мне больше информации относительно этой функции? Мне не нужен код, просто недостающие детали. Ваша помощь будет очень оценена.

//требование присвоения ниже

Чтобы определить, является ли символ ASCII c гласным или согласным, напишите две функции: bool vowel (char c) и bool consonant (char c). Используйте стек для передачи символьного аргумента этим функциям. Избегайте длинных условных выражений при тестировании персонажа для того, чтобы быть гласным и согласным. Вместо этого используйте два глобальных массива (таблицы), содержащие Boolean flags для реализации гласных() и consonant(). Например, массив с именем is_vowel имел бы true для символов a и A, но false для b и B.

// 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;
}
0
источник поделиться
3 ответа

Если вы хотите вызвать 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().

+2
источник

Поскольку это означает, что ваша функция не будет работать, потому что ASCII A - 65, вам нужно увеличить свой массив, чтобы покрыть все символы ASCII или вычесть "A" (который дает значение ASCII A), чтобы масштабировать номер в вашем массиве. ASCII a - 97, поэтому строчные буквы должны быть масштабированы путем вычитания 'a'

0
источник

Буквы представлены значениями от 65 до 90 (верхний регистр) и от 97 до 122 (нижний регистр) в ASCII. Вы используете массив, как если бы они начинались с индекса 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, чтобы он строился только один раз, а не каждый раз, когда is_conson функция.

0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос