# switch-cases werte zuordnen?



## {lullaby} (11. Okt 2005)

Hallo! 

Es geht um eine "15 punkte challenge" in informatik. und zwar soll ich rausfinden ob es möglich ist des switch cases werte zuzuordnen. 

wie zB, dass case 1 auf alle eingegebenen werte zwischen 20 und 50 zutrifft etc. 


kann mir da jemand helfen`? 

Wäre echt super nett  

Lg


----------



## messi (11. Okt 2005)

Bitte mehr Input.

Sowas?

```
int wert = 29;
switch (wert) {
    case 20:
    case 21:
    ...
    case 49:
    case 50:
        //bla
        break;
}
```


----------



## {lullaby} (11. Okt 2005)

nee ich meinte eher dass ich dem case an sich einen wert wie zB 20<wert>50 angeben könnte... 


heisst: 

angenommen ein brief zwischen 20 und 50 g kostet 2,50€. 

zwischen 50 und 100 3,00€. 


dass ich dann quasi schreiben könnte : 

switch (porto) 

case 1 (vorher definiert durch zwischen 20 und 50) system.out.print("porto beträgt 2.50") etc. 


also dass ich wie bei einer variable oben bereits den konstanten wert zuordne, wie bei int porto= 3 oder sowas. 


danke für deine mühe. hoffe du hast jetzt verstandenw as ich meine? 


Lg


----------



## na-oma (11. Okt 2005)

naja es geht schon in der Art:

so wie


```
if (porto > 0 && porto < 1)
 i = 1;
if (porto > 1 && porto < 3)
 i = 2;

switch(i)
case 1:
...
```

allerdings is das wohl nicht sinn der sache...


----------



## messi (12. Okt 2005)

Nein, verstanden habe ich es noch immer nicht. Aber ich wage noch einen Versuch:

```
double gramm = 78.4;
int wert = (int) (gramm / 10.0);
double porto;

switch (wert) {
    case 0:
    case 1:
        porto = 2.0;
        break;
    case 2:
    case 3:
    case 4:
        porto = 2.5;
        break;
    case 5:
    case 6:
    case 7:
    case 8:
    case 9:
        porto = 3.0;
        break;
    default:
        porto = 3.5;
        break;
}
```
In Java musst du bei einem switch-Kontrukt immer diskrete Werte angeben. Intervalle kannst du durch fall-throughs simulieren. Dabei lässt man halt einfach das "break" weg. Aber es gibt Sprachen (z. B. Pascal), die erlauben das Angeben von Wertebereichen bei einem "case", aber meistens ist dann ein fall-through nicht möglich.

Besser ist es aber, wenn du für so etwas "if" benutzt:

```
if (gramm < 20.0)
    porto = 2.0;
else if (gramm < 50.0)
    porto = 2.5;
else if (gramm < 100.0)
    porto = 3.0;
else
    porto = 3.5;
```
Aber das ist ja nicht die Aufgabe.

Manchmal ist es schwierig zu erahnen, was Profs eigentlich wollen. Nicht besser wird es, wenn deren Aufgaben von Dritten nur umschrieben wiedergegeben werden. Das "fall-through" ist schon etwas besonderes und Anfänger kommem da nicht sofort drauf. Dass das jetzt aber eine "Herausforderung" ist, wage ich zu bezweifeln.

14.11 The switch Statement


----------



## Sky (12. Okt 2005)

{lullaby} hat gesagt.:
			
		

> Es geht um eine "15 punkte challenge" in informatik. und zwar soll ich rausfinden ob es möglich ist des switch cases werte zuzuordnen.
> 
> wie zB, dass case 1 auf alle eingegebenen werte zwischen 20 und 50 zutrifft etc.



Geht es wirklich darum, *ob* es möglich ist, oder geht es darum *wie* es möglich ist!?

Naja, wenn Du ein "festes Intervall" hast so ist dies eigentlich relativ einfach möglich:
	
	
	
	





```
int intervall = 20;
    int theValue = 10;
    int switchValue = theValue / intervall;

    switch( switchValue ) {
      case 0:
        System.out.println( "Wert ist zwischen 0 und 19" );
        break;
      case 1:
        System.out.println( "Wert ist zwischen 20 und 39" );
        break;
      case 2:
        System.out.println( "Wert ist zwischen 40 und 59" );
        break;
      default:
        System.out.println( "Wert ist >= 60" );
        break;
    }
