Programme cpp (C++) débutant

Résolu
LelLex Messages postés 1753 Statut Membre -  
fiddy Messages postés 11653 Statut Contributeur -
Bonjour à tous,

Je commence un petit programme en cpp de questions-réponses, et étant débutant, je rencontre quelques difficultés.

J'aimerais que l'utilisateur (moi) pose une question et reçoive une réponse, sachant que le programme doit tourner en boucle pour poser plusieurs questions l'une à la suite de l'autre.
Alors, j'ai commencé par déclarer ma variable q (question) et essayé de faire une comparaison avec un if(), ça donne ça :

int main()
{
     char q;

     scanf("%c", &q);

     if(q == "Question 1 ?")
     {
          printf("Réponse 1.");
     }
     else if(q == "Question 2 ?")
     {
          printf("Réponse 2.");
     }
     ...

     return 0;
}


Donc, hey hey, ça ne marche pas puisque pour faire une comparaison de chaine de caractères il faut utiliser strcmp() ou alors on peut utiliser if mais il doit y avoir une boucle.

=> SOURCE :

lien : https://www.commentcamarche.net/contents/193-les-chaines-de-caracteres-en-c

" La fonction strcmp()

La fonction strcmp() (prononcez string compare) est une fonction qui permet de comparer deux chaînes de caractères. En effet, il n'est pas possible d'effectuer simplement une comparaison de chaînes de caractères avec la simple utilisation des opérateurs habituels (==, !=, >=, etc.) à moins d'utiliser une boucle. Il est donc préférable d'utiliser cette fonction fournie en standard avec le C++. Cette fonction admet comme paramètres deux chaînes de caractères. Elle retourne 0 si les deux chaînes sont les mêmes. Si les chaînes sont différentes, elle renvoie bien évidemment 1. "


Donc, voilà, j'aimerais pouvoir comparer mes chaines de caractères, sur ce model ci-dessus, avec mes if, elseif - voir pourquoi pas case, break - avec mes opérateurs habituels dans une boucle, afin que le programme tourne en boucle (pardon pour la répétition de boucle!)

Que dois-je supprimer, modifier et rajouter ?

Cordialement, merci d'avance à tous.

5 réponses

doctorpower Messages postés 404 Statut Membre 68
 
salut, je ne prog pas en c++ mais sur le principe je peux t'aider.
Pour faire tourner ton programme en boucle il suffit de faire une boucle while, par exemple:

while(x=0)
{

...ton programme...

}



et a la fin de ton programme tu demande a l utilisateur s'il veut arreter le programme, et tu change x=1

dsl si jai mal compris ta question
0
fiddy Messages postés 11653 Statut Contributeur 1 847
 
while(x=0)
Plutôt while(x==0)
0
Snow
 
Nn il a raison doctorpower while( x= 0 )
0
fiddy Messages postés 11653 Statut Contributeur 1 847
 
J'adore ce qui revienne sur une discussion 6 mois après pour dire des bêtises.
C'est while(x==0). En C, l'opérateur de comparaison est le double opérateur égal (==).
Si tu fais, while(x=0) {ins; ...}, cela fera : x=0; while(0) {ins; ...}. Autrement dit, cela fera juste x=0...
0
fiddy Messages postés 11653 Statut Contributeur 1 847
 
Bonjour,

Tu compares un char avec une chaîne de caractère. Ca ne risque pas de marcher.
Pour que ta variable q soit un tableau, il faut mettre : char q[50]; /*tu pourras mettre une phrase de 49 caractères*/

scanf("%c", &q)
Pour une chaîne de caractères, il faut mettre "%s". Mais tu ne pourras pas mettre d'espaces. Bien sûr si tu veux vraiment utiliser scanf, c'est possible mais un peu compliqué quand on débute.
Donc, utilise plutôt fgets : fgets(q, sizeof q, stdin);
Attention, dans ta variable q, il y aura le code de la touche entrée.
Pour strcmp, il faudra donc mettre : if (strcmp(q,"Question 1 ?\n")==0)
Etc.

Par contre, toute ta façon de faire ressemble plus à du C qu'à du C++. Pourquoi ne pas utiliser les string ? Ca se ferait en deux coups de cuillères à pot.
Cdlt,
0
LelLex Messages postés 1753 Statut Membre 112
 
Merci @fiddy ; quand tu parles de strings, tu veux dire quoi ?

Ah d'accord, du C, autant pour moi. Je changerais donc mes librairies.

Donc, avec votre aide, je pense faire ces modifications :
#include "stdio.h"  
#include "stdlib.h"  
#include "string.h"  

int main(int argc, char *argv[])  
{  
    // On initialise la variable question  
    char question[100] = "Pas de question";  

    scanf("%s", question); // Ne prend pas en compte les espaces, c'est bien ça ?!  
    /* *** OU *** */  
    fgets(question, sizeof question, stdin); // Prend en compte les espaces, c'est bien ça ?!  

    if(strcmp(question, "Question 1 ?\") == 0)  
    {  
        printf("Réponse 1.\n");  
    }  
    else if(strcmp(question, "Question 2 ?\") == 0)  
    {  
        printf("Réponse 2.\n");  
    }  

    return 0;  
}


Ai-je bien fait mes modifications ?

Cordialement, merci d'avance.
0
fiddy Messages postés 11653 Statut Contributeur 1 847
 
quand tu parles de strings, tu veux dire quoi ?
A la place des tableaux de char, tu peux mettre : string question;
Toute l'allocation est gérée automatiquement, mais c'est du domaine du C++ avec l'apparition notable des classes.

#include "stdio.h" => #include <stdio.h>
La remarque s'applique pour stdlib.h et string.h

scanf("%s", question); // Ne prend pas en compte les espaces, c'est bien ça ?!
Exactement. Si t'écris : "je m'appelle LeILex", question vaudra "je".

fgets(question, sizeof question, stdin); // Prend en compte les espaces, c'est bien ça ?!
Oui. Ici question aurait valu : "je m'appelle LeILex\n". Il ne faut pas oublier que le code ascii de la touche entrée est également stockée.


if(strcmp(question, "Question 1 ?\") == 0)
Il faut mettre f(strcmp(question, "Question 1 ?\n") == 0)
'\n' représente la touche entrée.

Cdlt,
0
LelLex Messages postés 1753 Statut Membre 112
 
Merci beaucoup @fiddy.

Donc maintenant, on à ça :

#include <stdio.h>    
#include <stdlib.h>    
#include <string.h>    

int main(int argc, char *argv[])    
{    
    // On initialise la variable question    
    char question[100] = "Pas de question";    

    // On récupère l'entrée clavier  
    fgets(question, sizeof question, stdin);  

    if(strcmp(question, "Question 1 ?\n") == 0)    
    {    
        printf("Réponse 1.\n");    
    }    
    else if(strcmp(question, "Question 2 ?\n") == 0)    
    {    
        printf("Réponse 2.\n");    
    }    

    return 0;    
} 


J'vais essayer de le compiler ça, car j'utilisais g++ dans le Terminal sous Ubuntu, mais la je vais devoir essayer gcc !?

Cordialement.
0
fiddy Messages postés 11653 Statut Contributeur 1 847
 
Oui utilise gcc puisque c'est du C.
Sinon le code est bon.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
LelLex Messages postés 1753 Statut Membre 112
 
Okay, merci beaucoup, bon je vais faire ça. Maintenant, faut que je t'intègre le fait que les questions puissant se répéter en faisant une boucle...
0
fiddy Messages postés 11653 Statut Contributeur 1 847
 
Une simple boucle for avec un tableau des questions, un tableau de réponse, ça sera tip top ;-))).
Ensuite, cela permettra une évolution facile du programme. Par exemple, lire les questions / réponses dans un fichier.

Bonne recherche.
0
LelLex Messages postés 1753 Statut Membre 112
 
Comment je pourrais faire ça ? Donne moi une piste @fiddy . :) Merci d'avance!
0
fiddy Messages postés 11653 Statut Contributeur 1 847
 
C'était déjà une piste que j'ai donnée ^^.
Sinon en gros :
char *question[10]={"Question 1", "Question 2", ...};
char *reponse[10]={"Reponse 1\n", "Reponse 2\n", ...};

Ainsi un simple :
i
nt i; 
for(i=0;i<10,i++) { 
   puts(question[i]); 
   if (strcmp(...) 
      etc.  
}

Cdlt,
0
LelLex Messages postés 1753 Statut Membre 112
 
D'accord, merci...
0