Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1783 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Petit programme tout simple

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Petit programme tout simple

n°1907033
dj_titeuf
Posté le 21-07-2009 à 00:26:43  profilanswer
 

Bonsoir,
 
Grand débutant en langage C, j'ai voulu tester dans un petit programme tout bête une boucle while:
 

Code :
  1. #include<stdio.h>
  2. int main(int argc, char*argv[])
  3. {
  4. int leBonChoix = 0;
  5. printf("\n=== Programme de test d'une boucle while. Bienvenue! ===\n\n" );
  6. printf("\nVeuillez rentrer la bonne reponse: \n" );
  7. scanf("%d",&leBonChoix);
  8. while (leBonChoix != 1)
  9. {
  10.  printf("\nMauvaise reponse, veuillez recommencer votre saisie: \n" );
  11.  scanf("%d",&leBonChoix);
  12. }
  13. printf("\nOk, bien vu! Test fini.\n" );
  14. return 0;
  15. }


 
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:
 

Code :
  1. while (leBonChoix != (1 || 2))


 
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. :)

mood
Publicité
Posté le 21-07-2009 à 00:26:43  profilanswer
 

n°1907044
Profil sup​primé
Posté le 21-07-2009 à 04:54:31  answer
 

essaie :
 

Code :
  1. while ( (leBonChoix - 1)*(leBonChoix -2) !=0)

n°1907046
budlite
Fresh
Posté le 21-07-2009 à 06:24:32  profilanswer
 

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 :D .
Sinon je pense que ce que tu cherches serait

Code :
  1. while ( leBonChoix != 1 || leBonChoix !=2 )

Message cité 2 fois
Message édité par budlite le 21-07-2009 à 06:26:04

---------------
Fresh
n°1907054
Joel F
Real men use unique_ptr
Posté le 21-07-2009 à 08:13:08  profilanswer
 

budlite a écrit :

Tu peux faire comme sylvainmn a ecrit, c'est astucieux :D .


c'st surtout illisible deux mois plus tard [:prozac]

n°1907060
budlite
Fresh
Posté le 21-07-2009 à 08:53:22  profilanswer
 

Joel F a écrit :


c'st surtout illisible deux mois plus tard [:prozac]


J'ai jamais dit le contraire  [:gidoin]


---------------
Fresh
n°1907305
Profil sup​primé
Posté le 21-07-2009 à 16:25:42  answer
 

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 ).
 
Tu peux faire comme sylvainmn a ecrit, c'est astucieux :D .
Sinon je pense que ce que tu cherches serait

Code :
  1. while ( leBonChoix != 1 || leBonChoix !=2 )



 
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  ;) ).

Message cité 1 fois
Message édité par Profil supprimé le 21-07-2009 à 16:27:43
n°1907464
dj_titeuf
Posté le 21-07-2009 à 23:37:55  profilanswer
 

Merci pour vos réponses!
 
Tout d'abord, je ne saisi pas bien la différence entre
 

Code :
  1. while ( leBonChoix != 1 || leBonChoix !=2 )


et

Code :
  1. while (leBonChoix != (1 || 2))


Pouvez-vous préciser un peu svp?
 
Et finalement, j'avoue m'être un peu perdu parmi vos réponses... pourquoi parler de &&?

n°1907465
esox_ch
Posté le 21-07-2009 à 23:54:25  profilanswer
 

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


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
n°1907466
SquiZZ
Posté le 21-07-2009 à 23:58:30  profilanswer
 

dj_titeuf a écrit :

Code :
  1. while (leBonChoix != (1 || 2))


Pouvez-vous préciser un peu svp?


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!
 
Tout d'abord, je ne saisi pas bien la différence entre
 

Code :
  1. while ( leBonChoix != 1 || leBonChoix !=2 )


 
Et finalement, j'avoue m'être un peu perdu parmi vos réponses... pourquoi parler de &&?


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.


Message édité par SquiZZ le 22-07-2009 à 00:14:57
n°1907467
dj_titeuf
Posté le 21-07-2009 à 23:59:13  profilanswer
 

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?

mood
Publicité
Posté le 21-07-2009 à 23:59:13  profilanswer
 

n°1907468
esox_ch
Posté le 22-07-2009 à 00:01:39  profilanswer
 

Code :
  1. while ( leBonChoix != 1 || leBonChoix !=2 )


 
=> 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


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
n°1907472
dj_titeuf
Posté le 22-07-2009 à 00:29:46  profilanswer
 

Ok, merci pour vos explications je pense avoir saisi!
Bonne soirée à vous tous, je vais poursuivre mon apprentissage... ;-)

n°1907479
budlite
Fresh
Posté le 22-07-2009 à 03:51:00  profilanswer
 


Oulah oui j'ai repondu un peu trop vite effectivement :D


---------------
Fresh
n°1907747
dj_titeuf
Posté le 22-07-2009 à 20:17:12  profilanswer
 

Bonsoir! :)
 
J'ai un peu continué en faisant d'autres essais, dont celui-ci:
 

Code :
  1. #include<stdio.h>
  2. int main(int argc, char*argv[])
  3. {
  4. int thePass = 0;
  5. int count = 0;
  6. printf("\n=== Welcome to your Private Space ===\n\n" );
  7. printf("Please enter your password to obtain your full access: \n\n" );
  8. scanf("%d",&thePass);
  9. while (thePass != 666 && count < 3)
  10. {
  11.  printf("\nWrong password! Please try again: \n" );
  12.  scanf("%d",&thePass);
  13.  count++;
  14. }
  15. if (count == 3)
  16.  printf("\nToo many errors! Autodestruction...5...4...3...2...1... ;-)\n" );
  17. else
  18.  printf("\nOk! Access enabled! Congratulations!\n" );
  19. return 0;
  20. }


 
Vous comprendrez aisément ce qu'il fait, et après essai, il fonctionne! :bounce:  
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! ;)

n°1907795
Sebxoii
I've made a huge tiny mistake.
Posté le 22-07-2009 à 23:41:55  profilanswer
 

"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.

 


Message édité par Sebxoii le 22-07-2009 à 23:42:26
n°1907797
ptitchep
Posté le 22-07-2009 à 23:49:25  profilanswer
 

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)
 
 
 [:benou_grilled] sauf que je ne conseille pas atoi

Citation :

La  fonction atoi() convertit le début de la chaîne pointée par nptr en
       entier de type int. Le résultat est identique à un appel à
 
           strtol(nptr, (char **) NULL, 10);
 
       à la différence que atoi() ne détecte pas d’erreur.


Message édité par ptitchep le 22-07-2009 à 23:53:42

---------------
deluser --remove-home ptitchep
n°1908430
Sve@r
Posté le 24-07-2009 à 20:59:23  profilanswer
 

dj_titeuf a écrit :

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?


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.


Message édité par Sve@r le 24-07-2009 à 21:01:53

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1908526
dj_titeuf
Posté le 25-07-2009 à 15:49:41  profilanswer
 

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..!


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Petit programme tout simple

 

Sujets relatifs
Problème du connexion à BD Mysql dans un programme CPetites images et grandes images...
création d'un programme générant des nuages de point, et histogrammesconnecter à une base de données Mysql via ODBC à partir d'un programme
executer un programme de cygwin dans l'environnement windows[Resolu]Adaptation programme Windows vers Linux
Petit programme simple pour débutant VBAcherche petit programme tout simple pour coder
Aide pour un petit programme très simple ![.bat] Petit programme tout simple (effacer fichiers) ?
Plus de sujets relatifs à : Petit programme tout simple


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR