Probleme tout bete avec while ! (je suis nb)

Probleme tout bete avec while ! (je suis nb) - C++ - Programmation

Marsh Posté le 27-08-2005 à 16:26:34    

Voilà j'ai un tout petit probleme avec mon code
 
 
include<iostream>
int main()
{
char roro[4]="   ";
 
 
 
while(roro != "oui" && roro != "non" )
{
cin >>roro;
}
 
  return 0;
}
 
 
j'ai un soucis pour sortir de la boucle while, normalement, si je tape oui ou non je devrai sortir de la boucle ! mais impossible !!  :ouch:  
 
evidemment vous allez tout de suite trouver le truc qui vas pas car je connais presque rien en c mais j'avoue que c'est le premier langage qui me pose tant de soucis pour comprendre les choses basique !
 
Bon vous allez me dire que je peux utiliser les bool etc, mais j'aimerai savoir pourquoi avec ma technique ça ne marche pas  :ouch:

Reply

Marsh Posté le 27-08-2005 à 16:26:34   

Reply

Marsh Posté le 27-08-2005 à 16:29:15    

Tu ne peux pas faire ça, on ne peux pas faire de comparaison de cette manière avec des char ...
- Soit tu utilises strnicmp()
- soit tu utilises la SL, donc des string et tu peux faire ce genre de comparaison il me semble.


Message édité par cricri_ le 27-08-2005 à 16:29:30
Reply

Marsh Posté le 27-08-2005 à 17:26:09    


 
Pour savoir pourquoi ta technique ne marche il suffit de lire n'importe quel bouquin correct sur le C++. [:spamafote]

Reply

Marsh Posté le 27-08-2005 à 17:31:13    


Tu viens probablement de langages haut niveau (Java? VB?) dans lesquels les chaînes de caractères sont des types à part entière.
 
Le C/C++ est un langage de beaucoup plus bas niveau, une chaîne "de base" n'en est pas une, c'est un tableau de caractères fini par le caractère '\0', et l'une des sources d'emmerdes. Il existe des libs (comme la Standard Template Library avec son std::string) avec des implémentations plus complètes des chaînes, mais ce sont des extensions du langage
 
Un conseil: ne te lance pas de cette manière dans le langage, tu vas te planter, reprend tout à 0 après avoir consciencieusement oublié tous tes anciens mécanismes.
 
Et vas te ballader dans les bibliolinks


Message édité par masklinn le 27-08-2005 à 17:31:35

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 27-08-2005 à 17:38:22    

euh niorai pas un chti # avant le include <iostream> ??

Reply

Marsh Posté le 27-08-2005 à 17:57:06    

masklinn a écrit :

Tu viens probablement de langages haut niveau (Java? VB?) dans lesquels les chaînes de caractères sont des types à part entière.
 
Le C/C++ est un langage de beaucoup plus bas niveau, une chaîne "de base" n'en est pas une, c'est un tableau de caractères fini par le caractère '\0', et l'une des sources d'emmerdes. Il existe des libs (comme la Standard Template Library avec son std::string) avec des implémentations plus complètes des chaînes, mais ce sont des extensions du langage


 
string n'a jamais fait parti de la STL. Ce n'est pas un type fondamental, mais c'est *intégré* au langage C++.
De la à dire que c'est la panacé ...

Reply

Marsh Posté le 27-08-2005 à 18:21:18    

++fab a écrit :

string n'a jamais fait parti de la STL. Ce n'est pas un type fondamental, mais c'est *intégré* au langage C++.
De la à dire que c'est la panacé ...


 [:f@bek]  
 
