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 690
    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 690
    Points : 30 985
    Points
    30 985
    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
    }
    ...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    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.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 625
    Points : 1 564
    Points
    1 564
    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.
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  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 690
    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 690
    Points : 30 985
    Points
    30 985
    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...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 625
    Points : 1 564
    Points
    1 564
    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.
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  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