Aide sur projet c

Fermé
alfons14 Messages postés 3 Date d'inscription samedi 7 juin 2014 Statut Membre Dernière intervention 7 juin 2014 - 7 juin 2014 à 18:24
alfons14 Messages postés 3 Date d'inscription samedi 7 juin 2014 Statut Membre Dernière intervention 7 juin 2014 - 7 juin 2014 à 23:27
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 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 228
7 juin 2014 à 19:10
'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 samedi 7 juin 2014 Statut Membre Dernière intervention 7 juin 2014
7 juin 2014 à 20:48
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 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 228
7 juin 2014 à 21:03
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 samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 841
7 juin 2014 à 21:20
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 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 228
7 juin 2014 à 21:22
Bien vu ;)
0
alfons14 Messages postés 3 Date d'inscription samedi 7 juin 2014 Statut Membre Dernière intervention 7 juin 2014
7 juin 2014 à 23:27
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