Avatar billede Slettet bruger
30. marts 2006 - 15:41 Der er 24 kommentarer og
1 løsning

Kan man have flere case numre i en switch

Er det muligt at lave

switch(test)
{
case 1: gør dit
case 2..10 gør dat
}
Avatar billede jpk Nybegynder
30. marts 2006 - 15:43 #1
ja, ellers gav det ikke meget mening...

switch(test)
{
case 1: gør dit
break;
case 2..10 gør dat
break;
}
Avatar billede Slettet bruger
30. marts 2006 - 15:44 #2
Umiddelbart virker det ikke i C!!
Avatar billede jpk Nybegynder
30. marts 2006 - 15:49 #3
"Umiddelbart"?
Har du ikke en fejlmeddelse?

Evt. kunne det være at compileren kræver en default.

switch(test)
{
case 1: //gør dit
break;
case 2: //..10 gør dat
break;
default: // gør intet
break;
}

HUSK også at afslutte hver case-linie med':'
Avatar billede Slettet bruger
30. marts 2006 - 15:50 #4
error: too many decimal points in number
Avatar billede jpk Nybegynder
30. marts 2006 - 15:55 #5
Se min sidste kommentar...
Avatar billede Slettet bruger
30. marts 2006 - 15:56 #6
jep var allerede sket.....
Avatar billede soreno Praktikant
30. marts 2006 - 15:58 #7
Konkret eksempel:
void test(int foo) {
    switch(foo) {
        case 0:
            cout << "0";
            break;
        case 1:
        case 2:
        case 3:
            cout << "1-3";
            break;
        case 4:
        case 5:
        case 6:
        case 7:
            cout << "4-7";
            break;
        default:
            cout << "??";
            break;           
    }
    cout << endl;
}
Avatar billede michael_stim Ekspert
30. marts 2006 - 15:58 #8
Eller endnu bedre: post din kode herind.
Avatar billede soreno Praktikant
30. marts 2006 - 15:59 #9
Men generelt er det nemmere at teste intervaller med en if sætning.
Avatar billede Slettet bruger
30. marts 2006 - 16:02 #10
det er såmænd bare

switch(test)
{
case 0..13, 28..33:
  printf("TEST");
  break;
default:
  printf("Default");
}
Avatar billede jpk Nybegynder
30. marts 2006 - 16:06 #11
Jeg misforstod dit spm, du bliver nødt til at liste de muligheder med seperat case, som i ex soreno.
Avatar billede michael_stim Ekspert
30. marts 2006 - 16:06 #12
Men det kan kompilatoren jo UMULIGT regne ud hvad du mener der ;o)
Kig på Sorenos kode.
Avatar billede michael_stim Ekspert
30. marts 2006 - 16:09 #13
Og som soreno siger, er det nok mere belejligt med if, når du tester på den måde.
Avatar billede michael_stim Ekspert
30. marts 2006 - 16:10 #14
if((test>0 && test<14) && (test>27 && test<34)){

}
Avatar billede jpk Nybegynder
30. marts 2006 - 16:13 #15
eller, ikke og:

if((test>0 && test<14) || (test>27 && test<34)){

}
Avatar billede jpk Nybegynder
30. marts 2006 - 16:15 #16
Lidt lettere at læse + rigtig test for 0:

if((test>=0 && test<=13) || (test>=28 && test<=33)){

}
Avatar billede michael_stim Ekspert
30. marts 2006 - 16:15 #17
Klart
Avatar billede soreno Praktikant
30. marts 2006 - 18:11 #18
Eller hvis man er mere til funktionsorienteret programmering:

bool inInterval(int minIncl, int maxExcl, int val) {
  if(val >= minIncl && val < maxExcl)
    return TRUE;
  else
    return FALSE;
}

if(inInterval(0,13,3)) {
  // do stuff
}
Avatar billede bertelbrander Novice
30. marts 2006 - 20:06 #19
Nu er der jo ingen grund til at lave der unødvendigt simpelt, man kan jo lave:

#include <set>
#include <iostream>

class Interval : private std::set<int>
{
public:
  Interval()
  {}
  Interval(int aStart, int aEnd)
  {
      while(aStart <= aEnd)
        insert(aStart++);
  }
  friend Interval operator + (const Interval& lhs, const Interval& rhs);
  bool operator == (int val)
  {
      return find(val) != end();
  }
};

Interval operator + (const Interval& lhs, const Interval& rhs)
{
  Interval I;
  I.insert(lhs.begin(), lhs.end());
  I.insert(rhs.begin(), rhs.end());
  return I;
}

int main()
{
  if(Interval(1, 3) + Interval(5, 9) == 2)
  {
      std::cout << "2 is in the interval" << std::endl;
  }

  if(Interval(1, 3) + Interval(5, 9) == 4)
  {
      std::cout << "4 is in the interval" << std::endl;
  }
  return 0;
}

Nogen vil måske synes at == syntax'en er en lille smugle odd, men jeg kunne ikke lige finde bedre.
Avatar billede Slettet bruger
31. marts 2006 - 09:48 #20
tak

gider michael_stim og soreno lave et svar også..
Avatar billede soreno Praktikant
31. marts 2006 - 09:51 #21
Ok.
Avatar billede michael_stim Ekspert
31. marts 2006 - 10:00 #22
Skal ikke have nogle point, men syndes nok at bertelbrander har fortjent nogle stilpoint *LOL*
Avatar billede Slettet bruger
05. april 2006 - 08:14 #23
Det kan jeg godt leve med... bertelbrander gider du lave en besvarelse...
Avatar billede bertelbrander Novice
05. april 2006 - 19:42 #24
Jeg samler ikke på point.
Avatar billede Slettet bruger
07. april 2006 - 10:12 #25
Lukker spm
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester