Größer als und kleiner als in der C-Switch-Anweisung
Lesezeit: 5 Minuten
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.
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
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
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.
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.
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.
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
13735100cookie-checkGrößer als und kleiner als in der C-Switch-Anweisungyes
switch
kann nur exakte Vergleiche mit konstanten ganzzahligen Werten handhaben. Sie müssen verwendenif
undelse
.– 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