Jump to content

cmt remettre à 0 un tab de structures


Recommended Posts

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.

Link to comment
Share on other sites

À 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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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."

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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... :chinois: MAis ça ne m'aide pas en effet... :-D

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 :yes: )

Link to comment
Share on other sites

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???

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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 
Link to comment
Share on other sites

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 ?

Link to comment
Share on other sites

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é... :francais:

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... :francais: 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...

Link to comment
Share on other sites

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 :D

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...