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 :

fonction : calcul du nombre d'enrgistrements d'une table


Sujet :

C

  1. #1
    zui
    zui est déconnecté
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2005
    Messages : 43
    Points : 37
    Points
    37
    Par défaut fonction : calcul du nombre d'enrgistrements d'une table
    Bonsoir tout le monde,

    Voila j'ai fait une petite fonction qui calcule le nombre d'enregistrements d'une table quelconque. Je l'ai compilé sans faute mais le problème est qu' l'execution il me donne toujours 1 alors que dans la table il ya plus d'1 enr.
    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
     
    #include <stdio.h>
    #include <conio.h>
    #include <string.h>
    #define MAXENR 30 // taille maxmumun de la table
     
    struct t_enr // une structure qui permet d'encoder un numero matricule et un nom
        { int matr; char nom[30];};
     
        void remplirTable(struct t_enr* t) // Une procédure qui permet d'encoder 
                                           // et la condition d'arrêt est matr = 0
        {
          int i=0;
          printf(" Matricule: ");
          scanf("%d", &t[i].matr);
          while( t[i].matr != 0)
          {
    	printf(" Nom: ");
    	gets(t[i].nom);
    	printf(" Matricule: ");
    	scanf("%d", &t[i].matr);
     
          }
        }
     
        int Haut(struct t_enr* t) /* Voila la fonction qui me permet de calculer la taille de la table. 
                                     Elle returne le numero du dernier enregistrement qui correspond 
                                     à la taille de la table*/
        {
         int h=1;
         while (t[h].matr) h++; return h-1;}
     
     
     
    void main() // ma fonction main()
    {
     
       struct t_enr tb[MAXENR];
     
       remplirTable(tb); // je remplis la table
     
       int h = Haut(tb); // j'appelle la fonction qui pemet de calculer la taille de la table
       printf("Le nombre des enregistrements est %d", h);
     
    }
    Le problème du programme c'est qu'il me returne toujours 1 à l'exécution. J'arrive pas à comprendre.

    Vos contributions sont les bienvenues. Merci.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Points : 711
    Points
    711
    Par défaut
    Bonjour,

    1) dans la fonction remplirTable, la variable i qui pointe dans ton tableau n'est jamais incrémentée ==> tu stockes toujours dans l'enregisttrement 0

    2) dans la fonction Haut, pourquoi commencer avec h = 1, pour renvoyer ensuite h-1 ? ==> tu sautes l'enregistrement 0

    3) ton tableau n'est pas initialisé, rien ne te garantit que les tab[i].matr dans lesquels tu n'écris rien sont à 0.

    4) ta boucle de remplissage de ton tableau, dans la fonction remplirTable est très mal construite :
    - entre autres, pas de vérification de fin de tableau
    - avec une meilleure construction de la boucle, tu n'aurais pas répéter la ligne de lecture
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    scanf("%d", &t[i].matr);

  3. #3
    zui
    zui est déconnecté
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2005
    Messages : 43
    Points : 37
    Points
    37
    Par défaut
    dans la fonction remplirTable, la variable i qui pointe dans ton tableau n'est jamais incrémentée ==> tu stockes toujours dans l'enregisttrement 0
    J'ai incrémenté comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    void remplirTable(struct t_enr* t) // Une procédure qui permet d'encoder 
                                           // et la condition d'arrêt est matr = 0
        {
          int i=0;
          printf(" Matricule: ");
          scanf("%d", &t[i].matr);
          while( t[i].matr != 0)
          {
    	printf(" Nom: ");
    	gets(t[i].nom);
            i++;//  c'est ici que j'ai mis l'incrémentation j'espère que c'est correct
    	printf(" Matricule: ");
    	scanf("%d", &t[i].matr);
    ton tableau n'est pas initialisé, rien ne te garantit que les tab[i].matr dans lesquels tu n'écris rien sont à 0.
    Pour cela j'ai créé une procédure pour initialiser la table:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        void videTable(struct t_enr* t)
        {t[1].matr = 0;}
    Je l'appelle dans main comme suit:
    ta boucle de remplissage de ton tableau, dans la fonction remplirTable est très mal construite :
    - entre autres, pas de vérification de fin de tableau
    - avec une meilleure construction de la boucle, tu n'aurais pas répéter la ligne de lecture
    Je ne vois pas comment je peux boucler autrement. Aucune d'idée

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Points : 711
    Points
    711
    Par défaut
    Citation Envoyé par zui
    J'ai incrémenté comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    void remplirTable(struct t_enr* t) // Une procédure qui permet d'encoder 
                                           // et la condition d'arrêt est matr = 0
        {
          int i=0;
          printf(" Matricule: ");
          scanf("%d", &t[i].matr);
          while( t[i].matr != 0)
          {
    	printf(" Nom: ");
    	gets(t[i].nom);
            i++;//  c'est ici que j'ai mis l'incrémentation j'espère que c'est correct
    	printf(" Matricule: ");
    	scanf("%d", &t[i].matr);
    Si tu ne changes pas ta boucle, ça ira, mais il faut quand même ajouter le contrôle du nombre d'enregistrements.

    Citation Envoyé par zui
    Pour cela j'ai créé une procédure pour initialiser la table:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        void videTable(struct t_enr* t)
        {t[1].matr = 0;}
    ta procédure videtable se contente de mettre t[1].matr à 0. Il vaudrait mieux initialiser toutes les valeurs du tableau.
    Et rappel : en C, les indices des tableaux commencent à 0 (zéro)
    tu peux faire quelque chose comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void videTable(struct t_enr* t)
    {
      for (int i=0;i<MAXENR;++i)
      {
        t[i].matr = 0;
        t[i].nom[0] = 0;
      }
    }
    Citation Envoyé par zui
    Je ne vois pas comment je peux boucler autrement. Aucune d'idée
    C'est une boucle où tu dois passer au moins une fois, donc première piste:
    au lieu de faire une boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while (condition)
    {
      ...
    }
    fais une boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    do
    {
      ...
    } while (condition);

  5. #5
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int main(){
    ...
    return EXIT_SUCCESS;
    }
    est standard.

Discussions similaires

  1. Calculer le nombre de lignes d'une table sas
    Par 22011988 dans le forum Macro
    Réponses: 4
    Dernier message: 08/06/2012, 16h04
  2. calculer le nombre d'entrer dans une table
    Par chrisl0 dans le forum Langage
    Réponses: 2
    Dernier message: 14/02/2009, 10h49
  3. Réponses: 6
    Dernier message: 23/05/2008, 15h03
  4. calcul le nombre de colonne d'une table
    Par salsero1 dans le forum SQL
    Réponses: 2
    Dernier message: 17/07/2007, 08h15
  5. [Optimisation][Fonction]calcul du nombre de jours ...
    Par m-mas dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 26/10/2005, 14h39

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