entrer une serie d'entiers sur une seule ligne

entrer une serie d'entiers sur une seule ligne - C - Programmation

Marsh Posté le 01-04-2004 à 18:41:42    

Salut,
j'ai commencé le c++ il y a peu de temp, et j'essai de faire un petit jeu ressemblant à un mastermind en ligne de commande.
actuellement j'entre le code chiffre par chiffre :

Code :
  1. for(i=0;i<col;i++)
  2. {
  3. printf("entrez le chiffre %d :",i);
  4. scanf("%d",&rep[i]);
  5. while (rep[i]<0 || rep[i] > vmax)
  6. {
  7.  printf("valeur incorrecte!\nEntrez de nouveau le chiffre :" ); //evite les valeur sortant de la config
  8.  scanf("%d",&rep[i]);
  9. }
  10. }


avec col le nombre de colonne du code ( par exemple un code de la forme xx xx xx xx a 4 colonnes ) et vmax la valeur max de chaque colonne.
 
Je voudrai maintenant arriver à entrez directement le code sur une seul ligne, càd que le joueur tape par exemple 12 1 2 3 et retrouver dans mon tableau rep[0] = 10, rep[1] = 1, rep[2]= 2 et rep[3] = 3. Mon probleme est que le nombre de chiffre est variable.
 
Si quelqu'un à une idée, je suis preneur :)
merçi


Message édité par cortex21 le 02-04-2004 à 07:10:57
Reply

Marsh Posté le 01-04-2004 à 18:41:42   

Reply

Marsh Posté le 01-04-2004 à 19:11:32    

Je vois pas trop le pb, avec scanf tu peux entrer plusieurs valeurs à la suite séparées par un espace ou séparateur quelconque :

Code :
  1. scanf("%d %d %d %d", &rep[0], &rep[1], &rep[2], &rep[3]);


Ensuite tu imbriques  dans ton while une boucle for pour tester si les valeurs entrées sont dans le domaine voulu.
 
