concernant les livres et le c...
Répondre à la discussion
Affichage des résultats 1 à 21 sur 21

concernant les livres et le c...



  1. #1
    invite5c6a01fc

    Question concernant les livres et le c...


    ------

    Bonsoir à Tous,
    j'aimerai bien que vous m'aidiez si c'est possible,sur le sujet des listes chainées:
    supposant que je dispose d'une bibliothèque et je veux ajouter un livre:
    et ce livre est défini par une structure:
    Code:
    typedef struct element
    {
    int code;
    char nomAuteur[20];
    char titreLivre[20];
    }livre;
    typedef livre* liste;
    je veux créer une fonction qui s'appelle ajoutLivre qui va recevoir le nouveau livre c'est à dire un nouveau code,un nouveau titre et un nouveau auteur, et cette fonction va retourner la liste qui contient le livre ajouté.
    est ce que j'ai le droit de faire ceci?
    Code:
    liste ajoutLivre(livre.code,livre.nomAuteur,livre.titreAuteur)
    {}
    parce que je dois pas oublier que dans le programme principal(main),je vais demander à l'utilisateur d'entrer les informations(code,auteur,titre ) concernant le livre à ajouter dans la liste.
    mais comment allouer la mémoire pour chaque champ de la structure livre?
    (parce que dans le cours de listes chainéesour ajouter une element dans la liste,on doit allouer la mémoire pour ce nouveau element ).
    s'il vous plait veuillez m'aider ,
    d'après vos aides je pourrai avancer dans le programme pour creer d'autres fonctions par exemple supprimer un livre,modifier un livre ou bien lister un livre.

    j'attends vos réponses impatiemment.
    merci pour votre compréhension.

    -----

  2. #2
    Jack
    Modérateur

    Re : concernant les livres et le c...

    Code:
    typedef struct element
    {
    int code;
    char nomAuteur[20];
    char titreLivre[20];
    }livre;
    Cette structure est figée? Parce que pour chainer la liste, il faut prévoir au moins un pointeur sur la liste dans la structure

    Code:
    liste ajoutLivre(livre.code,livre.nomAuteur,livre.titreAuteur)
    {}
    Quel intérêt de passer les données champ par champ? Pourquoi ne pas passer directement la structure?

    Ensuite, où veux-tu ajouter le livre? En tête, en queue, à une position déterminée.

    Il existe une littérature abondante sur les listes chainées, ainsi que l'implémentation de leurs primitives en C.

    A+

  3. #3
    invite5c6a01fc

    Lightbulb Re : concernant les livres et le c...

    Bonsoir,
    excuser moi,j'ai oublié de mettre:
    Code:
    typedef struct element
    {
    int code;
    char nomAuteur[20];
    char titreLivre[20];
    }livre;
    typedef livre* listeLivre;
    dans le programme principal ,je demande à l'utilisateur de donner le code de livre ajouté,son titre,et son auteur.
    je peux affecter ces champ à une structure qui s'appelle nouveauLivre de type maillon?
    puis envoyer cette structure à la fonction
    qui va ajouter ce nouveauLivre en fin de la liste(pour garder l'ordre des ajouts);lors de son appel.
    c'est bien cela?
    à votre avis,j'ajoute en fin ou en tête ou à travers le choix de l'utilisateur?
    merci pour votre aide.

  4. #4
    invite5c6a01fc

    Question Re : concernant les livres et le c...

    je peux créer cette fonction:
    Code:
    listeLivre ajoutLivreFin(listeLivre l,livre liv);
    c'est la même démarche pour ajouter un élément en fin de la liste chainée?

    merci pour votre compréhension!

  5. A voir en vidéo sur Futura
  6. #5
    Jack
    Modérateur

    Re : concernant les livres et le c...

    je peux affecter ces champ à une structure qui s'appelle nouveauLivre de type maillon?
    Oui on peut, mais champ par champ. Il serait bon également que tu nous montres ta définition d'un maillon.

    je peux créer cette fonction:
    Code:
     listeLivre ajoutLivreFin(listeLivre l,livre liv);
    c'est la même démarche pour ajouter un élément en fin de la liste chainée?
    l doit être un pointeur, donc listelivre* l
    Le plus rapide est d'ajouter en tête car on n'a pas besoin de parcourir la liste à la recherche du dernier élément.

    A+

  7. #6
    invite5c6a01fc

    Question Re : concernant les livres et le c...

    Bonsoir ,
    oui
    Code:
    listeLivre l
    est un pointeur,je l'ai déjà marqué dans la définition de la structure:
    Code:
    typedef struct element
    {
    int code;
    char nomAuteur[20];
    char titreLivre[20];
    }livre;
    typedef livre* listelivre;
    s'il vous plait,
    pour l'ajout d'un livre:
    supposant que l'utilisateur a ajouté dans le premier coup un livre,et il veut ajouter un deuxième livre,normalement je dois l'ajouter d'après un ordre alphabétique ou bien d'après l'ordre des codes.
    comment faire pour un garder un ordre?
    je trouve que l'ordre par le code est plus facile que l'ordre alphabetique!!
    pour le premier cas;
    je vais créer un pointeur pour parcourir la liste et comparer le code pour chaque livre(=maillon)avec le code de livre que l'utilisateur veut ajouter.
    est ce que c correct!..?
    merci

  8. #7
    Jack
    Modérateur

    Re : concernant les livres et le c...

    listeLivre l
    est un pointeur,je l'ai déjà marqué dans la définition de la structure:
    Tu as raison.

    je vais créer un pointeur pour parcourir la liste et comparer le code pour chaque livre(=maillon)avec le code de livre que l'utilisateur veut ajouter.
    est ce que c correct!..?
    ca me semble correct. Reste à voir ton code.

    A+

  9. #8
    invite5c6a01fc

    Re : concernant les livres et le c...

    merci,
    donc j'utilise l'ordre par des codes pour l'ajout.

  10. #9
    Jack
    Modérateur

    Re : concernant les livres et le c...

    Citation Envoyé par achernar Voir le message
    merci,
    donc j'utilise l'ordre par des codes pour l'ajout.
    C'est quand même à toi de savoir dans quel ordre tu veux faire ton tri.

    A+

  11. #10
    invite5c6a01fc

    Exclamation un probleme de definition

    Salut,

    voici le code concernant l'ajout d'un livre dans une liste:
    Code:
    #include<conio.h>
    #include<malloc.h>
    #include<stdlib.h>
    
    struct referencesLivre
    {
           int code;
           char titreL[20];
           char nomAuteurL[20];
           };
    // struct referenceslivre infoslivre;       
           
    typedef struct livre
    {
       struct referencesLivre infoslivre;
       struct livre* suivant;
           }maillonlivre;
    typedef maillonlivre* listelivres;
    
    
    
    listelivres ajoutLivreTete(listelivres l,maillonlivre.infoslivre.code,maillonlivre.infosLivre.titre,maillonlivre.infosLivre.nomAuteur)
    {
           (maillonlivre* nouveaulivre)=(maillonlivre*)malloc(sizeof(maillonlivre));
           if(nouveaulivre==NULL)
           {
           printf("probleme de mémoire!");
           return 0; 
           }
           else   //il ya de mémoire
           {
               nouveaulivre->code=referencesLivre.code;
               nouveaulivre->titre=referencesLivre.titre;
               nouveaulivre->nomauteur=referencesLivre.nomAuteur;
               
               if (l==NULL) //l vide
               {
                 nouveaulivre->suivant=NULL;
                 l=nouveaulivre;
                 return l;
                            }
               //l n'est pas vide
               nouveaulivre->suivant=l;
               return nouveaulivre;          
    }
    voici les erreurs que le compilateur les montre:
    24 C:\Dev-Cpp\bin\essai-p.cpp expected `,' or `...' before '.' token

    C:\Dev-Cpp\bin\essai-p.cpp In function `maillonlivre* ajoutLivreTete(maillonlivre*, maillonlivre)':

    26 C:\Dev-Cpp\bin\essai-p.cpp expected primary-expression before '*' token

    26 C:\Dev-Cpp\bin\essai-p.cpp `nouveaulivre' undeclared (first use this function)

    s'il vous plait aidez moi


    merci pour votre compréhension!

  12. #11
    Jack
    Modérateur

    Re : concernant les livres et le c...

    Code:
    listelivres ajoutLivreTete(listelivres l,maillonlivre.infoslivre.code,maillonlivre.infosLivre.titre,maillonlivre.infosLivre.nomAuteur)
    Vu l'entête de ta définition de fonction, rien d'étonnant que le compilateur n'aime pas.

    Je rappelle que tous les paramètres doivent être définis, ce qui veut dire type suivi du nom de l'identificateur.
    De plus, et je te l'ai déjà fait remarquer, pourquoi passer les champs de la structure et non pas la structure elle-même?

    Code:
    26 C:\Dev-Cpp\bin\essai-p.cpp `nouveaulivre' undeclared (first use this function)
    Ca me semble assez clair: nouveaulivre n'a pas été défini.

    A+
    Dernière modification par Jack ; 09/01/2010 à 19h11.

  13. #12
    invite5c6a01fc

    Re : concernant les livres et le c...

    donc la fonction ajoutlivreTete doit recevoir une structure de type maillonlivre
    Code:
    listelivres ajoutLivreTete(listelivres l, maillonlivre->infoslivre);
    c'est bien ça!?
    est ce que la définition que je vous ai donné est correct,j'ai rien négligé?

    merci

  14. #13
    Jack
    Modérateur

    Re : concernant les livres et le c...

    Je me cite:
    Je rappelle que tous les paramètres doivent être définis, ce qui veut dire type suivi du nom de l'identificateur.
    Je te cite:
    Code:
    listelivres ajoutLivreTete(listelivres l, maillonlivre->infoslivre);
    où est le type du 2ème argument?

    Ceci devrait te convenir.
    Code:
    listelivres ajoutLivreTete(listelivres l, struct referencesLivre infoslivre);
    A+

  15. #14
    invite5c6a01fc

    Smile Re : concernant les livres et le c...

    Bonjour,
    j'ai suivis vos consigne,mais apparemment, il reste le même problème ,
    s'il vous plait est ce que vous voir encore une fois le code de mon programme tout entier,si vous avez le temps!!
    Code:
    #include<stdio.h>
    #include<conio.h>
    #include <windows.h>
    #include<malloc.h>
    #include<stdlib.h>
    #include<string.h>
    struct referencesLivre
    {
           int code;
           char titreL[20];
           char nomAuteurL[20];
           };
    // struct referenceslivre infoslivre;       
           
    typedef struct livre
    {
       struct referencesLivre infoslivre;
       struct livre* suivant;
           }maillonlivre;
    typedef maillonlivre* listelivres;
    
    
    
    listelivres ajoutLivreTete(listelivres l,struct referencesLivre infoslivre)
    {
           (maillonlivre* nouveaulivre)=(maillonlivre*)malloc(sizeof(maillonlivre));
           if(nouveaulivre==NULL)
           {
           printf("probleme de mémoire!");
           return 0; 
           }
           else   //il ya de mémoire
           {
                  nouveaulivre->code=referencesLivre.code;       
                  strcpy(nouveaulivre->nomauteur,referencesLivre.nomAuteur);
                  strcpy(nouveaulivre->titre,referencesLivre.titre);
                   
               if (l==NULL) //l vide
               {
                 nouveaulivre->suivant=NULL;
                 l=nouveaulivre;
                 return l;
                            }
               //l n'est pas vide
               nouveaulivre->suivant=l;
               return nouveaulivre;          
    }
    
    
    
    listelivres ajoutLivreFin (listelivres l,struct referencesLivre infoslivre->code,struct referencesLivre infoslivre->titre , struct referencesLivre infoslivre->nomAuteur)
       
    {
           (maillonlivre* nouveaulivre)=(maillonlivre*)malloc(sizeof(maillonlivre)); 
            if(nouveaulivre==NULL)
           {
           printf("probleme de mémoire!");
           return 0; 
           }
           else   //il ya de mémoire
           {
               nouveaulivre->code=referencesLivre.code;
               nouveaulivre->titre=referencesLivre.titre;
               nouveaulivre->nomauteur=referencesLivre.nomAuteur;
               nouveaulivre->suivant=NULL;
               
               if (l==NULL) //l vide
           {
                return nouveaulivre;
                       }
         else
           //l n'est pas vide
               {
                   maillonlivre* temp=l;
                   while (temp->suivant!=NULL)
                   {
                       temp=temp->suivant;  
                         }
                         temp->suivant=nouveaulivre;
                         return l;
               }           
    }
    
    
    
    
    void affichagelivre(listelivres l)
    {
         maillonlivre* temp=l;
         while (temp->suivant!=NULL)
         {
               printf("%d         %s                %s                   ",l->code,l->titre,l->nomauteur);
               temp=temp->suivant!=NULL;
               }
         
    }
    
    
         
    listelivres suppressionlivre(listelivres l,infoslivre.code)
    {
        maillonlivre* temp=l;
        maillonlivre* avantTemp=l;
           while (temp->suivant!=NULL)&&(temp->infoslivre.code!=infoslivre.code)
           {
                avantTemp=temp;
                temp=temp->suivant; 
                 }  
            if ( (infoslivre.code)==(temp->infoslivre.code) ) 
            {
                 avantTemp->suivant=temp->suivant;
                 free(temp);
                 return l;
                 } 
            // else 
            // if (temp->suivant==NULL)//on a pas trouver le code
            //return NULL;            
    }  
    
    
    
    int rechercheCodeSupr(listelivres l,int coderecherche) 
    {
                maillonlivre* temp=l;
                while(temp->suivant!=NULL);
                    {
                          temp=temp->suivant;                 
                                           }    
                       if (code==temp->infoslivre.code)
                       {
                             return 1;                          
                                                       }  
                         else 
                         {
                         return 0;
                         }                                                       
    }             
               
    void gotoxy(int x,int y)
    {
    	COORD C;
    	HANDLE H=GetStdHandle(STD_OUTPUT_HANDLE);
    	C.X=x;
    	C.Y=y;
    	SetConsoleCursorPosition(H,C);
    }   
    
    
    
             
    main()
    {
          
          int choixlivre=0,acode=0,position=0,scode=0,verificationRecherche=0;  //scode ==code à supprimer/acode==code à ajouter
         // maillonlivre nouveaulivre;
          char atitre[20],anomauteur[20];
          listelivres list;
          
          system("cls"); 
          
    //while (choixlivre==4)
    //{      
          //il faut ajouter une boucle lorsque l'utilisateur  choisi (4) do while!!!!!
    gotoxy(27,5);
    printf("-------traitement des livres---------");
    gotoxy(9,15);
    printf("1-Ajout d'un livre.");
    gotoxy(9,17);
    printf("2-Suppression d'un livre.");
    gotoxy(9,19);
    printf("3-Affichage de la liste des livres.");
    gotoxy(9,21);
    printf("4-Modification de choix.");
    gotoxy(9,23);
    printf("5-Quitter.");
    gotoxy(15,27);
    printf("veuillez svp entrer votre choix:");
    scanf("%d",&choixlivre);
    //}
    gotoxy(1,30);
    printf("____________________________________________________________________");
    
    system("cls"); 
    
    
    switch(choixlivre)
      {
      case 1:
           gotoxy(27,35);
           printf("---Ajout de livre---");
           gotoxy(9,39);
           printf("le livre est identifie par : CODE,TITRE et NOM DE L'AUTEUR.\n Veuillez svp remplir ces 3champs ci dessous!");
           gotoxy(9,43);
           printf("Code:");
           scanf("%d",acode);
           gotoxy(9,45);
           printf("Titre:");
           gets(atitre);
           gotoxy(9,47);
           printf("Nom de l'auteur:");
           gets(anomauteur);
           gotoxy(9,49);
           printf("si voulez vous ajouter le livre au début,tapez 1");
           gotoxy(9,51);
           printf("et si vous voulez ajouter le livre à la fin de la liste,tapez 2");
           scanf("%d",&position);
                switch(position)
                {
                   case 1:
                        printf("le livre va être ajouter au début de la liste"); 
                       //  list=ajoutLivreTete(list,acode,atitre,anomAuteur);
                         break;
                   case 2:
                         printf("le livre va être ajouter à la fin de la liste"); 
                        // list=ajoutLivreTete(list,ncode,ntitre,nnomAuteur);
                         break;
                                                
                }
       break;
        
       case 2:
           gotoxy(27,54);
           printf("---Suppression de livre---");
           gotoxy(9,57);
           printf("entrer le code de livre à supprimer:");
           scanf("%d",&scode);
           //recherche code à supprimer
            // verificationRecherche=rechercheCodeSupr(list,scode);
             if (verificationRecherche==1)
             {
           // appel la fct suppression
         //  list=suppressionlivre(list,scode);
              }
          else 
          gotoxy(9,59);
          printf("code erroné!Veuillez verifier votre code!");
          break;
          
       case 3:
            gotoxy(27,62);
            printf("---Affichage des livres---"); 
            //appel de la fct affichage
            gotoxy(9,64);
            //affichagelivre(list);
            break;
            
       //case 4:
          //  gotoxy(27,67);  
          //  printf("---Modification de choix---");
                                          
       // case 5:
               //quitter le programme
                 
              
    }
    getch();
    return 0;
               }
    merci pour votre compréhension!

  16. #15
    Jack
    Modérateur

    Re : concernant les livres et le c...

    Il faudrait savoir ce qui ne marche pas, ce serait plus simple. C'est quoi comme compilateur? On dirait un vieux Borland C.

    A+

  17. #16
    Jack
    Modérateur

    Re : concernant les livres et le c...

    Bon, j'ai remarqué certaines incohérences sur l'accès aux données. Par exemple:
    Code:
                  nouveaulivre->code=referencesLivre.code;
    code n'est pas un champ de nouveaulivre

    Pour accéder à code, il faudrait écrire
    Code:
          nouveaulivre->referencesLivre.code=infoslivre.code;
    Je remarque en passant que tes noms de variables ne sont pas idéaux puisque tu utilises les mêmes en variables globales et en variables locales, ce qui amène de la confusion.

    A+

  18. #17
    Jack
    Modérateur

    Re : concernant les livres et le c...

    tant qu'on y est, je remplacerait la définition de structure
    Code:
    struct referencesLivre
    {
           int code;
           char titreL[20];
           char nomAuteurL[20];
           };
    par
    Code:
    typedef struct {
           int code;
           char titreL[20];
           char nomAuteurL[20];
           }referencesLivre;
    , ce qui éviterait d'avoir à répéter le mot "struct" à chaque définition d'une nouvelle variable de ce type.

    C'est d'ailleurs comme çà que tu as défini la structure livre.

  19. #18
    invite5c6a01fc

    Smile Re : concernant les livres et le c...

    Salut,
    merci pour cette idée,
    donc pour reperer un champ ,
    je met par exemple:
    referenceslivre infoslivre->code

    la fonction ajoutLivreTete va recevoir une liste et un pointeur sur code,pointeur sur titre,et pointeur sur nomAuteur
    donc je met
    listelivres AjoutLivreTete
    (listelivres l,
    referenceslivre*infoslivre->codeL ,
    referenceslivre*infoslivre->titreL ,
    referenceslivre *infoslivre->nomAuteurL).
    c'est bien correct?
    merci

  20. #19
    Jack
    Modérateur

    Re : concernant les livres et le c...

    donc pour reperer un champ ,
    je met par exemple:
    referenceslivre infoslivre->code
    Hors contexte, je ne peux pas trop te répondre.

    listelivres AjoutLivreTete
    (listelivres l,
    referenceslivre*infoslivre->codeL ,
    referenceslivre*infoslivre->titreL ,
    referenceslivre *infoslivre->nomAuteurL).
    c'est bien correct?
    Bin non, c'est un retour en arrière Pourquoi tu veux absomument passer les paramètres champ par champ alors que tout est bien encapsulé dans une structure? A part le nom de variable, tout entête me semblait bon.

    A+

  21. #20
    invite5c6a01fc

    Smile Re : concernant les livres et le c...

    merci,
    donc je met :
    Code:
    listelivres ajoutLivreTete
    (
    listelivres l,referenceslivre *infoslivre
    )
    et dans le programme principal je réunis tous les champs dans une seul structure pour la
    transférer lors de l'appel de la fonction!!!!

  22. #21
    Jack
    Modérateur

    Re : concernant les livres et le c...

    peut-être est-ce que je me fais mal comprendre, mais j'ai l'impression que tu ne lis pas ce que j'écris.

    Code:
    referenceslivre *infoslivre
    Pourquoi un pointeur? Pourquoi réutiliser cet identificateur (infolivre) qui est le même que dans la définition de la structure:
    Code:
    typedef struct livre
    {
       struct referencesLivre infoslivre;
       struct livre* suivant;
           }maillonlivre;
    et qui va amener de la confusion entre le champ de la structure maillon livre et la variable locale de ta fonction?

Discussions similaires

  1. concernant les alcalins
    Par invite70ed4c63 dans le forum Chimie
    Réponses: 2
    Dernier message: 14/10/2009, 21h51
  2. Concernant les incertitudes
    Par invite08fc9639 dans le forum Physique
    Réponses: 20
    Dernier message: 15/07/2009, 06h49
  3. Concernant les Plasmas.
    Par invitec8758a33 dans le forum Physique
    Réponses: 7
    Dernier message: 04/12/2008, 12h23
  4. Concernant les animaux
    Par invite161a0bc8 dans le forum Biologie
    Réponses: 8
    Dernier message: 04/11/2006, 20h53
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...