[C] Ajouter une valeur a une variable lors de l'appui d'une touche

Ajouter une valeur a une variable lors de l'appui d'une touche [C] - C - Programmation

Marsh Posté le 10-01-2008 à 15:36:34    

Bonjour !
Je voudrai savoir comment augmenter la valeur d'une variable par appuie d'une touche, on doit pouvoir par la suite augmenter cette valeur lorsque la touche est réappuyée a n'importe quel moment.  
 
J'ai testé :
 
if(kbhit()) menu_touche=getch();
      switch (menu_touche)
        {
        case 's' : do
                   {
                   sommeil=sommeil+1;
                   }while (sommeil <= 100);
                   break;
         }
 
dans une grande boucle "do while" mais le problème est que lorsque j'appuyes une fois sur 's' ma valeur sommeil monte jusqu'a 100.  
 
Comment faire pour qu'elle augmente que d'un seul "pallier" a la fois.
 
merci :)


Message édité par rarerealities le 16-01-2008 à 11:26:00
Reply

Marsh Posté le 10-01-2008 à 15:36:34   

Reply

Marsh Posté le 10-01-2008 à 15:41:14    

Euh ... tu comprend le code que tu écrit ?

Reply

Marsh Posté le 10-01-2008 à 15:45:37    

bin je pense, menu_touche est la variable contenant la touche que l'utilisateur appuie, je fais un switch après pour pouvoir mettre plusieurs touches, et si (dans ce cas) la touche est 's' la variable sommeil devrait etre augmentée de 1, et elle doit valoir au maximum 100.

Reply

Marsh Posté le 10-01-2008 à 15:48:29    

Alors le code que tu as écrit c'est :
 
SI la touche appuyée est le : s
ALORS
   REPETER
      Sommeil = Sommeil + 1
   TANT QUE Sommeil EST PLUS GRAND OU EGAL A 101

Reply

Marsh Posté le 10-01-2008 à 21:07:57    

pourtant si met while (sommeil <= 101); et que j'appuie sur 's' le compteur défile indéfiniment :??: j'ai aussi testé for(i=0;i<=1;i++) ça ne marche pas non plus :(

Reply

Marsh Posté le 10-01-2008 à 21:46:19    

si tu veut temporiser utilise nanosleep

Reply

Marsh Posté le 11-01-2008 à 17:51:59    

Joel F a écrit :

si tu veut temporiser utilise nanosleep


Euh, bof... Pas portable. Il faut préciser le contexte...
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 11-01-2008 à 18:13:51    

si je met sleep(100); ça augmente toujours ... mais plus lentement :D

Reply

Marsh Posté le 11-01-2008 à 18:37:52    

Emmanuel Delahaye a écrit :


Euh, bof... Pas portable. Il faut préciser le contexte...


 
ha, je pensais que c'etais ISo, je note merci :jap:

Reply

Marsh Posté le 15-01-2008 à 18:49:41    

n'idée ? :)

Reply

Marsh Posté le 15-01-2008 à 18:49:41   

Reply

Marsh Posté le 16-01-2008 à 07:45:04    

Bon, pour commencer, il sert a quoi ton while ?

Reply

Marsh Posté le 16-01-2008 à 11:25:44    

a faire en sorte que l'on ne puisse plus augmenter la valeur de sommeil si elle dépasse 100
"tant que sommeil est inférieur a 100, on peut faire ce qui est avant"

Message cité 2 fois
Message édité par rarerealities le 16-01-2008 à 11:26:43
Reply

Marsh Posté le 16-01-2008 à 11:36:38    

rarerealities a écrit :

a faire en sorte que l'on ne puisse plus augmenter la valeur de sommeil si elle dépasse 100
"tant que sommeil est inférieur a 100, on peut faire ce qui est avant"


Es-tu conscient qu'un while est une boucle ? Je pense qu'un if devrait suffire. Tu es déjà dans une grande boucle...
 
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 16-01-2008 à 19:14:33    

rarerealities a écrit :

a faire en sorte que l'on ne puisse plus augmenter la valeur de sommeil si elle dépasse 100
"tant que sommeil est inférieur a 100, on peut faire ce qui est avant"


tant que sommeil est inferieur a 100, on REPETE ce qui est avant. Donc forcement, si tu appuies sur une touche une seule fois, ta boucle va tourner cent fois ...
-> Revoir ton bouquin de C sur do {} while

Reply

Marsh Posté le 17-01-2008 à 17:51:33    

j'ai réussi, en fait il suffisait de mettre menu_touche=0; dans ma boucle, comme ça la valeur de la variable n'augmentait plus toute sule, merci a tous :)

