Größer als und kleiner als in der C-Switch-Anweisung

Lesezeit: 5 Minuten

Benutzer-Avatar
Salahuddin

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

Schreiben Sie in „QUANT.C“ ein Programm, das Zahlen „quantifiziert“. Lesen Sie eine Ganzzahl „x“ und testen Sie sie, was die folgende Ausgabe erzeugt:

x größer oder gleich 1000 print „sehr positiv“
x von 999 bis 100 (einschließlich 100) „sehr positiv“ drucken
x zwischen 100 und 0 „positiv“ drucken
x genau 0 gib „Null“ aus
x zwischen 0 und -100 „negativ“ drucken
x von -100 bis -999 (einschließlich -100) drucke „sehr negativ“
x kleiner oder gleich -1000 drucke „sehr negativ“

So würde -10 „negativ“, -100 „sehr negativ“ und 458 „sehr positiv“ ausgeben.

Dann habe ich versucht, es mit einer switch-Anweisung zu lösen, aber es hat nicht funktioniert. Muss ich es mit einem lösen if Anweisung oder gibt es eine Methode, um es mit einer switch-Anweisung 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;
}

  • switch kann nur exakte Vergleiche mit konstanten ganzzahligen Werten handhaben. Sie müssen verwenden if und else.

    – Fred Larson

    7. Januar 2014 um 13:03 Uhr


  • Sieben Kompilierungsfehler sollten Ihnen gesagt haben etwas (und 1 Warnung: control reaches end of non-void function).

    – Jongware

    7. Januar 2014 um 13:06 Uhr

  • In Ihrer Problemdefinition wird nicht erwähnt, nur den Switch-Case zu verwenden. wenn es anders geht!

    – Digitale_Realität

    7. Januar 2014 um 13:08 Uhr

Es gibt keine saubere Möglichkeit, dies mit switch zu lösen, da Cases integrale Typen sein müssen. Schau dir if-else if-else an.

Benutzer-Avatar
Jongware

Ein 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 ;), aber es läuft immer noch über das Array mit Werten und beendet sich, wenn der eingegebene Wert erreicht ist a gleich oder größer als die ist value Element im Array. An diesem Punkt, i enthält den Indexwert für die description zu drucken.

  • Ich wäre Ihnen dankbar, wenn Sie es Schritt für Schritt erklärt haben, danke trotzdem

    – Salahuddin

    7. Januar 2014 um 13:44 Uhr

  • Das for Schleife ist alles, was zählt – verwenden Sie einen Debugger oder gehen Sie sie mit Stift und Papier durch. Nun, das und a konsistent Behandlung der Gleichheitsoperatoren in Ihrer Beschreibungsliste.

    – Jongware

    7. Januar 2014 um 13:46 Uhr

  • Bin gerade über dieses Thema gestolpert und habe diese Antwort gefunden. Die Lösung funktioniert nicht, wenn die eingegebene Zahl kleiner als -999 ist

    – AlexG

    1. Mai 2018 um 13:17 Uhr

  • @AlexG: Es gibt keine description für Werte unter dem Mindestwert, und das Hinzufügen von einem erfordert wiederum das Hinzufügen eines Grenzwerts für diesen Wert. Vielleicht ist alles, was es braucht INT_MIN statt willkürlich -999. (Ähnlich, wie ich sehe, zu Anatolygs Antwort mit INT_MAX um eine Kappe am anderen Ende zu erzwingen.)

    – Jongware

    1. Mai 2018 um 13:23 Uhr


Benutzer-Avatar
anatolyg

Wenn Sie gcc verwenden, haben Sie “Glück”, weil es genau das unterstützt, was Sie wollen, 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 (“Portabilität”) schreiben sollten.

Erwägen Sie also die Verwendung der “stromlinienförmigen” if-elseif-else konstruieren:

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");
}

  • Warum verstehen andere Compiler die Verwendung von Ellipsen in einer switch-Anweisung nicht (was zu einem “Nicht-Standard” führt)?

    – Will von Ullrich

    23. August 2016 um 23:06 Uhr

Benutzer-Avatar
Sourav Ghosh

(a>1000) wertet entweder 1 aus [true] oder 0 [false].

Kompilieren und Sie erhalten den Fehler:

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

Das bedeutet, dass Sie eine verwenden müssen integer constant Wert für die case Etiketten. Ein If-else if-else Schleife sollte für diesen Fall gut funktionieren.

Benutzer-Avatar
Souza

Verwenden:

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

Bei dem die option() Funktion ist einfach eine Funktion mit if else.

Dadurch können Sie das saubere Aussehen eines Schalters beibehalten und der Logikteil befindet sich woanders.

Benutzer-Avatar
Rolle

Warum bevorzugen Sie Switch?

Ich frage, weil das schrecklich nach einer “Hausaufgabenfrage” klingt. Ein Compiler sollte mit if/else-Konstrukten genauso effizient umgehen wie mit einem Schalter (selbst wenn Sie sich nicht mit Bereichen befassen).

Switch kann nicht mit Bereichen umgehen, wie Sie gezeigt haben, aber Sie könnten einen Weg finden, switch einzuschließen, indem Sie zuerst die Eingabe kategorisieren (mit if/else) und dann eine switch-Anweisung verwenden, um die Antwort auszugeben.

Benutzer-Avatar
Praveen

Verwenden Sie das Typparametermuster zusammen mit der When-Klausel, z

switch(a)
    {
        case * when (a>1000):
            printf("hugely positive");
            break;
        case * when (a>=100 && a<999):
            printf("very positive");
            break;
        case * when (a>=0 && a<100):
            printf("positive");
            break; }

  • Dies ist kein gültiges C.

    – dbusch

    11. Juni 2020 um 23:48 Uhr

1373510cookie-checkGrößer als und kleiner als in der C-Switch-Anweisung

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

Privacy policy