diff --git a/VANDAMME24.c b/VANDAMME24.c new file mode 100644 index 0000000..cf2e5af --- /dev/null +++ b/VANDAMME24.c @@ -0,0 +1,444 @@ +#include +#include +#include +#include +#include +#include +#include +#define __TVA__ 1.21 +#define __REDUC__ 0.9 +#define __MAXNBRART__ 3 + +#define __STRLEN__ 34 + +typedef enum{FALSE,TRUE} Bool; +typedef struct { + char deisgnation[__STRLEN__]; + float prixHTVA; + int quant; +} Article; +typedef struct { + Article * article; + unsigned int nbrArt; +} Panier; +typedef struct{ + int jour,moi,annee; +} Date; +typedef struct{ + char rue[__STRLEN__],numero[__STRLEN__],localite[__STRLEN__]; + int codePostal; +} Adresse; +typedef struct{ + char telephone[13],email[__STRLEN__]; +} Contact; +typedef struct{ + char nom[__STRLEN__]; + Adresse adresse; + Contact contact; + Date anniversaire; + Panier panier; +} Client; + + + + +void EncoderDate(Date *); +int DateValide (Date *); +void afficherArticle(Article * article, unsigned int nbrArt, FILE * file); +void encoderArticle(Article * article); +void encoderClient(Client *); +void afficherClient(Client *); +void encoderFacture(Panier *); +FILE * creerFichier(Date *, Client *); +Bool fichierExistant(char *); +void genererFacture(FILE *, Date *, Client *); +void cleanFgets(char*); +int itoaY(int i, char*); +int itoaDM(int i, char*); + + +int main() +{ + char buf[5]; + itoaY(1999,buf); + printf("%s\n", buf); + Date date; + FILE * file; + Client client; + do + EncoderDate(&date); + while(!DateValide(&date)); + + encoderClient(&client); + + file = creerFichier(&date, &client); + if(file == NULL) + { + printf("Erreur lors de l'ouvertur !\n"); + return -1; + } + + + client.panier.article = (Article *)malloc(sizeof(Article)); + client.panier.nbrArt = 1; + if(client.panier.article == NULL) + { + printf("ERREUR ALLOCATION !"); + free(client.panier.article); + return -1; + } + + + + //En t�te de la facture + printf("La Bulle Informatique\nRoute du Condroz 78, 4123 Neupre\n"); + printf("\nFacture a payer\n"); + printf("Date de facturation :"); + printf("%02d/%02d/%02d", date.jour, date.moi, date.annee); + printf("%u\n", client.panier.nbrArt); + afficherArticle(client.panier.article,client.panier.nbrArt, file); + getch(); + fclose(file); + free(client.panier.article); + return 0; +} +void EncoderDate(Date * date) +{ + printf("Entrez la date sous cette forme : jj/mm/aaaa\n"); + fflush(stdin); scanf("%d/%d/%d",&(date->jour),&(date->moi),&(date->annee)); +} + +int DateValide(Date * date) +{ + int j = date->jour; + int m = date->moi; + int a = date->annee; + int bis; + if(m != 2) + { + if(m >= 1 && m <= 7) + { + if(m %2 == 0) + { + if(j >= 1 && j <= 30) return 1; + else return 0; + } + else + { + if(j >= 1 && j <= 31) return 1; + else return 0; + } + } + else if(m > 7 && m <= 12) + { + if(m %2 == 0) + { + if(j >= 1 && j <= 31) return 1; + else return 0; + } + else + { + if(j >= 1 && j <= 30) return 1; + else return 0; + } + } + else return 0; + } + else + { + if(a %100 == 0) + { + if(a %400 == 0) bis = 1; + else bis = 0; + } + else + { + if(a %4 == 0)bis = 1; + else bis = 0; + } + if(bis == 1) + { + if(j >= 1 && j <= 29) return 1; + else return 0; + } + else + { + if(j >= 1 && j <= 28) return 1; + else return 0; + } + } +} + +void afficherArticle(Article * article, unsigned int nbrArt,FILE * file) +{ + unsigned int i; + float prixTot=0; + fprintf(file,"\n|---------------------------------------------------------------------------------------------|\ + \n| Designation | prixHTVA | Quantite | 10%% | prixTVAC |"); + printf("\n|---------------------------------------------------------------------------------------------|\ + \n| Designation | prixHTVA | Quantite | 10%% | prixTVAC |"); + for(i=0;i=20)?'x':' ',\ + (article[i].quant>=20)?article[i].prixHTVA*__TVA__*__REDUC__*article[i].quant:article[i].prixHTVA*__TVA__*article[i].quant); + fprintf(file,"\n|%34s|%12.2f Eur |%14d| %c |%12.2f |",\ + article[i].deisgnation,article[i].prixHTVA,article[i].quant\ + ,(article[i].quant>=20)?'x':' ',\ + (article[i].quant>=20)?article[i].prixHTVA*__TVA__*__REDUC__*article[i].quant:article[i].prixHTVA*__TVA__*article[i].quant); + + prixTot += (article[i].quant>=20)?article[i].prixHTVA*__TVA__*__REDUC__*article[i].quant:article[i].prixHTVA*__TVA__*article[i].quant; + } + printf("\n|---------------------------------------------------------------------------------------------|"); + printf("\nPrix totale :%f", prixTot); + + fprintf(file,"\n|---------------------------------------------------------------------------------------------|"); + fprintf(file,"\nPrix totale :%f", prixTot); +} +void encoderArticle(Article * article) +{ + printf("\nVeuillez entrer le nom : "); + scanf("%34s", article->deisgnation); + printf("\nVeuillez entrer le prix a l'unite hors TVA : "); + scanf("%f", &article->prixHTVA); + printf("\nVeuillez entrer la quantite desiree : "); + fflush(stdin); + scanf("%d", &article->quant); +} + + + + +void encoderClient(Client * client) +{ + printf("Encoage Client\n"); + fflush(stdin); + if(!(printf("Entrez la rue :") && !fflush(stdin) && fgets(client->adresse.rue,__STRLEN__,stdin) != NULL && \ + printf("\nEntrez le numero :" ) && !fflush(stdin) && fgets(client->adresse.numero,__STRLEN__,stdin) != NULL && \ + printf("\nEntrez la localité :") && !fflush(stdin) && fgets(client->adresse.localite,__STRLEN__,stdin) != NULL && \ + printf("\nEntrez le code postal :") && !fflush(stdin) && scanf("%d", &(client->adresse.codePostal)) && \ + printf("\nNom client :") && !fflush(stdin) && fgets(client->nom,__STRLEN__,stdin) != NULL)) + { + printf("\nErreur lors de l'encodage de l'adresse"); + exit(-1); + } + cleanFgets(client->adresse.rue);cleanFgets(client->adresse.numero);cleanFgets(client->adresse.localite); + cleanFgets(client->nom); + if(!(printf("\n Entrez le numéro de tél. :") && !fflush(stdin) &&fgets(client->contact.telephone,13,stdin) && \ + printf("\nEntrez l'adresse email :") && !fflush(stdin) &&fgets(client->contact.email,__STRLEN__,stdin))) + { + printf("\nErreur lors de l'encodage des coo de contact"); + exit(-1); + } + cleanFgets(client->contact.telephone);cleanFgets(client->contact.email); + printf("\n Anniversaire client :"); + do + EncoderDate(&(client->anniversaire)); + while(!DateValide(&(client->anniversaire))); +} +void afficherClient(Client *client) +{ + printf("Client : %s\n", client->nom); + printf("rue : %s",client->adresse.rue); + printf("numero : %s",client->adresse.numero); + printf("localité : %s",client->adresse.localite); + printf("code postal : %d",client->adresse.codePostal); + printf("numéro de tél. : %s",client->contact.telephone); + printf("adresse email : %s",client->contact.email); + +} +void encoderFacture(Panier * panier) +{ + char continuer = 'y'; + do{ + if(panier->nbrArt <= __MAXNBRART__) + { + encoderArticle(&(panier->article[panier->nbrArt-1])); + printf("Y-a-t-il encore un article ?(Y|n)"); + fflush(stdin); + scanf("%c", &continuer); + if(panier->nbrArt < 3 && (continuer|0b00100000) == 'y') + { + panier->nbrArt++; + Article * tempArticle; + tempArticle = (Article*)realloc(panier->article, sizeof(Article)*(panier->nbrArt)); + if(panier->article == NULL) + { + printf("ERREUR ALLOCATION !"); + free(tempArticle); + free(panier->article); + exit(-1); + } + else + { + panier->article = tempArticle; + } + } + else + { + system("cls"); + printf("Vous avez ateint le nombre d'article maximum !\n\n"); + break; + } + } + }while((continuer|0b00100000) == 'y'); +} +FILE * creerFichier(Date * date, Client * client) +{ + char cat[__STRLEN__*+15]; //Dans l'ideal malloc pour un nombre de fichier illimiter mais flem ... + cat[0] = '\0'; + char i; + char buf[5]; + strcat(cat,client->nom); + printf("%s\n", cat); + itoaY(date->annee, buf); + printf("%s %s\n", cat, buf); + strcat(cat,buf); + printf("%s\n", cat); + itoaDM(date->moi, buf); + strcat(cat, buf); + printf("%s\n", cat); + itoaDM(date->jour, buf); + strcat(cat, buf); + printf("%s\n", cat); + strcat(cat,"_"); + for(i='1'; i<= '9'; i++)//Le caractère 10 n'existe pas, flem de coder pour avoir plus que 9 et aloc dynamique nécessaire + { + char itmp[2] = {i,'\0'}; + strcat(cat,itmp); + if(fichierExistant(cat)) + { + char * p = strchr(cat, i); //Renvois l'adresse de i\0 + //cat contient actuellement nom+date+_i\0 + *p = '\0'; + //Maintenant cat contient actuellement nom+date+_\0\0 + //Si on remplace par '' strcat va ajouter au \0 donc on aura nom+date+_+''+QQChose\0 + //On aura donc un caractère en plus a chaque tour de boucle ... + } + else + { + printf("%s\n", cat); + FILE * f = fopen(cat,"w"); + if(f==NULL) + { + printf("Erreur lors de l'ouverture du fichier"); + exit(-1); + return f; + } + } + } + return NULL; +} +Bool fichierExistant(char * filename) +{ + FILE * f = fopen(filename, "r"); + if(f==NULL) + return 0; + else + return 1; +} +void genererFacture(FILE * file, Date * date, Client * client) +{ + int i; + float prixTot = 0; + fprintf(file,"La Bulle Informatique\nRoute du Condroz 78, 4123 Neupre\n"); + fprintf(file,"\nFacture a payer\n"); + fprintf(file,"Date de facturation :"); + fprintf(file,"%02d/%02d/%02d", date->jour, date->moi, date->annee); + fprintf(file,"\n|---------------------------------------------------------------------------------------------|\ + \n| Designation | prixHTVA | Quantite | 10%% | prixTVAC |"); + + for(i=0;client->panier.nbrArt>i;i++) + { + fprintf(file,"\n|%34s|%12.2f Eur |%14d| %c |%12.2f |",\ + client->panier.article[i].deisgnation,client->panier.article[i].prixHTVA,client->panier.article[i].quant\ + ,(client->panier.article[i].quant>=20)?'x':' ',\ + (client->panier.article[i].quant>=20)?client->panier.article[i].prixHTVA*__TVA__*__REDUC__*client->panier.article[i].quant:client->panier.article[i].prixHTVA*__TVA__*client->panier.article[i].quant); + prixTot += (client->panier.article[i].quant>=20)?client->panier.article[i].prixHTVA*__TVA__*__REDUC__*client->panier.article[i].quant:client->panier.article[i].prixHTVA*__TVA__*client->panier.article[i].quant; + } + fprintf(file,"\n|---------------------------------------------------------------------------------------------|"); + fprintf(file,"\nPrix totale :%f", prixTot); +} + + +void cleanFgets(char * str) +{ + char *p = strchr(str, '\n'); + if(p!=NULL) + *p = '\0'; + else + { + printf("Une erreur est arrivé lors du nettoygae \\0"); + exit(-1); + } +} +int itoaY(int i, char * buf) +{ + buf [0] = '0'; + buf [1] = '0'; + buf [2] = '0'; + buf [3] = '0'; + buf [4] = '\0'; + int j; + if(!i) + return 1; + buf [3] = '1'; + for(j=1; j<=i && j<=9999 ; j++) + { + if(!(j%1000)) + { + buf[0]++; + buf[1]='0'; + buf[2]='0'; + buf[3]='0'; + } + else if(!(j%100)) + { + buf[1]++; + buf[2]='0'; + buf[3]='0'; + } + else if(!(j%10)) + { + buf[2]++; + buf[3]='0'; + } + else + { + buf[3]++; + } + //printf("%s, %d, %d, %d, %d, j%d\n",buf,buf[3],buf[2],buf[1],buf[0],j ); + } + if(j>9999) + return 0; + else + return 1; +} +int itoaDM(int i, char * buf) +{ + buf[0] = '0'; + buf[1] = '0'; + buf[2] = '\0'; + printf("%s\n", buf); + int j; + if(!i) + return 1; + buf[1]++; + for(j=1; j<=i && j<=99 ; j++) + { + if(!(j%10)) + { + (buf[0])++; + (buf[1])='0'; + } + else + { + (buf[1])++; + } + } + if(j>99) + return 0; + else + return 1; +}