webentwicklung-frage-antwort-db.com.de

Größer als und kleiner als in switch-Anweisung C

Ich versuche, einen Code zu schreiben, der viel Vergleich hat

 Schreiben Sie ein Programm in „QUANT.C“, das Zahlen „quantifiziert“. Lesen Sie eine Ganzzahl „x“ und testen Sie sie. Dabei erhalten Sie die folgende Ausgabe: 
 
 X größer oder gleich 1000 print „enorm positiv“ 
 X from 999 bis 100 (einschließlich 100) drucke "sehr positiv" 
 x zwischen 100 und 0 drucke "positiv" 
 x genau 0 drucke "Null" 
 x zwischen 0 und -100 drucke " negativ “
 x von -100 bis -999 (einschließlich -100) druckt„ sehr negativ “
 x kleiner oder gleich -1000 druckt„ sehr negativ “
 
 Somit würde -10 "negativ", -100 "sehr negativ" und 458 "sehr positiv" ausgeben. 

dann habe ich versucht, es mit switch zu lösen, aber es hat nicht funktioniert. Muss ich es mit der if-Anweisung lösen, oder gibt es eine Methode, um es mit switch zu lösen?

#include <stdio.h>

int main(void)
{
int a=0;
printf("please enter a number : \n");

scanf("%i",&a);

switch(a)
{
case (a>1000):
    printf("hugely positive");
   break;
case (a>=100 && a<999):
    printf("very positive");
   break;
case (a>=0 && a<100):
    printf("positive");
   break;
case 0:
    printf("zero");
   break;
case (a>-100 && a<0):
    printf("negative");
   break;
case (a<-100 && a>-999):
    printf("very negative");
   break;
case (a<=-1000):
    printf("hugely negative");
   break;

return 0;
}
13
Salahuddin

Es gibt keine saubere Lösung, um dies mit switch zu lösen, da es sich bei den Fällen um integrierte Typen handeln muss. Schauen Sie sich if-else if-else an.

6
Eric Fortin

Eine switch-less und if-else-less-Methode:

#include <stdio.h>

int main(void)
{
    int a=0, i;
    struct {
        int value;
        const char *description;
    } list[] = {
        { -999, "hugely negative" },
        { -99, "very negative" },
        { 0, "negative" },
        { 1, "zero" },
        { 100, "positive" },
        { 1000, "very positive" },
        { 1001, "hugely positive" }
    };

    printf("please enter a number : \n");
    scanf("%i",&a);

    for (i=0; i<6 && a>=list[i].value; i++) ;
    printf ("%s\n", list[i].description);

    return 0;
}

Die for-Schleife enthält keinen Code (es gibt nur eine leere Anweisung ;), läuft jedoch weiterhin mit Werten über das Array und wird beendet, wenn der eingegebene Wert a dem value-Element im Array entspricht oder größer ist. An diesem Punkt enthält i den Indexwert für die zu druckende description.

7
usr2564301

Wenn Sie gcc verwenden, haben Sie "Glück", weil es genau das unterstützt, was Sie möchten, indem Sie eine Spracherweiterung verwenden:

#include <limits.h>
...

switch(a)
{
case 1000 ... INT_MAX: // note: cannot omit the space between 1000 and ...
    printf("hugely positive");
   break;
case 100 ... 999:
    printf("very positive");
   break;
...
}

Dies ist jedoch kein Standard, und andere Compiler werden Ihren Code nicht verstehen. Es wird oft erwähnt, dass Sie Ihre Programme nur mit Standardfunktionen schreiben sollten ("Portabilität").

Erwägen Sie also die Verwendung des "rationalisierten" if-elseif-else-Konstrukts:

if (a >= 1000)
{
    printf("hugely positive");
}
else if (a >= 100)
{
    printf("very positive");
}
else if ...
...
else // might put a helpful comment here, like "a <= -1000"
{
    printf("hugely negative");
}
5
anatolyg

(a>1000) wird entweder 1 [wahr] oder 0 [falsch] ausgewertet. 

kompilieren und den Fehler erhalten

test_15.c:12: error: case label does not reduce to an integer constant

das heißt, Sie müssen einen integer constant-Wert für die case-Beschriftungen verwenden. Die If-else if-else-Schleife sollte für diesen Fall gut funktionieren.

2
Sourav Ghosh

Dies könnte etwas zu spät kommen, aber:

switch( option(a) ){
    case (0): ...
    case (1): ...
    case (2): ...
    case (n): ...

Die option () - Funktion ist einfach eine Funktion mit if else ..__, mit der Sie das saubere Aussehen eines Schalters beibehalten können und der Logik-Teil an anderer Stelle ist.

1
Souza

Warum bevorzugen Sie den Switch? 

Ich frage, weil das schrecklich nach einer "Hausaufgabenfrage" klingt. Ein Compiler sollte sich mit if/else genauso effizient wie ein Schalter befassen (auch wenn Sie sich nicht mit Ranges beschäftigen).

Switch kann keine Bereiche behandeln, wie Sie gezeigt haben. Sie können jedoch eine Möglichkeit finden, den Schalter einzuschließen, indem Sie die Eingabe zuerst kategorisieren (mithilfe von if/else) und dann die Antwort mit einer switch-Anweisung ausgeben.

0
rolinger