Gestion d'une bibliothèque

Signaler
Messages postés
22
Date d'inscription
dimanche 14 novembre 2010
Statut
Membre
Dernière intervention
26 février 2012
-
Messages postés
22
Date d'inscription
dimanche 14 novembre 2010
Statut
Membre
Dernière intervention
26 février 2012
-
slt, j'ai besoin d'aide SVP!!
j'ai un mini projet de gestion d'une bibliothèque!! je dois implémenter un ensemble de fonctions :saise, tri, recherche...et je dois aussi implémenter les livres de la bibliothèque sous forme d'un tableau de structure livre de dim 1 et de taille 100...
mon prblème c'est que le nombre de livre sur lequl j'effectue toutes ces opérations est variable du coup il faut travailler avec des pointeurs...j'ai programmé un code et ça se compile mais il me sort une erreur'la mémoire ne peut pas être read'....voici mon code:
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
struct livre
{
int num_inv;
int annee_edition;
char titre[20], nom_auteur[20];
};

livre saisie()
{
livre L;
printf("\n\n\t Veuillez saisir les donnees du livre \n\n");
printf("Entrer le numero d'inventaire :\n");
scanf("%d", &L.num_inv);
printf("Entrer le titre du livre :\n");
scanf("%s", &L.titre);
printf("Entrer le nom de l'auteur :\n");
scanf("%s", &L.nom_auteur);
printf("Entrer l'annee d'edition :\n");
scanf("%d", &L.annee_edition);
return(L);
}

void affichage(livre L)
{
printf("\t\n Les caracteristiques du livre sont: \n\t Le numero d'inventaire: %d \n\t Le titre du livre: %s \n\t Le nom de l'auteur: %s \n\t L'annee d'edition: %d",L.num_inv,L.titre,L.nom_auteur,L.annee_edition);
}

void recherche(livre *m)
{
int i,n;
int numr;
printf("\n\nveuillez entrer le numero d'inventaire du livre recherche :");
scanf("%d",&numr);
m = (livre *)malloc(n * sizeof(int));
for (i=0;i<n;i++)
{
if ((*(m+i)).num_inv==numr)
{
printf("le livre recherche est disponible");
affichage(*(m+i));
}
}
}
void tri(livre *p)
{
int i,j,n;
p = (livre *)malloc(n * sizeof(int));
livre x;
for (j=0;j<n;j++)
{
for (i=0;i<j;i++)
if ((*(p+i)).num_inv < (*(p+i+1)).num_inv)
{
x=*(p+i);
*(p+i)=*(p+i+1);
*(p+i+1)=x;

}

}
for (i=0;i<n;i++)

affichage(*(p+i));
}

main()
{int n;
printf("\n\n\n\t\t\t=> Gestion de bibliotheque <=\n\n\n");
printf("\n\n\n\t\Veuillez entrer le nombre de livre que vous voulez saisir : \n\n\n");
scanf("%d",&n);
livre tab[100];
int i;
for(i=0; i<n; i++)
{
*(tab+i)=saisie();
}
for(i=0; i<n; i++)
{
affichage(*(tab+i));
}
printf("\n\n\nles livres tries par numero d'inventaire décroissant:\n\n\n");
recherche( &tab[0]);
tri( &tab[0]);
free(tab);
getch();
}
Merci d'avance

8 réponses

Messages postés
252
Date d'inscription
vendredi 13 juin 2003
Statut
Membre
Dernière intervention
25 avril 2011

Salut,

De nos jours, on a la chance de pouvoir compiler souvent. Aussi, construis ton programme petit à petit et teste au fur et à mesure chaque partie.

Je te conseille de commencer par l'affichage : définis ta structure, place deux ou trois éléments dans un tableau (statiquement : dans le code source écris la valeur de ces éléments), et écris une fonction main très simple qui affiche le contenu du tableau.

Une fois que cela fonctionne, tu pourras te pencher sur les fonctionnalités plus complexes, par exemple la saisie, et ainsi de suite.

Quelques remarques plus concrètes :

malloc et free ne semblent pas nécessaire dans ton programme : évite-les pour le moment

idem pour conio.h

Pour accéder à l'élément i du tableau m : m[i] est plus lisible que *(m+i) quoique équivalent.

* * *

J'ai à mon tour une question. Cela ressemble à un exercice scolaire. Dans le cadre de quel cours sont posés de tels exercices ? Algorithmique ? Programmation ? Structures de données ? Histoire ? Est-ce une punition ?

Bonne prog,
Messages postés
22
Date d'inscription
dimanche 14 novembre 2010
Statut
Membre
Dernière intervention
26 février 2012

slt, merci chouchou, j'ai deja essayé cela :) et pr repondre à ta question, c'est dans le cadre des structures de données...j'ai fais qlq modifications dans mon programme, mais ça marche pas:s SVP j'ai besoin d'aide, voici le code:
#include<stdio.h>
#include<conio.h>
#include<string.h>

struct livre
{
int num_inv;
int annee_edition;
char titre[20], nom_auteur[20];
};

livre saisie()
{
livre L;
printf("\n\n\t Veuillez saisir les donnees du livre \n\n");
printf("Entrer le numero d'inventaire :\n");
scanf("%d", &L.num_inv);
printf("Entrer le titre du livre :\n");
scanf("%s", &L.titre);
printf("Entrer le nom de l'auteur :\n");
scanf("%s", &L.nom_auteur);
printf("Entrer l'annee d'edition :\n");
scanf("%d", &L.annee_edition);
return(L);
}

