بســم الله الـرحمــن الرحيــم
السلام عليكــم ورحمـة الله وبركاتــه ،،
main.c
/* بسم الله الرحمن الرحيم */
#include <stdio.h>
#include <stdlib.h>
#include "Admin.h"
#include "Client.h"
int main()
{
char reponse;
int accept=0, pass=0;
system("cls");
Color(9,15);
printf(" Mini-Logiciel de Facturation et Gestion de Stock \n");
Color(3,15);
printf(" \n");
printf(" ****** Programme Realise par Aymen_ka ****** \n");
printf(" \n");
printf(" **** Encadre par Mr. H. E. **** \n");
printf(" \n\n\n");
Color(7,0);
do
{
do
{
printf ("\n Voulez vous entrer en Mode Adminstrateur ou client (A/C): ");
scanf ("%s", &reponse);
printf("\n\n\n");
} while (reponse!='c' && reponse!='C' && reponse!='a' && reponse!='A');
if (reponse=='a' || reponse=='A')
{
printf(" Mot de passe: ");
Color(12, 0);
printf("1234\n\n");
Color(7, 0);
printf(" veuillez entrer le mot de passe administrateur: ");
Color(12, 0);
scanf("%i", &pass);
Color(7, 0);
if (pass==1234)
{
accept=1;
Menu_Admin ();
}
else
{
printf("\n\n ");
Color2(FOREGROUND_RED | BACKGROUND_INTENSITY);
printf("Mot de passe incorrecte\n\n");
Color(7, 0);
}
}
else if (reponse=='c' || reponse=='c')
{
accept=1;
Menu_Client ();
}
} while(accept!=1);
return 0;
}Admin.h
/* بسم الله الرحمن الرحيم */ #include <stdio.h> #include <stdlib.h> #include <windows.h> typedef struct Article Article; void Menu_Admin (); void Modif(int pos_debut); void Ajout(int id); void liste_Articles(); int chercher_article(int article_recherche, int *pos_debut, int *pos_fin); void Color(int couleurDuTexte,int couleurDeFond); void Color2(WORD Attributes);
Admin.c
/* بسم الله الرحمن الرحيم */#include "Admin.h"struct Article { int code; char libelle[10]; float prix; int stock; };void Menu_Admin (){ int continuer=0, choix=0, taille_chaine=0, fin=0, id; int pos, pos_debut=0, pos_fin=0, article_recherche=-1; char rep; char chaine_partie1[30]; char chaine_partie2[30]; system("cls"); while (continuer != 6) { Color(1,8); printf("\n\n *** veuillez faire un choix *** \n"); Color(0,7); printf(" \n"); printf("1: voir les articles \n"); printf("2: ajouter/modifier un article \n"); printf("3: supprimer un article \n"); printf("4: voir l'historique des commandes \n"); printf("5: Retour au menu principal \n"); printf("6: Quitter \n"); Color(7,0); printf("\nVotre choix: "); scanf("%i", &choix); printf("\n"); switch (choix) { case 1: Color(11,0); printf(" -> votre choix est: voir les articles\n\n"); Color(7,0); liste_Articles(); break; case 2: Color(11,0); printf(" -> votre choix est: ajouter/modifier un article\n\n"); Color(7,0); id=-1; while (id<=0 || id>999) // { printf("Donner le code du produit a ajouter/modifier: "); Color(14,0); scanf("%i", &id); Color(7,0); } if ((chercher_article(id, &pos_debut, &pos_fin))==1) { while(getchar() != '\n'); // on vide le buffer Color(15,0); printf("\nArticle existant,"); Color(7,0); printf(" voulez vous le modifier? "); Color(15,0); printf("(O/N)"); Color(7,0); printf(": "); rep=getchar(); if (rep=='o' || rep=='O' || rep=='0') Modif(pos_debut); } else Ajout(id); break; case 3: Color(11,0); printf(" -> votre choix est: effacer un article\n\n"); Color(7,0); printf("donner l'ID de l'article a supprimer: "); Color(14,0); scanf("%i", &article_recherche); Color(7,0); if ((chercher_article(article_recherche, &pos_debut, &pos_fin))==1) { FILE* fichier_articles = NULL; fichier_articles = fopen("fichier_articles.txt", "r+"); FILE* fichier_tmp = NULL; // * fichier_tmp = fopen("fichier_tmp.txt", "w+"); // * on crée un fichier temporaire rewind(fichier_articles); //on fait retourner le curseur au début du fichier pos=0; //initialisation de pos à 0 pour entrer dans la boucle while ((fgets(chaine_partie1, 30, fichier_articles) != NULL) && (pos<pos_debut)) // lecture et ecriture (dans le fichier temporaire) des lignes qui se trouvent avant la ligne à supprimer { pos=ftell(fichier_articles); fputs(chaine_partie1, fichier_tmp); } fseek(fichier_articles, (pos_fin+2), SEEK_SET); //on positionne le curseur au début de la ligne qui se trouve apres la ligne à supprimer while (fgets(chaine_partie2, 30, fichier_articles) != NULL) // // lecture et ecriture (dans le fichier temporaire) des lignes qui se trouvent apres la ligne à supprimer { fputs(chaine_partie2, fichier_tmp); } fclose(fichier_articles); fichier_articles = fopen("fichier_articles.txt", "w+"); //reouverture du fichier "fichier_articles.txt" en le vidant rewind(fichier_tmp); // se positionner au début du fichier temporaire while (fgets(chaine_partie1, 30, fichier_tmp) != NULL) // lecture et ecriture du contenu du fichier temporaire dans "fichier_articles.txt" { fputs(chaine_partie1, fichier_articles); } fclose(fichier_articles); fclose(fichier_tmp); remove("fichier_tmp.txt"); //on supprime le fichier temporaire } else { Color2(FOREGROUND_RED | BACKGROUND_INTENSITY); printf("Article introuvable\n\n"); Color(7,0); } break; case 4: Color(11,0); printf(" -> votre choix est: voir l'historique des commandes\n\n"); Color(7,0); system("notepad fichier_historique.txt"); break; case 5: main(); break; case 6: Color(11,0); printf(" Quitter"); Color(7,0); continuer = 6; system ("exit"); break; default: Color2(FOREGROUND_RED | BACKGROUND_INTENSITY); printf("!!!vous devez faire un choix valide!!!\n\n\n"); Color(7, 0); break; } }}void Ajout(int id){ Article article_actuel; FILE* fichier_articles = NULL; fichier_articles = fopen("fichier_articles.txt", "a"); if (fichier_articles != NULL) { fprintf(fichier_articles, "%3i|", id); printf("Donner le libelle du produit: "); Color(14,0); scanf("%s", &article_actuel.libelle); Color(7,0); do { printf("Donner la quantite : "); Color(14,0); scanf("%i", &article_actuel.stock); Color(7,0); }while((article_actuel.stock<=0) && (article_actuel.stock>999)); fprintf(fichier_articles, "%3i|", article_actuel.stock); do { printf("Donner le prix du produit : "); Color(14,0); scanf("%f", &article_actuel.prix); Color(7,0); }while((article_actuel.prix<=0) && (article_actuel.prix>999999)); fprintf(fichier_articles, "%6.3f|", article_actuel.prix); fprintf(fichier_articles, "%10s\n", article_actuel.libelle);//le libelle doit etre en derniere place pourque la lecture string fontionne correctement fclose(fichier_articles); } else { printf("Impossible d'ouvrir le fichier fichier_articles.txt"); }}void Modif(int pos_debut){ Article article_actuel; FILE* fichier_articles = NULL; fichier_articles = fopen("fichier_articles.txt", "r+"); if (fichier_articles != NULL) { fseek(fichier_articles, pos_debut, SEEK_SET); //on retourne le curseur au début du fichier fscanf(fichier_articles, "%i|%i|%f|%s", &article_actuel.code, &article_actuel.stock, &article_actuel.prix, &article_actuel.libelle); Color(15,0); printf("donnees Actuels :"); Color(7,0); printf(" code: %3i; libelle: %10s; stock: %3i; prix: %.3f \n\n", article_actuel.code, article_actuel.libelle, article_actuel.stock, article_actuel.prix); printf("Code :"); Color(14,0); printf("%3i\n", article_actuel.code); Color(7, 0); printf("Nouveau Libelle : "); Color(14,0); scanf("%s", &article_actuel.libelle); Color(7,0); do { printf("Nouveau Stock : "); Color(14,0); scanf("%i", &article_actuel.stock); Color(7,0); }while((article_actuel.stock<0) && (article_actuel.stock>999)); do { printf("Nouveau Prix : "); Color(14,0); scanf("%f", &article_actuel.prix); Color(7,0); }while((article_actuel.prix<0) && (article_actuel.prix>999)); fseek(fichier_articles, pos_debut, SEEK_SET); fprintf(fichier_articles, "%3i|", article_actuel.code); fprintf(fichier_articles, "%3i|", article_actuel.stock); fprintf(fichier_articles, "%6.3f|", article_actuel.prix); fprintf(fichier_articles, "%10s\n", article_actuel.libelle); fseek(fichier_articles, pos_debut, SEEK_SET); fscanf(fichier_articles, "%i|%i|%f|%s", &article_actuel.code, &article_actuel.stock, &article_actuel.prix, &article_actuel.libelle); Color(15,0); printf("\nArticle Modifie :"); Color(7,0); printf(" code: %i | libelle: %s | stock: %i | prix: %.3f \n", article_actuel.code, article_actuel.libelle, article_actuel.stock, article_actuel.prix); fclose(fichier_articles); } else { printf("Impossible d'ouvrir le fichier fichier_articles.txt"); }}void liste_Articles(){ Article article_actuel; int pos=0, fin=0, i=0; FILE* fichier_articles = NULL; fichier_articles = fopen("fichier_articles.txt", "r"); if (fichier_articles != NULL) { fseek(fichier_articles, 0, SEEK_END); // * fin = ftell(fichier_articles); // * pour determiner la fin du fichier (le nombre de carateres totale) fseek(fichier_articles, 0, SEEK_SET); //on retourne le curseur au début du fichier printf(" "); Color(0,8); printf(" Code Libelle Stock Prix \n"); Color(7, 0); while (pos<(fin-2)) //fin - \n (qui representent 2 caracteres) { i++; fscanf(fichier_articles, "%i|%i|%f|%s", &article_actuel.code, &article_actuel.stock, &article_actuel.prix, &article_actuel.libelle); //le libelle doit etre au dernier emplacement pourque le programme fonctionne correctement Color(0,8); printf("Article %3i ", i); Color(7, 0); printf(" %3i %10s %3i %.3f\n", article_actuel.code, article_actuel.libelle, article_actuel.stock, article_actuel.prix); Color(0,8); printf(" \n", i); Color(7, 0); pos=ftell(fichier_articles); //position de la fin de chaque ligne lue fseek(fichier_articles, (pos+2), SEEK_SET); //pos + \n (qui representent 2 caracteres) } fclose(fichier_articles); } else { printf("Impossible d'ouvrir le fichier fichier_articles.txt"); }}int chercher_article(int article_recherche, int *pos_debut, int *pos_fin){ Article article_actuel; int pos1=0, pos2=0, fin=0, trouve=0; FILE* fichier_articles = NULL; fichier_articles = fopen("fichier_articles.txt", "r"); if (fichier_articles != NULL) { fseek(fichier_articles, 0, SEEK_END); fin = ftell(fichier_articles); fseek(fichier_articles, 0, SEEK_SET); while (pos2<(fin-2)) { pos1=ftell(fichier_articles); //pour avoir la position de debut l'ID cherché fscanf(fichier_articles, "%i|%i|%f|%s", &article_actuel.code, &article_actuel.stock, &article_actuel.prix, &article_actuel.libelle); pos2=ftell(fichier_articles); // la position de la fin de la ligne if ((article_actuel.code)==article_recherche) { trouve=1; *pos_debut=pos1; //on retourne la position de debut du code de l'article recherché *pos_fin=pos2; //on retourne la position de fin du code de l'article recherché return(trouve); //on retourne 1 si l'article est trouvé return; } fseek(fichier_articles, (pos2+2), SEEK_SET); } fclose(fichier_articles); } else { printf("Impossible d'ouvrir le fichier fichier_articles.txt"); }}void Color(int couleurDuTexte,int couleurDeFond) // affichage des couleurs{ HANDLE H = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleTextAttribute(H,couleurDeFond*16+couleurDuTexte);}void Color2(WORD Attributes) // fonction d'affichage de couleurs{ HANDLE H=GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleTextAttribute(H,Attributes);}Client.h
/* بسم الله الرحمن الرحيم */ #include <stdio.h> #include <stdlib.h> #include <time.h> #include <string.h> typedef struct ArticleC ArticleC; void Menu_Client (); void copie_fichier(char nomFichierOriginal[], char nomFichierDestination[]);
Client.c
/* بسم الله الرحمن الرحيم */
#include "Client.h"
#include "Admin.h"
struct ArticleC {
int code;
char libelle[10];
float prix;
int stock;
};
void Menu_Client ()
{
int continuer=0, choix=0, quantite, i, j, k, id, pos2, fin2;
int cod, quant;
float pri, total, global;
char libel[10];
int pos_debut=0, pos_fin=0;
char rep, rep2, rep3, rep4;
ArticleC article_actuel;
time_t temp_recupere;
struct tm * temps_info;
char chaine_temp [20];
system("cls");
while (continuer != 4)
{
Color(1,8);
printf("\n\n *** veuillez faire un choix *** \n");
Color(0,7);
printf(" \n");
printf("1: voir la liste des articles \n");
printf("2: Faire un commande \n");
printf("3: Retour au menu principal \n");
printf("4: Quitter \n");
Color(7,0);
printf("\nVotre choix: ");
scanf("%i", &choix);
printf("\n");
switch (choix)
{
case 1:
Color(11,0);
printf(" -> votre choix est: voir la liste des articles\n\n");
Color(7,0);
liste_Articles();
break;
case 2:
Color(11,0);
printf(" -> votre choix est: Faire une commande\n\n");
Color(7,0);
FILE* fichier_articles = NULL;
fichier_articles = fopen("fichier_articles.txt", "r+");
j=0; // compteur j pour verifier s'il y a eu au moins un article acheté dans cette commande
k=0;
if (fichier_articles != NULL)
{
FILE* fichier_commande = NULL;
fichier_commande = fopen("fichier_commande.txt", "w+"); // on vide "fichier_commande.txt" avec w+ pour preparer son remplissage par une eventuelle nouvelle commande
fclose(fichier_commande);
copie_fichier("fichier_articles.txt", "copie_fichier_articles.txt"); //création d'une copie temporaire
do
{
do //on demande le code de l'article à commander
{
printf("\nDonner le code de l'article a commander: ");
Color(14,0);
scanf("%i", &id);
Color(7,0);
} while (id<=0 || id>999);
quantite=0; // inialisation de la quantité au début de la boucle
if ((chercher_article(id, &pos_debut, &pos_fin))==1) // on fait une recherche à l'aide de la fonction chercher_article et si disponible on entre dans la boucle sinon on affiche "Article introuvable"
{
FILE* fichier_copie = NULL;
fichier_copie = fopen("copie_fichier_articles.txt", "r+");
fseek(fichier_copie, pos_debut, SEEK_SET); //on positionne le curseur au début de la ligne de l'acrticle à commander
fscanf(fichier_copie, "%i|%i|%f|%s", &article_actuel.code, &article_actuel.stock, &article_actuel.prix, &article_actuel.libelle); //scan de l'article à commander
Color(15,0);
printf ("Article choisi: ");
Color(7,0);
printf("code: %3i | Libelle: %10s | Stock: %3i | prix: %.3f\n", article_actuel.code, article_actuel.libelle, article_actuel.stock, article_actuel.prix); // affiche de l'article à commander
do //on demande la quantité et on verifie si elle est <= au stock
{
Color(15,0);
printf ("quantite: ");Color(7,0);
scanf("%i", &quantite);
if (quantite>article_actuel.stock)
{
while(getchar() != '\n');
Color2(FOREGROUND_RED | BACKGROUND_INTENSITY);
printf("quantite demandee indisponible, ressayer/annuler (R/A): ");
rep=getchar();
Color(7,0);
}
} while ((quantite>article_actuel.stock) && (rep=='r' || rep=='R'));
if ((quantite>0) && (quantite<=article_actuel.stock))
{
FILE* fichier_commande = NULL;
fichier_commande = fopen("fichier_commande.txt", "r");
system("cls");
Color(0,7);
printf("Votre commande code article quantite prix unitaire total \n");
printf(" ");
Color(7,0);
printf(" \n");
if (j>0) // s'il y a au moins un article comfirmé dans cette commande
{
fseek(fichier_commande, 0, SEEK_END);
fin2 = ftell(fichier_commande);
fseek(fichier_commande, 0, SEEK_SET);
do // on affiche toutes les articles comamnder avant de commander un nouvel article
{
fscanf(fichier_commande, "%i|%i|%i|%f|%f|%s", &k, &cod, &quant, &pri, &total, &libel);
Color(0,7);
printf("Article %2i ", k);
Color(7,0);
printf(" %3i %10s %3i %6.3f %6.3f\n", cod, libel, quant, pri, total);
pos2=ftell(fichier_commande);
fseek(fichier_commande, (pos2+2), SEEK_SET);
}while (pos2<(fin2-2));
}
else k=0;
k++;
Color(0,7);
printf("Article %2i ", k);
Color(7,0);
printf(" %3i %10s %3i %6.3f %6.3f\n", article_actuel.code, article_actuel.libelle, quantite, article_actuel.prix, ((article_actuel.prix)*quantite));
fclose(fichier_commande);
while(getchar() != '\n');
printf("\n\n\nConfirmer l'ajout de ");
Color(0,7);
printf("l'Article %i", k);
Color(7,0);
printf(" ? ");
Color(15,0);
printf("(O/N): ");
Color(7,0);
rep2=getchar();
if (rep2=='O' || rep2=='o' || rep2=='0')
{
j++; // compteur pour commandes finales
article_actuel.stock -= quantite; //on va diminuer la quantité commandé du stock
fseek(fichier_copie, pos_debut, SEEK_SET);
fprintf(fichier_copie, "%3i|%3i|%6.3f|%10s\n", article_actuel.code, article_actuel.stock, article_actuel.prix, article_actuel.libelle);
FILE* fichier_commande = NULL;
fichier_commande = fopen("fichier_commande.txt", "a"); // on ouvre "fichier_commande.txt" en mode ajout pour le remplir avec les articles de cette commande
fprintf(fichier_commande, "%3i|%3i|%3i|%6.3f|%6.3f|%10s\n", j, article_actuel.code, quantite, article_actuel.prix,((article_actuel.prix)*quantite) , article_actuel.libelle);
fclose(fichier_commande);
}
}
fclose(fichier_copie);
}
else
{
Color2(FOREGROUND_RED | BACKGROUND_INTENSITY);
printf("Article introuvable");
Color(7,0);
}
while(getchar() != '\n'); //on vide le buffer
printf ("\nVoulez vous commander un autre article? ");
Color(15,0);
printf("(O/N): ");
Color(7,0);
rep3=getchar();
} while(rep3=='o' || rep3=='O'); //si le client veut commander un autre article on repete la boucle
if (j>0) //s'il y a eu au moins un article acheté dans cette commande
{
while(getchar() != '\n'); //on vide le buffer
Color2(FOREGROUND_BLUE | BACKGROUND_INTENSITY);
printf ("\n\nConfirmer votre commande? (O/N): ");
rep4=getchar();
Color(7,0);
if (rep4=='O' || rep4=='o' || rep4=='0')
{
// modification du stock dans le fichier "fichier_articles.txt" original
copie_fichier("copie_fichier_articles.txt", "fichier_articles.txt");
// compteur de commandes
FILE* fichier_compteur = NULL;
fichier_compteur = fopen("fichier_compteur.txt", "r+");
fscanf(fichier_compteur, "%i", &i);
rewind(fichier_compteur);
i++;
fprintf(fichier_compteur, "%i", i);
fclose(fichier_compteur);
// historique & affichage de la facture
system("cls"); //vider l'ecran
FILE* fichier_historique = NULL;
fichier_historique = fopen("fichier_historique.txt", "a");
time ( &temp_recupere );
temps_info = localtime ( &temp_recupere );
strftime (chaine_temp,20,"%a %x %H:%M",temps_info);
fprintf(fichier_historique, "COMMANDE %3i Date: %s\n\n\n\n", i, chaine_temp);
FILE* fichier_commande = NULL;
fichier_commande = fopen("fichier_commande.txt", "r");
Color(15,0);
printf ("Facture N%i Date: %s\n\n\n", i, chaine_temp);
Color(0,7);
printf("Votre commande code article quantite prix unitaire total \n");
printf(" ");
Color(7,0);
printf(" \n");
fprintf(fichier_historique, "La commande code article quantite prix unitaire total\n\n");
fseek(fichier_commande, 0, SEEK_END);
fin2 = ftell(fichier_commande);
fseek(fichier_commande, 0, SEEK_SET);
do
{
fscanf(fichier_commande, "%i|%i|%i|%f|%f|%s", &k, &cod, &quant, &pri, &total, &libel);
global +=total;
Color(0,7);
printf("Article %2i ", k);
Color(7,0);
printf(" %3i %10s %3i %6.3f %6.3f\n", cod, libel, quant, pri, total);
fprintf(fichier_historique, "Article %2i %3i %10s %3i %6.3f %6.3f\n", k, cod, libel, quant, pri, total);
pos2=ftell(fichier_commande);
fseek(fichier_commande, (pos2+2), SEEK_SET);
}while (pos2<(fin2-2));
printf("\n\n ");
Color(0, 8);
printf(" Prix Total:");
Color(15,0);
printf(" %.3f\n\n", global);
Color(7, 0);
fprintf(fichier_historique, "\n\n Prix Total: %.3f", global);
fprintf(fichier_historique, "\n\n-------------------------------------------------------------------------");
fprintf(fichier_historique, "\n\n\n");
fclose(fichier_commande);
fclose(fichier_historique);
}
}
fclose(fichier_articles);
}
else
{
Color2(FOREGROUND_RED | BACKGROUND_INTENSITY);
printf("Impossible d'ouvrir le fichier fichier_articles.txt");
Color(7, 0);
}
break;
case 3:
main();
break;
case 4:
Color(11,0);
printf(" Quitter");
Color(7,0);
continuer = 4;
system ("exit");
break;
default:
Color2(FOREGROUND_RED | BACKGROUND_INTENSITY);
printf("!!!vous devez faire un choix valide!!!\n\n\n");
Color(7, 0);
break;
}
}
}
void copie_fichier(char nomFichierOriginal[], char nomFichierDestination[])
{
char libel[10];
int pos3, fin3, cod, stoc;
float pri;
FILE* fichier_copie = NULL; // *
fichier_copie = fopen(nomFichierDestination, "w+"); // * Création (ou effacement si existant) d'un fichier copie
FILE* fichier_original = NULL;
fichier_original = fopen (nomFichierOriginal, "r");
if (fichier_original != NULL)
{
fseek(fichier_original, 0, SEEK_END);
fin3 = ftell(fichier_original);
fseek(fichier_original, 0, SEEK_SET);
do
{
fscanf(fichier_original, "%i|%i|%f|%s", &cod, &stoc, &pri, &libel);
fprintf(fichier_copie, "%3i|%3i|%6.3f|%10s\n", cod, stoc, pri, libel);
pos3=ftell(fichier_original);
fseek(fichier_original, (pos3+2), SEEK_SET);
}while (pos3<(fin3-2));
fclose(fichier_original);
fclose(fichier_copie);
}
else
{
printf("Impossible d'ouvrir le fichier %s", nomFichierOriginal);
}
}