Programme cpp (C++) débutant

Résolu/Fermé
LelLex Messages postés 1628 Date d'inscription mercredi 18 février 2009 Statut Membre Dernière intervention 5 septembre 2012 - 1 nov. 2010 à 03:42
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 20 mai 2011 à 11:14
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 359 Date d'inscription jeudi 14 mai 2009 Statut Membre Dernière intervention 4 décembre 2011 68
1 nov. 2010 à 04:53
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 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
1 nov. 2010 à 11:04
while(x=0)
Plutôt while(x==0)
0
Nn il a raison doctorpower while( x= 0 )
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
20 mai 2011 à 11:14
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 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
Modifié par fiddy le 1/11/2010 à 14:04
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 1628 Date d'inscription mercredi 18 février 2009 Statut Membre Dernière intervention 5 septembre 2012 112
Modifié par LelLex le 1/11/2010 à 13:22
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 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
1 nov. 2010 à 14:04
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 1628 Date d'inscription mercredi 18 février 2009 Statut Membre Dernière intervention 5 septembre 2012 112
Modifié par LelLex le 1/11/2010 à 14:40
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 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
1 nov. 2010 à 14:41
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 1628 Date d'inscription mercredi 18 février 2009 Statut Membre Dernière intervention 5 septembre 2012 112
1 nov. 2010 à 15:06
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 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
1 nov. 2010 à 15:10
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 1628 Date d'inscription mercredi 18 février 2009 Statut Membre Dernière intervention 5 septembre 2012 112
1 nov. 2010 à 16:48
Comment je pourrais faire ça ? Donne moi une piste @fiddy . :) Merci d'avance!
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
Modifié par fiddy le 1/11/2010 à 17:29
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 1628 Date d'inscription mercredi 18 février 2009 Statut Membre Dernière intervention 5 septembre 2012 112
1 nov. 2010 à 17:32
D'accord, merci...
0