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 :

petit probleme de structure je pense


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 126
    Par défaut petit probleme de structure je pense
    Bonjour à tous,

    Voilà j'ai un problème qui est un peu beaucoup lié à mon manque de connaissance j'essaye de remedier au mieux à mes lacunes mes je bute encore merci de rester indulgent

    Pourriez vous m'aider et me permettre d'avancer un peu ?

    J'aimerais essayer de créer une structure possedant : un tableau et un entier, le tableau contenant un mot et l'entier indiquant le nombre de mot identique.
    Et me servir de cette structure pour initialiser un tableau de 100 mots !
    voilà ce que j'ai fait :

    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
     
    struct occurence_mot 
    {
    char chaine[30]; 
    int nb;
    };
    struct occurence_mot tab1[100];
    int nb_mots;
     
    void compare_mots(struct occurence_mot tab1,int nb_mot)
    {
    int i,j,k;
    for(i=0;i<nb_mot;i++)
    {
        for(j=0;j!='\0';j++)
            {
            printf("\n Entrez un mot :");
            scanf("%s",&tab1[i].chaine);
            }
    }
    }
    Je n'ai joint ici que la partie qui me pose probleme.
    J'aimerais donc savoir si possible quels sont les defaults dans mon code svp !

    Merci d'avance

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    le premier défaut est la présence de variables globales:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    struct occurence_mot tab1[100];
    int nb_mots;
    Le second est que la fonction compare_mots ne fait pas ce qu'elle annonce : elle ne compare pas des mots
    Le troisième est que le contenu de cette fonction est incohérent
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(j=0;j!='\0';j++) // ??????
    Je n'ai joint ici que la partie qui me pose probleme.
    Explique plutôt en quoi cele te pose problème. On pouura (peut être) avoir une réponse mieux adaptée

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 126
    Par défaut
    Merci diogene pour ta réponse !
    Alors je vais donc essayer d'être plus clairs.
    Effectivement la fonction ici n'a pas pour but de comparer les mots je désire effectivement initialiser mon tableau tab1 (avec des mots que je vais comparer plus tard, une chose à la fois )

    pour l'initialisation de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    struct occurence_mot tab1[100];
    int nb_mots;
    je vais les déclarer dans le main.

    Ensuite en ce qui concerne la fonction :

    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
     
    void init_tab(struct occurence_mot tab1,int nb_mot)
    {
    int i,j,k;
    do
    {
    for(i=0;i<100;i++)
    {
            {
            printf("\n Entrez un mot :");
            scanf("%s",&tab1[i].chaine);
            }
    }
    }while((i<=100) && (tab1[i].chaine!=''));
    }
    Je ne sais pas si on peut l'écrire de cette façon ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    scanf("%s",&tab1[i].chaine);
    Et ici je voudrais ici continuer ma boucle tant que le nombre de mot est inferieur à 100 où à conditions que l'utilisateur ne rentre pas de mots

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while((i<=100) && (tab1[i].chaine!=''));


    Voilà qui correspond plus à ce que je souhaite réaliser !

    Merci d'avance pour votre aide

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 801
    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 801
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par masterix59 Voir le message
    Merci diogene pour ta réponse !
    Alors je vais donc essayer d'être plus clairs.
    Effectivement la fonction ici n'a pas pour but de comparer les mots je désire effectivement initialiser mon tableau tab1 (avec des mots que je vais comparer plus tard, une chose à la fois )

    pour l'initialisation de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    struct occurence_mot tab1[100];
    int nb_mots;
    je vais les déclarer dans le main.

    Ensuite en ce qui concerne la fonction :

    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
     
    void init_tab(struct occurence_mot tab1,int nb_mot)
    {
    int i,j,k;
    do
    {
    for(i=0;i<100;i++)
    {
            {
            printf("\n Entrez un mot :");
            scanf("%s",&tab1[i].chaine);
            }
    }
    }while((i<=100) && (tab1[i].chaine!=''));
    }
    Je ne sais pas si on peut l'écrire de cette façon ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    scanf("%s",&tab1[i].chaine);
    Et ici je voudrais ici continuer ma boucle tant que le nombre de mot est inferieur à 100 où à conditions que l'utilisateur ne rentre pas de mots

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while((i<=100) && (tab1[i].chaine!=''));


    Voilà qui correspond plus à ce que je souhaite réaliser !

    Merci d'avance pour votre aide
    Une chaîne est déjà un pointeur donc on ne met pas "&" devant son identificateur. Par ailleurs, comme c'est un pointeur on ne peut pas écrire chaine != '' car ça compare une adresse avec un caractère. Faut comparer juste un caractère de la chaîne avec un autre ou utiliser strcmp().
    Par ailleurs j'arrive pas à comprendre comment t'as organisé ta saisie. Tu initialises une boucle "do {}" puis tu y insères une boucle "for()" où "i" atteint 100 puis tu finis ta boucle "do {}" tant que "i <= 100 (ce qui est vrai) et tab[i].chaine = '' (je rappelle que "i" vaut ici 100 donc t'es hors tableau).

    Concevoir un algo ça passe aussi par une phase de réflexion initiale. C'est un petit investissement en temps qui n'est pas inutile et qui est largement rattrapé par la suite...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    i=0;
    while (i < 100)
    {
            printf("\n Entrez le mot %d :", i + 1);
            scanf("%s", tab[i].chaine);
            if (tab[i].chaine[0] == '\0')
            {
                printf("Mot %d incorrect - recommencez\n", i + 1);
                continue;
            }
            i++;
    }
    Maintenant l'ensemble des programmeurs habitués du C recommandent d'éviter scanf() (aucun contrôle) au profit de fgets() (faut juste faire gaffe au <return> qui est enregistré par fgets() dans la chaîne)
    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]

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 126
    Par défaut
    j'ai donc apporter quelque modification d'après vos conseils voilà ce que j'obtient :
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    struct occurence_mot 
    {
    char chaine[30]; 
    int nb;
    };
     
    void init_mots(struct occurence_mot*tab1,int nb_mot)
    {
    int i,j,k;
    i=0;
    while (i < 3)
    {
            printf("\n Entrez le mot %d :", i + 1);
            scanf("%s",tab1[i].chaine);
            if (tab1[i].chaine[0] == '\0')
            {
                printf("Mot %d incorrect - recommencez\n", i + 1);
                continue;
            }
            i++;
    }
    }
     
    int main(int argc, char *argv[])
    {
    struct occurence_mot tab1[100];
    int nb_mot=0,i;
    int taille,tab[100],choix,lon,flag1=0;
    char chaine[30];
     
    init_mots(tab1,nb_mot);
     
    for(i=0;i<3;i++)
    {
    printf("%s \n",tab1[i]);
    }
     
    system("pause");
    return 0;
    }
    Il y a toujours un probleme cependant je ne sais pas pourquoi car il compile...
    Sve@r merci pour ta réponse je n'ai pas utiliser ici de fgets je me renseignerais un peu plus dessus avant je ne l'ai encore jamais utilisé

    ps :j'ai demander 3 mots ici pour pouvoir le tester facilement
    Merci d'avance

  6. #6
    Membre chevronné Avatar de corentin59
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 462
    Par défaut
    c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%s \n",tab1[i].chaine);
    et non
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%s \n",tab1[i]);
    d'autre part, si tu n'utilises pas les variables passées à ton prog en ligne de commande, fais unEnfin, penche-toi sur fgets, qui est bien plus facile et sûr d'usage.

    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    printf("Entrez le mot %d : ",i+1);
    fgets(mot,30,stdin);
    // pour enlever le \n final
    if (mot[strlen(mot)-1] == '\n') {
        mot[strlen(mot)-1] = '\0';
    }
     
    if ( !strlen(mot) ) {
       printf("Mot %d incorrect - recommencez\n", i + 1);
       continue;
    }
     
    strcpy(tab1[i].chaine,mot);

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Petit probleme lors de la declaration de structure (pointeurs)
    Par KosenHitatchi dans le forum Débuter
    Réponses: 8
    Dernier message: 03/01/2013, 15h01
  2. petit probleme avec l'éditeur de builder
    Par qZheneton dans le forum C++Builder
    Réponses: 2
    Dernier message: 28/10/2004, 16h19
  3. petit probleme de requete
    Par nico33307 dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 25/08/2004, 11h36
  4. Réponses: 3
    Dernier message: 28/09/2003, 17h08
  5. petit probleme dans une requte POSTGRE SQL
    Par ghis le fou dans le forum Requêtes
    Réponses: 5
    Dernier message: 08/09/2003, 13h51

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