Petit programme tout simple - C - Programmation
Marsh Posté le 21-07-2009 à 04:54:31
essaie :
Code :
|
Marsh Posté le 21-07-2009 à 06:24:32
C'est parce que (1 || 2) te renverra une valeur booleenne ( enfin 1 ou 0 en C ), en l'occurence ca te renverra toujours 1 ( car les deux valeurs 1 et 2 sont non nulles ).
Tu peux faire comme sylvainmn a ecrit, c'est astucieux .
Sinon je pense que ce que tu cherches serait
Code :
|
Marsh Posté le 21-07-2009 à 08:13:08
budlite a écrit : Tu peux faire comme sylvainmn a ecrit, c'est astucieux . |
c'st surtout illisible deux mois plus tard
Marsh Posté le 21-07-2009 à 08:53:22
Joel F a écrit : |
J'ai jamais dit le contraire
Marsh Posté le 21-07-2009 à 16:25:42
budlite a écrit : C'est parce que (1 || 2) te renverra une valeur booleenne ( enfin 1 ou 0 en C ), en l'occurence ca te renverra toujours 1 ( car les deux valeurs 1 et 2 sont non nulles ).
|
Non ça ça marche pas tu continues dans la boucle que tu rentres 1 (dans ce cas là 1!=2) ou 2 ( 2!=1). Il faut mettre un && (Mais j'imagine que c'est peut être ce que tu as voulu écrire ).
Marsh Posté le 21-07-2009 à 23:37:55
Merci pour vos réponses!
Tout d'abord, je ne saisi pas bien la différence entre
Code :
|
et
Code :
|
Pouvez-vous préciser un peu svp?
Et finalement, j'avoue m'être un peu perdu parmi vos réponses... pourquoi parler de &&?
Marsh Posté le 21-07-2009 à 23:54:25
Ton problème c'est que tu essaies de traduire en C la phrase "Tant que leBonChoix est différent de 1 OU 2, alors ..."
Le problème c'est que C ne réfléchit pas de la même manière.
Tu ne peux pas lui faire comparer une valeur à 2 autres comme tu le fais, il faut que tu sépares ça en 2 comparaisons distinctes.
Concernant le &&, en effet il faut l'utiliser à la place du || qui t'avais été proposé avant, sinon ça ne marchera pas
Marsh Posté le 21-07-2009 à 23:58:30
dj_titeuf a écrit :
|
Les règles de base de la logique booléenne en C sont :
0 veut dire Faux, tout le reste veut dire Vrai.
Avec les parenthèses, (1 || 2) est évalué avant de faire la comparaison => Vrai OU Vrai = Vrai.
Ensuite le test est fait avec leBonChoix différent de Vrai. (d'ailleurs leBonChoix n'est pas un bon nom vu qu'il peut contenir un mauvais choix).
Donc si je suis pas trop fatigué ça boucle tant que tu ne saisis pas 0.
[edit] je dois être très fatigué.
dj_titeuf a écrit : Merci pour vos réponses!
|
Ca va boucler tant que leBonChoix est différent de 1 OU leBonChoix est différent de 2 alors que tu veux boucler tant que leBonChoix est différent de 1 ET leBonChoix est différent de 2.
Marsh Posté le 21-07-2009 à 23:59:13
Citation : Ton problème c'est que tu essaies de traduire en C la phrase "Tant que leBonChoix est différent de 1 OU 2, alors ..." |
En effet, c'est bien comme ça que je raisonnais!
Citation : Concernant le &&, en effet il faut l'utiliser à la place du || qui t'avais été proposé avant, sinon ça ne marchera pas |
Une petite explication peut-être?
Marsh Posté le 22-07-2009 à 00:01:39
Code :
|
=> tant que leBonChoix est différent de 1 OU leBonChoix est différent de 2, alors continue la boucle. Étant donné que 1 != il y aura toujours au moins une des 2 affirmations vraie, et la boucle continuera.
En remplaçant le OU par ET, aussitôt qu'une des 2 conditions est remplie, alors ça sort
Marsh Posté le 22-07-2009 à 00:29:46
Ok, merci pour vos explications je pense avoir saisi!
Bonne soirée à vous tous, je vais poursuivre mon apprentissage... ;-)
Marsh Posté le 22-07-2009 à 03:51:00
Oulah oui j'ai repondu un peu trop vite effectivement
Marsh Posté le 22-07-2009 à 20:17:12
Bonsoir!
J'ai un peu continué en faisant d'autres essais, dont celui-ci:
Code :
|
Vous comprendrez aisément ce qu'il fait, et après essai, il fonctionne!
J'ai cependant deux questions.
La première: au moment de taper le pass, s'il se trouve que je rentre des caractères et non des chiffres (après tout, un utilisateur lambda n'est pas censé le savoir...), le programme ne me redemande pas de taper mon pass de nouveau, au lieu de cela il affiche trois fois "Wrong password! Please try again: " sans me laisser la possibilité de faire des saisies puis "Too many errors! Autodestruction...5...4...3...2...1... ;-)". Pourquoi donc? Je suppose que le fait que le type associé à thePass ne soit pas respecté doit y jouer, mais pourquoi? Et comment corriger cela?
Ma deuxième question découle un peu de l'erreur que j'ai pu constater précédemment. Si j'avais voulu choisir un pass défini par une chaîne de caractères et non un nombre, que serait devenu mon code?
Merci d'avance!
Marsh Posté le 22-07-2009 à 23:41:55
"scanf" comme son nom l'indique n'est à utiliser que lorsque tu utilises des entrées "formatées". Or, lorsque c'est à l'utilisateur d'entrer quelque chose, rien ne l'oblige à taper un chiffre. Ici, ton scanf attends un entier %d, il reçoit autre chose, donc ça plante.
Si j'étais toi je jetterai un oeil aux fonctions getchar, fgetc ou fgets.
Ensuite une fois que tu as récupéré l'entrée de l'utilisateur sous la forme d'une chaîne de caractères, tu pourras la convertir en entier avec strol ou atoi.
Marsh Posté le 22-07-2009 à 23:49:25
Salut
Les deux questions d'un coup:
utilise fgets() et une chaîne de caractères.
fgets va attendre que l'utilisateur saisisse des caractères (qui peuvent être des chiffres) et va les stocker dans un tableau de caractères que tu auras défini précédemment sans oublier de mettre une case supplémentaire pour le caractère de fin.
Si tu veux convertir ta chaîne en nombre, utilise ensuite strtol.
Si tu veux comparer deux chaînes (par exemple celle de l'utilisateur avec le bon password) utilise strncmp.
Tape "man fgets" , "man strtol" et "man strncmp" dans une console (linux) ou google (linux ou windows) pour en savoir plus. Reviens ensuite ici poser des questions si besoin... ou ajouter "résolu" au titre de ton message .
Pour info, scanf n'est pas la plus simple des fonctions. Certains ici te diront qu'ils savent l'utiliser mais ils n'ont pas le même niveau que toi... et moi. Même avec quelques années d'expérience, j'utilise toujours fgets, combiné avec strtol si besoin. (pour les réels il doit exister strtof, strtod)
sauf que je ne conseille pas atoi
Citation : La fonction atoi() convertit le début de la chaîne pointée par nptr en |
Marsh Posté le 24-07-2009 à 20:59:23
dj_titeuf a écrit :
|
Loi de "De Morgan"
non (A ET B) = non(A) OU non(B)
non(A OU B) = non(A) ET non(B)
Exemple simple: tu veux sortir de ta boucle si la réponse vaut 1 ou si elle vaut 2. Donc à l'inverse tu ne veux pas sortir si la réponse ne vaut pas 1 et aussi si elle ne vaut pas 2.
Contre exemple: Si tu demandes "tant que (rep différent de 1 ou rép différent de 2)"; comme tu auras toujours l'un des 2 cas de vrais (la réponse ne pouvant pas être égale aux 2 chiffres en même temps, elle sera toujours différente de l'un des deux), ça te donnera une boucle infinie.
Marsh Posté le 25-07-2009 à 15:49:41
Ok, merci pour vos réponses! J'ai ENFIN saisi ce que vous m'avez expliqué, il ne devrait plus y avoir de problèmes sur ce point là j'espère..!
Marsh Posté le 21-07-2009 à 00:26:43
Bonsoir,
Grand débutant en langage C, j'ai voulu tester dans un petit programme tout bête une boucle while:
Pour résumer, ce programme se termine donc lorsque la valeur 1 est rentrée, et pour toute autre valeur, il boucle en redemandant la bonne réponse, jusqu'à ce que celle-ci soit donnée. J'ai voulu changer légèrement ce programme en se donnant deux bonnes réponses possibles au lieu d'une seule: 1 ou bien 2. J'ai alors simplement modifié la ligne 15 en la remplaçant par:
Or, même si ça compile, le programme ne s'exécute pas du tout comme je l'attendais... Pouvez-vous m'en donner la ou les raisons svp?
Merci d'avance.