C – Schalter mit mehreren Fallnummern

Lesezeit: 4 Minuten

Also bat uns mein Professor, eine Switch-Anweisung zu erstellen. Wir dürfen verwenden nur der “SCHALTER” Anweisung, das Programm zu tun. Er möchte, dass wir eine Nummer eingeben und sie dann anzeigen, wenn sie sich im Nummernbereich befindet und welche Aktenkoffernummer genommen wird, wie unten gezeigt. Nun … Ich weiß, dass es für diese Art von Programm einfacher ist, das zu verwenden IF-Anweisung. Fall 1 ausführen: Fall 2: Fall 3 … Fall 30 wird funktionieren, aber aufgrund des Nummernkreises zu viel Zeit in Anspruch nehmen.

#include <stdio.h>
main()
{
      int x;
      char ch1;
      printf("Enter a number: ");
      scanf("%d",&x);
      switch(x)
      {
                 case 1://for the first case #1-30
                 case 30:
                      printf("The number you entered is >= 1 and <= 30");
                      printf("\nTake Briefcase Number 1");
                      break;         
                 case 31://for the second case #31-59
                 case 59:
                      printf("The number you entered is >= 31 and <= 59");
                      printf("\nTake Briefcase Number 2");
                      break;                 
                 case 60://for the third case #60-89
                 case 89:
                      printf("The number you entered is >= 60 and <= 89");
                      printf("\nTake Briefcase Number 3");
                      break;                 
                 case 90://for the fourth case #90-100
                 case 100:
                      printf("The number you entered is >= 90 and <= 100");
                      printf("\nTake Briefcase Number 4");
                      break;      
                 default:
                     printf("Not in the number range");
                     break;

                 }
      getch();
      }

Mein Professor hat uns gesagt, dass es einen kürzeren Weg gibt, aber er sagt uns nicht, wie. Ich kann mir nur vorstellen, es zu verkürzen, indem ich IF verwende, aber das dürfen wir nicht. Irgendwelche Ideen, wie ich das hinkriegen kann?

  • Nur zur Überprüfung, sind Sie sicher, dass der erste Fall von 1 bis 30 geht? und nicht 1 bis 29?

    – Prashant Kumar

    26. November 2013 um 4:42 Uhr

  • Denkst du case 1: case 30: passt zu jeder Zahl im Bereich? Es wird nicht.

    – John3136

    26. November 2013 um 4:42 Uhr

  • Ihr erstes Paar case Etiketten finden nur 2 Werte: 1 und 30; sie ignorieren 2..29. Das Gleiche gilt für die nächste “Reichweite” usw. Wenn Sie nur den Schalter verwenden, stehen Sie vor einer Welt voller Schmerzen.

    – Jonathan Leffler

    26. November 2013 um 4:43 Uhr


Benutzer-Avatar
tay10r

Mit GCC und Clang können Sie Fallbereiche wie folgt verwenden:

switch (x){

case 1 ... 30:
    printf ("The number you entered is >= 1 and <= 30\n");
    break;
}

Die einzige Cross-Compiler-Lösung besteht darin, Case-Anweisungen wie diese zu verwenden:

switch (x){

case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
    printf ("The number you entered is >= 1 and <= 6\n");
    break;
}

Bearbeiten: Verwenden von etwas mit der Wirkung von switch (x / 10) ist eine weitere gute Möglichkeit, dies zu tun. Es kann einfacher sein, GCC-Fallbereiche zu verwenden, wenn die Bereiche keine Unterschiede von sind 10aber andererseits akzeptiert Ihr Professor möglicherweise keine GCC-Erweiterung als Antwort.

  • Bonusfrage: Ist es notwendig, jeden zu setzen case auf einer bestimmten Linie? Diese Frage liegt an der goto-label-ähnliches Verhalten der switch case

    – Sandburg

    7. Januar 2019 um 8:27 Uhr

  • Ich habe eine Frage zu Ihrem ersten Beispiel. Gibt es eine Möglichkeit, zwei völlig unterschiedliche Variablen wie char und int für einen Fall anzugeben? -> ist dies ein guter Weg, es zu tun case addr, 0xFF:

    Benutzer5713188

    28. Februar 2019 um 8:05 Uhr


  • @OskarGarczyński nein, nicht dass ich wüsste. 0xFF als signierter Char-Typ ist -0x01, vielleicht ist das eine Option. Wenn nicht, sollten Sie die Variable besser in den Schalterausdruck umwandeln.

    – tay10r

    28. Februar 2019 um 23:59 Uhr

Wenn die Bereiche konsistent sind, können Sie einige der Daten verwerfen:

switch (x / 10 )
{
   case 0:
   case 1:
   case 2:  // x is 0 - 29
     break ;

   // etc ...
}

Andernfalls müssen Sie an den Rändern ein wenig hacken.

  • +1: Mehr oder weniger — (x - 1)/10 Würde geben [012] für 1..30; wiederholen. Das Problem wird -8..0 sein (was auch 0 ergibt).

    – Jonathan Leffler

    26. November 2013 um 4:47 Uhr

Benutzer-Avatar
äh

   Try this ...

#include <stdio.h>
main()
{
      int x;
      char ch1;
      printf("Enter a number: ");
      scanf("%d",&x);
      int y=ceil(x/30.0);
      switch(y)
      {

                 case 1:
                      printf("The number you entered is >= 1 and <= 30");
                      printf("\nTake Briefcase Number 1");
                      break;         

                 case 2:
                      printf("The number you entered is >= 31 and <= 60");
                      printf("\nTake Briefcase Number 2");
                      break;                 

                 case 3:
                      printf("The number you entered is >= 61 and <= 90");
                      printf("\nTake Briefcase Number 3");
                      break;                 

                 case 4:
                      printf("The number you entered is >= 91 and <= 100");
                      printf("\nTake Briefcase Number 4");
                      break;      
                 default:
                     printf("Not in the number range");
                     break;

                 }
      getch();
      }

  • Ihr aktueller Verbrauch von ceil() ist leicht falsch. Sie versuchen es mit der ganzzahligen Division von x durch 30, die bereits ganzzahlig ist, da die ganzzahlige Division eine Unterteilung ist. Vielleicht meintest du ceil(x/30.0)?

    – Ich werde nicht existieren Ich werde nicht existieren

    26. November 2013 um 5:00 Uhr


  • Leider kann ich das nicht selbst machen, da die Bearbeitung weniger als 6 Zeichen hat. Wenn Sie das selbst tun könnten, würde ich diese beiden Kommentare gerne löschen.

    – Ich werde nicht existieren Ich werde nicht existieren

    26. November 2013 um 12:52 Uhr

1257930cookie-checkC – Schalter mit mehreren Fallnummern

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy