2
votes

Variations possibles en langage C à 4 chiffres avec exception

J'ai donc un devoir, mais je ne peux pas comprendre pourquoi ce code ne fonctionne pas.

Le problème ressemble à ceci:

Créez un code qui vérifie toutes les variantes possibles d'un nombre à 4 chiffres, mais il n'y a pas 3 chiffres identiques dans un nombre. (j'espère que cela a du sens)

Mon code:

0,1,2,2
0,1,3,3
0,1,4,4
0,1,5,5
0,1,6,6
...
0,8,6,6
0,8,7,7
0,8,8,8
0,8,9,9
0,9,2,2
...
9,9,9,8

Je veux qu'il imprime quelque chose comme ceci:

0,0,1,1
0,0,1,2
0,0,1,3
...
0,1,0,9
0,1,1,0
0,1,1,2
...
9,9,8,8

À la place, il imprime:

#include<stdio.h>


int main ()
{
        int i;
        char a,b,c,d;

        for (i=0; i<9999; i++)
        {
                a = i/1000;
                b = i/100%10;
                c = i/10%10;
                d = i%10;

                if (a==b==c)    {i++;}
                else if (b==c==d)       {i++;}
                else if (c==d==a)       {i++;}
                else if (d==a==b)       {i++;}
                else if (a==b==c==d)    {i++;}

                else
                {
                        printf("%d,%d,%d,%d\n", a,b,c,d);
                }
        }
}


4 commentaires

L'expression a == b == c est en fait égale à a == (b == c) ce qui signifie que vous comparez a avec le résultat booléen de b == c .


@Someprogrammerdude: printf ("0 == 4 == 3 est% s \ n", 0 == 4 == 3? "True": "false"); ou printf ( "0 == (4 == 3) est% s \ n", 0 == (4 == 3)? "True": "false"); ... https://ideone.com/sRY0Gb


@pmg Merde, je me suis trompé d'associativité. C'est (a == b) == c .


@Someprogrammerdude: aussi b == c donne un résultat int ; 0 ou 1 :)


3 Réponses :


1
votes

Vous ne pouvez pas utiliser plusieurs égalités comme celle-ci. Vous devez les faire séparément avec les conditions et (par exemple a == b && b == c ).


1 commentaires

"Vous ne pouvez pas utiliser plusieurs égalités." - oui vous pouvez, c'est juste que cela a un sens différent de l'écrire d'une autre manière.



3
votes

Il y a un problème avec ces comparaisons:

if ((a==b) && (a==c))

Cela ne permet pas de savoir si a , b et c sont tous les mêmes. Le résultat de == est 0 ou 1 , puis il est comparé au troisième nombre. Par exemple, si les trois nombres sont 9 , alors 9 == 9 == 9 se transforme en 1 == 9 , qui est 0 , donc le if n'est pas pris. De plus, vous avez des faux positifs pour des choses comme 9==9==1.

Ce dont vous avez besoin à la place, c'est

 if (a==b==c)

Maintenant, vous vérifiez si a est égal à b , et quand c'est le cas, vous le vérifiez avec c , et le if est pris s'ils sont tous identiques.

De même bien sûr pour les autres comparaisons, donc au lieu de else if (a == b == c == d) vous voulez else if ((a == b) && (a == c) && (a == d))


1 commentaires

Merci beaucoup! J'ai résolu mon problème!



2
votes

Comme d'autres réponses l'ont noté, vous ne pouvez pas enchaîner les opérateurs de comparaison en C et obtenir les résultats attendus. Utilisez des opérateurs logiques pour combiner des comparaisons. Il serait probablement plus clair d'utiliser || pour éviter toutes les instructions else .

Il y a un autre problème important avec le code affiché: i est incrémenté chaque fois qu'un numéro défaillant est trouvé. Mais alors i est à nouveau incrémenté par la boucle for . Cela fait sauter le numéro après un numéro défaillant, de sorte que certains numéros souhaités ne seront pas trouvés. Par exemple, 3222 devrait échouer, et le numéro suivant 3223 devrait passer, mais ce numéro est ignoré par le code affiché (après les corrections de comparaison), avec le numéro suivant à être vérifié 3224 . A la place, utilisez simplement continue:

if ((a == b && a == c) ||
    (b == c && b == d) ||
    (c == d && c == a) ||
    (d == a && d == b) ||
    (a == b && a == c && a == d)) {
    continue;
} else {
    printf("%d,%d,%d,%d\n", a,b,c,d);
}


2 commentaires

Il serait préférable d'annuler le test et de mettre le printf dans le bloc if et d'éliminer ainsi le continue


@JeremyP - Je suis sûr qu'il existe de meilleures façons d'exprimer cela, mais je voulais rester proche de la logique d'OP et me concentrer sur la correction de l'utilisation de l'opérateur de comparaison et l'incrément supplémentaire erroné de i . Cela dit, le code modifié que j'ai écrit semble assez clair, et je ne suis pas sûr que l'utilisation de la négation ajouterait à cette clarté.