You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
553 lines
15 KiB
553 lines
15 KiB
#include "SAE.h"
|
|
|
|
int chargement(int tnCarte[],int tPoint[],int tEtat[],int tPhys)
|
|
{
|
|
int i = 0,nCarte,point,etat;/*déclaration d'un compteur(i) et de variables intermédiaires pour l'assignation des tableaux*/
|
|
FILE *flot;/*formalités pour les fichiers*/
|
|
flot=fopen("clients.txt","r");
|
|
if (flot==NULL)
|
|
{
|
|
printf("Problème d'ouverture du fichier clients.txt\n");
|
|
return -1;
|
|
}
|
|
fscanf(flot,"%d%d%d",&nCarte,&point,&etat);
|
|
while(!feof(flot))/*remplissage des tableaux*/
|
|
{
|
|
if (i > tPhys)
|
|
{
|
|
printf("Tableaux plein.\n");/*tableaux pleins donc on retourne -1*/
|
|
fclose(flot);
|
|
return -1;
|
|
}
|
|
tnCarte[i] = nCarte;
|
|
tPoint[i] = point + 2; /*ajoute 2 points bonus à chaque usager pendant le chargement*/
|
|
tEtat[i] = etat;
|
|
fscanf(flot,"%d%d%d",&nCarte,&point,&etat);
|
|
i++;
|
|
}
|
|
fclose(flot);
|
|
return i; /*retourne si le chargement s'est bien passé la taille logique des tableaux(i)*/
|
|
}
|
|
|
|
|
|
void affichage(int tnCarte[], int tPoint[], int tEtat[],int tLog) /*affiche les informations de tous les usagers enregistrés*/
|
|
{
|
|
int i = 0;
|
|
printf("|----------------------------------------------|\n"); /*affichage un peu plus esthétique*/
|
|
printf("| N°Carte | Nb Points | Etat Carte |\n");
|
|
printf("|----------------------------------------------|\n");
|
|
while(i < tLog)
|
|
{
|
|
if(tEtat[i] == 1)
|
|
{
|
|
printf("| %5d |\t %3d | Bloquée |\n",tnCarte[i],tPoint[i]);
|
|
printf("|----------------------------------------------|\n");
|
|
}
|
|
else
|
|
{
|
|
printf("| %5d |\t %3d | Débloquée |\n",tnCarte[i],tPoint[i]);
|
|
printf("|----------------------------------------------|\n");
|
|
}
|
|
i ++;
|
|
}
|
|
}
|
|
|
|
|
|
void affichageUnique(int tnCarte[], int tPoint[], int tEtat[], int tLog) /*affiche les informations d'une seule personne*/
|
|
{
|
|
int pos, numeroC;
|
|
char trouve;
|
|
printf("Quel est le numéro de carte de l'usager ?\nSaisie : ");
|
|
scanf("%d%*c", &numeroC);
|
|
printf("\n");
|
|
pos = recherche(tnCarte, tLog, numeroC, &trouve);
|
|
if(trouve == 'N')
|
|
{
|
|
printf("Erreur, l'usager n'existe pas\n");
|
|
return;
|
|
}
|
|
printf("|----------------------------------------------|\n"); /*affichage un peu plus esthétique*/
|
|
printf("| N°Carte | Nb Points | Etat Carte |\n");
|
|
printf("|----------------------------------------------|\n");
|
|
if(tEtat[pos] == 1)
|
|
{
|
|
printf("| %5d |\t %3d | Bloquée |\n",tnCarte[pos],tPoint[pos]);
|
|
printf("|----------------------------------------------|\n");
|
|
}
|
|
else
|
|
{
|
|
printf("| %5d |\t %3d | Débloquée |\n",tnCarte[pos],tPoint[pos]);
|
|
printf("|----------------------------------------------|\n");
|
|
}
|
|
}
|
|
|
|
|
|
int recherche(int tnCarte[], int tLog, int val, char *trouve) /* recherche le numéro de carte dans le tableaux */
|
|
{
|
|
int i = 0;
|
|
if(val == tnCarte[0])
|
|
{
|
|
*trouve = 'O';
|
|
return i;
|
|
}
|
|
while(val > tnCarte[i])
|
|
{
|
|
if(i == tLog)
|
|
{
|
|
return -1;
|
|
}
|
|
i++;
|
|
}
|
|
if(val == tnCarte[i])
|
|
{
|
|
*trouve = 'O';
|
|
}
|
|
else
|
|
{
|
|
*trouve = 'N';
|
|
}
|
|
return i;
|
|
}
|
|
|
|
|
|
|
|
int insertion(int tnCarte[], int tPoint[],int tEtat[], int tBus[], int tTram[], int tMetro[], int tVelo[], int tTrot[],int *tLog,int tphys)
|
|
{
|
|
int i,j,numeroC,points = 0, taille;
|
|
char trouve;
|
|
printf("Quel est le numéro de carte à insérer ?\nSaisie : ");
|
|
scanf("%d%*c", &numeroC);
|
|
i = recherche(tnCarte,*tLog,numeroC,&trouve);
|
|
if (trouve == 'O') /* Si la carte existe déjà, la fonction renvoie -1 */
|
|
{
|
|
printf("\nLe numéro de carte existe déjà\n");
|
|
return -1;
|
|
}
|
|
if (*tLog == tphys)
|
|
{
|
|
printf("\nErreur, les tableaux sont pleins\n");
|
|
return -1;
|
|
}
|
|
if (trouve == 'N')
|
|
{
|
|
for (j = *tLog - 1; j >= i; j--) /* Décalage vers la doroite des valeurs des tableaux */
|
|
{
|
|
tnCarte[j+1] = tnCarte[j];
|
|
tPoint[j+1] = tPoint[j];
|
|
tEtat[j+1] = tEtat[j];
|
|
tBus[j+1] = tBus[j];
|
|
tTram[j+1] = tTram[j];
|
|
tMetro[j+1] = tMetro[j];
|
|
tVelo[j+1] = tVelo[j];
|
|
tTrot[j+1] = tTrot[j];
|
|
}
|
|
}
|
|
tnCarte[i] = numeroC;
|
|
tPoint[i] = points; /* Par défaut, la carte doit être créditée*/
|
|
tEtat[i] = 0; /* Par défaut, la carte est débloquée*/
|
|
tBus[i] = 0; /*Par défaut, aucun transport n'est réservé */
|
|
tTram[i] = 0;
|
|
tMetro[i] = 0;
|
|
tVelo[i] = 0;
|
|
tTrot[i] = 0;
|
|
*tLog = *tLog + 1;
|
|
taille = *tLog;
|
|
recharger(tnCarte,tPoint,tEtat,taille,numeroC);
|
|
system("clear");
|
|
return 0;
|
|
}
|
|
|
|
|
|
int suppression(int tnCarte[], int tPoint[], int tEtat[], int tBus[], int tTram[], int tMetro[], int tVelo[], int tTrot[], int *tLog, int tPhys)
|
|
{
|
|
int i, numeroC;
|
|
char trouve, choix;
|
|
printf("Quel est le numéro de la carte à supprimer ?\n");
|
|
scanf("%d%*c", &numeroC);
|
|
printf("Êtes-vous sûr de vouloir supprimer la carte n°%d ? (O/N)\nSaisie : ",numeroC);
|
|
scanf("%c%*c", &choix);
|
|
printf("\n");
|
|
if(choix == 'O')
|
|
{
|
|
i = recherche(tnCarte, *tLog, numeroC, &trouve);
|
|
if(trouve == 'N')
|
|
{
|
|
printf("Erreur, le numéro de carte saisie n'existe pas\n");
|
|
return -1;
|
|
}
|
|
while(i <= *tLog) /* Décalage vers la gauche des valeurs dans les tableaux*/
|
|
{
|
|
tnCarte[i] = tnCarte[i+1];
|
|
tPoint[i] = tPoint[i+1];
|
|
tEtat[i] = tEtat[i+1];
|
|
tBus[i] = tBus[i+1];
|
|
tTram[i] = tTram[i+1];
|
|
tMetro[i] = tMetro[i+1];
|
|
tVelo[i] = tVelo[i+1];
|
|
tTrot[i] = tTrot[i+1];
|
|
i++;
|
|
}
|
|
*tLog = *tLog -1;
|
|
}
|
|
system("clear");
|
|
}
|
|
|
|
|
|
void afficherBilan(int tBus[], int tTram[], int tMetro[], int tVelo[], int tTrot[],int tLog)
|
|
{
|
|
int i = 0, nbBus = 0, nbTram = 0, nbMetro = 0, nbVelo = 0, nbTrot = 0;
|
|
while(i < tLog) /* Calcule la somme de tous les éléments ppur chaque tableau de transport, soit le nombre d'usagers de la journée */
|
|
{
|
|
nbBus = nbBus + tBus[i];
|
|
nbTram = nbTram + tTram[i];
|
|
nbMetro = nbMetro + tMetro[i];
|
|
nbVelo = nbVelo + tVelo[i];
|
|
nbTrot = nbTrot + tTrot[i];
|
|
i++;
|
|
}
|
|
printf("Bus\tTram\tMétro\tVelo\tTrottinette\n");
|
|
printf("%d\t%d\t%d\t%d\t%d\n", nbBus, nbTram, nbMetro, nbVelo, nbTrot); /* Affiche le bilan de la journée */
|
|
}
|
|
|
|
|
|
int reserver(int tnCarte[], int tPoint[], int tEtat[], int tBus[], int tTram[], int tMetro[], int tVelo[], int tTrot[], int tLog)
|
|
{
|
|
int pos, numeroC,saisie;
|
|
char trouve;
|
|
system("clear");
|
|
printf("Quel est le numéro de la carte à débiter ?\nSaisie : ");
|
|
scanf("%d%*c", &numeroC);
|
|
printf("\n");
|
|
pos = recherche(tnCarte, tLog, numeroC, &trouve);
|
|
if(trouve == 'N') /* Si la carte n'est pas trouvée, la fonction retourne -1 */
|
|
{
|
|
printf("Erreur, le numéro de catrte n'existe pas");
|
|
return -1;
|
|
}
|
|
if(tEtat[pos] == 1) /* Si la carte est bloquée, la fonction retourne -1 */
|
|
{
|
|
printf("Erreur, cette carte est bloquée\n");
|
|
return -1;
|
|
}
|
|
printf("Quel moyen de transport souhaitez-vous réserver ?\n\n");
|
|
printf("|-------------------------------|\n");
|
|
printf("| 1 | Bus(4 points)\t\t|\n| 2 | Tram(4 points)\t\t|\n| 3 | Metro(6 points)\t\t|\n| 4 | Velo(3 points)\t\t|\n| 5 | Trottinette(2 points) |\n| 6 | Tout réserver(15 points) |\n| 7 | Quitter\t\t\t|\n");
|
|
printf("|-------------------------------|\n\n");
|
|
printf("Il vous reste %d points sur votre carte.\n\nSaisie : ", tPoint[pos]);
|
|
scanf("%d%*c", &saisie);
|
|
system("clear");
|
|
while(saisie != 7) /* Gestion du menu des types de transports */
|
|
{
|
|
if(saisie == 1)
|
|
{
|
|
if(tBus[pos] == 1) /* Impossible de réserver un type de transport plusieurs fois dans une journée */
|
|
{
|
|
printf("Le bus est déjà réservé pour cet usager\n\n");
|
|
}
|
|
else
|
|
{
|
|
if(tPoint[pos] < 4)
|
|
{
|
|
printf("Vous ne possédez pas assez de points.\n\n");
|
|
}
|
|
else
|
|
{
|
|
tPoint[pos] = tPoint[pos] - 4; /* Débitement des points sur la carte */
|
|
tBus[pos] = 1; /* Réservation du type de transport */
|
|
}
|
|
}
|
|
}
|
|
if(saisie == 2)
|
|
{
|
|
if(tTram[pos] == 1)
|
|
{
|
|
printf("Le tram est déjà réservé pour cet usager\n\n");
|
|
}
|
|
else
|
|
{
|
|
if(tPoint[pos] < 4)
|
|
{
|
|
printf("Vous ne possédez pas assez de points.\n\n");
|
|
}
|
|
else
|
|
{
|
|
tPoint[pos] = tPoint[pos] - 4;
|
|
tTram[pos] = 1;
|
|
}
|
|
}
|
|
}
|
|
if(saisie == 3)
|
|
{
|
|
if(tMetro[pos] == 1)
|
|
{
|
|
printf("Le métro est déjà réservé pour cet usager\n\n");
|
|
}
|
|
else
|
|
{
|
|
if(tPoint[pos] < 6)
|
|
{
|
|
printf("Vous ne possédez pas assez de points.\n\n");
|
|
}
|
|
else
|
|
{
|
|
tPoint[pos] = tPoint[pos] - 6;
|
|
tMetro[pos] = 1;
|
|
}
|
|
}
|
|
}
|
|
if(saisie == 4)
|
|
{
|
|
if(tVelo[pos] == 1)
|
|
{
|
|
printf("Le vélo est déjà réservé pour cet usager\n\n");
|
|
}
|
|
else
|
|
{
|
|
if(tPoint[pos] < 3)
|
|
{
|
|
printf("Vous ne possédez pas assez de points.\n\n");
|
|
}
|
|
else
|
|
{
|
|
tPoint[pos] = tPoint[pos] - 3;
|
|
tVelo[pos] = 1;
|
|
}
|
|
}
|
|
}
|
|
if(saisie == 5)
|
|
{
|
|
if(tTrot[pos] == 1)
|
|
{
|
|
printf("La trottinette est déjà réservée pour cet usager\n\n");
|
|
}
|
|
else
|
|
{
|
|
if(tPoint[pos] < 2)
|
|
{
|
|
printf("Vous ne possédez pas assez de points.\n\n");
|
|
}
|
|
else
|
|
{
|
|
tPoint[pos] = tPoint[pos] - 2;
|
|
tTrot[pos] = 1;
|
|
}
|
|
}
|
|
}
|
|
if(saisie == 6)
|
|
{
|
|
if(tPoint[pos] < 15)
|
|
{
|
|
printf("Vous ne possédez pas assez de points.\n\n");
|
|
}
|
|
else
|
|
{
|
|
tPoint[pos] = tPoint[pos] - 15;
|
|
tBus[pos] = 1;
|
|
tTram[pos] = 1;
|
|
tMetro[pos] = 1;
|
|
tVelo[pos] = 1;
|
|
tTrot[pos] = 1;
|
|
}
|
|
}
|
|
if(saisie == 7)
|
|
{
|
|
break;
|
|
}
|
|
printf("Quel moyen de transport souhaitez-vous réserver ?\n\n");
|
|
printf("|-------------------------------|\n");
|
|
printf("| 1 | Bus(4 points)\t\t|\n| 2 | Tram(4 points)\t\t|\n| 3 | Metro(6 points)\t\t|\n| 4 | Velo(3 points)\t\t|\n| 5 | Trottinette(2 points) |\n| 6 | Tout réserver(15 points) |\n| 7 | Quitter\t\t\t|\n");
|
|
printf("|-------------------------------|\n\n");
|
|
printf("Il vous reste %d points sur votre carte.\n\nSaisir : ", tPoint[pos]);
|
|
scanf("%d%*c", &saisie);
|
|
system("clear");
|
|
}
|
|
}
|
|
|
|
|
|
void enregistrementTableaux(int tnCarte[], int tPoint[], int tEtat[], int tLog)
|
|
{
|
|
int i = 0;
|
|
FILE *flot;
|
|
flot = fopen("clients.txt","w");
|
|
if (flot==NULL)
|
|
{
|
|
printf("Erreur d'ouverture du fichier clients.txt");
|
|
return;
|
|
}
|
|
while (i < tLog)
|
|
{
|
|
fprintf(flot,"%d\t%d\t%d\n",tnCarte[i],tPoint[i],tEtat[i]); //jsp si c'est mieux de passer par des valeurs intermédiaires pour l'écriture
|
|
i++;
|
|
}
|
|
}
|
|
|
|
int calculBonus(int ajout) //en travaux / calcul l'ajout de point à une carte / est appelée dans la fonction recharger et dans insertion
|
|
{
|
|
int bonus;
|
|
if (ajout>10)
|
|
{
|
|
if(ajout>15)
|
|
{
|
|
if (ajout>20)
|
|
{
|
|
if (ajout>30)
|
|
{
|
|
if (ajout>45)
|
|
{
|
|
if (ajout>75)
|
|
{
|
|
if (ajout>100)
|
|
bonus=20;
|
|
else bonus=15;
|
|
}
|
|
else bonus=10;
|
|
}
|
|
else bonus=8;
|
|
}
|
|
else bonus=5;
|
|
}
|
|
else bonus=3;
|
|
}
|
|
else bonus=2;
|
|
}
|
|
else bonus=0;
|
|
return bonus;
|
|
}
|
|
|
|
void recharger(int tnCarte[], int tPoint[], int tEtat[], int tLog, int carte)
|
|
{
|
|
char trouve, choix;
|
|
int index, ajout, bonus;
|
|
float cout;
|
|
if(carte == 0)
|
|
{
|
|
printf("Quelle carte voulez-vous recharger ?\nSaisie : ");
|
|
scanf("%d%*c",&carte);
|
|
}
|
|
index = recherche(tnCarte,tLog,carte, &trouve); //on regarde si la carte existe et on recupere son index
|
|
while (trouve != 'O') //on demande une carte valide tant que la carte n'est pas trouvée
|
|
{
|
|
printf("\nCette carte n'existe pas, re-saisir : ");
|
|
scanf("%d%*c",&carte);
|
|
index = recherche(tnCarte,tLog,carte,&trouve);
|
|
}
|
|
if(tEtat[index] == 1)
|
|
{
|
|
printf("\nCette carte est bloquée, vous ne pouvez pas la recharger.\n");
|
|
return;
|
|
}
|
|
printf("\nIl y a actuellement %d points sur cette carte\nCombien de points voulez vous ajouter ?\nSaisie : ",tPoint[index]);
|
|
scanf("%d%*c",&ajout);
|
|
cout = ajout * 1.50;/*prix à voir + est ce qu'on ferait pas des reduc par paliers de points*/;
|
|
bonus = calculBonus(ajout);
|
|
printf("\nCela vous fera %.2f€\n",cout);
|
|
/*PAIEMENT*/
|
|
printf("Souhaitez-vous continuer ? (O/N)\nSaisie : ");
|
|
scanf("%c%*c",&choix);
|
|
printf("\n");
|
|
printf("\n");
|
|
if(choix == 'N')
|
|
{
|
|
printf("Rechargement annulé\n");
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
tPoint[index] = tPoint[index] + ajout + bonus;
|
|
}
|
|
system("clear");
|
|
}
|
|
|
|
void gererEtatCarte(int tnCarte[], int tEtat[], int tLog)
|
|
{
|
|
int numeroC, pos;
|
|
char trouve, saisie;
|
|
printf("Quelle carte souhaitez-vous gérer ?\nSaisie : ");
|
|
scanf("%d%*c", &numeroC);
|
|
pos = recherche(tnCarte, tLog, numeroC, &trouve);
|
|
if(tEtat[pos] == 1)
|
|
{
|
|
printf("Cette carte est actuellement bloquée.\n");
|
|
printf("\nSouhaitez-vous la débloquer ? (O/N)\nSaisie : ");
|
|
scanf("%c%*c", &saisie);
|
|
if (saisie == 'O')
|
|
{
|
|
tEtat[pos] = 0;
|
|
printf("\nVotre carte est désormais débloquée.\n");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
printf("Cette carte est actuellement débloquée.\n");
|
|
printf("Souhaitez-vous la bloquer ? (O/N)\nSaisie : ");
|
|
scanf("%c%*c", &saisie);
|
|
if (saisie == 'O')
|
|
{
|
|
tEtat[pos] = 1;
|
|
printf("\nVotre carte est désormais bloquée.\n");
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void globale(void)
|
|
{
|
|
int tnCarte[100] = {0}, tPoint[100] = {0}, tEtat[100] = {0},tPhys = 100,tBus[100] = {0},tTram[100] = {0},tMetro[100] = {0},tVelo[100] = {0},tTrot[100] = {0}, tLog, choix, carte = 0;
|
|
tLog = chargement(tnCarte, tPoint, tEtat, tPhys); /* Chargement du fichier dans les tableaux */
|
|
if(tLog == -1)
|
|
return;
|
|
system("clear");
|
|
printf("\n------------------------------------------\n");
|
|
printf("| \tGestion des transports\t\t |\n");
|
|
printf("------------------------------------------\n");
|
|
printf("| 1 Réserver un type de transport\t |\n");
|
|
printf("| 2 Afficher tous les usagers\t |\n");
|
|
printf("| 3 Afficher un usager\t\t |\n");
|
|
printf("| 4 Recharger une carte\t\t |\n");
|
|
printf("| 5 Insérer un nouvel usager\t\t |\n");
|
|
printf("| 6 Supprimer un usager\t\t |\n");
|
|
printf("| 7 Afficher le bilan de la journée\t |\n");
|
|
printf("| 8 Bloquer/Débloquer une carte\t |\n");
|
|
printf("| 9 Quitter\t\t\t\t |\n");
|
|
printf("------------------------------------------\n\n");
|
|
printf("Saisie : ");
|
|
scanf("%d%*c",&choix);
|
|
printf("\n");
|
|
while(choix != 9) /* Gestion du menu général du programme */
|
|
{
|
|
if(choix == 1)
|
|
reserver(tnCarte,tPoint,tEtat,tBus,tTram,tMetro,tVelo,tTrot,tLog);
|
|
if(choix == 2)
|
|
affichage(tnCarte,tPoint,tEtat,tLog);
|
|
if(choix == 3)
|
|
affichageUnique(tnCarte, tPoint, tEtat, tLog);
|
|
if(choix == 4)
|
|
recharger(tnCarte, tPoint, tEtat, tLog, carte);
|
|
if(choix == 5)
|
|
insertion(tnCarte, tPoint, tEtat, tBus, tTram, tMetro, tVelo, tTrot, &tLog, tPhys);
|
|
if(choix == 6)
|
|
suppression(tnCarte, tPoint, tEtat, tBus, tTram, tMetro, tVelo, tTrot, &tLog, tPhys);
|
|
if(choix == 7)
|
|
afficherBilan(tBus, tTram, tMetro, tVelo, tTrot, tLog);
|
|
if(choix == 8)
|
|
gererEtatCarte(tnCarte, tEtat, tLog);
|
|
printf("\n------------------------------------------\n");
|
|
printf("| \tGestion des transports\t\t |\n");
|
|
printf("------------------------------------------\n");
|
|
printf("| 1 Réserver un type de transport\t |\n");
|
|
printf("| 2 Afficher tous les usagers\t |\n");
|
|
printf("| 3 Afficher un usager\t\t |\n");
|
|
printf("| 4 Recharger une carte\t\t |\n");
|
|
printf("| 5 Insérer un nouvel usager\t\t |\n");
|
|
printf("| 6 Supprimer un usager\t\t |\n");
|
|
printf("| 7 Afficher le bilan de la journée\t |\n");
|
|
printf("| 8 Bloquer/Débloquer une carte\t |\n");
|
|
printf("| 9 Quitter\t\t\t\t |\n");
|
|
printf("------------------------------------------\n\n");
|
|
printf("Saisie : ");
|
|
scanf("%d%*c",&choix);
|
|
system("clear");
|
|
}
|
|
enregistrementTableaux(tnCarte,tPoint,tEtat,tLog); /* Ecriture des tableaux dans le fichier */
|
|
system("clear");
|
|
} |