Problème d'affichage programme

Fermé
baedyl Messages postés 9 Date d'inscription vendredi 27 février 2015 Statut Membre Dernière intervention 15 juin 2015 - 15 avril 2015 à 19:38
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 16 avril 2015 à 00:13
Bonjour à tous,

Je travaille sur mon projet de fin d'année (gestion d'une bibliothèque), j'exécute mon programme sans souci mais au moment de l'affichage il plante, un message d'erreur s'affiche et mon programme s'arrete. J'utilise Codeblocks 13.12 sous windows 8.1.

SVP voici mon code j'ai vraiment besoin d'aide!!!

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#include <windows.h>
typedef struct{
int Jour,Mois,Annee;
}Date;
 
typedef struct{
int ISBN,Nombre_Exemplaire;
char Titre[100],Auteur[100],Editeur[100],Type[100];
Date Date_Edition;
float Prix;
}Document;
 
void Remplissage(Document T[],int );
void Affichage(Document [],int);
void Menu(Document [],int);
int Recherche(Document [],int ,int );
void Tri();
void Ajout();
void Suppression();
void Modification();
void Emprunter();
void Rendre_doc();
 
int main(){
system("color 3");
int choix=0,N;
Document T[100];
Menu(T,choix);
return 0;
}
 
void Menu(Document T[100],int choix){
int N,ISBN;
do{
 
    do{
        system("cls");
        printf("(1)Remplissage  \t(2)Affichage\t(3)Recherche\t(4)Tri\n\n(5)Ajout\t(6)Suppression\t(7)Modification\t(8)Emprunter\n\n\t\t\t\t\t\t\t\t(0)Quitter");
        printf("\nOperation a effectuer: ");
        scanf("%d",&choix);
    }while(choix<0||choix>9);
    switch(choix){
 
    case 1: system ("cls"); Remplissage(T,N);  break;
    case 2: system ("cls"); Affichage(T,N); break;
    case 3: system ("cls"); Recherche(T,N,ISBN); break;
    case 4: system ("cls"); Tri(T,N); break;
    case 0: break;  }
 
 
}while(choix!=0);
return;
}
void Remplissage(Document T[100],int N){
 
int i;
 
do{
  printf("\nEntrer le nombre de documents: ");
  scanf("%d",&N);
  }while(N<=0||N>100);
 
  for(i=0;i<N;i++){
  printf("\nEntrer les informations sur le document %d: ",i+1);
  printf("\n\n ISBN: ");
  do{
  scanf("%d",&T[i].ISBN);
  }while(T[i].ISBN==T[i-1].ISBN);
  fflush(stdin);
 
  printf(" \n\nTitre: ");
  gets(T[i].Titre);
 
  printf(" \n\nAuteur: ");
  gets(T[i].Auteur);
 
  printf(" \n\nEditeur: ");
  gets(T[i].Editeur);
 
  do{
  printf("\n\nDate selon le format JJ MM AAAA: ");
  scanf("%d %d %d", &T[i].Date_Edition.Jour, &T[i].Date_Edition.Mois, &T[i].Date_Edition.Annee);
  if(T[i].Date_Edition.Jour==29&&T[i].Date_Edition.Annee%4!=0)
    printf("\t\t\t\t\t\t\a Date non valide");
  }while((T[i].Date_Edition.Jour<=0)||(T[i].Date_Edition.Jour>31)||(T[i].Date_Edition.Mois<=0)||(T[i].Date_Edition.Mois>12)||(T[i].Date_Edition.Annee<0)||(T[i].Date_Edition.Annee>2015)||(T[i].Date_Edition.Jour==29 && T[i].Date_Edition.Annee%4!=0));
  fflush(stdin);
 
  printf(" \n\nType: ");
  gets(T[i].Type);
 
  printf(" \n\nNombre d'exemplaires: ");
  do{
  scanf("%d",&T[i].Nombre_Exemplaire);
  }while(T[i].Nombre_Exemplaire<0);
 
 do{
  printf(" \n\nprix: ");
  scanf("%f",&T[i].Prix);
 
  }while(T[i].Prix<=0);
 
  }
 
   return;
 
}
void Affichage(Document T[100], int N){
    int i;
    for(i=0;i<N;i++){
        printf("Infos Document %d : \n",i+1);
        printf("ISBN:%d", T[i].ISBN);
        printf("Titre: %s",T[i].Titre);
        printf("\n\tAuteur : %s ",T[i].Auteur);
        printf("\n\tEditeur : %s ",T[i].Editeur);
        printf("\n\tdate d'edition : %d/%d/%d ",T[i].Date_Edition.Jour,T[i].Date_Edition.Mois,T[i].Date_Edition.Annee);
        printf("\n\tType : %s",T[i].Type);
        printf("\n\tNombre d'exemplaires : %d ",T[i].Nombre_Exemplaire);
        printf("\n\tPrix :  %2f dh ",T[i].Prix);
 
    }
return;
}
 
