Preobleme de fonction

gemini010 Messages postés 12 Date d'inscription dimanche 27 octobre 2002 Statut Membre Dernière intervention 13 mars 2005 - 19 août 2004 à 17:15
gemini010 Messages postés 12 Date d'inscription dimanche 27 octobre 2002 Statut Membre Dernière intervention 13 mars 2005 - 20 août 2004 à 14:36
bonjour ,g commencer a faire un programme me permetant d'enregistrer des client dans un fichier a l'inde d'une fonction et de les consulte en utilisant une autre fonction, cela semblait fonctionner jusqu'au momment ou g creer une fonction execmenu affin de rendre le programme + intuitif

le probleme est que depuis que j'utilise la fonction execmenu, je n'arrive plus a consulter les enregistrement se trouvant dans le fichier

pourriez vous me dire ce qui ne vas pas dans mon code? merci

Gemini

// le code

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>

/* definition des structure ------------------------------------*/

struct cli
{
int id_cli;
char nom[25];
float som_due;
int reduc;
int tva;
};

struct fact
{
int id_fact;
char nom_cli[25];
float mont_tot;
};

/* déclaration des fonctions --------------------------------*/

int execmenu();
void encodecli(struct cli *t);
void encodefact(struct fact *t_fact);
void affiche (struct cli t);

/* Fonction principale -----------------------------------------*/
void main()
{

/*Déclarations ----------------------------------------------*/
struct cli tab[10];
struct fact tab_fact[10];
int choi;

/* Traitement -----------------------------------------------*/

do
{
choi=execmenu();

switch (choi)
{
case 1: encodecli(tab);
break;
case 2: encodefact(tab_fact);
break;
case 3: affiche (*tab);
break;
case 4: printf("choix 4");
break;
case 5: printf("choix 5");
break;
case 99: printf("choix 99");
break;
}

}
while (choi!=99);
}
/* fonction execmenu ----------------------------------------*/

int execmenu()

{
int choix;
clrscr();

printf("\n\n\n\n\n\n\n\n");
printf(" ******************************************\n");
printf(" * <1> Ajouter un client *\n");
printf(" * <2> Ajouter une facture *\n");
printf(" * <3> Consulter la liste des clients *\n");
printf(" * <4> Consulter la liste des factures *\n");
printf(" * <5> Lister les mauvais payeur *\n");
printf(" * <99> quitter *\n");
printf(" * Votre choix : *\n");
printf(" ******************************************\n");

do
{
scanf("%d",&choix);
}
while (choix!=1 && choix!=2 && choix!=3 && choix!=4 && choix!=5 && choix!=99);

return choix;
}

/*fonction d'encodage des client ----------------------------*/
void encodecli(struct cli *t)
{
FILE *ptr;
int ok;
char choix;
ptr=fopen("acces.dat","a+b");
if(ptr!=NULL)
{
choix='o';
while(choix == 'o')
{
clrscr();
printf("\nentrer le nom :");
scanf("%s",t->nom);
printf("entrer le taux de la tva, 25 ou 12:");
scanf("%d",&t->tva);
t->id_cli+1;
fflush(stdin);
fwrite(t,sizeof(*(t)),1,ptr);
do
{
ok=0;
printf("Nouvelle fiche (o/n) ?");
choix = getchar();
choix=tolower(choix);
if(choix!='o' && choix!='n')
{
printf("\nRépondez "o" ou "n" \n");
ok=1;
}
}while(ok == 1);
}// fin while ok
}// fin if ptr NULL

fclose(ptr);
}
/*fonction d'encodage des client ----------------------------*/

void encodefact(struct fact *t_fact)
{

int rep_fact;
int art=0;
int prix=0;
int quant=0;
int total=0;
int temp=0;
int somme=0;

do
{
clrscr();
printf("entrer le numero de l'article:");
scanf("%d", &art);
printf("entrer le prix de l'article:");
scanf("%d", &prix);
printf("entrer le nombre d'aricle:");
scanf("%d", &quant);

somme = prix*quant;
total += somme;

printf("voulez vous continuer? 1 pour oui, 2 pour non");
scanf("%d",&rep_fact);

}
while(rep_fact==1);

if (total > 1200)
temp = total-(total/100*3);

else
if(total > 500)
temp = total - total/100;

printf("le montant de la facture est de %d",temp);
}

