2010-12-20 7 views
22

뭔가 이상하게 들릴지 모르지만 개별적으로 작성하는 대신 사례를 그룹화하는 C++의 간단한 방법이 있습니까? (그것을 필요로하는 사람들을 위해) ++switch 문을 함께 그룹화 하시겠습니까?

SELECT CASE Answer 
CASE 1, 2, 3, 4 

예 C에서 : 나는 기본적으로 내가 할 단지 수있는 기억는 switch 구조로수록

#include <iostream.h> 
#include <stdio.h> 
int main() 
{ 
    int Answer; 
    cout << "How many cars do you have?"; 
    cin >> Answer; 
    switch (Answer)          
     { 
     case 1: 
     case 2: 
     case 3: 
     case 4: 
     cout << "You need more cars. "; 
     break;           
     case 5: 
     case 6: 
     case 7: 
     case 8: 
     cout << "Now you need a house. "; 
     break;           
     default: 
     cout << "What are you? A peace-loving hippie freak? "; 
     } 
     cout << "\nPress ENTER to continue... " << endl; 
     getchar(); 
     return 0; 
} 
+13

음, 내 질문에 답한 것 같아요. – Falmarri

+1

구체적인 예를 들어 보면 더 쉬운 방법은'if (Answer> = 1 && Answer <= 4) '입니다. – Mikhail

+1

@Falmari 아니요, 그는 더 많은 것을 원합니다. 'case 1, 2, 3, 4 : – marcog

답변

10

아니, 당신이 할 수있는 if와 - else if - 동일한 결과를 얻을 수 else 체인 :

if (answer >= 1 && answer <= 4) 
    cout << "You need more cars."; 
else if (answer <= 8) 
    cout << "Now you need a house."; 
else 
    cout << "What are you? A peace-loving hippie freak?"; 

당신은 또한 또한 다음 음의 예상치 못한 경우를 0 자동차의 경우를 처리하고 할 수 있습니다를 아마 예외를 던집니다.

추신 : 대문자로 변수를 시작하는 것은 좋지 않은 스타일로 간주되어 Answer에서 answer으로 이름이 바뀌 었습니다.

부수적으로, Python과 같은 스크립트 언어는 사용자가 원하는 것을 성취 할 수있는 유연한 방법 인 멋진 if answer in [1, 2, 3, 4] 구문을 허용합니다.

+0

그것은 switch 문에서 관계 연산자를 사용할 수 없다는 것을 싫어합니다. : - \ –

+2

@Josh 왜 당신은 문을 바꿔 주어야할까요? 그들이 당신이 필요로하는 것을 제공하지 않는다면,보다 적합한 대안을 사용하십시오. – marcog

+0

아무 것도 없습니다. Branching Statements에 대한 기사를 읽었을 때 많은 시간을 들였고 몇 가지 이유로 그룹화하는 다른 방법이 있다고 생각했습니다. 솔직히 프로그래밍을 시작했을 때 Switch Statements 만 사용했습니다. –

19

는 AFAIK 당신이 할 수있는 모든 C++에서 일을 더 컴팩트하게 수익 생략 할 수 있습니다 : (. 당신은 물론,뿐만 아니라 다른 수익률을 제거 할 수 있습니다)

switch(Answer) 
{ 
    case 1: case 2: case 3: case 4: 
     cout << "You need more cars."; 
     break; 
    ... 
} 

+1

'case'와 숫자 사이에 공백이 필요합니까? – marcog

+0

@marcog, 예! 그것을 알아 차리기 위해 그것을 고쳤습니다. –

+0

그건 내 목적에 어긋난다. –

0

아니,하지 않는 한 컴파일러가 호환성을 깨고 싶습니다.

5

키워드 case을 (를) 제거 할 수 없습니다. 하지만 당신의 예는 다음과 같이 짧게 쓸 수 있습니다 :

switch ((Answer - 1)/4)          
{ 
    case 0: 
     cout << "You need more cars."; 
     break;           
    case 1: 
     cout << "Now you need a house."; 
     break;           
    default: 
     cout << "What are you? A peace-loving hippie freak?"; 
} 
+0

나는이 아이디어를 실제로 좋아한다. 감사! –

+4

매우 융통성이 없으며이 코드를 보지 않아도됩니다. – marcog

+0

switch 문을 사용하고 각 경우를 정의 할 필요가없는 유일한 방법입니다. –

1

GCC는 소위 "경우 범위"확장자를 가지고 :

http://gcc.gnu.org/onlinedocs/gcc-4.2.4/gcc/Case-Ranges.html#Case-Ranges

나는 단지 GCC를 사용했을 때이를 사용하는 데 사용됩니다. 실제로 그것에 대해 말할 것도별로 없습니다. 단지 가치의 범위에 대해서만 당신이 원하는 것입니다.

가장 큰 문제점은 gcc 만 지원한다는 것입니다. 이것은 당신을 위해 문제 일지도 모르거나 아닐지도 모른다.

는 (나는 당신의 예를 들어 if 문이 더 자연 적합 할 것이라고 생각한다.)

1

당신은 다음과 같이 사용할 수 있습니다

case 4: case 2: 
{ 
    //code ... 
} 

사용 4 2 스위치 케이스를 들어.

1

전처리 기관 남용의 의도가 있다면 Boost.Preprocessor으로 연락하십시오.단지 전처리를 실행 -E -Pgcc 통해 실행

#include <boost/preprocessor/seq/for_each.hpp> 

    #define CASE_case(ign, ign2, n) case n: 

    #define CASES(seq) \ 
     BOOST_PP_SEQ_FOR_EACH(CASE_case, ~, seq) 

    CASES((1)(3)(15)(13)) 

, CASES의 확장 제공 :이 아마 작동하지 않을 경우 (코드 검토를 통과하지 것이다

case 1: case 3: case 15: case 13: 

하는 것으로 !) 그래서 개인적인 사용에 제약을받는 것이 좋습니다.

또한 매크로 CASE_RANGE(1,5)뿐만 아니라 당신을 위해

case 1: case 2: case 3: case 4: case 5: 

로 확대 만들 수 있어야한다.

6

물론 가능합니다.

당신은

예 범위에 대한 ... Y을 경우 X를 사용할 수 있습니다

#include <iostream.h> 
#include <stdio.h> 
int main() 
{ 
    int Answer; 
    cout << "How many cars do you have?"; 
    cin >> Answer; 
    switch (Answer)          
     { 
     case 1 ... 4: 
     cout << "You need more cars. "; 
     break;           
     case 5 ... 8: 
     cout << "Now you need a house. "; 
     break;           
     default: 
     cout << "What are you? A peace-loving hippie freak? "; 
     } 
     cout << "\nPress ENTER to continue... " << endl; 
     getchar(); 
     return 0; 
} 

반드시이 "-std = C++ 0X"플래그가 컴파일러에서 사용 가능합니다

관련 문제