int Recherche(Document T[100],int N,int ISBN){
int i;
do{
printf("Entrer l'ISBN du document a rechercher: ");
scanf("%d",&ISBN);
}while(ISBN<0||ISBN>100);
for(i=0;i<=N;i++){
    if(T[i].ISBN==ISBN)
       return i;
return -1;
}getch();
}
void Tri(Document T[100],int N,int choix2){
printf("(1) Tri par ordre alphabetique des titres\n(2)Tri par ordre croissant des prix\n(3)Tri par ordre chronologique des dates d'edition ");
printf("\nTri a effectuer: ");
scanf("%d",&choix2);
switch(choix2){
 
case 1: break;
case 2: break;
default: break;}
}

1 réponse

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
15 avril 2015 à 22:07
Bonjour,

int choix=0,N;
Menu(T,choix);

Ca ne modifiera pas la variable choix présent dans le main(). Pour ce faire, il faut passer par un pointeur. Et si tu n'as pas besoin de modifier choix, alors ça sert à rien de l'envoyer en paramètre. Il suffit de le déclarer dans la fonction Menu().
De plus à quoi sert ta fonction N dans le main() ?

void Menu(Document T[100],int choix){
int N,ISBN;

Exactement même remarque pour N que tu utilises pour appeler les fonctions Remplissage(), Affichage(), Recherche() et Tri().

while(T[i].ISBN==T[i-1].ISBN);
Attention, lorsque i=0 (1ère itération), tu auras T[-1] => plantage.

fflush(stdin);
Ce n'est pas correct. Pour vider le buffet, il faut le faire manuellement avec une boucle while() sur un getchar().

gets(T[i].Titre);
Fonction obsolète. On utilise plutôt la fonction fgets().
Même remarque pour les autres gets().

Pas besoin de return; à la fin de tes fonctions void.

Corrige déjà tout ça, et reposte ton code corrigé. N'hésite pas non plus à nous dire précisément où ça plante précisément.

Cdlt,
0
baedyl Messages postés 9 Date d'inscription vendredi 27 février 2015 Statut Membre Dernière intervention 15 juin 2015
15 avril 2015 à 23:46
Merci pour tes remarques!
J'ai suivi tes remarques...Mais il y a toujours des petits problèmes, quand j'utilise "fgets" on me dit "too few arguments to function fgets". Aussi j'ai pas encore vu les pointeurs donc je suis un peu perdu et aussi l'alternative que tu m'as proposé pour fflush reste encore un peu flou dans ma tete.
Sinon au moment du lancement de la fonction affichage mon programme plante toujours...
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
16 avril 2015 à 00:13
Ben si toutes mes remarques n'ont pas été prises en compte sans erreur, c'est pas anormale que ça ne fonctionne toujours pas, si ?
Pour fgets(), il faut regarder le manuel (man fgets) : cela donne par exemple :
fgets(chaine, sizeof chaine, stdout);


Pour fflush(stdin), cela n'existe pas en C...
La bonne méthode :
int c;
while ((c=getchar()) != '\n' && c != EOF);

A mettre dans une fonction bien sûr.

Après, il restera probablement d'autres erreurs. C'est pour ça que j'insiste sur le fait que tu corriges l'ensemble, que tu repostes le code corrigé et que tu nous dises précisément où ça plante.
0