Le C++ n'avait pas de string dans le namespace global la dernière fois que j'ai regardé (je peux me planter, taz si tu passes n'hésite pas à me corriger), seulement des char * comme en C, raison pour laquelle on a 12000 implémentation différentes de wrappers de chaines de caractères, l'une d'entre elles étant le "std::string" de la STL, résidant dans le namespace std.
 
Il est vrai que je me suis planté sur la standardisation puisque la stl est standard et censée être disponible dans toutes les implémentations (enfin je crois [:petrus dei]), mais ça reste une composante de la STL [:spamafote]


Message édité par masklinn le 27-08-2005 à 18:23:43

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 27-08-2005 à 18:23:03    

masklinn a écrit :

[:f@bek]  
 
Le C++ n'a pas de strings, il n'y


tab owned  :o


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 27-08-2005 à 18:44:22    

EDITED (ou plutot CENSURED)
EDIT2: Il me semble qu'historiquement, ça s'est fait dans un ordre bizarre tout ça. Enfin peu importe.
 
Le fait que ça se trouve dans std, c'est parce que ce n'est pas un type fondamental du C++, mais un composant de la bibliotheque standard, ce qui est très différent de "extension du langage"


Message édité par ++fab le 27-08-2005 à 19:09:06
Reply

Marsh Posté le 27-08-2005 à 19:05:21    

A ouaip. M'étais jamais posé la question, en fait... En même temps ca change pas grand chose, vu que les 2 _sont_ disponibles avec tout compilo C++ qui veut ce nom  :D  
 
http://www.msoe.edu/eecs/cese/resources/stl/
http://www.sgi.com/tech/stl/table_of_contents.html

Reply

Marsh Posté le 27-08-2005 à 19:05:21   

Reply

Marsh Posté le 27-08-2005 à 19:23:12    

voila, merci.  
basic_string ne faisait pas parti à l'origine de la STL, mais aujourd'hui, ça parait difficile à croire quand on visite le site de SGI.

Reply

Marsh Posté le 27-08-2005 à 21:57:56    

Merci pour toutes ces reponses !!!
 
j'ai finalement remplacé
while(roro != "oui" && roro != "non" )
 
par
 
while (strcmp("oui",roro)!=0 && strcmp("non",roro)!=0)
 
 
 
et ça marche ! Sauf que si on met un mot de plus de 3 caracteres dans roro[4], mon programme devient instable et je le comprend car roro[4] est fais pour retenir 3 caractere + le caractere de fin de chaine. MAis le c++ ne verifie et continue d'ecrir dans roro[4] meme si il n'y a plus de place ce qui efface la memoire ailleur...
 
Mais j'ai trouvé la parade, c'est d'analyser caractere par caractere ce qui donne :
 
 
 
while (strcmp("oui",roro)!=0 && strcmp("non",roro)!=0)
 
{
for(int x=0;x<3;x++)
{
cin>> roro[x];
}
 
}
 
 
Et là impecable, mon programme est stable !  
Par contre j'ai un petit soucis au niveau pratique.. si j'ecris le mot "salut", mon programme retiens "sal" mais garde en mémoire "ut" pour la prochaine saisie !!! ce qui est tres moyen !!!
 
car si j'ecris "salut" puis "non", le programme vas lire "sal" et "utn", et il vas pas quitter la boucle !!!
 
 
en reflechissant bien et en regardant sur google, j'ai tester la technique du vidage de buffer  ce qui donne :
 
while (strcmp("oui",roro)!=0 && strcmp("non",roro)!=0)
 
{
for(int x=0;x<3;x++)
{
cin>> roro[x];
}
fflush(stdin);
}
 
 
 
voilà j'ai rajouté fflush(stdin)
 
et maintenant impecable je peux dire salut puis non, et le programme vas comprendre "sal" et "non"
PArfait
 
Sauf que il y a un autre probleme
 
si je tape "g" puis "non", le programme vas comprendre "gno"
 
et là a priori, il n'y a pas vraiment de solution a ce probleme sauf si j'utilise le temps.
je m'explique
 
si je remplace
while (strcmp("oui",roro)!=0 && strcmp("non",roro)!=0)
 
{
for(int x=0;x<3;x++)
{
cin>> roro[x];
}
fflush(stdin);
}
 
 
par  
 
 
while (strcmp("oui",roro)!=0 && strcmp("non",roro)!=0)
 
{
for(int x=0;x<3;x++)
{
cin>> roro[x];
if x==0 { là je recupere l'heure que je met sous une variable y}
if x!=0 { si l'heure actuel depasse de plus d'1 seconde y, alors je fflush et x vaut 0}
}
fflush(stdin);
}
 
 
ça devrait marcher mais je trouve cette methode extremment brouillonne. enfn bon, je sens deja que vous allez rigoler, car y a surement une solution toute bete lol...
 
pour la culture personnelle c'est quoi en c++ la fonction qui permet d'avoir une heure precise au millieme de seconde ?

Reply

Marsh Posté le 27-08-2005 à 22:21:49    

A défaut d'avoir un bon bouquin de C++, tu m'as l'air débrouillard et malin, c'est déjà ça. :D
 
La solution en C++ pour faire ce que tu veux : utiliser std::string.
 


#include <iostream>
#include <string>
int main()
{
    std::string roro;
    while (roro != "oui" && roro != "non" )
        std::cin >> roro;
}


 
La solution en C (ou en mauvais C++ si tu préfères :D) est moins triviale mais n'est pas celle que tu as donnée.
 
Note : si ce que tu veux c'est que l'utilisateur entre sur une ligne rien d'autre que "oui" ou "non", tu peux utiliser getline. Mais bon je vais me répéter : achète un bon bouquin sur le sujet. :D


Message édité par Profil supprimé le 27-08-2005 à 22:37:09
Reply

Marsh Posté le 28-08-2005 à 10:52:09    

oui, achète le Deitel & Deitel, j'ai lu que celui la, et c'est le meilleur livre de tous les temps, et meme de l'univers. D'ailleurs, une fois que tu l'aura lu, tu ne sera meme pas tenté d'en voir un autre, tu saura tout sur tout.
 
OK, je --->[] :D

Reply

Marsh Posté le 01-09-2005 à 15:39:53    

Citation :

#include <iostream>  
#include <string>  
int main()  
{  
    std::string roro;  
    while (roro != "oui" && roro != "non" )  
        std::cin >> roro;  
}


 
ça c'est magnifique ! c'est un peu la reponse que j'attendais ! seulement ça bug un peu des que je met des espace :/
 
Par exemple si je tape "salut toi tu veux que je te dise oui"
 
le programme vas comprendre "salut" puis "toi" puis "tu" puis " veux" etc jusqu'a "oui" et on vas sortir de la boucle, alors qu'on a pas dit "oui" tout court
 
alors j'ai utilisé getline comme tu m'a dit :
 
 
 
j'ai essayer :

Citation :

#include<iostream>
#include<string>
 
using namespace std;
 
int main()
{
string roro;
 
    while (roro != "oui" && roro != "non" )
{
 
 cin.getline (roro,sizeof(roro),'\n')  ;
 
}
 
 
return 0;
}


mais ça ne veut pas compiler, dev c++ me dit :
no matchning function for call to '_IO_istream_withassign::getline (string&,unsigned  int,char)'
 
bon je me dit, que getline ça doit pas marcher quand on initialise la variable avec string...
 
donc je vais initialiser avec char
 
ce qui me donne :
 

Citation :

#include<iostream>
 
 
using namespace std;
 
int main()
{
 
char roro[3+1];
 
    while (roro != "oui" && roro != "non" )
{
 
 
 cin.getline (roro,sizeof(roro),'\n')  ;
 
}
 
return 0;
}


là ça a l'air de marcher sauf si je tape plus de 3 caractere ! ça vas tout fair buguer et je vais pas pouvoir sortir de la boucle !  :sweat:  
 
donc en gros j'y arrive toujours pas  :(  
 
on m'a preté le livre c++ pour les nuls mais je le trouve tres mal fait, ils utilisent encore iostream.h, et y a toujours des petits trucs comme ce que je vous montre qui m'echappe completement...
 
j'ai aussi tenté de telecharger les sources de petits programmes qu'on fait les gens sur internet, mais c'est tres mal codée et confondent c et c++...
 
donc ce WE je vais surement acheter un livre sur C++ (deitel&deiteil peut etre si on me conseille ce livre), mais bon, en faite il me faudrai un bon livre avec toutes les fonctions leurs description, leurs syntaxes et leurs librairie requises.
 
et j'ai aussi entendu dire que certaines personne avait fais des librairies tres bien optimisé un peu plus haut haut niveau que le c++ d'origine, donc, ça pourrai etre plus simple, et plus rapide de programmer, encore faut-il connaitre ces librairies donc si y a un livre qui les references toutes ce serait génial :)


Message édité par Profil supprimé le 01-09-2005 à 15:43:59
Reply

Marsh Posté le 01-09-2005 à 16:20:39    

les **** qui font du C, dehors !
 

Code :
  1. string line;
  2. while(getline(cin, line) && line != "non" && line != "oui" )
  3. {
  4.   // faire semblant de travailler
  5. }

Reply

Marsh Posté le 03-09-2005 à 18:49:41    

taz ! incroyable c'est exactement ça ! en plus c'est tres court et bien programmé je trouve !!!
 
http://www.merrittsbakery.com/party/IMAGES/eimages/spinning%20taz.jpg%20
 
d'ailleur je trouve bizzare que ça marche, car getline c'est pour recuperer des caracteres non ?
 
getline(nom de la chaine de caractere, nombre de caractere a retenir) ...  
 
or là logiquement je comprend pas comment le compilateur se debrouille en voyant ça  
 
string line;  
while(getline(cin, line)
{
}
 
logiquement je trouve ça inexpliquable... limite ça veut rien dire c'est un truc a savoir par coueur ça que  
 
string fezzeff
while(getline(cin,fezzeff)
{
}
permet de recuperer des phrases completes...  
 
ou alors sans doute je comprend mal ce que signifie getline en detail...
car getline(cin,fezzeff) met la chaine de caractaire dans fezzeff: chose que j'ai du mal a concevoir aussi :/
 
je vous cache pas c'est quand meme baleze le c++ !
 
en tout cas merci taz et maintenant je saurai le refaire sans hésiter meme si j'ai un peu de mal a comprendre le vrai fonctionnement de ce petit bout de code :/


Message édité par Profil supprimé le 03-09-2005 à 18:55:14
Reply

Marsh Posté le 03-09-2005 à 19:01:59    

ça a rien a voir d'être baleze, tu peux avoir plusieures variantes pour la même fonction, suivant comment tu l'appelles.
 
style:
 
bool foo( int a )
{
...
}
 
bool foo( float *b, int b_size )
{
}
 
ce qui permet d'écrire:
 
int z;
 
if( foo( z ) )
{
 ....
}
 
 
ou:
 
float TAB[100];
 
if( foo( TAB, 100 ) )
{
  .....
}
 
car le compilo choisira le bon foo()
 
pour getline c'est pareil.
d'autant plus que cin.getline() et getline(cin...), c'est pas pareil.


Message édité par bjone le 03-09-2005 à 19:05:37
Reply

Marsh Posté le 03-09-2005 à 20:27:03    

le proto complet simplifié, c'est
 
istream & getline(istream &, string &, const char * = "\n" );
 
le dernier argument permet de spécifier le délimiteur de ligne. l'istream passé en référence est retourné pour pouvoir écrire
 
if (getline( ))
 
en effet les streams ont des opérateurs qui permettent l'évaluation dans un context booléen, à utiliser systématiquement pour faire de la vérification d'erreur. par exemple
 
while (cin >> mot) ...
 
est tout à fait valide et une très bonne écriture. Recommandé.

Reply

Marsh Posté le 03-09-2005 à 20:28:12    

Citation :

tu peux avoir plusieures variantes pour la même fonction, suivant comment tu l'appelles.


 
 
ok merci :))) en gros c'est normale que j'ai pas pu trouver tout seul
 
string line;  
while(getline(cin, line)  
{  
}  
 
malgré que je connaissais la fonction getline :)
 
en gros c'est comme le dictionnaire un mot peut avoir plusieur definition :)

Reply

Marsh Posté le 03-09-2005 à 20:38:23    

non. ici, tu mélanges std::getline et std::istream::getline. Il n'y a pas de surcharge. Même s'il y a surcharges, puisqu'on utilise le même nom, on garde la même sémantique (même définition dans le dictionnaire), seul l'usage change.

Reply

Marsh Posté le 06-09-2005 à 16:16:39    

J'avoue que j'ai un peu de mal a suivre, j'ai pas assez de pratique en c++:/
En tout cas taz tu m'aide bien, d'autant que j'ai regardé tes post, et ça m'a appris certaines choses :) malheuresement y a beaucoup de chose qui me depasse :/
 
d'ailleur il y a des choses qui me chatouille...
 
pour faire une pause,j'utilise :
 
string fzf;
getline(cin,fzf);
 
mais n'est-ce pas un peu brouillon ?
 
le system("pause" ) est quand a lui une mavaise solution d'apres ce que j'ai compris.
y a le getch() mais c'est mauvais aussi...
 
 
 
et pour les chiffre aléatoire d'apres ce que j'ai compris la fonction rand() envoie un chiffre compris entre 0 et RAND_MAX... question : rand max vaut -t-il toujours 32767 ou ça peut dependre du pc ?
 
et finalement si je veux avoir un nombre aleatoire compris entre 0 et 999999999, le plus simple c'est pas de tirer 9 chiffres ? (un chiffre pour chaque emplacement)
 
par contre là, je suis encore bloqué... j'arrive pas a faire un tel programme (qui me semble extremement basique...)
 
j'ai pensé a faire
 
un programme de ce type :
 
 
#include<iostream>
#include<time.h>
int main()
{
srand(time(NULL));
for {int x=0;x<9;x++)
{
cout<<rand()*10/(RAND_MAX+1);
}
return 0;
}
 
evidemment ça vas m'afficher un nombre compris entre 0 et 999999999 mais je sais pas recuperer la valeur... en faite ce qu'il me manque c'est que je sais pas transformer un nombre en une string et un string en nombre je pense... une fois que je saurai faire ça je pense que j'aurai une petite idée en tete, mais quelqu'un a une autre methode peut etre?
 
 
j'ai une autre question jai fais un programme où il faut taper la bonne touche que l'ordinateur indique avant 1sec.
 
 
#include <iostream>
#include <windows.h>
int main
{
string pausino
char tareponse=' ';
 
 
 
while (tareponse != char(caracteredelordi))
{
 
cout<<"reproduit ce caractere"<<endl;
int caracteredelordi=rand()*255/32768;
 
cout<< char(caracteredelordi)<<endl;
int tempsavant=GetTickCount();
cin>>tareponse;
 if (tareponse == char(caracteredelordi))
 {
 int tempsapres=GetTickCount();
 cout<<"CORECT reponse taper en "<<tempsapres-tempsavant<<" ms \n";
  if (tempsapres <= tempsavant+1000)
  {
  cout<<"EN PLUS TU ES RAPIDE"<<endl;
  }
  else
  { cout<<"mais tu as repondu trop tard"<<endl; tareponse=' ';}
 
 
 }
  else
 {
 cout<<"T UNE GROSSE KICHE"<<endl;
 }
getline(cin,pausino);
}
 
 
 
 
cout<<"RESPECT TU AS GAGNER LE DROIT DE QUITTER LE PROGRAMME"<<endl;
 
cout<<"program finished";
 
getline(cin,pausino);
 
 
 
return 0;
}
voilà, en gros j'ai l'impression d'avoir codé ce programme tres tres mal, deja le GetTickCount est-il disponible que dans windows? je veux dire par là est-ce que ce programme tournera sur linux?
 
ensuite outre le petit bug qui fais que si l'ordinateur choisi le nombre qui correspond au char ' ', il suffit de taper n'importe quel touche pour gagner... (car on a faux mais le soft le remplace automatiquement par ' '..
mais le probleme n'est pas ça,
 
c'est par exemple si je tape sur mon clavier GDSGDG
y a pas de risque que la variable char soit surstocké ? (char n'est fais pour contenir qu'un seul caractere non ?)
 
en faite je n'aime pas beaucoup utiliser les char
 
je prefere nettement utiliser les string c'est moins compliqué a gerer ou tout du moins plus facile a prevoir leurs comportement quand on est debutant...
 
par contre j'arrive pas a trouver defonction equivalente a char(int unnombreaupif)
 
string(int unbombreaupif) ne marche pas :/
 
bon,bah voilà et vraiment quel nb je suis j'ai un peu honte de poser des question ici, surtout a coté du grand tazounet lol :))

Reply

Marsh Posté le 06-09-2005 à 17:19:38    


Ca ne fait que lancer la commande 'pause' qui n'est pas, a priori, presente sur tout systeme. C'est un probleme de portabilite. De toutes manieres, des que tu utilises la fonction system, tu t'exposes a ce genre de problemes. Pour vider l'ecran par exemple. Sous linux, c'est clear, sous dos c'est cls. On peut utiliser un #ifdef pour switcher de l'un a l'autre au moment de la compilation en fonction du systeme sur lequel on se trouve, mais tu ne gagnes pas ton independance pour autant, tu te contentes alors de ne plus distinguer windows et linux.  
 
 
oui, c'est extremement basique en effet : tu mets une variable a zero. tu parcours ta chaine de caracteres de gauche a droite.  
 
Tu recuperes le nombre associe au chiffre, tu l'ajoutes a ta variable. (en faisant par exemple, a = c - '0';)
Tu passes au chiffre suivant, si il y en a un, tu multiplies ta variable par dix.
 
... et tu recommences tant qu'il y a des chiffres a lire.
 
Maintenant instinctivement je me mefie de cette methode pour tirer un nombre au hasard, mais a y regarder une seconde fois ca a l'air correct.

Reply

Marsh Posté le 07-09-2005 à 14:21:13    

int valeurch=0;
for (int x=0;x<9;x++)
{
int randomatic=rand()*10/(RAND_MAX+1) ;
valeurch=randomatic*(pow(10,(8-x))) +valeurch;
}
cout<<valeurch;
 
 
ça marche mais j'ai l'impression que c'est programmé comme un torchon, c'est la premiere fois que je voie ça dans un langage qu'il faut bidouiller autant pour avoir un truc simple, limite dans les langages plus haut niveau ce serai 10X plus rapide en vitesse d'execution...
 
 


Message édité par Profil supprimé le 07-09-2005 à 14:24:27
Reply

Marsh Posté le 07-09-2005 à 14:28:52    


Euh non, c'est 10 fois plus rapide à coder et 10 fois plus lent à exécuter, c'est la base même de la notion de "niveau" pour un langage [:petrus75]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 07-09-2005 à 21:36:45    


C'est pas parce que ca a l'air complique que ca va forcement mettre plus longtemps a s'executer. De toutes manieres c'est deja un truc similaire qui se passe en interne avec les langages de plus haut niveau lorsque tu convertis un string en integer, sauf que tu ne le vois pas.
 
Ton algorithme peut cependant etre simplifie : tu n'es pas oblige de recalculer la puissance de 10 a chaque fois.

Code :
  1. int valeurch=0;
  2. for(int x=0;x<9;x++)
  3. {
  4. valeurch *= 10;
  5. valeurch += rand()*10/(RAND_MAX+1);
  6. }
  7. cout<<valeurch;


Message édité par Ace17 le 07-09-2005 à 21:37:42
Reply

Marsh Posté le 07-09-2005 à 22:55:33    

rand()*10/(RAND_MAX+1);
 
faut faire du calcul flottant, sinon le résultat est pas terrible.
 
* 10.0f

Reply

Marsh Posté le 08-09-2005 à 04:41:14    

merci bien:))
 
j'ai enfin créer un premier programme en a peine 100 lignes de codes...
en faite c'est un petit jeu en texte, où on achete et vends une action. c'est basique mais c'est marrant.. en faite y a pas trop de but lol mais bon on vas dire parce que c'est la premiere version..
 
version executable :
http://www.membres.lycos.fr/zouave321/Bourse321.exe
 
code source:
http://membres.lycos.fr/zouave321/Bourse321-.cpp


Message édité par Profil supprimé le 08-09-2005 à 04:48:13
Reply

Marsh Posté le 08-09-2005 à 15:53:07    

cool, on est dans les credits! :)


Message édité par Ace17 le 08-09-2005 à 15:53:16
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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