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 :

help! problème avec un chatterbot (simplifié)


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 2
    Par défaut help! problème avec un chatterbot (simplifié)
    Bonjour à tous !
    Je dois réaliser un programme en c et comme vous pouvez vous en douter j'ai un petit problème!
    C'est un programme qui doit converser avec l'utilisateur (type chatterbot en très simplifié) à propos d'un thème; j'ai choisi de le faire autour des voitures :il y aurait par exemple quatre types de voitures référencées, avec pour chacunes plusieurs options dispo.
    Cependant je reste bloqué depuis plusieurs jours sur la fonction qui permet de faire la conversation... j'ai refait un essai à part en plus petit pour essayer d'y voir plus clair et de comprendre d'où vient l'erreur, que je vous soumet :
    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
     
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
     
    #define MAX 100
     
    int main(void)
    {
     
        char question[MAX];
        char phrase[MAX]="Nous avons trois types de voitures disponibles";
        char phrase2[MAX]="Nous avons plusieurs couleurs disponibles !";
        char cle1[MAX]="voitures";
        char cle2[MAX]="couleurs";
        char *token;
        char **tok;
        int nombre =0,i;
     
        printf("Bonjour ! \n\n je vais vous guider dans votre rechercher de voitures ! \n\n");
        printf("Sam : Et si vous commenciez par poser une question : \n\n");
        getchar();
    	fgets(question,100,stdin);	// le dernier caractère est à strlen(c->phrase)-1   c->phrase[strlen(c->phrase)-1]='\0'
    	question[strlen(question)-1]='\0';
     
        token=strtok(question, " ");
        while(token != NULL)
                {
     
                    strcpy(tok[nombre],token);
                    nombre++;
                    token=strtok(NULL, " ");
                }
     
        for (i=0; i<nombre;i++)
            {
                        if (strcmpi(cle1, tok[i])==0)
                            {
     
                                        printf("Sam : %s", phrase);
                            }
                        else if (strcmpi(cle2, tok[i])==0)
                            {
                                printf("Sam : %s", phrase2);
                            }
            }
        return 0;
     
    }
    L'idée c'est que le logiciel demande à l'utilisateur de poser une question (ici ça sera une question du type: combien de voitures différentes avez-vous ?), il découpe ensuite celle-ci en token avec strtok et les compare aux mots clés.
    Il n'y a pas d'erreurs à la compilation mais quand j'éxécute et que je pose la question ça plante...

    Est-ce que vous voyez d'où vient l'erreur ?

    Merci par avance de votre aide!! (je précise que je débute un peu en c^^)

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Iran

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2011
    Messages : 28
    Par défaut
    "tok" est vide.
    vous devez utiliser malloc() avant strcpy() ou tout simplement declarez ca comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char tok[MAX_TOKEN_NUM][MAX_TOKEN_LENGTH];

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Iran

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2011
    Messages : 28
    Par défaut
    Ceci est une version améliorée de votre code :

    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
     
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
     
    #define MAX 100
     
    int main(void)
    {
     
    	char question[MAX];
    	const char phrase[] = "Nous avons trois types de voitures disponibles";
    	const char phrase2[] = "Nous avons plusieurs couleurs disponibles !";
    	const char cle1[] = "voitures";
    	const char cle2[] = "couleurs";
    	char *token;
    	int i;
     
    	printf("Bonjour ! \n\n je vais vous guider dans votre rechercher de voitures ! \n\n");
    	printf("Sam : Et si vous commenciez par poser une question : \n\n");
    	fgets(question, 100, stdin); // le dernier caractère est à strlen(c->phrase)-1   c->phrase[strlen(c->phrase)-1]='\0'
    	question[strlen(question)] = '\0';
     
    	token = strtok(question, " ");
    	while (token != NULL)
    	{
     
    		if (strcasecmp(cle1, token) == 0)
    		{
    			printf("Sam : %s", phrase);
    		}
    		else if (strcasecmp(cle2, token) == 0)
    		{
    			printf("Sam : %s", phrase2);
    		}
    		token = strtok(NULL, " ");
    	}
    	return 0;
     
    }
    1 - getchar() n'est pas nécessaires.
    2 - regardez a la Déclaration des chaînes constantes.
    3 - vous pouvez supprimer strcpy().

  4. #4
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 2
    Par défaut
    merci beaucoup pour votre réponse ! je cherchais justement à le faire sans allocation dynamique mais ça ne marchait pas...
    du coup j'ai essayé de faire un programme plus élaboré contenant une structure dans laquelle l'utilisateur enregistre d'abord une phrase type et les mots clés associés. Le principe est le même: l'utilisateur pose une question et le programme donne une réponse s'il trouve les mots clés correspondant à une phrase.
    Voici le code :
    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
     
     
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
     
    #define MAX 100
     
    typedef struct phrase1
    {
        char phrase[MAX];
        char cle1[MAX];
        char cle2[MAX];
        char cle3[MAX];
        char cle4[MAX];
     
    }phrase1;
     
    void creer_phrase(FILE *fp,phrase1 *p);
    void afficher_phrases(phrase1 *p, FILE *fp);
     
    void conversation(phrase1 *q,FILE *fp,char *question);
     
    int main(void)
    {
        FILE *fp;
        int n;
        phrase1 m,k,d;
        char question[MAX];
     
        if(!(fp = fopen("fichier_phrases.dat", "r+b")))              // On créé le fichier au cas où il n'existe pas
    		 fp = fopen("fichier_phrases.dat", "w+b");
     
     
        printf("1 : creer une réponse type \n");
     
        printf("2 : afficher les reponses types \n");
        printf("3 : Commencer une conversation \n");
        scanf("%d",&n);
     
     
        switch(n)
        {
            case 1 : creer_phrase(fp,&m);
            break;
     
            case 2 : afficher_phrases(&k,fp);
            break;
     
            case 3 :
        printf("Bonjour ! \n\n je vais vous guider dans votre rechercher de voitures ! \n\n");
    	printf("Sam : Et si vous commenciez par poser une question : \n\n");
    	getchar();
    	fgets(question, 100, stdin); // le dernier caractère est à strlen(c->phrase)-1   c->phrase[strlen(c->phrase)-1]='\0'
    	question[strlen(question)] = '\0';
    conversation(&d,fp,question);
            break;
     
            default : printf("Erreur !\n");
     
        }
     
     
     
     
    }
     
     
    void creer_phrase(FILE *fp,phrase1 *p)
    {
        printf("Vous pouvez créer des phrases types associées chacune à 4 mots clés \n\n");
        printf("Veuillez entrer une phrase : \n");
        getchar();
        fgets(p->phrase, 100, stdin); // le dernier caractère est à strlen(c->phrase)-1   c->phrase[strlen(c->phrase)-1]='\0'
    	p->phrase[strlen(p->phrase)-1] = '\0';
        printf("Entrez un mot clé que vous voulez lui associer : \n\n");
        scanf("%s",p->cle1);
        printf("Entrez un mot clé que vous voulez lui associer : \n\n");
        scanf("%s",p->cle2);
        printf("Entrez un mot clé que vous voulez lui associer : \n\n");
        scanf("%s",p->cle3);
        printf("Entrez un mot clé que vous voulez lui associer : \n\n");
        scanf("%s",p->cle4);
     
        fseek(fp, 0, SEEK_END);
    	fwrite(p,sizeof(phrase1),1,fp);
     
     
    }
     
     
     
     
    void afficher_phrases(phrase1 *p, FILE *fp)
    {
     
    	rewind(fp);
    	while (fread(p,sizeof(phrase1),1,fp)!=0)
    		{
    			printf("------------------------------------------------\n");
    			printf("Phrase type : %s \n",p->phrase);
     
                printf("Mots clés associés : %s \n  %s \n %s \n %s \n", p->cle1,p->cle2,p->cle3,p->cle4);
    			printf("--------------------------------------------------\n");
    		}
     
     
    }
     
     
     
    void conversation(phrase1 *q,FILE *fp,char *question)
    {
        char *token;
     
    	token = strtok(question, " ");
    	while (token != NULL)
    	{
    	    rewind(fp);
    	while (fread(q,sizeof(phrase1),1,fp)!=0)
     
    {
        if ((strcasecmp(q->cle1, token) == 0)||(strcasecmp(q->cle2, token) == 0)||(strcasecmp(q->cle3, token) == 0)||(strcasecmp(q->cle4, token) == 0))
    		{
    			printf("Sam : %s",q->phrase);
    		}
     
    		else
            {
     	printf("Veuillez préciser... \n");
    		}
    		token = strtok(NULL, " ");
     
    	}
    	}
    }
    or la fonction conversation pose problème. je ne sais pas trop comment coder le fait que s'il trouve au moins un mot clé correspondant au token il doit afficher la phrase, et s'il en trouve aucun il doit afficher "Veuillez préciser" :s
    Pour le moment, si j'écris une phrase qui n'a aucun mot clé il m'affiche Veuillez préciser cinq ou six fois à l'écran...
    Est-ce que vous voyez d'où vient l'erreur?

    Merci de votre aide

  5. #5
    Membre émérite
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Par défaut
    C'est normal, tu découpes ta chaîne et tu testes chaque mot. C'est niquel pour tester chaque mot à par rapport au token, mais si le mot présent n'est pas le même tu affiches « veuillez préciser ». Je n'ai pas tester ton code, mais j'imagine que ça affiche « Veuillez préciser » pour chaque mot qui ne correspond pas au token.
    En conclusion, enlève ton else. Pour faire ce que tu souhaites, tu peux utiliser un booléen que tu initialises à false (valeur numérique 0), et auquel tu affectes la valeur true (ou valeur numérique 1) lorsque un des strcasecmp réussit. Ensuite, à la fin de ta boucle, tu testes la valeur de ton booléen. S'il vaut false, tu affiches « veuillez préciser ».
    Récursivité en C : épidémie ou hérésie ?

    "Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman

Discussions similaires

  1. Réponses: 0
    Dernier message: 02/01/2009, 15h40
  2. Problème avec mon fichier .CHM créé par HTML Help Workshop
    Par Magdix dans le forum Installation, Déploiement et Sécurité
    Réponses: 0
    Dernier message: 20/10/2008, 15h24
  3. Problème avec la fonction tie(), need help! :)
    Par tomtom59 dans le forum Langage
    Réponses: 2
    Dernier message: 25/06/2008, 10h25
  4. [AJAX] Fonctionnement avec IE
    Par mewax dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 31/01/2007, 14h46
  5. HELP : Problème avec la fonction Mid
    Par lawrac dans le forum Access
    Réponses: 1
    Dernier message: 27/12/2006, 17h44

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