web-dev-qa-db-fra.com

Plus grand que et moins que dans l'instruction de commutateur C

J'essaie d'écrire un code qui a beaucoup de comparaison

 Écrivez un programme dans “QUANT.C” qui “quantifie” les nombres. Lisez un nombre entier «x» et testez-le en produisant la sortie 
 Suivante: 
 
 X supérieur ou égal à 1000, impression «extrêmement positif» 
 X de 999. jusqu'à 100 (y compris 100) imprimer “très positif” 
 x entre 100 et 0 imprimer “positif” 
 x exactement 0 imprimer “zéro” 
 x entre 0 et -100 imprimer “ négatif "
 x de -100 à -999 (y compris -100) afficher" très négatif "
 x inférieur ou égal à -1 000 imprimer" extrêmement négatif "
 
 Ainsi, -10 afficherait «négatif», -100 «très négatif» et 458 «très positif». 

alors j'ai essayé de le résoudre en utilisant un commutateur mais cela n'a pas fonctionné, dois-je le résoudre en utilisant si déclaration ou s'il existe une méthode pour le résoudre en utilisant un commutateur?

#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

Il n’existe aucun moyen propre de résoudre ce problème avec switch, car les cas doivent être de type intégral. Jetez un oeil à if-else if-else.

6
Eric Fortin

Une méthode sans commutateur et si-sinon-moins:

#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;
}

La boucle for ne contient pas de code (il y a juste une instruction vide ;) mais elle continue à parcourir le tableau avec des valeurs et se ferme lorsque la valeur entrée a est égale ou supérieure à l'élément value du tableau. À ce stade, i contient la valeur d'index pour description à imprimer.

7
usr2564301

Si vous utilisez gcc, vous avez "de la chance" car il supporte exactement ce que vous voulez en utilisant une extension de langue:

#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;
...
}

Ceci n'est cependant pas standard et les autres compilateurs ne comprendront pas votre code. Il est souvent mentionné que vous ne devez écrire vos programmes qu’en utilisant les fonctionnalités standard («portabilité»).

Pensez donc à utiliser la construction "simplifiée" if-elseif-else:

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) est évalué à 1 [true] ou 0 [false]. 

compiler et va obtenir l'erreur

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

cela signifie que vous devez utiliser une valeur integer constant pour les étiquettes case. La boucle If-else if-else devrait très bien fonctionner dans ce cas.

2
Sourav Ghosh

Cela peut venir un peu trop tard mais:

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

Où la fonction option () est simplement une fonction avec if else . Elle vous permet de conserver l'aspect propre d'un commutateur et la partie logique est ailleurs.

1
Souza

Pourquoi avez-vous une préférence pour utiliser switch? 

Je demande parce que cela ressemble terriblement à une «question de devoirs». Un compilateur doit traiter si/else construit de la même manière qu'un commutateur (même si vous n’avez pas affaire à des gammes).

Switch ne peut pas gérer les plages comme vous l’avez montré, mais vous pouvez trouver un moyen d’inclure le commutateur en classant d’abord l’entrée (en utilisant if/else), puis en utilisant une instruction switch pour afficher la réponse.

0
rolinger