Le test du singe

Le test du singe - C - Programmation

Marsh Posté le 07-10-2004 à 16:11:33    

Pour savoir si l'algorithme est bon, il doit obéir au test du singe, cad que si vous tapez nimporte quoi sur le clavier, l'algorithme doit résister.
 
C'est justement mon problème, j'ai besoin dans mon programme d'une variable qui doit être défini par l'utilisateur. Et elle doit obéir à un test pour la suite des opérations, si elle échoue au test, il faut redemander à l'utilisateur de rentrer une nouvelle variable.
Voici un exemple. Si vous entrez nimporte quel touche du clavier, la boucle while se répète à l'infini, comment empêcher cela?
 
int main() {
   int variable;
   printf("Entrer la variable (entier pair)\n" );
   scanf("%d",&variable);
   while((variable%2)==0) {
      printf("Nombre incorrect, entrez un nombre impair\n" );
      scanf("%d",&variable);
   }
   printf("Voici le nombre tape : %d\n",variable);
   system("pause" );
}

Reply

Marsh Posté le 07-10-2004 à 16:11:33   

Reply

Marsh Posté le 07-10-2004 à 16:23:51    

en controlant le retour de scanf.
 
plus généralement, la façon la plus simple : c'est de lire une ligne avec fgets, et de la tronçonner avec sscanf.

Reply

Marsh Posté le 07-10-2004 à 16:28:23    

Comprends pas. Si le gars tapes "djskh", le modulo 2 plante pas :??:

Reply

Marsh Posté le 07-10-2004 à 16:33:24    

Ben chez moi sous DOS en tout cas, ca plante. Et sous cygwin aussi.
 
Taz, est-ce que je pourrais avoir le meme code qu'en haut avec la modification que tu me conseilles, car je vois pas bien.

Reply

Marsh Posté le 07-10-2004 à 16:38:00    

tu fais un while(fgets
 
et à l'intérieur tu fais un if(sscanf() == n) ...

Reply

Marsh Posté le 07-10-2004 à 16:41:09    

Ben faut déjà commencer par ça comme test.
 
Parceque moi j'en connais pas beaucoup des singes qui vont résister à la tentation de taper VRAIMENT n'importe quoi.
 
Donc tu récupère une chaîne, puis tu vérifies que c'est bien un nombre, et à ce moment seulement tu peux faire le modulo pour vérifier la parité.
 
Je verrais un algo du style :
 
while(leSingeATapeNImporteQuoi());
printf("tiens, v'la ta banane" );
 
function leSingeATapeNImporteQuoi()
{
   printf("pose la papatte sur les boutons devant toi" );
   scanf("%s", mavar);
   // test que mavar contient un nombre
   // cast de mavar en long
   return (mavar%2 == 0);
}


Message édité par Arjuna le 07-10-2004 à 16:41:32
Reply

Marsh Posté le 07-10-2004 à 16:46:33    

Arjuna, tu prends la porte direct

Reply

Marsh Posté le 07-10-2004 à 16:47:33    

ca pourrais se limiter a ca pour la saisie d'un flottant par exemple ?
 
while( fgets( line, sizeof line, stdin ) )
{
 if( sscanf( line, "%f", &f ) == 1 )
  break;
 
puts( "Erreur, recommencez" );
}
 

Reply

Marsh Posté le 07-10-2004 à 16:48:30    

Ben quoi ? Faut bien lui donner une babane au singe, sinon il joue pas :o
Pis je luiai pas indiqué comment faire le plus dûr de toute façon, moi je sais même pas comment tester un nombre en C :D
 
Quant à faire les tests à l'intérieur du while, j'aime pas c'est pourri, c'est le while qui doit faire le test (enfin, dans les () et pas les {}, c'est son but, donc tu l'as même pas mis sur une bonne piste [:spamafote]


Message édité par Arjuna le 07-10-2004 à 16:49:48
Reply

Marsh Posté le 07-10-2004 à 16:50:16    

mais ouais ... allez, boucles-là et fais comme cris56 montre.

Reply

Marsh Posté le 07-10-2004 à 16:50:16   

Reply

Marsh Posté le 08-10-2004 à 12:31:16    

Dites, depuis que chuis dans le coin (donc pas longtemps), me semble à en entendre beaucoup que gets et scanf sont mauvais parce que pas sécurisés.  Patapé, mais les scanf et gets c'est ce qu'on nous apprend.  Alors quelqu'un pourrait-il me donner un exemple d'utilisation dans les deux cas pour voir où se situe le danger du scanf ?
 
et ceci: if( sscanf( line, "%f", &f ) == 1 ) j'ai pas trop saisi son fonctionnement exact.  Quelqu'un pourrait m'aider ?  merci :)

Reply

Marsh Posté le 08-10-2004 à 13:09:08    

Taz a écrit :

Arjuna, tu prends la porte direct

Oui, il a pas defini une classe virtuelle Utilisateur, une sous classe UtilisateurSimien... ;)
Oui, je sais, c'est du C...
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 08-10-2004 à 16:07:35    

bah tu regardes à quoi correspond la valeur de retour de sscanf et tu vas comprendre tout de suite
 

Spoiler :

au nombre d'arguments convertis avec succès

Reply

Marsh Posté le 08-10-2004 à 19:17:52    

Taz a écrit :

bah tu regardes à quoi correspond la valeur de retour de sscanf et tu vas comprendre tout de suite
 

Spoiler :

au nombre d'arguments convertis avec succès




J'ai pas encore regardé le retour de "sscanf" (j'ai trop la honte de me présenter ainsi nu et dépouillé devant toi ô Taz...:p ) mais j'ai connu des systèmes où "printf" renvoyait le nombre d'octets écrits; et d'autres systèmes où "printf" renvoyait un pointeur sur une adresse mémoire contenant la dernière chaîne écrite !
Ceci pour dire que même si on regarde ce que renvoie "sscanf", on n'est pas certain que ce sera pareil ailleurs...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 08-10-2004 à 19:29:08    