Reply

Marsh Posté le 17-01-2008 à 19:12:49    

On peut voir le nouveau code? Je ne sais pas pourquoi, je ne me sens pas tellement convaincu par ta modif :D

Reply

Marsh Posté le 17-01-2008 à 19:39:31    

do  
  {
             //actions de l'utilisateur sur la bête
   
             
  if(kbhit()) menu_touche=getch();
      switch (menu_touche)
        {
        case 's' : do
                   {
                   sommeil = sommeil+1;
                   menu_touche=0;
                   }while (sommeil >=101);
                   break;
 
 
...
 
 
}while (menu_touche != 'q');
 
 
ça te plaira certainement pas mais ça fait ce que je veux :D

Reply

Marsh Posté le 17-01-2008 à 20:00:40    

rarerealities a écrit :


Code :
  1. if(kbhit()) menu_touche=getch();
  2.       switch (menu_touche)
  3.         {
  4.         case 's' : do
  5.                    {
  6.                    sommeil = sommeil+1;
  7.                    menu_touche=0;
  8.                    }while (sommeil >=101);
  9.                    break;




En gros, il n'y a plus de boucle...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 17-01-2008 à 23:08:56    

Emmanuel Delahaye a écrit :


En gros, il n'y a plus de boucle...


 
Ah ben si justement, il va y en avoir une ...
 
Quand "sommeil" va atteindre 100, son while va parcourir tout l'intervalle du type (très certainement un int sur une machine 32bits).
 
P...n, je viens de faire vite fait un test : sur un Core 2 duo à 2Ghz, il ne met que 8secondes pour itérer sur 4milliards de valeurs. Donc quand Intel nous sortira une version à 16Ghz, le temps d'attente ne sera que d'une seconde, et passera certainement inaperçu [:matleflou] . Tout va bien, CQFD.

Reply

Marsh Posté le 18-01-2008 à 00:16:51    

rarerealities a écrit :

do  
  {
             //actions de l'utilisateur sur la bête
   
             
  if(kbhit()) menu_touche=getch();
      switch (menu_touche)
        {
        case 's' : do
                   {
                   sommeil = sommeil+1;
                   menu_touche=0;
                   }while (sommeil >=101);
                   break;
 
 
...
 
 
}while (menu_touche != 'q');
 
 
ça te plaira certainement pas mais ça fait ce que je veux :D


Trop bon :D

Reply

Marsh Posté le 18-01-2008 à 09:33:09    

Ce topic est collector  :sol:  
 
Je me rend compte que ma première impréssion etait tellement vrai ....
 

Citation :

  Euh ... tu comprend le code que tu écrit ?
 


La magie de l'incompréhension fait que le résultat immonde trouvé retourne le résultat attendu.
 
Il en sera d'une autre histoire au partiels ....  :sarcastic:  (en espérant que cette infamité est réalisée dans le cadre des études ...)

Reply

Marsh Posté le 18-01-2008 à 17:18:38    

Tu tentes un portage depuis un code brainfuck ?

Reply

Marsh Posté le 18-01-2008 à 23:32:11    

je ne sais pas ce qu'est un code brainfuck (quoi que...), je n'ai pas de partiels et mon processeur est un AMD [:feyd] sinon mon objectif est décrit dans les 2ème et 3ème lignes de mon premier post, j'ai juste fait une proposition dans l'espoir qu'on m'aide a l'améliorer, ou que qqn en fasse une plus "intelligente", si c'est complètement faux indiquez moi par où recommencer ou une idée mais arrêtez de m'enfoncer c'est pas franchement constructif...

Message cité 3 fois
Message édité par rarerealities le 18-01-2008 à 23:32:39
Reply

Marsh Posté le 18-01-2008 à 23:44:41    

rarerealities a écrit :

je ne sais pas ce qu'est un code brainfuck (quoi que...), je n'ai pas de partiels et mon processeur est un AMD [:feyd] sinon mon objectif est décrit dans les 2ème et 3ème lignes de mon premier post, j'ai juste fait une proposition dans l'espoir qu'on m'aide a l'améliorer, ou que qqn en fasse une plus "intelligente", si c'est complètement faux indiquez moi par où recommencer ou une idée mais arrêtez de m'enfoncer c'est pas franchement constructif...


On t'a déjà donné une solution simple... Si tu n'en tiens pas compte, on y peut rien...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 18-01-2008 à 23:51:36    

rarerealities a écrit :

je ne sais pas ce qu'est un code brainfuck (quoi que...), je n'ai pas de partiels et mon processeur est un AMD [:feyd] sinon mon objectif est décrit dans les 2ème et 3ème lignes de mon premier post, j'ai juste fait une proposition dans l'espoir qu'on m'aide a l'améliorer, ou que qqn en fasse une plus "intelligente", si c'est complètement faux indiquez moi par où recommencer ou une idée mais arrêtez de m'enfoncer c'est pas franchement constructif...


 
Ton code ne tiens pas debout, il te manque les notions de base. A ce moment précis, ce qu'il te faudrait ce n'est pas des conseils c'est une formation.
 
Pour dire autrement, la solution de ton probleme est triviale mais tu ne comprendrais pas la correction étant donné qu'il est évident que tu ne maitrise pas les outils élémentaires (boucles, conditions ...) d'un langage: tu patauges.
Regarde des tutoriaux sur le net, achete toi un bon bouquin de C, et tu verras de toi meme comment atteindre ton but (ton logiciel, je suppose qu'il ne fait pas que compter le nombre d'appuis sur une touche ;) ). A ce moment là, on pourra t'aider à résoudre tes problemes.


Message édité par leo++ le 18-01-2008 à 23:52:09
Reply

Marsh Posté le 19-01-2008 à 08:05:16    

rarerealities a écrit :

je ne sais pas ce qu'est un code brainfuck (quoi que...), je n'ai pas de partiels et mon processeur est un AMD [:feyd] sinon mon objectif est décrit dans les 2ème et 3ème lignes de mon premier post, j'ai juste fait une proposition dans l'espoir qu'on m'aide a l'améliorer, ou que qqn en fasse une plus "intelligente", si c'est complètement faux indiquez moi par où recommencer ou une idée mais arrêtez de m'enfoncer c'est pas franchement constructif...


 
Allez, c'est mon jour de bonte... meme si c'est pas du tout le role de ce forum de t'expliquer des trucs aussi basiques.

Code :
  1. {
  2.                    sommeil = sommeil+1;
  3.                    menu_touche=0;
  4.                    }while (sommeil >=101);
  5.                    break;


Mettons que tu appuies sur une touche, et que sommeil vaille zero. Voici ce qui se passe :
- sommeil = sommeil + 1  
- menu_touch = 0
- est-ce que sommeil >= 101 ? non
- break du switch.
 
Maintenant si sommeil vaut initialement 100.  
- sommeil = sommeil + 1
- menu_touch = 0
- est-ce que sommeil >= 101 ? oui : recommencer la boucle
- sommeil = sommeil + 1
- menu_touch = 0
- est-ce que sommeil >= 101 ? oui : recommencer la boucle  
- sommeil = sommeil + 1
- menu_touch = 0
- est-ce que sommeil >= 101 ? oui : recommencer la boucle  
- sommeil = sommeil + 1
- menu_touch = 0
- etc.
 
Dans ce cas la valeur de sommeil va augmenter jusqu'a la valeur maximum de ta variable. A ce moment la, ca va boucler et rebasculer a zero, et le test de ta boucle va echouer.  
Je ne pense pas que ce soit ce que tu cherches a faire.

Reply

Marsh Posté le 19-01-2008 à 11:51:18    

en fait ma valeur de sommeil est déjà comprise (aléatoirement) entre 0 et 100 lorsqu'elle arrive dans le switch, quoi qu'il en soit j'irai acheter un livre de C un de ces jours :p

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed