Petit Problème

Petit Problème - C++ - Programmation

Marsh Posté le 11-11-2016 à 14:07:31    

Bonjour à tous. Récemment je me suis mis à approfondir mes aptitudes en C++ et je commence par une Pierre Feuille Ciseau en texte dans la console mais j'ai un petit souci:
 
Le code est le suivant:
 

Spoiler :

#include <iostream>
#include <stdlib.h>
using namespace std;
 
int main(){
    int a=0;
    int b=0;
    int c=0;
    int e=0;
    int f=0;
    int j=0;
    int i;
    string sign;
    cout << "Bienvenu.";
    Jeu:{
        cout << "Choisis ton signe: nn";
        cout << "  Pierre n";
        cout << "  Feuille n";
        cout << "  Ciseaux nn";
        cout << "n Quel est ton signe? ";
        cin >> sign;
        for(i=0; i<4; i++){
                cout << "nnnnnnnnnnnn";
        }
        if sign = "Pierre"{
            a=1;
            }
        if sign = "Feuille"{
            a=2;
            }
        if sign = "Ciseaux"{
            a=3;
            }
        b = rand() % 3 + 1;
 
}    return 0;
}


 
Le soucis est que je n'arrive pas à nettoyer l'écran (j'évite d'utiliser les commandes system)  et que j'ai le message "error: expected '(' before 'sign'" dans les trois lignes du if.
 
J'ai essayé en ajoutant/enlevant accolades ou parenthèses mais rien ne résolu le problème. Merci beaucoup.


---------------
Tout le monde est un génie. Mais si on juge un poisson sur sa capacité à grimper à un arbre, il passera sa vie à croire qu’il est stupide. – Albert Einstein
Reply

Marsh Posté le 11-11-2016 à 14:07:31   

Reply

Marsh Posté le 11-11-2016 à 17:26:36    

= est un opérateur d'affectation. Dans tes if, tu voulais utiliser == qui est l'opérateur de comparaison
 

Code :
  1. if (sign == "Pierre" )
  2. {
  3. // ...
  4. }


---------------
last.fm
Reply

Marsh Posté le 11-11-2016 à 18:04:29    

theshockwave a écrit :

= est un opérateur d'affectation. Dans tes if, tu voulais utiliser == qui est l'opérateur de comparaison

 



Code :
  1. if (sign == "Pierre";)
  2. {
  3. // ...
  4. }


Ah d'accord l'erreur de débutant :(

 

Merci beaucoup :)

 

J'avais oublié les parenthèses aussi


Message édité par ryngetsu le 11-11-2016 à 18:21:55

---------------
Tout le monde est un génie. Mais si on juge un poisson sur sa capacité à grimper à un arbre, il passera sa vie à croire qu’il est stupide. – Albert Einstein
Reply

Marsh Posté le 11-11-2016 à 18:27:22    

Grâce à toi j'ai avancé mais j'ai un autre soucis, bien qu'il soit mineur cette fois:

 
Code :
  1. #include <iostream>
  2. #include <stdlib.h>
  3. using namespace std;
  4. int main(){
  5.     int a=0;
  6.     int b=0;
  7.     int c=0;
  8.     int e=0;
  9.     int f=0;
  10.     int j=0;
  11.     int i;
  12.     string sign;
  13.     cout << "Bienvenu.";
  14.     Jeu:{
  15.         cout << "Choisis ton signe: \n\n";
  16.         cout << "  Pierre \n";
  17.         cout << "  Feuille \n";
  18.         cout << "  Ciseaux \n\n";
  19.         cout << "\n Quel est ton signe? ";
  20.         cin >> sign;
  21.         for(i=0; i<12; i++){
  22.                 cout << "\n\n\n";
  23.         }
  24.         if (sign == "Pierre" ){
  25.             a=1;
  26.             }
  27.         if (sign == "Feuille" ){
  28.             a=2;
  29.             }
  30.         if (sign == "Ciseaux" ){
  31.             a=3;
  32.             }
  33.         b = rand() % 3 + 1;
  34.         cout << "Vous avez joué: ";
  35.         if (a == 1){
  36.             cout << "Pierre.";
  37.         }
  38.         if (a == 2){
  39.             cout << "Feuille";
  40.         }
  41.         if (a == 3){
  42.             cout << "Ciseaux";
  43.         }
  44. }    return 0;
  45. }
 

Au lieu de "Vous avez joué: " la console m'affiche "Vous avez jouÚ: ". merci encore :)

Message cité 1 fois
Message édité par ryngetsu le 11-11-2016 à 18:28:26

---------------
Tout le monde est un génie. Mais si on juge un poisson sur sa capacité à grimper à un arbre, il passera sa vie à croire qu’il est stupide. – Albert Einstein
Reply

Marsh Posté le 11-11-2016 à 19:14:14    

C'est un problème d'encodage. La table de caractères de ton éditeur de texte n'est pas la même que la table de caractères utilisée par ta console.

 

Si tu te restreins aux seuls caractères de la table ASCII, tu éviteras ce genre de souci (mais tu n'auras pas droit aux accents)


Message édité par theshockwave le 11-11-2016 à 19:14:37

---------------
last.fm
Reply

Marsh Posté le 11-11-2016 à 20:12:56    

Le fait qu'il m'affiche un Ú veut surement dire qu'il y a aussi un caractère qui sera remplacé par é une fois compilé. Comment je trouve ce caractère?


---------------
Tout le monde est un génie. Mais si on juge un poisson sur sa capacité à grimper à un arbre, il passera sa vie à croire qu’il est stupide. – Albert Einstein
Reply

Marsh Posté le 11-11-2016 à 22:42:39    

Code :
  1. #include <iostream>
  2. #include <stdlib.h>
  3. using namespace std;
  4. int main(){
  5.     int a=0;
  6.     int b=0;
  7.     string finir;
  8.     int e=0;
  9.     int f=0;
  10.     int j=0;
  11.     int i;
  12.     string sign;
  13.     cout << "Bienvenu.";
  14.     Jeu:{
  15.         cout << "Choisis ton signe: \n\n";
  16.         cout << "  Pierre \n";
  17.         cout << "  Feuille \n";
  18.         cout << "  Ciseaux \n\n";
  19.         cout << "\n Quel est ton signe? ";
  20.         cin >> sign;
  21.         for(i=0; i<12; i++){
  22.                 cout << "\n\n\n";
  23.         }
  24.         if (sign == "Pierre" ){
  25.             a=1;
  26.             }
  27.         if (sign == "Feuille" ){
  28.             a=2;
  29.             }
  30.         if (sign == "Ciseaux" ){
  31.             a=3;
  32.             }
  33.         b = rand() % 3 + 1;
  34.         cout << "Vous avez joué: \n";
  35.         if (a == 1){
  36.             cout << "Pierre.\n";
  37.         }
  38.         if (a == 2){
  39.             cout << "Feuille.\n";
  40.         }
  41.         if (a == 3){
  42.             cout << "Ciseaux.\n";
  43.         }
  44.         cout << "Votre adversaire a joué: \n";
  45.         if (b == 1){
  46.             cout << "Pierre.\n\n";
  47.         }
  48.         if (b == 2){
  49.             cout << "Feuille.\n\n";
  50.         }
  51.         if (b == 3){
  52.             cout << "Ciseaux.\n\n";
  53.         }
  54.         if (a == b){
  55.             j = 0;
  56.             cout << "Match Nul.\n";
  57.         }
  58.         if (a == 1 & b == 2){
  59.             f = f+1;
  60.             j = j+1;
  61.             cout << "Vous avez perdu.\n";
  62.         }
  63.         if (a == 1 & b == 3){
  64.             e = e+1;
  65.             j = 0;
  66.             cout << "Vous avez gagné.\n";
  67.         }
  68.         if (a ==2 & b == 1){
  69.             e = e+1;
  70.             j = 0;
  71.             cout << "Vous avez gagné.\n";
  72.         }
  73.         if (a == 2 & b == 3){
  74.             f = f+1;
  75.             j = j+1;
  76.             cout << "Vous avez perdu.\n";
  77.         }
  78.         if (a == 3 & b == 1){
  79.             f = f+1;
  80.             j = j+1;
  81.             cout << "Vous avez perdu.\n";
  82.         }
  83.         if (a == 3 & b == 2){
  84.             e = e+1;
  85.             j = 0;
  86.             cout << "Vous avez gagné.\n";
  87.         }
  88.         if (j >= 3){
  89.             cout << "T'es à chier.\n";
  90.         }
  91.         cout << "\n Nombre de victoires: ";
  92.         cout << e;
  93.         cout << "\n Nombre de défaites: ";
  94.         cout << f;
  95.         cout << "\n\n Voulez-vous rejouer? ";
  96.         cin >> finir;
  97.         if (finir == "Oui" ){
  98.             cout << "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n";
  99.             goto Jeu;
  100.         }
  101.         else{
  102.             return 0;
  103.         }
  104. }
  105. }


 
Je laisse ça là si quelqu'un veut l'essayer ou changer quelque chose.
 
Je me demande bien comment je pourrais optimiser ce code...


---------------
Tout le monde est un génie. Mais si on juge un poisson sur sa capacité à grimper à un arbre, il passera sa vie à croire qu’il est stupide. – Albert Einstein
Reply

Marsh Posté le 12-11-2016 à 01:04:37    

ryngetsu a écrit :

Le fait qu'il m'affiche un Ú veut surement dire qu'il y a aussi un caractère qui sera remplacé par é une fois compilé. Comment je trouve ce caractère?


Le problème, c'est que tu n'as pas de garantie sur la table de caractères utilisée par la personne qui exécutera ton programme.
Donc oui, tu peux trouver quel caractères te donnera un "é" dans ton cas, mais ce ne sera pas standard et pas portable, d'où ma recommandation d'éviter ces caractères, pour t'assurer que tes messages seront lisibles par tous.


---------------
last.fm
Reply

Marsh Posté le 12-11-2016 à 01:09:08    

ryngetsu a écrit :

Je me demande bien comment je pourrais optimiser ce code...


 
Très honnêtement, pour un programme de ce genre, il n'y a aucune raison de se demander comment l'optimiser : ton processeur va se tourner les pouces en permanence en attendant les entrées de ton utilisateur.
Par contre, en terme de maintenabilité, tu as quelques options qui se présentent à toi.
 
Commence par identifier les blocs de logique et les mettre sous forme de fonction, par exemple, plutôt que d'avoir l'intégralité de ton programme directement dans ta fonction main.
Ton "goto Jeu" est quelque chose que n'importe quel programmeur professionnel te dira immédiatement de retirer. Tu peux sans doute exprimer ta boucle de jeu de manière plus élégante.
 
Une suggestion : essaye de décrire dans une manière un peu abstraite le déroulement d'une partie, ca devrait te guider sur la construction de ton code.


---------------
last.fm
Reply

Marsh Posté le 12-11-2016 à 02:01:03    

theshockwave a écrit :


Le problème, c'est que tu n'as pas de garantie sur la table de caractères utilisée par la personne qui exécutera ton programme.
Donc oui, tu peux trouver quel caractères te donnera un "é" dans ton cas, mais ce ne sera pas standard et pas portable, d'où ma recommandation d'éviter ces caractères, pour t'assurer que tes messages seront lisibles par tous.

Sauf que des textes français sans accents c'est pas beau. :(  
Perso j'utilise la méthode de mettre le bon code en écriture héxa. Le problème c'est que le compilateur va râler car parfois il ne voit pas où se termine le code héxa, genre "méchant" --> "m\x82chant" avec c qui est une valeur héxa valide. Ma solution c'est de rajouter des guillemets "m""\x82""chant", le processeur va réunir les chaînes de caractères au moment de la compilation. C'est du bricolage (et je n'ai testé qu'en C, pas C++) qui risque de ne pas fonctionner selon les encodages utilisés mais à l'époque ça avait réglé mon problème.
 
è ""\x8A""
é ""\x82""
â ""\x83""
ä ""\x84""
à ""\x85""
ç ""\x87""
ù ""\x97""
ê ""\x88""
 
C'est le codepage 437 je crois (-->Wikipédia).
 
Après il doit y avoir un moyen de modifier l'encodage de la console avec les fonctions du système d'exploitation voire avec la bibliothèque standard peut-être.

Reply

Marsh Posté le 12-11-2016 à 02:01:03   

Reply

Marsh Posté le 12-11-2016 à 08:43:21    

theshockwave a écrit :


 
Très honnêtement, pour un programme de ce genre, il n'y a aucune raison de se demander comment l'optimiser : ton processeur va se tourner les pouces en permanence en attendant les entrées de ton utilisateur.
Par contre, en terme de maintenabilité, tu as quelques options qui se présentent à toi.
 
Commence par identifier les blocs de logique et les mettre sous forme de fonction, par exemple, plutôt que d'avoir l'intégralité de ton programme directement dans ta fonction main.
Ton "goto Jeu" est quelque chose que n'importe quel programmeur professionnel te dira immédiatement de retirer. Tu peux sans doute exprimer ta boucle de jeu de manière plus élégante.
 
Une suggestion : essaye de décrire dans une manière un peu abstraite le déroulement d'une partie, ca devrait te guider sur la construction de ton code.


Merci les gars je commence à comprendre. Je vais essayer de faire ça en héxadécimal.
 
Pour l'optimisation, c'est pas une question de CPU même si ça le sera dans des programmes plus avancés, c'est plutôt une question d'apprendre à faire un code plus rapide et surtout plus lisible et moins lourd.
 
J'avais vu que le Goto est une mauvaise chose mais je savais pas comment l'éviter et je suis en train de chercher un moyen d'avoir les scores affichés en permanence.


---------------
Tout le monde est un génie. Mais si on juge un poisson sur sa capacité à grimper à un arbre, il passera sa vie à croire qu’il est stupide. – Albert Einstein
Reply

Marsh Posté le 12-11-2016 à 15:14:27    

rat de combat a écrit :

Sauf que des textes français sans accents c'est pas beau. :(  
Perso j'utilise la méthode de mettre le bon code en écriture héxa. Le problème c'est que le compilateur va râler car parfois il ne voit pas où se termine le code héxa, genre "méchant" --> "mx82chant" avec c qui est une valeur héxa valide. Ma solution c'est de rajouter des guillemets "m""x82""chant", le processeur va réunir les chaînes de caractères au moment de la compilation. C'est du bricolage (et je n'ai testé qu'en C, pas C++) qui risque de ne pas fonctionner selon les encodages utilisés mais à l'époque ça avait réglé mon problème.
 
è ""x8A""
é ""x82""
â ""x83""
ä ""x84""
à ""x85""
ç ""x87""
ù ""x97""
ê ""x88""
 
C'est le codepage 437 je crois (-->Wikipédia).
 
Après il doit y avoir un moyen de modifier l'encodage de la console avec les fonctions du système d'exploitation voire avec la bibliothèque standard peut-être.


J'ai essayé et ça a marché en C++. Merci bien.


---------------
Tout le monde est un génie. Mais si on juge un poisson sur sa capacité à grimper à un arbre, il passera sa vie à croire qu’il est stupide. – Albert Einstein
Reply

Marsh Posté le 14-11-2016 à 17:12:48    

ryngetsu a écrit :


Au lieu de "Vous avez joué: " la console m'affiche "Vous avez jouÚ: ". merci encore :)


Plutôt que des macros objectivement assez dégueux, regarde plutôt du côté des locales.
 

Code :
  1. // NB: ce fichier est au format UTF-8
  2. # include <iostream>
  3. # include <clocale>
  4. int main()
  5. {
  6.   std::setlocale(LC_ALL, "" );
  7.   std::cout << "Été\n";
  8.   return 0;
  9. }


Le plus portable est d'encoder son fichier source en utf8, comme indiqué en commentaire. N'importe quel éditeur moderne propose cette option. Malheureusement, un commentaire est ce qu'on peut faire de mieux en C++ à l'heure actuelle. A ma connaissance, le standard ne propose pas grand chose concernant l'encodage des fichiers sources.

Reply

Marsh Posté le 14-11-2016 à 18:13:03    

Ohla j'en suis qu'au début ^^
 
Je connais ni clocale ni setlocale et j'ai encore moins de connaissainces par rapport à l'encodage UTF 8


---------------
Tout le monde est un génie. Mais si on juge un poisson sur sa capacité à grimper à un arbre, il passera sa vie à croire qu’il est stupide. – Albert Einstein
Reply

Marsh Posté le 30-11-2016 à 11:43:40    

In this code, the syntax of all the if statements are wrong.
You didn't put brackets around the conditions in this code.

Reply

Sujets relatifs:

Leave a Replay

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