oui ben si ton système est pas foutu de respecter une norme de 20ans, c'est qu'il mérite bien un piètre programmer comme toi :o

Reply

Marsh Posté le 08-10-2004 à 19:32:00    

ben oui, faut pas se fier aux compilos trop exotiques
 

Citation :


fscanf returns EOF if end of file or an error occurs before any conversion; otherwise it returns
the number of input items converted and assigned.

Reply

Marsh Posté le 08-10-2004 à 19:39:20    

quoi ? c'est exactement la définition de l'ANSI

Reply

Marsh Posté le 08-10-2004 à 19:42:11    

ben oui, ou est le probleme ?
 
edit : c'est fscanf mais on se comprends


Message édité par cris56 le 08-10-2004 à 19:43:24
Reply

Marsh Posté le 08-10-2004 à 19:44:29    

ben y en a pas justement

Reply

Marsh Posté le 08-10-2004 à 19:47:44    


edit :  j'avais compris de travers


Message édité par cris56 le 08-10-2004 à 20:10:17
Reply

Marsh Posté le 09-10-2004 à 15:03:12    

J'ai oublié de dire que sur ce système le short prenait 2 octets, le int en prenait 4 et le long en prenait 6.
 

Taz a écrit :

oui ben si ton système est pas foutu de respecter une norme de 20ans, c'est qu'il mérite bien un piètre programmer comme toi :o


 
Pauvre type ! :sleep:


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 09-10-2004 à 15:40:07    

c'etait quoi ce systeme ?
 
et seule la norme fais foie, sinon on s'en sort plus

Reply

Marsh Posté le 09-10-2004 à 15:42:53    

morue :o

Reply

Marsh Posté le 09-10-2004 à 15:50:30    

Taz a écrit :

Arjuna, tu prends la porte direct


 
 [:ddt]

Reply

Marsh Posté le 09-10-2004 à 16:43:05    

cris56 a écrit :

c'etait quoi ce systeme ?
 
et seule la norme fais foie, sinon on s'en sort plus


 
C'était un mini-ordinateur Nixdorf. L'Unix était un BSD
Sur cet ordi où je me suis bien pris la tête il y avait même un format dans "printf" pour afficher les chiffres en romain (%r). Là, ça m'a éclaté et je me suis amusé à afficher tous les nombres possibles en romain...
Evidemment, je suis d'accord. Seule la norme fait foi (sans le "e" ). C'était juste pour dire qu'on peut vraiment trouver de tout...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 10-10-2004 à 15:02:38    

Citation :

Sur cet ordi où je me suis bien pris la tête il y avait même un format dans "printf" pour afficher les chiffres en romain (%r).


Arf! Les implementeurs de la lib devaient se faire chier comme des rats morts pour en tomber là.
A+,

Reply

Marsh Posté le 11-10-2004 à 12:28:20    

gilou a écrit :

Arf! Les implementeurs de la lib devaient se faire chier comme des rats morts pour en tomber là.
A+,


Ils ne devaient pas parler Français, sinon on les aurait plutôt retrouvé sur le forum Discussion :)  

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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