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

  FORUM HardWare.fr
  Programmation
  C

  Le test du singe

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Le test du singe

n°867171
durandal14
Posté le 07-10-2004 à 16:11:33  profilanswer
 

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" );
}

mood
Publicité
Posté le 07-10-2004 à 16:11:33  profilanswer
 

n°867182
Taz
bisounours-codeur
Posté le 07-10-2004 à 16:23:51  profilanswer
 

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.

n°867186
Arjuna
Aircraft Ident.: F-MBSD
Posté le 07-10-2004 à 16:28:23  profilanswer
 

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

n°867190
durandal14
Posté le 07-10-2004 à 16:33:24  profilanswer
 

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.

n°867193
Taz
bisounours-codeur
Posté le 07-10-2004 à 16:38:00  profilanswer
 

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

n°867199
Arjuna
Aircraft Ident.: F-MBSD
Posté le 07-10-2004 à 16:41:09  profilanswer
 

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
n°867203
Taz
bisounours-codeur
Posté le 07-10-2004 à 16:46:33  profilanswer
 

Arjuna, tu prends la porte direct

n°867204
cris56
Posté le 07-10-2004 à 16:47:33  profilanswer
 

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" );
}
 

n°867205
Arjuna
Aircraft Ident.: F-MBSD
Posté le 07-10-2004 à 16:48:30  profilanswer
 

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
n°867209
Taz
bisounours-codeur
Posté le 07-10-2004 à 16:50:16  profilanswer
 

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

mood
Publicité
Posté le 07-10-2004 à 16:50:16  profilanswer
 

n°867930
Fishes
Posté le 08-10-2004 à 12:31:16  profilanswer
 

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

n°867954
gilou
Modérateur
Modzilla
Posté le 08-10-2004 à 13:09:08  profilanswer
 

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é!  --
n°868155
Taz
bisounours-codeur
Posté le 08-10-2004 à 16:07:35  profilanswer
 

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

n°868397
Sve@r
Posté le 08-10-2004 à 19:17:52  profilanswer
 

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.
n°868415
Taz
bisounours-codeur
Posté le 08-10-2004 à 19:29:08  profilanswer
 

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

n°868417
cris56
Posté le 08-10-2004 à 19:32:00  profilanswer
 

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.

n°868424
Taz
bisounours-codeur
Posté le 08-10-2004 à 19:39:20  profilanswer
 

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

n°868427
cris56
Posté le 08-10-2004 à 19:42:11  profilanswer
 

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
n°868429
Taz
bisounours-codeur
Posté le 08-10-2004 à 19:44:29  profilanswer
 

ben y en a pas justement

n°868430
cris56
Posté le 08-10-2004 à 19:47:44  profilanswer
 


edit :  j'avais compris de travers


Message édité par cris56 le 08-10-2004 à 20:10:17
n°869038
Sve@r
Posté le 09-10-2004 à 15:03:12  profilanswer
 

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.
n°869055
cris56
Posté le 09-10-2004 à 15:40:07  profilanswer
 

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

n°869059
Taz
bisounours-codeur
Posté le 09-10-2004 à 15:42:53  profilanswer
 

morue :o

n°869065
bjone
Insert booze to continue
Posté le 09-10-2004 à 15:50:30  profilanswer
 

Taz a écrit :

Arjuna, tu prends la porte direct


 
 [:ddt]

n°869094
Sve@r
Posté le 09-10-2004 à 16:43:05  profilanswer
 

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.
n°869463
gilou
Modérateur
Modzilla
Posté le 10-10-2004 à 15:02:38  profilanswer
 

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+,

n°869966
Lam's
Profil: bas.
Posté le 11-10-2004 à 12:28:20  profilanswer
 

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

mood
Publicité
Posté le   profilanswer
 


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

  Le test du singe

 

Sujets relatifs
obtenir un certificat de test[Javascript] Input File - Griser le textfield / Test sur le fichier
Faire un test sur une variable[Application Center Test] Qu'est ce qu'une socket error ?
On peut faire du C sur le forum? [test][PHP] test upload de fichier (resolu)
[VB.NET]test d'un champ vide[C++]Test le type d'une var
[ PHP ] sort() ne sait-il pas trier ? + test de mon site...Test des fonctionnalités d'un proxy
Plus de sujets relatifs à : Le test du singe


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