```

Wenn dies nicht der Fall ist, so kannst Du u.U. über eine andere Berechnungsvorschrift darauf kommen. Ansonsten sehe ich -ohne groß darüber nachzudenken- nur die Möglichkeit mittelst if-else den case-Wert zu bestimmen. Vermutlich wird es dafür aber dann nicht die 15 Punkte geben!?


----------



## Bleiglanz (12. Okt 2005)

diese 15 Punkte kannst du dir kaum holen, man kann bei

```
switch(zahl)
```
wohl kaum irgendwas tricksen: das geht nicht!

es sei denn er akzeptiert den Trick mit einer Abbildung Bereich -> int, so wie alle bisher gezeigten Lösungen

0-10 -> 0, 11-20 ->1, 21-30 -> 2 usw.

(könnte man durch Einsatz von Enums sogar aufhübschen); aber dann heisst es ja plötzlich

```
switch(eineFunktionDavon(zahl))
```
und ob das im Sinne der Aufgabenstellung ist?

in der case Klausel MUSS ein zur Compile-Zeit (!) berechenbarer konstanter integraler Wert (oder ein Enum-Wert) stehen, also ist die Aufgabe ziemlich sinnlos


----------



## Nova (12. Okt 2005)

Hallo,

So geht es:

Beispiel Briefe:
0-50g 1 Euro
51-100g 2 Euro
101-250g 3 Euro
251g - 500g 4 Euro
>500g: 5 Euro


```
int wert = 237; // Wert ist das Gewicht des Briefes, habs hier einfach mal fest mit 237g reingeschrieben
		double kosten;
		final int a = wert;

		switch (wert){
			default: // fällt durch
			case 0:{
				kosten = 1.0;
		    	if (wert <= 50) break;
			}
		    case 51: // nur falls wert >50
		    {
		    	kosten = 2.0;
		    	if (wert <= 100) break;
		    }
		    case 101: // nur falls wert >100
		    {
		    	kosten = 3.0;
		    	if (wert <= 250) break;
		    }
		    case 251: // nur falls Wert >250
		    {
		    	kosten = 4.0;
		    	if (wert <= 500) break;
		    }
		    case 501: kosten = 5.0; // nur falls Wert >500
		}
		System.out.println("Kosten: " + kosten);
```


Erklärung:
Man braucht den default-Fall um überhaupt mal reinzukommen. In default geht er immer rein, egal welche Zahl in "wert" steht.
Man kommt auf jeden Fall in "case 0", da beim default-Fall kein break steht, amn nutzt also die Eigenschaft des "durchfallens" aus. Die kosten werden jetzt auf 1 Euro gesetzt.
Ist der Brief leichter als 51g wird "break" aufgerufen, d.h. man springt aus dem switch raus. Ansonsten fällt man wieder durch ins nächste case, dort wird dann wieder entschieden ob der Brief leichter oder schwerer als 100 g ist usw.
Man kommt also nur z.B. in "case 51" wenn der Brief >=51g wiegt, in "case 101" wenn der Biref >=101g wiegt usw.


mfg
Nova


Edit:
hab den Code nochmal leicht umgeschrieben damit er verständlicher ist.
Edit2:
Mir fällt gerade auf das man "case 0" gar nicht braucht, könnte man auch in den default-Fall schreiben, wäre auch logischer:
Jeder Brief (=>default) kostet mindestens 1 Euro, wiegt der Brief mindestens 51g kostet er mindestens 2 Euro usw.


----------



## Bleiglanz (12. Okt 2005)

wozu die verneblungstaktik mit den vielen cases?

```
switch (wert){
        default:
        {
          kosten = 1.0; if (wert <= 50)  break;
          kosten = 2.0; if (wert <= 100) break;
          kosten = 3.0; if (wert <= 250) break;
          kosten = 4.0; if (wert <= 500) break;
          kosten = 5.0; // nur falls Wert >500
        }
    }
```


----------



## Nova (12. Okt 2005)

Damit es zur Aufgabenstellung passt  :wink:


----------

