Aide sur projet c

alfons14 Messages postés 3 Date d'inscription   Statut Membre Dernière intervention   -  
alfons14 Messages postés 3 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour a tous les membres de ccm , le projet c'est gestion de bibliothéque j'ai un probleme de l'affichage de la liste d'ouvrage fonction affiche . (Dev c++)

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
typedef struct {
char titre[100];
int annee;
char auteur[100];
char domaine[100];
}ouvrage;

void menu()
{

printf(" MENU PRINCIPAL\n ");
printf("1-Gestion des Ouvrages \n ");
printf("2-Gestion des Adhérents\n");
printf("3-Gestion des Locations \n");
printf("4-Quitter\n");
}
void menugdo()
{
system(("cls"));

printf("1-Ajout d'un Ouvrage \n");
printf("2-Modification \n");
printf("3-Suppression \n");
printf("4-Recherche \n");
printf("5-Liste des ouvrages \n");
printf("6-Menu Principal\n");
choixgdo();
}
void menuaddouvrage()
{
system(("cls"));

printf("1-Titre \n");
printf("2-Anné d'edition \n");
printf("3-Auteur \n");
printf("4-Domaine \n");
printf("5-Retour \n");
choixaddouvrage();

}
void affiche(ouvrage a[],int x)
{
int i;
for(i=0;i<2;i++)
{
printf("\n titre:");
printf("%s",a[i].titre);
//printf("\n");
//printf("annee:");
// printf("%d",a[i].annee);
}
}
void saisiouvrage(ouvrage a[],int x)
{
int i;

for(i=0;i<2;i++)
{
fflush(stdin);
printf("Titre:");
gets(a[i].titre);

printf("annee:");
scanf("%d",&a[i].annee);
fflush(stdin);
}

// printf("Titre:\t");/*gets(a[*x].titre);*/scanf("%d",&a[*x].annee);

//fflush(stdin);
// printf("Annee edition:\t");scanf("%d",&a[i].annee);

// printf("Auteur:\t");gets(a[i].auteur);//scanf("%s",&a[x].auteur);

// printf("Domaine:\t");gets(a[i].domaine);//scanf("%s",&a[x].domaine);
//}

}
int choixaddouvrage()
{


ouvrage a[3];
int c,x;
while(c!=5)
{
printf(" choix:");
scanf("%d",&c);
switch(c)
{
case 1 :saisiouvrage(a,x);

break;
case 5 :system(("cls"));menugdo();break;
}
}

return c;

}

int choixgdo()
{
ouvrage a[3];
int c,x;
while(c!=6)
{
printf(" choix:");
scanf("%d",&c);
switch(c)
{
case 1 :menuaddouvrage();break;
case 5:affiche(a,x);break;

break;


}
}

return c;

}
int choix()
{
ouvrage a[3];
int c,x;
printf(" choix:");
scanf("%d",&c);
switch(c)
{
case 1 :menugdo();break;
case 5:affiche(a,x);break;
}

return c;
}

int main()
{

menu();
choix();








getch();
return 0;
}

3 réponses

ElementW Messages postés 4814 Date d'inscription   Statut Contributeur Dernière intervention   1 223
 
'lut, et où est la question? Sache qu'ici, on ne fait pas les exos à la place des autres, mais on aide quand quelqu'un coince sur un point où il a déjà cherché (et n'a pas réussi).
Quelques commentaires:
#include <conio.h>
: Non standard, a supprimer
system(("cls"));
: Idem, pas portable
fflush(stdin);
: Idem, comportement non défini, a remplacer par un appel vers une fonction comme ça:
void flush_stdin() {
    int c;
    while ((c = getchar()) != '\n' && c != EOF);
}

L'indentation a été supprimée mais j'espère qu'elle existe dans ton code, la prochaine fois sers toi de ce bouton une fois que tu as copié ton code et séléctionné:
0
alfons14 Messages postés 3 Date d'inscription   Statut Membre Dernière intervention  
 
J'ai compris, mais le probleme est dans l'affichage de la liste des ouvrages, quand j'affiche il me donne des valeurs aléatoires.
0
ElementW Messages postés 4814 Date d'inscription   Statut Contributeur Dernière intervention   1 223
 
C'est normal:
ouvrage a[3];
définit la place pour 3
ouvrage
s mais la mémoire peut contenir des octets au hasard, d'où les valeurs aléatoires. Il faut nettoyer cet espace avec
memset(a, 0, sizeof(ouvrage)*3);

