Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ////////////////////////// TP10
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include "prod.h"
- /******** **********************************************************/
- /* fonction : lireNumeroProchaineCommande */
- /* description : lire l'entier contenu dans le fichier */
- /* numNextFact */
- /* paramètres : aucun */
- /* retourne : un entier qui est le numero de la premiere */
- /* commande à traiter */
- /* condition : le fichier numNextFact doit exister */
- /* dans le repertoire de l'exe */
- /* auteur : kub */
- /* date : 29/3/20 */
- /*******************************************************************/
- int lireNumeroProchaineCommande()
- {
- FILE *f;
- int N;
- f=fopen("numNextFact","r");
- fread(&N,sizeof(int),1,f);
- fclose(f);
- //printf("\n--->lu N=%d",N);
- return N;
- }
- /*******************************************************************/
- /* fonction : convertirNenChaine4 */
- /* description : convertir l'entier en une chaine */
- /* paramètre : N l'entier à convertir en chaine */
- /* paramètre : N4 la chaine contenant le resultat */
- /* retourne : RIEN */
- /* condition : 1<=N<=9999 */
- /* condition : N4 doit etre une chaine de 5 char ou */
- /* auteur : kub */
- /* date : 29/3/20 */
- /*******************************************************************/
- void convertirNenChaine4(int N,char *N4)
- { // si N=1234 alors N4 sera égal à "1234"
- int m,c,d,u;
- char cm,cc,cd,cu;//chiffre des milliers, chiffre des centaines ...
- m=N/1000;cm=48+m;
- N%=1000;
- c=N/100;cc=48+c;
- N%=100;
- d=N/10;cd=48+d;
- u=N%10;
- cu=48+u;
- N4[0]=cm;N4[1]=cc;N4[2]=cd;N4[3]=cu;N4[4]='\0';
- }
- /*******************************************************************/
- /* fonction : chercherReference (à compléter) */
- /* paramètre : ref : la reference du produit */
- /* à rechercher dans produits.txt */
- /* paramètre : lib : chaine de caractere qui contiendra */
- /* le libelle du produit */
- /* retourne : le prix unitaire du produit */
- /* condition : on suppose que la reference existe dans le */
- /* fichier produits.txt */
- /* auteur : kub */
- /* date : 29/3/20 */
- /*******************************************************************/
- float chercherReference(int ref,char *lib)
- {
- printf("%d",ref);
- printf("%s",lib);
- //à coder : ouvrir produits.txt en lecture , le parcourir jusqu'à
- // trouver la refence ref. Dans ce cas, on aura aussi son prix unitaire et son
- // libelle (qui seront renvoyés). On fermera alors le fichier produits.txt
- return 0;
- }
- /*******************************************************************/
- /* fonction : lireCommande (à compléter) */
- /* paramètre : pf l'adresse du fichier de commande à lire, nf correspondant a NNNN lle numéro du fichier en 4 charactères*/
- /* retourne : RIEN */
- /* auteur : kub */
- /* date : 29/3/20 */
- /*******************************************************************/
- void lireCommande(FILE * pf, const char *nf)// le fichier pointé par pf est deja ouvert
- {
- FILE *fProduit=fopen("produits.txt","r"); //on ouvre le fichier produits.txt contenant les references associées au noms des produits
- FILE *factureNNNN=NULL; //on prépare l'ouverture du fichier facture correspondant a la commande traitée
- char nomFacture[21];
- char nomClient[TAILLE];
- T_Produit scanP; //permet de comparer les produits de produits.txt aux produits des commandes
- T_Produit p;
- float prixTotal=0;
- //on initialise notre produit de comparaison
- p.reference=0;
- p.prixU=0.0;
- strcpy(p.libelle,"??");
- p.quantite=0;
- strcpy(nomFacture,"factures/facture"); //On met en place le nom complet du fichierde facture
- strcat(nomFacture, nf);
- strcat(nomFacture, ".txt");
- //printf("\n nom du fichier facture en production : %s\n",nomFacture); //Affichage de debug
- factureNNNN=fopen(nomFacture,"w+");
- fscanf(pf,"%s",nomClient);//la commande contient tjrs le nom du client
- // en premiere ligne
- fprintf(factureNNNN,"Client : %s",nomClient);
- do
- {
- // à partir de la ligne2, toutes les lignes sont en 2 morceaux :
- // un int suivi d'un int
- //2 chaines sont lues et implicitement converties en int
- fscanf(pf,"%d %d",&(p.reference),&(p.quantite));
- //printf("\n\tReference recupérée : %d, qte récupérée : %d",p.reference,p.quantite);
- while(!feof(fProduit))
- {
- fscanf(fProduit,"%d %s %f",&scanP.reference,scanP.libelle,&scanP.prixU);
- if(scanP.reference==p.reference)
- {
- //printf("\nReference recupérée : %d, qte récupérée : %d",p.reference,p.quantite);
- strcpy(p.libelle,scanP.libelle);
- p.prixU=scanP.prixU;
- }
- }
- //Partie 1 Etape 1 (voir sujet) : pour afficher la facture à l'écran
- if (!feof(pf))
- {
- //printf("\n-->ref = %d qtt=%d",p.reference,p.quantite);
- prixTotal=prixTotal+(p.quantite*p.prixU);
- fprintf(factureNNNN,"\n%d %s (PU=%f€) :: %f€",p.quantite,p.libelle,p.prixU,p.quantite*p.prixU);
- // à écrire :
- //p.prixU= chercherReference(p.reference,p.libelle);
- //printf("\n\t-->lib = %s prixUnit=%f",p.libelle,p.prixU);
- //calculez aussi puis afficher le total de la facture
- rewind(fProduit);
- }
- }while(!feof(pf));
- prixTotal=prixTotal+(p.quantite*p.prixU);
- fprintf(factureNNNN,"\n%d %s (PU=%f€) :: %f€",p.quantite,p.libelle,p.prixU,p.quantite*p.prixU);
- fprintf(factureNNNN,"\n");
- fprintf(factureNNNN,"\n\tTOTAL = %f€",prixTotal);
- fclose(fProduit);
- fclose(factureNNNN);
- }
- /*******************************************************************/
- /* fonction : lireLesCommandes */
- /* description : ouvrir 1 par 1 tous les fichiers de commande */
- /* description : (commandes pas encore traitées) */
- /* description : appel à la fonction lireCommande pour chacune */
- /* des commandes */
- /* description : mettre à jour le fichier numNextFact */
- /* paramètre : aucun */
- /* retourne : RIEN */
- /* condition : 1<=N<=9999 */
- /* condition : N4 doit etre une chaine de 5 char ou */
- /* auteur : kub */
- /* date : 29/3/20 */
- /*******************************************************************/
- void lireLesCommandes() //cette fonction ouvre tous les fichiers commandeXXXX.txt avec XXXX démarrant à N lu dans numNextFact
- {
- FILE *ficCommande=NULL;
- int FINI=0;
- int N = lireNumeroProchaineCommande(); //numero de la premiere commande qui sera lue et traitee lors de cette execution
- char NNNN[5];
- char nomCommande[29];
- do //ce do while prend fin dès que fichier commandeXXXX.txt est absent
- {
- strcpy(nomCommande,"./commandes/commande");//pour lire ds le bon repertoire
- convertirNenChaine4(N,NNNN);//convertion d'un int en chaine de 4
- //printf("\n==>%s<==",NNNN);
- ficCommande=NULL;
- strcat(nomCommande,NNNN);
- strcat(nomCommande,".txt");//le nom du fichier est formé
- //printf("\n traitement de %s",nomCommande);
- ficCommande=fopen(nomCommande,"rt");//mode rt = "read" et "text"
- if (ficCommande!=NULL)
- { // le fichier commandeNNNN.txt existe
- printf("\n fichier %s present",nomCommande);
- lireCommande(ficCommande,NNNN); // à vous de coder cette fonction lors de ce TP10
- fclose(ficCommande);
- }
- else
- {
- printf("\n -> toutes les commandes presentes ont ete traitees.\n");
- FILE *f=fopen("numNextFact","w"); // on va ecrire la valeur de N dans numNextFact
- fwrite(&N,1,sizeof(int),f);
- fclose(f);
- FINI=1;
- }
- N++;
- }while(FINI==0);
- }
- /*******************************************************************/
- /* fonction : lireCommande2 */
- /* paramètre : voir lireCommande */
- /* retourne : RIEN */
- /* auteur : rekky */
- /* date : 29/3/20 */
- /*******************************************************************/
- void lireCommande2(FILE * pf, const char *nf)// le fichier pointé par pf est deja ouvert
- {
- FILE *fProduit=fopen("produits.txt","r");
- FILE *factureNNNN=NULL;
- FILE *fStock=fopen("stock.txt","w+");
- char nomFacture[21];
- char nomClient[TAILLE];
- T_Produit scanP;
- T_Produit p;
- float prixTotal=0;
- p.reference=0;
- p.prixU=0.0;
- strcpy(p.libelle,"??");
- p.quantite=0;
- strcpy(nomFacture,"factures/facture");
- strcat(nomFacture, nf);
- strcat(nomFacture, ".txt");
- printf("\n nom du fichier facture en production : %s\n",nomFacture);
- factureNNNN=fopen(nomFacture,"w+");
- fscanf(pf,"%s",nomClient);//la commande contient tjrs le nom du client
- // en premiere ligne
- fprintf(factureNNNN,"Client : %s",nomClient);
- do
- {
- // à partir de la ligne2, toutes les lignes sont en 2 morceaux :
- // un int suivi d'un int
- //2 chaines sont lues et implicitement converties en int
- fscanf(pf,"%d %d",&(p.reference),&(p.quantite));
- //printf("\n\tReference recupérée : %d, qte récupérée : %d",p.reference,p.quantite);
- while(!feof(fProduit))
- {
- fscanf(fProduit,"%d %s %f",&scanP.reference,scanP.libelle,&scanP.prixU);
- if(scanP.reference==p.reference)
- {
- //printf("\nReference recupérée : %d, qte récupérée : %d",p.reference,p.quantite);
- strcpy(p.libelle,scanP.libelle);
- p.prixU=scanP.prixU;
- }
- }
- //Partie 1 Etape 1 (voir sujet) : pour afficher la facture à l'écran
- if (!feof(pf))
- {
- //printf("\n-->ref = %d qtt=%d",p.reference,p.quantite);
- prixTotal=prixTotal+(p.quantite*p.prixU);
- fprintf(factureNNNN,"\n%d %s (PU=%f€) :: %f€",p.quantite,p.libelle,p.prixU,p.quantite*p.prixU);
- // à écrire :
- //p.prixU= chercherReference(p.reference,p.libelle);
- //printf("\n\t-->lib = %s prixUnit=%f",p.libelle,p.prixU);
- //calculez aussi puis afficher le total de la facture
- }
- else
- {
- }
- }while(!feof(pf));
- prixTotal=prixTotal+(p.quantite*p.prixU);
- fprintf(factureNNNN,"\n%d %s (PU=%f€) :: %f€",p.quantite,p.libelle,p.prixU,p.quantite*p.prixU);
- fprintf(factureNNNN,"\n");
- fprintf(factureNNNN,"\n\tTOTAL = %f€",prixTotal);
- fclose(fProduit);
- fclose(factureNNNN);
- fclose(fStock);
- }
- /*******************************************************************/
- /* fonction : lireLesCommandes2 */
- /* condition : 1<=N<=9999 */
- /* condition : N4 doit etre une chaine de 5 char ou */
- /* auteur : rekky */
- /* date : 11/04/2020 */
- /*******************************************************************/
- void lireLesCommandes2() //cette fonction ouvre tous les fichiers commandeXXXX.txt avec XXXX démarrant à N lu dans numNextFact
- {
- FILE *ficCommande=NULL;
- int FINI=0;
- int N = lireNumeroProchaineCommande(); //numero de la premiere commande qui sera lue et traitee lors de cette execution
- char NNNN[5];
- char nomCommande[29];
- do //ce do while prend fin dès que fichier commandeXXXX.txt est absent
- {
- strcpy(nomCommande,"./commandes/commande");//pour lire ds le bon repertoire
- convertirNenChaine4(N,NNNN);//convertion d'un int en chaine de 4
- //printf("\n==>%s<==",NNNN);
- ficCommande=NULL;
- strcat(nomCommande,NNNN);
- strcat(nomCommande,".txt");//le nom du fichier est formé
- //printf("\n traitement de %s",nomCommande);
- ficCommande=fopen(nomCommande,"rt");//mode rt = "read" et "text"
- if (ficCommande!=NULL)
- { // le fichier commandeNNNN.txt existe
- printf("\n fichier %s present",nomCommande);
- lireCommande(ficCommande,NNNN); // à vous de coder cette fonction lors de ce TP10
- fclose(ficCommande);
- }
- else
- {
- printf("\n -> toutes les commandes presentes ont ete traitees.\n");
- FILE *f=fopen("numNextFact","w"); // on va ecrire la valeur de N dans numNextFact
- fwrite(&N,1,sizeof(int),f);
- fclose(f);
- FINI=1;
- }
- N++;
- }while(FINI==0);
- }
- /**************************************************************************/
- /* TP10 */
- /**************************************************************************/
- int main()
- {
- char chx;
- printf("\nLe code de quelle partie du tp voulez vous executer ? (1 ou 2)\n");
- scanf("%c",&chx);
- //ci dessous :
- // creation d un fichier d'un seul int nommé umNnextFact et contenant l'int 1
- // code à utiliser pour réinitialiser numNextFact à 1 si besoin au cours du TP
- /*
- FILE *f;int N=1;
- f=fopen("numNextFact","w");
- fwrite(&N,1,sizeof(int),f);
- fclose(f);
- */
- //J'ai remplacé ces lignes de codes par un argument "reset" dans le fichier makefile qui permet de reinitialiser numNextFact
- //Il suffit simplement de taper "make reset"
- if(chx=='1')
- {
- //PARTIE 1 du TP : sans Gestion de stock
- lireLesCommandes();
- //lecture de tous les fichiers commandeXXXX.txt (cette fonction doit
- //produire les factures des commandes non traitées jusqu'à maintenant)
- }
- else if(chx=='2')
- {
- //PARTIE 2 du TP : même sujet que PARTIE 1 MAIS avec Gestion de stock
- //copiez coller votre travail précédent puis modifiez le
- lireLesCommandes2();
- // le fichier stock.txt devra évoluer au fur et à mesure des commandes
- //traitees (voir explications dans le sujet)
- }
- else
- {
- printf("La valeur saisie est incorrecte, veuillez recommencer\n");
- }
- printf("Fin de l'execution du programme\n");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement