Mon conférencier ne veut pas que nous utilisions l'opérateur OR lors de l'utilisation d'une instruction if et les deux tests de condition ne doivent pas non plus être sur la même ligne. par exemple.

if(condition1 || condition2){
  statement
}
if(condition1 || condition3){
  statement
}

Mais nous avons reçu un projet nous demandant de mettre à jour des livres où l'utilisateur peut sélectionner l'une ou l'autre des options, ou les deux. J'ai essayé d'utiliser un interrupteur, mais je pense que c'est trop long.

Un exemple de code est ci-dessous. Cependant, y a-t-il un moyen de le raccourcir sans utiliser le case 3 et taper du code redondant.

#include  <stdio.h>
#include <stdlib.h>
int main()
{
    int opt;

    printf("(1) Option 1");
    printf("\n(2) Option 2");
    printf("\n(3) Both\n");
    printf("Choice: ");
    scanf(" %d", &opt);
    switch(opt){
        case 1:
            printf("\nThis is option one");
            break;
        case 2:
            printf("\nThis is option two");
            break;
        case 3:
            printf("\nThis is option one");
            printf("\nThis is option two");
            break;
    }
    return 0;
}
c
3
wooldon 20 nov. 2018 à 15:59

3 réponses

Meilleure réponse

Vous pouvez utiliser les lois de De Morgan pour éviter la salle d'opération. Le pertinent

not (A or B) = not A and not B

Qui une fois transformé en votre cas devient

A or B = not (not A and not B)

Voici la table de vérité pour mettre en valeur cette logique

+-------+-------+--------+-------+-------+-----------------+----------------------+
|   A   |   B   | A or B | not A | not B | not A and not B | not(not A and not B) |
+-------+-------+--------+-------+-------+-----------------+----------------------+
| true  | true  | true   | false | false | false           | true                 |
| true  | false | true   | false | true  | false           | true                 |
| false | true  | true   | true  | false | false           | true                 |
| false | false | false  | true  | true  | true            | false                |
+-------+-------+--------+-------+-------+-----------------+----------------------+

Donc, avec cela à l'esprit, la condition

if(condition1 || condition2)

Se transforme en

if (! (!condition1 && !condition2) )
7
VLAZ 20 nov. 2018 à 14:19

Vous pouvez également utiliser la syntaxe "else if".

#include <stdio.h>

int main()
{
    int opt;

    printf("(1) Option 1");
    printf("\n(2) Option 2");
    printf("\n(3) Both\n");
    printf("Choice: ");
    scanf(" %d", &opt);

    if (opt == 3){
        printf("\nBoth");
    }
    else if (opt == 2){
        printf("\n2");
    }
    else{
        printf("\n1");
    }
    return 0;
}
0
Cryckx 20 nov. 2018 à 15:18

Dans ce cas, vous pouvez utiliser l'opérateur binaire AND (&) à la place:

if(opt & 1)
{
  // option 1 or 3 chosen
}
if(opt & 2)
{
  // option 2 or 3 chosen
}

Les nombres décimaux 1, 2 et 3 sont respectivement en binaire 01, 10 et 11. (Désigné par 0b01, 0b10 et 0b11 ci-dessous pour les distinguer des nombres décimaux).

L ' opérateur AND au niveau du bit renvoie un 1 si et seulement si les deux bits sont 1.
C'est à dire. 1 & 1 = 1, 0 & 1 = 0, 1 & 0 = 0 et 0 & 0 = 0.

Table de vérité:

&   0  1
   -----
0 | 0  0
1 | 0  1

Lorsque opt est égal à 1, alors seule la première instruction if est vraie.
0b01 & 0b01 = 0b01 ( true ) et 0b01 & 0b10 = 0b00 ( false )

Lorsque opt est égal à 2, alors seule la deuxième instruction if est vraie.
0b10 & 0b01 = 0b00 ( false ) et 0b10 & 0b10 = 0b10 ( true )

Lorsque opt est égal à 3, les deux instructions if sont vraies.
0b11 & 0b01 = 0b01 ( true ) et 0b11 & 0b10 = 0b10 ( true )

Tout ce qui n'est pas zéro est vrai, donc toutes vos conditions sont remplies en conséquence.

7
Sani Singh Huttunen 20 nov. 2018 à 14:41