150 votes

Si la condition A est vérifiée, la condition B doit l'être pour pouvoir effectuer l'action C

Ma question est:

 if (/* condition A */)
{
    if(/* condition B */)
      {
         /* do action C */
      }
    else
      /* ... */
}
else
{
   /* do action C */
}
 

Est-il possible d’écrire le code d’action C une fois au lieu de deux?

Comment le simplifier?

401voto

QuestionC Points 1490

Votre première étape dans ce genre de problèmes consiste toujours à créer un tableau logique.

 A | B | Result
-------------------
T | T | do action C
T | F | ...
F | T | do action C
F | F | do action C
 

Une fois que vous avez fait la table, la solution est claire.

 if (A && !B) {
  ...
}
else {
  do action C
}
 

Notez que cette logique, bien que plus courte, peut être difficile à maintenir pour les futurs programmeurs.

65voto

Code-Apprentice Points 18086

Vous avez deux options:

  1. Écrire une fonction qui effectue l'action "C".

  2. Réorganiser votre logique, de sorte que vous ne avez pas besoin de faire beaucoup d'instructions if imbriquées. Demandez-vous ce qui cause des conditions d'action "C" de se produire. Il me semble qu'il se passe lorsque l'état "B" est vraie, ou "état" est faux. Nous pouvons écrire ce que "PAS A OU B". La traduction en code C, nous obtenons

    if (!A || B) {
        action C
    } else {
        ...
    }
    

Pour en savoir plus sur ce genre d'expressions, je vous suggère de googler "l'algèbre booléenne", "logique des prédicats", et "prédicat de calcul". Ces profondes sujets de mathématiques. Vous n'avez pas besoin d'apprendre tout cela, juste l'essentiel.

Renseignez-vous également sur le "court-circuit de l'évaluation". De ce fait, l'ordre des expressions est important de reproduire exactement l'original de votre logique. Alors qu' B || !A est logiquement équivalent, à l'aide de ce que l'état va exécuter d'action "C" lorsqu' B est vrai quelle que soit la valeur de A.

15voto

binaryBaBa Points 688

Vous pouvez simplifier la déclaration comme ceci:

 if ((A && B) || (!A)) // or simplified to (!A || B) as suggested in comments
{
    do C
}
 

Sinon, mettez le code pour 'C' dans une fonction séparée et appelez-le:

 DoActionC()
{
    ....
    // code for Action C
}
if (condition A)
{
    if(condition B)
      {
         DoActionC(); // call the function
      }
    else
      ...
}
else
{
   DoActionC(); // call the function
}
 

14voto

Aaron M. Eshbach Points 5337

Dans un langage de filtrage, vous pouvez exprimer la solution de façon plus directement reflète la vérité de table en QuestionC de réponse.

match (a,b) with
| (true,false) -> ...
| _ -> action c

Si vous n'êtes pas familier avec la syntaxe, chaque modèle est représenté par une | suivie par les valeurs de match avec (a,b), et le trait de soulignement est utilisé comme joker pour dire "autres valeurs". Puisque le seul cas où nous voulons faire quelque chose d'autre que de l'action c est quand a est vrai et b est faux, nous avons explicitement état de ces valeurs que le premier modèle (vrai,faux), et ensuite faire tout ce qui doit être fait dans ce cas. Dans tous les autres cas, nous tombons par le "caractère générique" et de faire de l'action c).

10voto

jamesdlin Points 13455

L'énoncé du problème:

Si la condition A est vérifiée, la condition B doit l'être pour pouvoir effectuer l'action C

décrit l' implication : A implique B , une proposition logique équivalente à !A || B (comme mentionné dans d'autres réponses):

 bool implies(bool p, bool q) { return !p || q; }

if (implies(/* condition A */,
            /* condition B */))
{
    /* do action C */
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X