cs_samanta26
Messages postés22Date d'inscriptiondimanche 14 novembre 2010StatutMembreDernière intervention26 février 2012
-
14 mars 2011 à 22:50
cs_samanta26
Messages postés22Date d'inscriptiondimanche 14 novembre 2010StatutMembreDernière intervention26 février 2012
-
17 mars 2011 à 21:24
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
cs_Chouchou182
Messages postés252Date d'inscriptionvendredi 13 juin 2003StatutMembreDernière intervention25 avril 20111 15 mars 2011 à 08:43
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 ?
cs_samanta26
Messages postés22Date d'inscriptiondimanche 14 novembre 2010StatutMembreDernière intervention26 février 2012 15 mars 2011 à 14:07
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();
}
cs_samanta26
Messages postés22Date d'inscriptiondimanche 14 novembre 2010StatutMembreDernière intervention26 février 2012 15 mars 2011 à 17:21
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!!
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_Chouchou182
Messages postés252Date d'inscriptionvendredi 13 juin 2003StatutMembreDernière intervention25 avril 20111 15 mars 2011 à 17:38
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 ?
cs_samanta26
Messages postés22Date d'inscriptiondimanche 14 novembre 2010StatutMembreDernière intervention26 février 2012 15 mars 2011 à 17:47
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!!!!
cs_Chouchou182
Messages postés252Date d'inscriptionvendredi 13 juin 2003StatutMembreDernière intervention25 avril 20111 16 mars 2011 à 08:52
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).
cs_samanta26
Messages postés22Date d'inscriptiondimanche 14 novembre 2010StatutMembreDernière intervention26 février 2012 17 mars 2011 à 21:24
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