Autre remarques: remplace le
getch()
par
getchar()
.
gets(a[i].titre)
est dangereux, remplace le par
scanf("%99s", a[i].titre)
(99 car titre peut contenir 100 caractères, il faut l'espace pour le
'\0'
final), idem pour le reste du code que tu as commenté.
Ta liste d'ouvrage n'est pas conservée entre les fonctions: tu redéfinis
ouvrage a[3];
à chaque fois. Fais comme avec ta fonction
affiche
: utilise un paramètre qui contient le tableau des oeuvres pour le passer entre les fonctions.
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Juste une petite remarque. Il vaut mieux remplacer gets() par fgets(a[i].titre, 100, stdin); Sinon pas d'espace possible dans le titre. Après, il y a le problème du '\n' stocké en fin, mais c'est pareil qu'avec gets().
0
ElementW Messages postés 4814 Date d'inscription   Statut Contributeur Dernière intervention   1 223
 
Bien vu ;)
0
alfons14 Messages postés 3 Date d'inscription   Statut Membre Dernière intervention  
 
Merci infiniment , je veux pas etre fatiguant mais j'ai un autre problème , après plusieurs modification dans mon programme je sais pas comment incrémenter la taille du tableau pour que l'affichage soit exacte d'autant de fois l'utilisateur ajoute un autre ouvrage pendant l'execution du programme.j'ai penser a un pointeur *p qui s'incrementera aprés chaque saisie d'infos .puis laffichage final sera de i=0 à *p.
#include <stdio.h>
#include <stdlib.h>
#include <myconio.h>
typedef struct {
        char titre[100];
        int annee;
        char auteur[100];
        char domaine[100];
        }ouvrage;

void menu()
{
    gotoxy(31,11);  
   printf("    MENU PRINCIPAL\n      \t\t          1-Gestion des Ouvrages\n       \t\t          2-Gestion des Adhérents\n       \t\t          3-Gestion des Locations\n      \t\t          4-Quitter\n    ");
  // printf("1-Gestion des Ouvrages \n ");
  // printf("2-Gestion des Adhérents\n");
  // printf("3-Gestion des Locations \n");
  // printf("4-Quitter\n");
}

void menugdo(ouvrage a[],int x,int *p)
{
    system(("cls"));

   printf("1-Ajout d'un Ouvrage \n");
   printf("2-Modification \n");
   printf("3-Suppression \n");
   printf("4-Recherche \n");
   printf("5-Liste des ouvrages \n");
   printf("6-Menu Principal\n");
   choixgdo(a,x,p);
}
void menuaddouvrage(ouvrage a[],int x,int *p)
{
    system(("cls"));

   printf("1-Titre \n");
   printf("2-Anné d'edition \n");
   printf("3-Auteur \n");
   printf("4-Domaine \n");
   printf("5-Retour \n");
   choixaddouvrage(a,x,p);
   
}
 void affiche(ouvrage a[],int x,int *p)
{
     int i;
     
     for(i=0;i<*p;i++)
     {
     printf("\n titre:");
     printf("%s",a[i].titre);
     printf("\n");
     printf("annee:");
    printf("%d",a[i].annee);
     }
} 
void saisiouvrage(ouvrage a[],int x, int *p)
{
     int i;
    
 for(i=0;i<x;i++)
     {
     fflush(stdin);
     printf("Titre:");
     gets(a[i].titre);
     
     printf("annee:");
     scanf("%d",&a[i].annee);
     fflush(stdin);
     (*p)++;
     }
  
  //  printf("Titre:\t");/*gets(a[*x].titre);*/scanf("%d",&a[*x].annee);   

    //fflush(stdin);              
 //  printf("Annee edition:\t");scanf("%d",&a[i].annee);  
 
 //   printf("Auteur:\t");gets(a[i].auteur);//scanf("%s",&a[x].auteur);
  
  // printf("Domaine:\t");gets(a[i].domaine);//scanf("%s",&a[x].domaine);
  //}
  
     }
int choixaddouvrage(ouvrage a[],int x,int *p)
{
    
    
   
    int c;
   while(c!=5)
   {
    printf("        choix:");
    scanf("%d",&c);
    switch(c)
    {
        case 1 :saisiouvrage(a,x,p);
                
                break;     
        case 5 :system(("cls"));menugdo(a,x,p);break;
    }
}

    return c;
    
    }
  
int choixgdo(ouvrage a[],int x,int *p)
{
    int c;
    while(c!=6)
    {
    printf("        choix:");
    scanf("%d",&c);
    switch(c)
    {
        case 1 :menuaddouvrage(a,x,p);break;
        case  5:affiche(a,x,p);break;
        
        case 6:system(("cls"));menu();choix(a,x,p);break;
                
        
    }
}

    return c;
    
    }
int choix(ouvrage a[],int x,int *p)
{
     
    int c;
    printf("  \t\t\t\t\t         choix:");
    scanf("%d",&c);
    switch(c)
    {
        case 1 :menugdo(a,x,p);break;
        case 5:affiche(a,x,p);break;
        
    }

    return c;
}

int main()
{
    ouvrage a[100];
  int x=1,*p;
  memset(a, 0, sizeof(ouvrage)*100);
    menu();
   choix(a,x,p);








 getch();
    return 0;
}

0