//Affichage du contenu du fichier principal
void affiche(struct cli t)
{
FILE *ptr;
ptr=fopen("acces.dat","r");
fread(&t,sizeof(t),1,ptr);
while(fread(&t,sizeof(struct cli),1,ptr) != 0)//(!feof(ptr))
{
printf("\nNom : %s, tva : %d",t.nom,t.tva);
}
fclose(ptr);
}

4 réponses

dletozeun Messages postés 546 Date d'inscription vendredi 13 février 2004 Statut Membre Dernière intervention 9 janvier 2008 1
19 août 2004 à 20:16
Il y a un truc que je comprends pas dans ta fonction execmenu() pourquoi tu mets des points virgule apres la parenthese finale de tes while ? Si tu les enleves ca fait koi?

Mais bon vu que je n'utilise pas "do" je dis surement des conneries...

moi j'aurais fait:

while (choix!=1 && choix!=2 && choix!=3 && choix!=4 && choix!=5 && choix!=99)
{
scanf("%d",&choix);
}

Ce genre de presentation a la place des do while

Peut etre que le probleme vient du fait que t'as pas mis de "s" à "/*fonction d'encodage des client ----------------------------*/
" :big)

Mais plus serieusement, il y aun truc bizarre ici:

while(choix == 'o')
{
clrscr();
...

"choix" est du type char alors tu ne peux pas comparer choix et 'o' comme ca parce que choix est un pointeur vers une adresse memoire...
Il faut que tu fasses while(!strcmp(choix,"o"))
strcmp() renvoie 0 quand les deux arguments sont egaux mais c'est a verifier...) de meme pour :if(choix!='o' && choix!='n')
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
19 août 2004 à 21:04
Ya juste un truc vraiment chelou:

Affiche(*Tab);

T'es sure de toi sur ce coup la ?!
Corrige toi et ca devrait bcp mieux marcher!

Shell
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
19 août 2004 à 21:49
affiche (*tab); est correcte, mais le code est incoherent, a qoi ca sert de servir d'une copie de *tab comme variable locale?

ne jamais faire
while (choix!=1 && choix!=2 && choix!=3 && choix!=4 && choix!=5 && choix!=99)
{
scanf("%d",&choix);
}

risque de boucle infinie, si la saisie est invalide scanf butera indefiniment dessus

il faut faire

while (choix!=1 && choix!=2 && choix!=3 && choix!=4 && choix!=5 && choix!=99)
{
if( !scanf("%d",&choix) ) while( fgetc(stdin) != EOF );
}

pir encore, jamais de scanf sur un char*, pas de controle de bord, toujours utiliser fgets
0
gemini010 Messages postés 12 Date d'inscription dimanche 27 octobre 2002 Statut Membre Dernière intervention 13 mars 2005
20 août 2004 à 14:36
voila g reussi a resoudre mon probleme avec execmenu mais c vrai que comme disait Djl lorsque je rentre autre chose que un nombre pour rentrer dans

while (choix!=1 && choix!=2 && choix!=3 && choix!=4 && choix!=5 && choix!=99)
{
scanf("%d",&choix);
}

et bien ca plante, g essayer comme tu as dit mais alors le menu ne fonctionne de nouveau plus

ceci dit g un autre probleme, lorsque j'encode les facture, je dois entrer le nom du client mais le client doit d'abord exister, j'aimerai savoir comment faire pour pouvoir aller verifier dans mon fichier client si celui ci existe deja

je remet mon code modifier, merci pour votre aide

Stéphane

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#define TAILLE 100

/* definition des structure ------------------------------------*/

struct cli
{
int id_cli;
char nom[25];
float som_due;
int reduc;
int tva;
};

struct fact
{
int id_fact;
char nom_cli[25];
float mont_tot;
};

/* déclaration des fonctions --------------------------------*/

int execmenu();
void encodecli(struct cli *t);
void encodefact(struct fact *t_fact);
void affiche (struct cli t);

/* Fonction principale -----------------------------------------*/
void main()
{

/*Déclarations ----------------------------------------------*/
struct cli tab[TAILLE];
struct fact tab_fact[TAILLE];
int choi;

/* Traitement -----------------------------------------------*/

do
{
choi=execmenu();

switch (choi)
{
case 1: encodecli(tab);
break;
case 2: encodefact(tab_fact);
break;
case 3: affiche (*tab);
break;
case 4: printf("choix 4");
break;
case 5: printf("choix 5");
break;
case 99: printf("Aurevoir");
break;
}

}
while (choi!=99);
}
/* fonction execmenu ----------------------------------------*/

int execmenu()

{
int choix;
clrscr();

printf("\n\n\n\n\n\n\n\n");
printf(" ******************************************\n");
printf(" * <1> Ajouter un client *\n");
printf(" * <2> Ajouter une facture *\n");
printf(" * <3> Consulter la liste des clients *\n");
printf(" * <4> Consulter la liste des factures *\n");
printf(" * <5> Lister les mauvais payeur *\n");
printf(" * <99> quitter *\n");
printf(" * Votre choix : *\n");
printf(" ******************************************\n");

do
{
scanf("%d",&choix);
}
while (choix!=1 && choix!=2 && choix!=3 && choix!=4 && choix!=5 && choix!=99);

return choix;
}

/*fonction d'encodage des client ----------------------------*/
void encodecli(struct cli *t)
{
FILE *ptr;
int ok;
char choix;
ptr=fopen("acces.dat","a+b");
t->id_cli = 1;
if(ptr!=NULL)
{
choix='o';
while(choix == 'o')
{
clrscr();
printf("Client n°%d",t->id_cli);
printf("\nentrer le nom :");
scanf("%s",t->nom);
printf("entrer le taux de la tva, 25 ou 12:");
scanf("%d",&t->tva);
t->id_cli++;
fflush(stdin);
fwrite(t,sizeof(*(t)),1,ptr);
do
{
ok=0;
printf("Nouvelle fiche (o/n) ?");
choix = getchar();
choix=tolower(choix);
if(choix!='o' && choix!='n')
{
printf("\nRépondez "o" ou "n" \n");
ok=1;
}
}
while(ok == 1);
}// fin while ok
}// fin if ptr NULL

fclose(ptr);
}
/*fonction d'encodage des Facture ----------------------------*/

void encodefact(struct fact *t_fact)
{

int rep_fact;
int art=0;
int prix=0;
int quant=0;
int total=0;
int temp=0;
int somme=0;

do
{
clrscr();
printf("entrer le numero de l'article:");
scanf("%d", &art);
printf("entrer le prix de l'article:");
scanf("%d", &prix);
printf("entrer le nombre d'aricle:");
scanf("%d", &quant);

somme = prix*quant;
total += somme;

printf("voulez vous continuer? 1 pour oui, 2 pour non");
scanf("%d",&rep_fact);

}
while(rep_fact==1);

if (total > 1200)
temp = total-(total/100*3);

else
if(total > 500)
temp = total - total/100;
else
temp = total;

printf("le montant de la facture est de %d",temp);
getch();
}
//Affichage du contenu du fichier principal
void affiche(struct cli t)
{
FILE *ptr;
ptr=fopen("acces.dat","r");
fread(&t,sizeof(t),0,ptr);
clrscr();
while(fread(&t,sizeof(struct cli),1,ptr) != 0)//(!feof(ptr))
{
printf("\n Numéro Client : %d, Nom : %s, tva : %d",t.id_cli-1,t.nom,t.tva);
//cli-1 car incrémentation par avance à l'encode
}
printf("\n\n Appuyer sur une touche pour revenir au menu");
getch();
fclose(ptr);
}
0
Rejoignez-nous