2010-12-20 20 views
22

Być może już nie szukam czegoś, ale czy istnieje prosty sposób w C++, aby grupować przypadki, zamiast pisać je pojedynczo? Pamiętam, że w podstawowym może po prostu zrobić:Grupowanie przypadków oświadczeń przełącznika razem?

SELECT CASE Answer 
CASE 1, 2, 3, 4 

przykład w C++ (Dla tych, którzy tego potrzebują):

#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

Umm, myślę, że odpowiedziałeś na własne pytanie ... – Falmarri

+1

Dla podanego przykładu łatwiejszy byłby 'if (Answer> = 1 && Answer <= 4)' – Mikhail

+1

@Falmari Nie, on chce jeszcze więcej zwarta forma, taka jak "case 1, 2, 3, 4:' – marcog

Odpowiedz

10

No, ale można z if - łańcuch else która osiąga ten sam wynik - else if:

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?"; 

Można też obsługiwać przypadek 0 samochodów, a następnie również nieoczekiwane przypadku negatywnego liczba samochodów prawdopodobnie przez zgłoszenie wyjątku.

PS: Zmieniłem nazwę na Answer na answer, ponieważ za zły styl uważa się uruchamianie zmiennych za pomocą wielkiej litery.

Na marginesie, języki skryptowe, takie jak Python, pozwalają na ładną składnię if answer in [1, 2, 3, 4], która jest elastycznym sposobem osiągnięcia tego, co chcesz.

+0

To jest do bani, że operatory relacyjne nie mogą być używane w instrukcji switch ...: - \ –

+2

@Josh Co jest takiego związanego z przełączaniem instrukcji? Jeśli nie zapewniają tego, czego potrzebujesz, użyj bardziej odpowiedniej alternatywy. – marcog

+0

Nic tak naprawdę. Właśnie czytałem artykuł o Rozgałęzieniach i zauważyłem, że poświęcają im dużo czasu, a ja z jakiegoś powodu myślałem, że istnieje inny sposób ich pogrupowania. Szczerze mówiąc, używałem tylko instrukcji Switch, kiedy zaczynałem programowanie. –

3

Twój przykład jest tak zwięzły jak to się robi z switch konstruktu.

19

AFAIK wszystko, co można zrobić, to pominięcie powraca do rzeczy bardziej zwarty w C++: (. Można usunąć inne zwroty, a także, oczywiście)

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

+1

Potrzebujesz spacji między "przypadkiem" a liczbą, prawda? – marcog

+0

@marcog, Tak! Naprawiono to, by zauważyć. –

+0

To pokonuje mój cel. –

0

No, chyba że chcesz złamać kompatybilność i twój kompilator go obsługuje.

5

Nie można usunąć słowa kluczowego case. Ale Twój przykład można zapisać krócej tak:

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

Podoba mi się ten pomysł. Dzięki! –

+4

Niezbyt elastyczny i nie chciałbym spotkać się z tym kodem. – marcog

+0

To naprawdę jedyny sposób, aby nadal używać instrukcji switch i nie trzeba definiować każdego przypadku. –

1

gcc ma tak zwany „zakres przypadek” rozszerzenie:

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

Ja używałem tego, kiedy byłem tylko przy użyciu gcc. Nie ma wiele do powiedzenia na ten temat - robi to, co chcesz, ale tylko dla zakresów wartości.

Największym problemem jest to, że obsługuje go tylko gcc; może to być problem lub nie.

(podejrzewam, że za przykład stwierdzenie if byłoby bardziej naturalne dopasowanie.)

1

można używać tak:

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

Do użytku 4 lub 2 skrzynki rozdzielczej.

1

Jeśli chcesz podejść do problemu nadużycia preprocesora, może ci pomóc Boost.Preprocessor.

#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)) 

Running to poprzez gcc z -E -P tylko uruchomić preprocesor, ekspansja CASES daje:

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

Zauważ, że to chyba nie przejdzie przeglądu kodu (nie gdzie pracuję !), więc zalecam, aby był ograniczony do osobistego użytku.

To powinno być również możliwe, aby stworzyć CASE_RANGE(1,5) makro rozszerzyć do

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

dla Ciebie.

6

Pewnie, że możesz.

Można użyć sprawę X ... Y dla zakresu

Przykład:

#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; 
} 

Upewnij się, że "-std = C++ 0x" flag włączona w swoim kompilatorze