2013-04-17 4 views
0

할당에 의해 예상대로 부울 함수가 생깁니다. 내 자신의 코드를 작성하고자 할 때 설명이 필요합니다. 실제로 대문자, 소문자, 모음, 자음 및 숫자의 수를 문자열로 계산하는 MIPS 코드를 작성해야합니다. C++로 코드를 작성한 다음 MIPS 어셈블리로 변환합니다. 아래에 요구 사항을 붙여 넣으면 bool 자음 (char c) 함수가 어떻게 보이는지 (교수님이 지정한 아이디어) 따라야합니다. 문제는 해당 기능을 작동시키기위한 정보가 누락 된 것 같습니다. 누구든지 그 기능에 관한 더 많은 정보를 제공 할 수 있습니까? 코드가 필요 없으며 누락 된 세부 정보 만 필요합니다. 귀하의 도움은 매우 감사하겠습니다. 부울 함수가 제대로 작동하지 않습니다.

는 //

짖는 소리 과제의 요구 사항은 ASCII 문자 C는 모음이나 자음 인 경우, 결정하는 두 가지 기능을 부울 모음 (숯불 c) 및 부울 자음 (숯불 c)를 작성합니다. 스택을 사용하여 문자 인수를 이러한 함수에 전달하십시오. 문자가 모음과 자음을 테스트 할 때 긴 조건부 문자 을 사용하지 마십시오. 대신, 부울 플래그를 포함하는 두 개의 전역 배열 (테이블)을 사용하여 vowel() 및 consonant()를 구현하십시오. 예를 들어 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; 
} 
+0

_actual_ 코드를 입력하십시오.또한 26 문자 알파벳을 검사하는 배열에 30 개의 요소가있는 이유는 무엇입니까? 마지막으로''a'' 또는''A'' 상수를 배열에 인덱스로 직접 넣으면 안된다는 것을 알고 있습니까? – Shahbaz

+0

'is_conson'에있는 원소의 수를 어디서 30으로 만들었습니까? (힌트 - 30은 충분히 크지 않습니다.) –

+0

테스트 목적으로 30 개를 선택하지만 모든 정보가 누락 될 때마다 올바른 코드를 작성합니다. 실제로는 256입니다. – T4000

답변

0

그것은 함수가 ASCII A가 65이기 때문에, 모든 ASCII 문자를 포함하는 배열을 증가하거나 (A의 ASCII 값을 제공합니다) 'A'를 빼해야합니다 작동하지 않습니다 로선 숫자를 배열로 확장하십시오. ASCII a는 97, 그래서, 당신은 ('a' 때문에! = 0)를 사용하거나 먼저 인덱스로 c을 번역해야 소문자 '는이'

2

당신이 consonant('a') 같은 bool consonant(char c)를 호출 할 경우 차감하여 조정되어야 할 것이다 또 다른 접근법. 휴대용 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()을 도입하여 이식성을 높일 수 있습니다.

+0

모음을 확인하고 반전하면 시간을보다 효율적으로 사용할 수 있다고 생각납니다. –

+0

@LightnessRacesinOrbit : 흥미로운 생각이지만 인스턴스에 대해'! is_vowel ('1')'이 무엇입니까? –

+0

Meh. 음 ... 쓰론 (troolean)을 사용하십시오! –

0

문자는 ASCII에서 65 - 90 (대문자) 및 97 - 122 (소문자) 값으로 나타냅니다. 또한

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

, 당신은 staticis_conson 배열을 선언해야합니다 단지마다 기능을 한 번 건설하고 아니에요 있도록 : 그들은 인덱스에서이 같은 0 어떻게 좀 시작하는 것처럼 당신은 배열을 사용하고 호출됩니다.

관련 문제