edit : je vois que tu veux laisser à l'utilisateur la possibilité de rentrer un nombre inconnu de valeurs. Dans ce cas tu reprend l'exemple au dessus, mais avec un nombre de %d et &rep[i] suffisemment important pour laisser l'utilisateur autant de valeurs qu'il souhaite.
Je crois que dans ce cas scanf remplira "rep" jusqu'à la derniere bonne valeur entrée par l'utilisateur, et s'il rencontre une erreur parce que le nombre de valeurs entrées est inférieur à celui escompté alors il s'arrêtera là. Je ne sais pas ce qu'il mettra dans les dernieres valeurs (faut tester, ou mieux, lire un petit cours sur scanf) mais je pense qu'il les laissera non initialisées.
Apres suffit donc d'avoir initialisé tout le tableau (avec des 0par exemple) avant de faire le scanf pour voir "où l'utilisateur s'est arrêté de rentrer des données".
Petit problème : reste à vérifier que scanf fonctionnera bien comme je l'imagine, et aussi celà oblige à rentrer toutes les valeurs d'un coup (à moins d'adapter le test conditionnel qui suit le scanf). Je me rend compte que c'était peut être ça l'objet du topic en fait [:joce]. Fallait détailler plus alors :d [:spamafote]


Message édité par TotalRecall le 01-04-2004 à 19:17:33

---------------
Topic .Net - C# @ Prog
Reply

Marsh Posté le 01-04-2004 à 19:22:08    

Apres vérification, pour que mon truc au dessus marche il faut mettre un autre séparateur qu'un espace on dirait, sinon si on valide la saisie avant d'avoir mis le nb de valeurs spécifié alors le curseur descend à la ligne et attend qu'on rentre toutes les valeurs qu'on a spécifié.
Avec une virgule comme séparateur ça marche comme je l'imaginais par contre. Les valeurs affichées pour les éléments du tableau qui n'ont pas recu de valeur sont des grands nombres apparemment aléatoires : des variables qui n'ont pas étées initialisées donc...


Message édité par TotalRecall le 01-04-2004 à 19:22:39

---------------
Topic .Net - C# @ Prog
Reply

Marsh Posté le 01-04-2004 à 19:24:52    

Pour le test qui suis, je pense pouvoir sans probleme verifier les valeur contenu dans le tableau apres et demandé l'utilisateur de coriger individuellement les valeur erroné.
Je vai essayer ton idée pour le scanf, mais j'ai limité le nombre max de colonne à 10, ca fait beaucoup de %d :)
 
merci quand meme de ton aide.

Reply

Marsh Posté le 01-04-2004 à 19:33:43    

re salut!  
Aprés essais, scanf attend d'avoir reçus les 10 valeurs avant de bien vouloir passer à la fonction suivante :(

Reply

Marsh Posté le 01-04-2004 à 19:38:12    

ok. petite rectification : c'est une boucle while qu'il faut imbriquer dans le for, pas l'inverse évidemment :sarcastic: [:aloy]
En fait c'est ce que tu fais pour l'instant, sauf qu'il faut sortir le printf/scanf de la for donc puisque on remplit tout le tableau d'un coup, et apres on teste si chaque valeur est correcte jusqu'à trouver là où l'utilisateur s'est arrêté d'en rentrer. Là selon ce que tu cherches à faire, sois tu lui fais rentrer ce qui manque soit tu consideres que les valeurs du tableau à utiliser s'arrêtent là :crazy:...
Bon en fait c'est tres simple à comprendre je crois, mais c'est sûr que c'est assez lourd côté code... A mon avis il doit y avoir possibilité de faire quelque chose de plus court et plus souple, mais comme je sais pas trop ce que tu cherches à faire (à part faire rentrer un nb à priori inconnu de valeur à l'utilisateur et vérifier qu'elles sont bien comprises entre 2 bornes) je peux pas t'aider plus, même si ça doit peut être pouvoir etre raccourci ou optimisé...
 
edit : ça c'était une réponse au post qui precede le "re salut".


Message édité par TotalRecall le 01-04-2004 à 19:40:03

---------------
Topic .Net - C# @ Prog
Reply

Marsh Posté le 01-04-2004 à 19:39:22    

cortex21 a écrit :

re salut!  
Aprés essais, scanf attend d'avoir reçus les 10 valeurs avant de bien vouloir passer à la fonction suivante :(


Je te l'ai dit dans mon post suivant ! Ca fait effectivement ça si on met un simple espace comme séparateur, par contre avec des virgules là c'est ok :??:

Code :
  1. scanf("%d, %d, %d, %d", &rep[0], &rep[1], &rep[2], &rep[3]);


Message édité par TotalRecall le 01-04-2004 à 19:40:40

---------------
Topic .Net - C# @ Prog
Reply

Marsh Posté le 01-04-2004 à 20:00:10    

cortex21 a écrit :

re salut!  
Aprés essais, scanf attend d'avoir reçus les 10 valeurs avant de bien vouloir passer à la fonction suivante :(


Je te propose quelque chose du genre (je sais je me fais chier) :

#include <stdio.h>
#include <stdlib.h>
 
#define  TAILLE_MAX  2000
 
int main(int nb_parametres, char* parametres[])
{
 char      chaine[TAILLE_MAX+1];
 char*     resultat=NULL;  /* Pointeur sur le caractère en cours de traitement  */
 long int  entier=0;       /* Entier !!! */
 char*     fin=NULL;       /* Pointeur sur le premier caractère non valide après le nombre lu */
 int       n=0;            /* Nombre d'entiers lus */
 
 fprintf(stdout, "Entrez une serie de nombre.\n>" );
 resultat=fgets(chaine, TAILLE_MAX, stdin);
 if (resultat != chaine)
  {
   fprintf(stderr, "Oups #1.\n" );
   exit(1);
  }
 
 while (1)
  {
   /* Positionement sur le premier chiffre */
   while ( (resultat[0] != '\0') && ( (resultat[0] < '0') || (resultat[0] > '9') ) ) resultat++;
   if (resultat[0] == '\0') break;
   /* Lecture de l'entier */
   entier=strtol(resultat, &fin, 10);
/*
   if ( (entier == LONG_MIN) || (entier == LONG_MAX) )
    {
     fprintf(stderr, "Oups #2.\n" );
     exit(1);
    }
*/
   if (resultat == fin)
    {
     fprintf(stderr, "Oups #3.\n" );
     exit(1);
    }
   /* Affichage */
   n++;
   fprintf(stderr, "Entier #%d : %d.\n", n, entier);
   resultat=fin;  
  }
 
 /* Fin */
 exit(0);
}


Tu peux rentrer le nombre d'entier que tu veux simplement à la fin de chque boucle, il te suffit de mettre à jour ton tableau et éventuellement de générer  une erreur si le nombre d'entiers saisis est trop grand ou si aucun entier n'est saisi.
 
Pour la partie en commentaire, c'est normalement pour gerer le cas d'entiers trop longs mais à la compilation ça ne passait pas ! :D
 
Exemple :

Entrez une serie de nombre.
>123456789123456789
Entier #1 : 2147483647.


Entrer une serie de nombre.
>1 4 5 lapin 4 5 tortue 785456 marm48ott2e
Entier #1 : 1.
Entier #2 : 4.
Entier #3 : 5.
Entier #4 : 4.
Entier #5 : 5.
Entier #6 : 785456.
Entier #7 : 48.
Entier #8 : 2.


 
La méthode n'est pas parfaite car elle tolère les caractères parasite entre les nombres. Mais ça ce corrige facilement en modifiant la condition du while de la boucle.
 
Il te reste encore un peu de travail ! :D
 
PS : En fait c'est du C et pas du C++.


Message édité par darkoli le 01-04-2004 à 20:02:57
Reply

Marsh Posté le 01-04-2004 à 20:26:04    

Merci pour votre aide.
Pour preciser ce que je cherche a faire :
le joueur a definie les parametres avant : nombre d'entiers et valeurs max qu'ils peuvent prendre.
Le but est de trouver un code au format configurer par le joueur.
par exemple si le joueur a choisi 4 colonne et des entier de valeurs max 5, on pourrai avoir une combinaison de ce genre : 1 3 5 4.
ensuite je compare la valeur entré par l'utilisateur à celle recherché et je lui indique le nombre d'entier bien placé et le nombre d'entier mal placé.
C'est le principe du Mastermind.
Pour une question de lisibilité et de pratique je voudrai que l'utilisateur puisse rentrer la combinaison de chiffre sur une seule ligne, et il faut que les entier soit stocké dans un tableau afin de pouvoir effectuer la comparaison.
 
Darkoli > ton programme semble tres bien fonctionné sous visual c++, mais comme ca depasse mes competences, pourrai tu me dire ce qu'il y a eventuellement a modifier pour recuperer les entier dans un tableau rep et pour que le nombre d'entier entré soit limité à la valeur d'une variable col deja definie?

Reply

Marsh Posté le 01-04-2004 à 20:50:26    

ami du mauvais C bonsoir


Message édité par Taz le 01-04-2004 à 20:50:53
Reply

Marsh Posté le 01-04-2004 à 20:50:26   

Reply

Marsh Posté le 01-04-2004 à 21:10:42    

a la base, c'est du c++ que j'utilise, je ne connait absolument rien au C :s

Reply

Marsh Posté le 01-04-2004 à 21:19:32    

ben tu inverse C et C++ dans ta phrase et ça ira

Reply

Marsh Posté le 01-04-2004 à 21:32:49    

euh oui là il est entierement en C ton programme...
(à part peut etre le commentaire :ange:)

Reply

Marsh Posté le 02-04-2004 à 07:07:15    

Effectivement, renseignement pris il s'agit bien de C, le C++ viendra plus tard. Quelqu'un pourrai m'expliquer la difference entre les deux juste par curiosité?


Message édité par cortex21 le 02-04-2004 à 07:10:43
Reply

Marsh Posté le 02-04-2004 à 07:18:42    

ben c'est 2 langages très différents, le C étant un tout petit sous ensemble du C++

Reply

Sujets relatifs:

Leave a Replay

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