IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Recommencer programme avec chaine de char "oui" et "non"


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 24
    Points : 12
    Points
    12
    Par défaut Recommencer programme avec chaine de char "oui" et "non"
    Bonjour à tous !
    Je me présente vite fait, Pierre, 20 ans, étudiant en première année Math-info
    a l'issus de mes TP infos, je me réserve le plaisir de "paufiner" mes codes en soignant l'affichage à l'écran, les printf et autres compléments (précisions/praticité etc..)

    Ma question va surement vous paraître très bête, mais à l'issus des programmes, j'aime bien demander à l'utilisateur s'il souhaite recommencer, pour cela nous avons appris 2 méthodes :
    - avec oui(1) et non(2)
    - avec oui(o) et non(n)

    Seulement, ayant le soucis du détail, cela fait 2 semaines que je me casse la tête a essayer de le faire avec des chaines de caractères comparées (oui) et (non) et je n'y arrive pas ! mon test d'entrée en boucle foire complètement et je me suis résolu a "abandonné " ( ---> demandé de l'aide :p )

    ce que je veux, c'est qu'à la fin de mon programme, le printf

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     printf("Voulez-vous recommencer ? [oui] [non]\n");
    analyse la réponse de l'utilisateur, l'enregistre dans un tableau de char (scanf %s) , compare les 2 chaines, si l"utilisateur a entrée "oui" alors le programme recommence, s'il a rentré "non", on sort de la boucle, c'est pourtant très simple a expliquer, mais si dur a programmer.. pourquoi ?
    voici mon code, je sais que le test d'entrée en boucle ne marche pas, cependant si je me résous a changer le test d'entrée en boucle "foireux" par un vulgaire "oui(o) non(n)" je vous assure que celà marche tres bien

    pouvez-vous m'aider a programmer ce test d'entrée en boucle demandé en fin de programme ? ma méthode n'est surement pas la bonne, les votre sont plus que la bienvenue

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <string.h>
     
     
    int main (void)
     {
      	int x, max=1000001, min=0, compt=0, a, flag, reco;
      	char oui[]= "oui",  /*chaine de caractère fixe (PS : voir commentaire fin de programme) */
    	non[4]=0;           /*le tableau dans lequel serait stockée la réponse de l'utilisateur */
      	compt=1;
      	srand(time(0));
      	flag=0;
     
     	do
      		{
       			printf("Bonjour, entrez le nombre que je dois deviner de 0 à 1000000 :\n");
       			scanf("%d", &a);
     
       			x=rand()%max + min;
        			while(x!=a)
         				{    
    					printf("|[Machine]            : Je pense que le nombre mystère est : %d|\n", x);
    					printf("|---------------------+-------------------------------------------+\n");
            				printf("|[Administrateur]     : Mauvaise réponse, essaye encore...        |\n");
    					printf("|---------------------+-------------------------------------------+\n");
    					flag++;  
            				printf("|[Machine]            : 	        L> Echec numéro :   %d  |\n", flag);
    					printf("|---------------------+-------------------------------------------+\n");
    				if(x>a)
    					{
              				max=x;
    					}
            			else
    					{
              				min=x;
            				compt++;
            				x=rand()%(max-min) + min;
    					}
          				}
     
        			printf("Après %d tours, j'ai trouvé le nombre mystère : %d \n", compt, x);
    			printf("Voulez vous recommencer ? [non] / [oui]\n");
    			printf("%s", non);
    		}
    	while(reco=1); /* j'ai pensé a faire une fonction qui comparerai les 2 chaines avec strcomp et qui renverrait 1 si les chaines été identiques ("oui" serait fixe et non modifiable et non serait la réponse de l'utilisateur et 0 si elles étaient différentes, cette "valeur" serait affecté a la variable de type int "reco" .. la encore je n'ai pas réussi a faire cette fonction*/
      return 0;
     }
    voilà, merci de m'avoir lu si vous pouviez m'aider cela serait très aimable car je le veut ce test d'entrée/sortie de boucle en oui/non en fin de programme

  2. #2
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Salut,

    Déjà il faut lire la réponse de l'utilisateur, ça se fait avec un simple Pour comparer deux chaines de caractères tu peux utiliser la fonction "strcmp" de "string.h", la fonction prend en argument deux chaines de caractères (char *) et retourne 0 si les deux chaînes sont identiques.

    du coup ça donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while( strcmp(reponse, "oui") == 0 );
    ou encore
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while( !strcmp(reponse, "oui") );
    n'utilise pas de chaîne de caractère fixe comme ça puisque tu peux directement utiliser "oui" (chaîne de caractère statique)

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Aztharos Voir le message
    Seulement, ayant le soucis du détail...
    Bonjour

    La réponse de Knarf0 (tiens? Knarf, ça me rappelle le donjon de Naheulbeuk...) est très bien pour débuter.

    Mais pour celui qui a le soucis du détail, je proposerai carrément une fonction dédiée. Cette fontion (forcément plus modulable qu'un test simple) pourrait alors accepter "oui", "Oui", "O", "o" et éventuellement d'autres possibilités de ton goût que tu n'aurais qu'à intégrer dans tes tests...

    Exemple
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int isOk(char *rep)
    {
        if (strcmp(rep, "Oui") == 0) return 1;
        if (strcmp(rep, "oui") == 0) return 2;    
        if (strcmp(rep, "OUI") == 0) return 3;
        if (strcmp(rep, "o") == 0) return 4;
        if (strcmp(rep, "O") == 0) return 5;
        return 0;
    }

    Le fait que la valeur retournée soit à chaque fois différente n'empêche pas le classique while (isOk(reponse)) (tout nombre différent de 0 est considéré comme vrai) mais t'offre la possibilité supplémentaire de pouvoir affiner si tu le désires
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    switch (isOk(reponse))
    {
        case 1: //Gérer le cas "Oui"
            ...
        case 2: // Gérer le cas "oui"
            ...
        case 3: // Gérer le cas "OUI
            ...
        case 4: // Gérer le cas "o"
            ...
        case 5: // Gérer le cas "O"
            ...
        default: // Gérer tous les autres cas
    }
    ...

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Hélas, le standard C ne possède pas de fonction pour comparer deux chaînes de caractères indépendamment de leur casse.
    Par contre, tu peux convertir une chaîne de caractères en minuscules en utilisant tolower() sur chacun de ses caractères (mais je me demande bien comment ça marche pour de l'UTF-8).

    PS: scanf("%s", ) est dangereux, il faudrait limiter la taille.

  5. #5
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 656
    Points : 1 680
    Points
    1 680
    Par défaut
    Hello,

    Citation Envoyé par Médinoc Voir le message
    PS: scanf("%s", ) est dangereux, il faudrait limiter la taille.
    Je trouve aussi, je suis plutot partisan d'un fgets(answer,sizeof(answer),stdin);: pas de danger de débordement....

    A+
    Edgar.

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par edgarjacobs Voir le message
    Je trouve aussi, je suis plutot partisan d'un fgets(answer,sizeof(answer),stdin);: pas de danger de débordement....
    Attention avec sizeof, ça peut être dangereux de trop lui faire confiance

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int main()
    {
        char chaine[100];
        saisie(chaine);
    }
     
    void saisie(char *answer)
    {
        fputs("Votre réponse :", stdout);
        fgets(answer, sizeof(answer), stdin);
    }

    Tu vois le risque ??? Je préfère pour ça mettre la taille de la chaine dans une macro et mettre la macro dans fgets...

  7. #7
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 656
    Points : 1 680
    Points
    1 680
    Par défaut
    Hello,

    Citation Envoyé par Sve@r Voir le message
    Attention avec sizeof, ça peut être dangereux de trop lui faire confiance
    ....
    Tu vois le risque ??? Je préfère pour ça mettre la taille de la chaine dans une macro et mettre la macro dans fgets...
    Oui, bien sur, sauf que je n'ai jamais envisagé d'avoir la déclaration dans une fonction, et le fgets dans une autre, qui reçoit le string en paramètre....
    Mais tu as raison dans ce cas-ci: ajouter un #define MAXSIZE nnn et utiliser ce define pour tout ce qui touche à la variable.

    A+

    Edgar.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    Hello ! merci à tous ! j'ai passé 2 semaines de vacances et en revenant j'ai été ô combien heureux de voir le nombre de possibilité différentes !

    Merci pour les fonctions c'est extra ! il y a de quoi faire mumuse et je suis fier de la mettre dans chacun de mes programmes

    merci à tous

Discussions similaires

  1. programmation avec les listes chainées
    Par rufa11 dans le forum Gnome
    Réponses: 0
    Dernier message: 11/02/2009, 07h08
  2. [Débutant] Un programme avec char
    Par amira dans le forum C
    Réponses: 10
    Dernier message: 02/12/2006, 19h54
  3. Aide sur une selection de chaine de char avec une souris
    Par Baharroth dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 15/11/2006, 21h17
  4. Réponses: 3
    Dernier message: 27/08/2003, 21h14
  5. Pb Update avec chaine de caractere
    Par JuJu° dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 28/05/2003, 15h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo