Variable condition dans if

Fermé
axteure Messages postés 61 Date d'inscription samedi 15 août 2009 Statut Membre Dernière intervention 9 janvier 2017 - 5 janv. 2017 à 10:34
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 - 10 janv. 2017 à 09:43
Bonjour,

Est il possible d'avoir un if avec une variable comme condition.
Exemple :

- Si l'utilisateur tape 1, condition = (var1 == 10) ;
- Si l'utilisateur tape 2, condition = (var1 > 10) ;
(var1, et var2 sont des chaines de caractères représentant des valeurs).

if(condition){
instructions;
}

J'ai essayé, ça n'a pas l'air de fonctionner. Qu'en pensez-vous ? Une alternative ?

Merci d'avance de votre aide :) !

7 réponses

yg_be Messages postés 23399 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 17 décembre 2024 Ambassadeur 1 556
Modifié par yg_be le 5/01/2017 à 11:04
Qu'as-tu essayé?
Ceci?
if(((choix==1) && (var1 == 10)) || ((choix==2) && (var1 > 10))){ 
instructions; 
} 
Attention, tu mentionnes var2 et tu ne l'utilises pas.
1
diablo13800 Messages postés 2890 Date d'inscription jeudi 2 juillet 2015 Statut Membre Dernière intervention 16 février 2024 1 857
5 janv. 2017 à 10:58
Bonjour,

C'est le principe de ce genre de conditions, pouvoir comparer des variables a des valeurs que nous souhaitons.

Cependant l'énoncé de la question n'est pas forcement très clair....

si vous mettez

if(var1==10){
instruction
}
else if (var1>10){
instruction
}
else{
instruction
}


Ca devrait passer
0
Utilisateur anonyme
5 janv. 2017 à 11:11
Bonjour

Le principe est bon, ce sont tes comparaisons qui posent un problème.

Tu compares des chaînes de caractères à des nombres. tes variables var1 et var2 sont donc des tableaux de char ou des pointeurs sur char, tu ne peux pas les comparer à des int.
Mais si tes var1 et var2 (et condition aussi, d'ailleurs) sont bien des int, il n'y a pas de raison que ça ne marche pas. Néanmoins, ton programme sera plus compréhensible si tu utilises l'écriture de yg_be.
0
axteure Messages postés 61 Date d'inscription samedi 15 août 2009 Statut Membre Dernière intervention 9 janvier 2017 3
5 janv. 2017 à 11:39
Bonjour merci pour vos réponses, un exemple plus concret pour que vous voyez comment ce présente mon programme.
L'exemple est une version light du programme.


int main()
{
char *condition[]={"t[i].table[i]==0","t[i].table[i]==1","t[i].table2[i]<100","t[i].table2[i]>=100"};


scanf("%i", &choix);

switch (choix)
{
case 0:
fonction(condition[choix]);
break;
case 1:
fonction(condition[choix]);
break;
case 2:
fonction(condition[choix]);;
break;
case 3:
fonction(condition[choix]);
break;
// ---- ERREUR ---- //
default:
printf("Vous n'avez pas rentre un nombre correct.\n\n");
break;
}
}

int fonction(valeur)
{
if(valeur){
instructions;
}
}
0
yg_be Messages postés 23399 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 17 décembre 2024 1 556
Modifié par yg_be le 5/01/2017 à 12:16
Si tu nous expliques pourquoi tu veux absolument travailler avec une table "condition", plutôt que programmer tes conditions, alors nous pourrons sans doute t'expliquer comment faire. Et ce ne sera peut-être pas simple.
Pourquoi ne pas faire:
case 0:
            fonction(t[i].table[i]==0);
            break;
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
5 janv. 2017 à 12:01
Non, aucune chance que ça marche comme ça. Ce n'est pas ce que tu avais dit.
Tu ne fais pas
condition = (t[i].table[i]==0);
mais
condition = "t[i].table[i]==0";
Ce qui n'a aucun rapport.

Dans le premier cas, l'expression t[i].table[i]==0 est évaluée, ce qui suppose d'ailleurs que les variables soient initialisées. Dans le second cas, condition est une simple chaîne de caractères. Au mieux, si les déclarations sont cohérentes, if (valeur) sera toujours vrai puisque valeur sera un pointeur sur une chaîne, donc pas zéro.
0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 094
Modifié par [Dal] le 5/01/2017 à 19:40
on pourrait éventuellement faire un tableau de pointeurs vers des fonctions de comparaison, et pour les appeler, il suffirait d'utiliser le pointeur contenu à l'indice du tableau, avec des paramètres génériques utilisables dans les différents cas
0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 094
Modifié par [Dal] le 10/01/2017 à 09:58
en faisant quelque chose comme cela, tu as effectivement un tableau de conditions, que tu peux tester en disposant juste de l'indice de la condition à tester :

#include <stdio.h>

struct t {
    int truc;
    int machin;
};

int (*condition[4]) (struct t t);

int truc0(struct t t) { return t.truc == 0; }
int truc1(struct t t) { return t.truc == 1; }
int machin_petit(struct t t) { return t.machin < 100; }
int machin_grand(struct t t) { return t.machin >= 100; }

void fonction(int vrai, int choix) {
    if (vrai)
        printf("la condition %d est vraie\n", choix);
    else
        printf("la condition %d est fausse\n", choix);
}

int main(void) {
    struct t t;
    t.truc = 0;
    t.machin = 50;

    condition[0] = truc0;
    condition[1] = truc1;
    condition[2] = machin_petit;
    condition[3] = machin_grand;

    int choix = 2;

    fonction((*condition[choix]) (t), choix);

    return 0;
}

Dal
0
axteure Messages postés 61 Date d'inscription samedi 15 août 2009 Statut Membre Dernière intervention 9 janvier 2017 3
9 janv. 2017 à 11:59
Bonjour,

Merci de vos réponses. Quelle serait donc la solution ?

j'ai essayé ce code comme le propose yg_be mais ça ne fonctionne pas...

case 0:
fonction(t[i].table[i]==0);
break;


L'avantage d'utiliser la variable condition[choix] était que je pouvais faire une boucle for pour ma déclaration des cases. Mais l'utilisation de cette variable ne fonctionne pas.
Comme le père le dit, mon if est toujours vrai avec l'utilisation de cette variable condition[choix].
0
yg_be Messages postés 23399 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 17 décembre 2024 1 556
9 janv. 2017 à 16:24
bonjour, "ça ne fonctionne pas": que vois-tu?
0
Utilisateur anonyme
9 janv. 2017 à 18:20
Bonjour

Surtout, comment est défini et initialisé ton tableau 't' et en particulier son champ 'table' ?
Tel que tu l'utilises, 't' serait un tableau de structures, chaque structure comprenant elle-même (entre autres ?) un tableau. Là où c'est très bizarre, c'est que tu utilises le même indice sur 't' et sur 'table' : un peu comme si tu avais défini un tableau à deux dimensions pour n'utiliser que la diagonale. Je me permets de douter que ce soit bien ça que tu veux faire.
0