void affichage(livre L)
{
printf("\t\n Les caracteristiques du livre sont: \n\t Le numero d'inventaire: %d \n\t Le titre du livre: %s \n\t Le nom de l'auteur: %s \n\t L'annee d'edition: %d",L.num_inv,L.titre,L.nom_auteur,L.annee_edition);
}

void recherche(livre *m, int N)
{
int i;
int numr, *p;
printf("\n\nveuillez entrer le numero d'inventaire du livre recherche :");
scanf("%d",&numr);

for (i=0;i<N;i++)
{
if ((*(m+i)).num_inv==numr)
{
printf("le livre recherche est disponible");
affichage(*(m+i));
}
}
}
void tri(livre *p, int N)
{
int i,j;
livre x;
for (j=0;j<N;j++)
{
for (i=0;i<j;i++)
if ((*(p+i)).num_inv < (*(p+i+1)).num_inv)
{
x=*(p+i);
*(p+i)=*(p+i+1);
*(p+i+1)=x;

}

}
for (i=0;i<N;i++)
{
affichage(*(p+i));
}
}

main()
{int n;
printf("\n\n\n\t\t\t=> Gestion de bibliotheque <=\n\n\n");
printf("\n\n\n\t\Veuillez entrer le nombre de livre que vous voulez saisir : \n\n\n");
scanf("%d",&n);
livre tab[100];
int i;
for(i=0; i<n; i++)
{
*(tab+i)=saisie();
}
for(i=0; i<n; i++)
{
affichage(*(tab+i));
}
printf("\n\n\nles livres tries par numero d'inventaire décroissant:\n\n\n");
recherche( &tab[0], n);
tri( &tab[0],n);
getch();
}

Merci d'avance!!!
Messages postés
252
Date d'inscription
vendredi 13 juin 2003
Statut
Membre
Dernière intervention
25 avril 2011

Salut.

Ça marche pas, dis-tu. Il faudrait être un peu plus clair.

Il y a des soucis dans la fonction de tri. Il me semble qu'un i < N - j s'est changé en i < j.

Bonne prog,
Messages postés
22
Date d'inscription
dimanche 14 novembre 2010
Statut
Membre
Dernière intervention
26 février 2012

slt, merci chouchou pr ta remarque!!! mon prblème c'est qu'il n'effectue aucun tri et concernant la recherche, il m'affiche le livre recherché 2 fois et il m'affiche tous les autres livres!!
Messages postés
252
Date d'inscription
vendredi 13 juin 2003
Statut
Membre
Dernière intervention
25 avril 2011

Hello,

Il affiche tous les livres parce qu'à la fin de la fonction tri, tu demandes d'afficher tous les livres (ce qui n'est pas le rôle d'une fonction de tri).

As-tu essayé de corriger la condition de la boucle interne (sur i) dans la fonction de tri ?

Pour y voir plus clair, remplace

*(tab + i) par tab[i]
&tab[0] par tab

Bonne prog,
Messages postés
22
Date d'inscription
dimanche 14 novembre 2010
Statut
Membre
Dernière intervention
26 février 2012

slt, j'ai déja essayé ça mais ça marche pas aussi :s:s!!!! En fait le problème d'affichage j'arrive pas à le résoudre!!!SVP si tu px me montrer comment afficher seulement les livres triés et comment afficher seulement le livre recherché!!!!
Merci d'avance!!!!
Messages postés
252
Date d'inscription
vendredi 13 juin 2003
Statut
Membre
Dernière intervention
25 avril 2011

Bonjour,

Relis ma première remarque : « fais en sorte que l'affichage fonctionne avant de passer à la suite.» Aussi il ne devrait pas y avoir de soucis d'affichage maintenant !

D'abord, une fonction pour afficher tout le tableau :

void afficherN(livre L[], int N)
{
  int i ;
  for (i = 0 ; i < N ; ++i)
    affichage(L[i]);
}


Ensuite il faut retirer la boucle d'affichage de la fonction de tri.

Enfin tu peux envisager un main comme celui qui suit :

int
main()
{
  int n;
  printf("Veuillez entrer le nombre de livre que vous voulez saisir : ");
  scanf("%d",&n);
  livre tab[100];
  int i;
  for(i=0; i<n; i++)
  {
    tab[i] = saisie();
  }

  printf("Tous les livres :\n");
  afficherN(tab, n);

  recherche(tab, n);

  printf("\nLes livres tries par numero d'inventaire décroissant:\n");
  tri(tab,n);
  afficherN(tab,n);
  return 0;
}


1° une phase de saisie
2° un affichage pour montrer que la saisie a bien fonctionné
3° on cherche un élément et on en affiche les caractéristiques si il est trouvé.
4° on trie et affiche tout le tableau trié.

Une fois que ça fonctionne, il y a moult façons d'améliorer ce code :
* programmer un vrai algorithme de tri (pas un truc folklorique) ;
* permettre à l'utilisateur de se tromper lors de la saisie ;
* ne pas passer des structures entre fonctions par valeur (i.e. copie).

Bonne prog,
Messages postés
22
Date d'inscription
dimanche 14 novembre 2010
Statut
Membre
Dernière intervention
26 février 2012

merci chouchou pour ton aide j'ai déja resolu le problème, maintenant je veux implémenter une fonction ajout et retrait...SVP concernant les façons d'améliorer le code, je voulais te demander si tu as déja un exemple de ces trucs!! est ce que tu px me le passer :) !!!
maerci d'avance