atfximen Posté(e) le 12 mars 2006 Partager Posté(e) le 12 mars 2006 Bonjour à tous, j'ai un problème lorsque je dois afficher un tableau de structures. Je m'explique: j'encode des factures les une à la suite des autres. C'est à dire que le tableau "factures" avance à chaque fois d'une position. Après cela, je reviens au main et j'appelle la fonction qui est censée m'afficher ce tableau. Cependant elle ne m'affiche que les éléments à partir de l'emplacement actuel dans le tableau. (position de la dernière facture enregistrée) Est ce que quelqu'un a une idée pour ré-initialiser la tableau à 0? Merci à tous. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Quarky Posté(e) le 12 mars 2006 Partager Posté(e) le 12 mars 2006 Tu peux utiliser Reset pour faire revenir le pointeur en début de tableau ! Lien vers le commentaire Partager sur d’autres sites More sharing options...
atfximen Posté(e) le 12 mars 2006 Auteur Partager Posté(e) le 12 mars 2006 Merci, mais j'ai omis de préciser que c'est en language C. Je suppose que ça ne fonctionne pas... EDIT: En effet ça ne fonctionne pas. Une autre idée??? Lien vers le commentaire Partager sur d’autres sites More sharing options...
Baldurien Posté(e) le 12 mars 2006 Partager Posté(e) le 12 mars 2006 Tu peux préciser le langage dans le titre? (ceci structure et php ...) Faudrait voir comment tu fais fonctionner ce tableau :) ça me paraît bizarre ton histoire d'index. Lien vers le commentaire Partager sur d’autres sites More sharing options...
atfximen Posté(e) le 12 mars 2006 Auteur Partager Posté(e) le 12 mars 2006 C'est en language C, mais qu'entends tu par comment je fais fonctionner mon tableau? Lien vers le commentaire Partager sur d’autres sites More sharing options...
theocrite Posté(e) le 12 mars 2006 Partager Posté(e) le 12 mars 2006 À la déclaration : int tab [NB]={0}; char chaine[NB]={0}; T'initialise tes tabs à 0. Sinon tu peux utiliser memset pour mettre à 0 (ou pour tout multipe d'un octet comme avec un char par exemple). Dans le cas contraire tu peux utiliser aussi memcpy, entre autres... ou un boucle. Lien vers le commentaire Partager sur d’autres sites More sharing options...
atfximen Posté(e) le 12 mars 2006 Auteur Partager Posté(e) le 12 mars 2006 Comment fonctionne memset? Et les tableaux s'initialisent seuls à 0 au début, mais à chaque retour dans mon main, il restent à la position courante... Voila le main: #include <stdio.h> #include <stdlib.h> #include <conio.h> #include "structures.h" #define N 50 void affiche_cli(struct client *,int); int ajout_cli(struct client *,int); int facture(struct client *,struct facture *,int,int); void affiche_fact(struct facture *,int); void payeur(struct facture *,int); int main() { struct client tab[N]={{"Laurent",12,10,0.0}, {"Andy",25,20,0.0}, {"Joffrey",12,30,0.0}}; struct facture tab1[N]; int cpt=3,cpt1=0,choix=0; do { printf("\n ********************************************"); printf("\n * MENU: *"); printf("\n ********************************************"); printf("\n * 1: Afficher le tableau des clients *"); printf("\n * 2: Ajouter des clients *"); printf("\n * 3: Traitement des factures *"); printf("\n * 4: Afficher le tableau des factures *"); printf("\n * 5: Lister les mauvais payeurs *"); printf("\n * 6: QUITTER *"); printf("\n ********************************************"); printf("\n Votre choix: "); scanf("%d",&choix); switch(choix) { case 1: affiche_cli(tab,cpt); break; case 2: cpt=ajout_cli(tab,cpt); affiche_cli(tab,cpt); break; case 3: cpt1=facture(tab,tab1,cpt,cpt1); break; case 4: affiche_fact(tab1,cpt1); break; case 5: payeur(tab1,cpt1); break; } }while(choix!=6); system("Pause"); return 0; } Pour la fct affiche_fact et payeur, le tab1 devrait etre remis à 0. Lien vers le commentaire Partager sur d’autres sites More sharing options...
theocrite Posté(e) le 12 mars 2006 Partager Posté(e) le 12 mars 2006 man memset Lien vers le commentaire Partager sur d’autres sites More sharing options...
atfximen Posté(e) le 12 mars 2006 Auteur Partager Posté(e) le 12 mars 2006 man memset Merci, mais quels sont les paramètres que prend la fonction??? Lien vers le commentaire Partager sur d’autres sites More sharing options...
LePhasme Posté(e) le 12 mars 2006 Partager Posté(e) le 12 mars 2006 Tu as été voir le lien ? parce que moi oui et il y a écrit dessus assez visiblement : void *memset (void *s, int c, size_t n); Lien vers le commentaire Partager sur d’autres sites More sharing options...
atfximen Posté(e) le 12 mars 2006 Auteur Partager Posté(e) le 12 mars 2006 Tu as été voir le lien ? parce que moi oui et il y a écrit dessus assez visiblement : void *memset (void *s, int c, size_t n); Moi aussi mais ils représentent quoi? La chaine, puis..., et la taille de la chaine. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Baldurien Posté(e) le 12 mars 2006 Partager Posté(e) le 12 mars 2006 affximen> de ce que j'ai compris de ton problème, c'est pas memset qui va le résoudre. Ton problème c'est que tu affiche que les éléments à partir d'une certaine position. Ce que je comprend dans ton premier message, c'est que tu veux afficher tout, et donc partir du premier élément. Lien vers le commentaire Partager sur d’autres sites More sharing options...
theocrite Posté(e) le 12 mars 2006 Partager Posté(e) le 12 mars 2006 Tu as été voir le lien ? parce que moi oui et il y a écrit dessus assez visiblement : void *memset (void *s, int c, size_t n); Et c'est écrit en bon français quelques lignes plus bas : "La fonction memset() remplit les n premiers octets de la zone de mémoire pointée par s avec l'octet c." Lien vers le commentaire Partager sur d’autres sites More sharing options...
lorinc Posté(e) le 12 mars 2006 Partager Posté(e) le 12 mars 2006 affximen> de ce que j'ai compris de ton problème, c'est pas memset qui va le résoudre. Ton problème c'est que tu affiche que les éléments à partir d'une certaine position. Ce que je comprend dans ton premier message, c'est que tu veux afficher tout, et donc partir du premier élément. c'est aussi ce que je pense. dans ta fonction affiche, tu devrais donc faire une boucle sur i allant de 0 à cpt1 et afficher tab1 Lien vers le commentaire Partager sur d’autres sites More sharing options...
atfximen Posté(e) le 12 mars 2006 Auteur Partager Posté(e) le 12 mars 2006 Tu as été voir le lien ? parce que moi oui et il y a écrit dessus assez visiblement : void *memset (void *s, int c, size_t n); Et c'est écrit en bon français quelques lignes plus bas : "La fonction memset() remplit les n premiers octets de la zone de mémoire pointée par s avec l'octet c." Pardon je n'avais pas fait attention à ça... MAis ça ne m'aide pas en effet... affximen> de ce que j'ai compris de ton problème, c'est pas memset qui va le résoudre. Ton problème c'est que tu affiche que les éléments à partir d'une certaine position. Ce que je comprend dans ton premier message, c'est que tu veux afficher tout, et donc partir du premier élément. c'est aussi ce que je pense. dans ta fonction affiche, tu devrais donc faire une boucle sur i allant de 0 à cpt1 et afficher tab1 C'est exactement ça! Cependant j'ai fait de la manière que tu décris, mais ça ne fonctionne pas!!! Je peux t'envoyer le code complet si tu veux, mais je n'ai pas réussi à faire fonctionner ce programme de cette manière! J'ai essayé en délcarant un pointeur au début du main qui enregistrait l'adresse du premier élément du tableau, et le restituer au début de la fct, sans succès. J'ai essayé d'afficher tout les éléments a l'aide d'un indice, sans succès. J'ai essayé de les afficher comme ceci: tab1->sommefact et incrémenter tab1 à chaque passage de boucle, sans succès... Ca fait deux semaines que je suis sur ce même problème. Alors je me suis résolu à poster sur ce forum qui a toujours pu m'aider en cas de besoin! (même mon prof n'est pas aussi qualifié que les gens ici ) Lien vers le commentaire Partager sur d’autres sites More sharing options...
LePhasme Posté(e) le 12 mars 2006 Partager Posté(e) le 12 mars 2006 Tu as quoi comme problème avec la solution de lorinc ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
atfximen Posté(e) le 12 mars 2006 Auteur Partager Posté(e) le 12 mars 2006 Tu as quoi comme problème avec la solution de lorinc ? Voici ce que j'ai pour le moment: void affiche_fact(struct facture *tab1,int cpt1) { int cpt; system("CLS"); printf("\n | N facture: | Somme due: | Client: "); printf("\n -----------------------------------"); for(cpt=0;cpt<cpt1;cpt++) { printf("\n | %1d | %9.2f | %s, cpt=%d",tab1[cpt].numfact,tab1[cpt].sommefact,tab1[cpt].nom,cpt); } getch(); system("cls"); Et ça ne fonctionne pas. tout comme ceci: void affiche_fact(struct facture *tab1,int cpt1) { int cpt; system("CLS"); printf("\n | N facture: | Somme due: | Client: "); printf("\n -----------------------------------"); for(cpt=0;cpt<cpt1;cpt++,tab1++) { printf("\n | %1d | %9.2f | %s, cpt=%d",tab1->numfact,tab1->sommefact,tab1->nom,cpt); } getch(); system("cls"); Aucune des deux ne commence l'affichage à partir du premier élément... Bizarre n'est ce pas??? Lien vers le commentaire Partager sur d’autres sites More sharing options...
LePhasme Posté(e) le 12 mars 2006 Partager Posté(e) le 12 mars 2006 Le tableau que tu envoies à la fonction c'est bien le tableau qui contient toutes les structures dans ton main ? Si tu sais montre nous le code qui fait appel à la fonction avec la déclaration de ton tableau. Lien vers le commentaire Partager sur d’autres sites More sharing options...
atfximen Posté(e) le 12 mars 2006 Auteur Partager Posté(e) le 12 mars 2006 Le tableau que tu envoies à la fonction c'est bien le tableau qui contient toutes les structures dans ton main ? Si tu sais montre nous le code qui fait appel à la fonction avec la déclaration de ton tableau. Il est affiché plus haut. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Baldurien Posté(e) le 12 mars 2006 Partager Posté(e) le 12 mars 2006 Fait péter le main, c'est pas ton code là qui merde (oublie le second, avec tab1++, ça revient au même). Lien vers le commentaire Partager sur d’autres sites More sharing options...
atfximen Posté(e) le 12 mars 2006 Auteur Partager Posté(e) le 12 mars 2006 Il est plus haut mon main!! Lien vers le commentaire Partager sur d’autres sites More sharing options...
lorinc Posté(e) le 12 mars 2006 Partager Posté(e) le 12 mars 2006 pour afficher des fatures, il faut qu'il y en ait !!! tu es sûr d'avoir ajouter des facture avant de vouloir afficher le tableau ? tu peux paster l'intégralité du code (même structure.h) (entre balise ce sera plus lisible), qu'on y voit plus clair Lien vers le commentaire Partager sur d’autres sites More sharing options...
Baldurien Posté(e) le 12 mars 2006 Partager Posté(e) le 12 mars 2006 Ah pas vu #include <stdio.h> #include <stdlib.h> #include <conio.h> #include "structures.h" #define N 50 void affiche_cli(struct client *,int); int ajout_cli(struct client *,int); int facture(struct client *,struct facture *,int,int); void affiche_fact(struct facture *,int); void payeur(struct facture *,int); int main() { struct client tab[N]={{"Laurent",12,10,0.0}, {"Andy",25,20,0.0}, {"Joffrey",12,30,0.0}}; struct facture tab1[N]; int cpt=3,cpt1=0,choix=0; do { scanf("%d",&choix); switch(choix) { case 1: affiche_cli(tab,cpt); break; case 2: cpt=ajout_cli(tab,cpt); affiche_cli(tab,cpt); break; case 3: cpt1=facture(tab,tab1,cpt,cpt1); break; case 4: affiche_fact(tab1,cpt1); break; case 5: payeur(tab1,cpt1); break; } } while(choix!=6); system("Pause"); return 0; } L'indentation c'est sacré :) A priori je ne vois pas d'erreur là dedans void affiche_fact(struct facture *tab1,int cpt1) { int cpt; system("CLS"); printf("\n | N facture: | Somme due: | Client: "); printf("\n -----------------------------------"); for(cpt=0;cpt<cpt1;cpt++) { printf("\n | %1d | %9.2f | %s, cpt=%d", tab1[cpt].numfact,tab1[cpt].sommefact,tab1[cpt].nom,cpt); } getch(); system("cls"); } Là non plus (simple boucle jusqu'à cpt1) Par contre, pourquoi n'utilise pas des noms communs (et simple), genre i, j, k ? au lieu de "cpt" ? et nb_facture au lieu de cpt1 quand il s'agit d'un nombre de trucs ? :) Tu peux nous filer un exemple d'affichage voir comment ça déconne ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
atfximen Posté(e) le 13 mars 2006 Auteur Partager Posté(e) le 13 mars 2006 Il est vrai que pour la simplicité du code, d'autres noms de compteurs devraient être attribués. Mais depuis l'école secondaire j'ai été habitué à les nommer comme ça! Désolé... Voici donc mon code complet: #include <stdio.h> #include <stdlib.h> #include <conio.h> #include "structures.h" #define N 50 void affiche_cli(struct client *,int); int ajout_cli(struct client *,int); int facture(struct client *,struct facture *,int,int); void affiche_fact(struct facture *,int); void payeur(struct facture *,int); int main() { struct client tab[N]={{"Laurent",12,10,0.0}, {"Andy",25,20,0.0}, {"Joffrey",12,30,0.0}}; struct facture tab1[N]; int cpt=3,cpt1=0,choix=0; do { printf("\n ********************************************"); printf("\n * MENU: *"); printf("\n ********************************************"); printf("\n * 1: Afficher le tableau des clients *"); printf("\n * 2: Ajouter des clients *"); printf("\n * 3: Traitement des factures *"); printf("\n * 4: Afficher le tableau des factures *"); printf("\n * 5: Lister les mauvais payeurs *"); printf("\n * 6: QUITTER *"); printf("\n ********************************************"); printf("\n Votre choix: "); scanf("%d",&choix); switch(choix) { case 1: affiche_cli(tab,cpt); break; case 2: cpt=ajout_cli(tab,cpt); affiche_cli(tab,cpt); break; case 3: cpt1=facture(tab,tab1,cpt,cpt1); break; case 4: affiche_fact(tab1,cpt1); break; case 5: payeur(tab1,cpt1); break; } }while(choix!=6); system("Pause"); return 0; } #include <stdio.h> #include <stdlib.h> #include <conio.h> #include "structures.h" int ajout_cli(struct client *tab,int cpt) { int cpt1,fl=0; tab=tab+cpt; for(cpt1=3;cpt1<50&&fl!=-1;cpt1++,tab++,cpt++) { system("CLS"); fflush(stdin); printf("\nEntrez le nom du %d client: (fin de l'encodage avec 'ENTER')\n",cpt+1); gets(tab->nom); if(tab->nom[0]=='\0') { printf("\nEncodage termine\n"); fl=-1; cpt--; } else { fflush(stdin); do { printf("Entrez le taux de TVA de ce client:\n"); scanf("%d",&tab->tva); }while(tab->tva!=12&&tab->tva!=25); fflush(stdin); printf("Entrez le taux de reduction:\n"); scanf("%f",&tab->reduc); fflush(stdin); printf("Entrez la somme due totale:\n"); scanf("%f",&tab->sommedue); } } return cpt; } #include <stdio.h> #include <stdlib.h> #include <conio.h> #include "structures.h" void affiche_cli(struct client *tab,int cpt) { int cpt1; system("cls"); printf("\n | TVA: | Reduction: | Somme due: | Client: "); printf("\n -------------------------------------------"); for(cpt1=0;cpt1<cpt;cpt1++,tab++) printf("\n | %2d | %6.0f | %9.2f | %s",tab->tva,tab->reduc,tab->sommedue,tab->nom); getch(); system("cls"); } #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <string.h> #include "structures.h" int search(struct client *,char *,int); int facture(struct client *tab,struct facture *tab1,int cpt,int cpt1) { int cpt2,fl=1; float somme=1,reduction=0; char name[20]; while(name[0]!='\0') { system("CLS"); fflush(stdin); printf("\n\nEntrez le nom du client ('ENTER' pour terminer) : "); gets(name); cpt2=0; if(name[0]=='\0') printf("\nTraitement des factures termine.\n"); else { fl=search(tab,name,cpt); if(fl!=-1) { printf("\n"); do { printf("Entrez la valeur du %d article (0 pour terminer): ",cpt2+1); scanf("%f",&somme); if(somme<=0) { if(cpt2!=0) { printf("\nEncodage de cette facture termine."); cpt1++; tab1->numfact=cpt1; } else { printf("Facture annulee"); getch(); } } else { tab[fl].sommedue=tab[fl].sommedue+somme; cpt2++; } }while(somme>0); if(tab[fl].sommedue>500&&tab[fl].sommedue<=1200) reduction=tab[fl].reduc+1; else { if(tab[fl].sommedue>1200&&tab[fl].tva==25) reduction=tab[fl].reduc+3; else { if(tab[fl].sommedue>1200&&tab[fl].tva==12) reduction=tab[fl].reduc+1; else reduction=tab[fl].reduc; } } if(cpt2!=0) { tab1->sommefact=tab[fl].sommedue; strcpy(tab1->nom,tab[fl].nom); printf("\n\nMontant total de la facture %d pour %s (hors reduction): %6.2f",tab1->numfact,tab1->nom,tab1->sommefact); printf("\nReduction totale: %2.0f",reduction); tab1->sommefact=tab1->sommefact-((reduction/100)*tab1->sommefact)+(tab1->sommefact*(tab->tva/100)); printf("\nMontant total (avec reduction): %6.2f",tab1->sommefact); tab[fl].sommedue=0; getch(); } } } } system("CLS"); return cpt1; } #include <stdio.h> #include <stdlib.h> #include <conio.h> #include "structures.h" void affiche_fact(struct facture *tab1,int cpt1) { int cpt; system("CLS"); printf("\n | N facture: | Somme due: | Client: "); printf("\n -----------------------------------"); for(cpt=0;cpt<cpt1;cpt++) { printf("\n | %1d | %9.2f | %s, cpt=%d",tab1[cpt].numfact,tab1[cpt].sommefact,tab1[cpt].nom,cpt); } getch(); system("cls"); } #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <string.h> #include "structures.h" int search(struct client *tab,char *name,int cpt) { int cpt1,fl=-1; for(cpt1=0;cpt1<cpt&&fl==-1;cpt1++) { if(stricmp(tab[cpt1].nom,name)!=0) fl=-1; else fl=cpt1; } return fl; } struct client { char nom[20]; int tva; float reduc; float sommedue; }; struct facture { int numfact; char nom[20]; float sommefact; }; Voilà pour ce qui est du code complet. J'espère que vous puissiez m'aider. Et évidemment j'ai entré un facture avant de l'afficher... Mais en en entrant qu'un, cela fonctionne (le tab1 est tjs à la position courante) Mais en ajoutant plus d'une facture....rien a faire! Affichage: |N facture: | Somme due: | Client: ----------------------------------- | 2 | 13884.00 | Laurent | 0 | 0.00 | , cpt=1 Voivi l'affichage après l'entrée de deux factures... Lien vers le commentaire Partager sur d’autres sites More sharing options...
lorinc Posté(e) le 13 mars 2006 Partager Posté(e) le 13 mars 2006 dans ta fonction facture, tu écris toujours à la première case du tableau de factures... deux solution, soit tu passes tab1+cpt1 comme argument de facture dans ton main(), soit tu fais un tab1 += cpt1 au début de facture. sinon, c'est sûr que tu n'a toujours qu'une seule facture Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.