Untitled
user_9243973
plain_text
3 years ago
17 kB
11
Indexable
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
#include <dos.h> //des bibliotheques utilisees pour la fonction couleurs
#include <dir.h>
// Déclaration
typedef struct Objet *Pliste;
typedef struct Objet
{
int x;
int y;
int nature;
Pliste Suiv;
} Parcelle;
//déclaration de la File
typedef Pliste Telm;
typedef struct Element* EFile;
typedef struct Element { Telm Val; EFile Suiv} CelluleF;
typedef struct {EFile Tete,Queue;} File;
////primitives des Files
//procedure Initfile
void Initfile(File *F)
{(*F).Tete=NULL; (*F).Queue=NULL;}
//procedure Enfiler
void Enfiler(File *F, Telm x)
{EFile V;
V=malloc(sizeof(CelluleF));
V->Val=x;
V->Suiv=NULL;
if ((*F).Tete==NULL) (*F).Tete=V; //la file est vide
else (*F).Queue->Suiv=V;
(*F).Queue=V;
}
//procedure Defiler
void Defiler(File *F, Telm *x)
{EFile V;
V=(*F).Tete;
*x=V->Val; //ou *x=(*F).Tete->Val;
if ((*F).Tete==(*F).Queue) {(*F).Tete=NULL; (*F).Queue=NULL;}
else (*F).Tete=(*F).Tete->Suiv; // ou (*F).Tete=V->Suiv;
free(V);
}
//Fonction Filevide
int Filevide(File F)
{if (F.Tete==NULL) return 1;
else return 0;
}
int n, m, k;
int T[100][100];
Pliste Tete;
// Creation
void creercarte(int T[][100], int n, int m)
{
int i, j, r;
srand(time(NULL)); //srand permet de ne pas avoir les memes valeurs a chaque execution
for (i = 0; i < n; i = i + 2) // on avance de deux pas pour travailler que par paire
{
for (j = 0; j < m; j = j + 2)
{
r = (rand() % 4) + 1; // rand%4 veut dire qu'on remplie avec des 0 1 2 3 on rajoute
T[i][j] = r; //+1 pour remplir avec 1 2 3 4 seulement
T[i][j + 1] = r;
T[i + 1][j] = r; // on remplie aleatoirement 4 pixels voisin en meme temps et vu que cest
T[i + 1][j + 1] = r; // aleatoire on a au minimum des objets de 4 sinon plus que 4
}
}
}
// Affichage
void affichecarte(int T[][100],int n,int m)
{
int i, j;
printf("\n\n -La carte : \n");
printf(" ");
printf("\t\t%c", 201); //correspond a des signes en code ASCII utilises afin de delimiter la matrice
for (j = 0; j< m; j++) //premiere colonne de signe
{
printf("%c", 205);
}
printf("%c", 187);
for (i = 0; i < n; i++)
{
printf("\n");
printf(" ");
printf("\t\t%c", 186);
for (j = 0; j < m; j++)
{
if (T[i][j] == 1){SetColor(1);}
if (T[i][j] == 2){SetColor(4);} // pour que chaque nature ait sa propre couleur
if (T[i][j] == 3){SetColor(6);} // on appelle la fonction des couleurs
if (T[i][j] == 4){SetColor(2);}
printf("%d", T[i][j]);
}
SetColor(15); //(le 15 la couleur du blanc) pour quil n'y ait que les chiffres en couleurs et non les signes
printf("%c", 186);
}
printf("\n");
printf(" ");
printf("\t\t%c", 200);
for (j = 0; j < m; j++) //derniere colonne de signes
{
printf("%c", 205);
}
printf("%c", 188);
}
//La fonction pour les couleurs
void SetColor(int ForgC)
{
WORD wColor;
HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO csbi;
if (GetConsoleScreenBufferInfo(hStdOut, &csbi))
{
wColor = (csbi.wAttributes & 0xF0) + (ForgC & 0x0F);
SetConsoleTextAttribute(hStdOut, wColor);
}
return;
}
//procedure qui nous rend la matrice initiale
void reintialiser(int T[][100], int n, int m)
{
int i,j;
for (int i = 0; i < n; i++) //on parcourt la matrice en permutant le 5 en 1; le 6 en 2, le 7 en 3, le 8 en 4
for (int j = 0; j < m; j++)
{
if (T[i][j] == 5){T[i][j] = 1;}
if (T[i][j] == 6){T[i][j] = 2;}
if (T[i][j] == 7){T[i][j] = 3;}
if (T[i][j] == 8){T[i][j] = 4;}
}
}
//Extraire l'objet
Pliste ExtraireObjet(int T[][100], int x, int y, int n, int m, int nature)
{
Pliste P,Q;
int A, B;
if(T[x][y]==nature)
{
if (nature == 1){T[x][y] = 5;}
if (nature == 2){T[x][y] = 6;}
if (nature == 3){T[x][y] = 7;}
if (nature == 4){T[x][y] = 8;}
k = k + 1;
if (y > 0) {ExtraireObjet(T, x, y - 1, n, m, nature);} // case gauche
if (x > 0) {ExtraireObjet(T, x - 1, y, n, m, nature);} // case du haut
if (x < n - 1){ExtraireObjet(T, x + 1, y, n, m, nature);} // case du bas
if (y < m - 1){ExtraireObjet(T, x, y + 1, n, m, nature);} // case droite
P = malloc(sizeof(Parcelle)); //on cree un maillon pour chaque parcelle en lui attribuant ses coordonnees et sa nature
P->x = x;
P->y = y;
P->nature = nature;
P->Suiv = Tete;
Tete = P;
k = k - 1;
}
//si toutes les parcelles ont ete chainees on peut alors commencer a les trier
if (k == 0)
{
triliste(&Tete); //Appel de la procedure tri pour trier la liste
}
return (Tete);
}
//procedure de tri de la liste
void triliste(Pliste *Tete)
{
Pliste Q, P; //on utilise deux variables pour pouvoir permuter les coordonnees
int A, B; //ainsi que deux pointeurs pour pouvoir comparer un maillon et celui qui le suit
P = *Tete;
while (P->Suiv != NULL)
{
Q = P->Suiv;
while (Q != NULL)
{
if (P->x >= Q->x)
{
A = P->x;
B = P->y; //si le x d'un maillon est plus grand que celui d'apres on permute les (x,y)
P->x = Q->x;
P->y = Q->y;
Q->x = A;
Q->y = B;
};
if (P->x == Q->x && P->y >= Q->y) //si les x sont pareils et que le y d'un maillon est plus grand que celui d'apres on permute les (x,y)
{
A = P->x;
B = P->y;
P->x = Q->x;
P->y = Q->y;
Q->x = A;
Q->y = B;
};
Q = Q->Suiv;
}
P = P->Suiv;
}
}
//Affichage de l'objet
void AfficheObjet(int T[][100], int x, int y, int n, int m, int nature)
{
int i,j;
Pliste P;
P = ExtraireObjet(T, x, y, n, m, nature); //on extrait l'objet de la parcelle choisie
printf("\n\n La carte : \n");
printf(" ");
printf("\t\t%c", 201); //correspond a des signes en code ASCII utilises afin de delimiter la matrice
for (j = 0; j< m; j++) //premiere colonne de signe
{
printf("%c", 205);
}
printf("%c", 187);
for (i = 0; i < n; i++)
{
printf("\n");
printf(" ");
printf("\t\t%c", 186);
for (j = 0; j < m; j++)
{
if(P!=NULL)
{
if (P->nature == 1){SetColor(1);}
if (P->nature== 2){SetColor(4);} // pour que chaque nature ait sa propre couleur
if (P->nature == 3){SetColor(6);} // on appelle la fonction des couleurs
if (P->nature == 4){SetColor(2);}
if (i == P->x && j== P->y)
{
printf("%c", 219);
P = P->Suiv;
}
else
{
SetColor(15);
printf(" ");
}
}
else
{
SetColor(15);
printf(" ");
}
}
SetColor(15); //(le 15 la couleur du blanc) pour quil n'y ait que les chiffres en couleurs et non les signes
printf("%c", 186);
}
printf("\n");
printf(" ");
printf("\t\t%c", 200);
for (i = 0; i < m; i++)
{
printf("%c", 205); //derniere colonne de signes
}
printf("%c", 188);
}
//Extraire le theme
void ExtraireTheme(int T[][100], int n, int m, int nature, File *F)
{
int i, j;
Initfile(&(*F));
Pliste P;
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
if (T[i][j] == nature)
{
P = ExtraireObjet(T, i, j, n, m, nature); //on parcourt la matrice en cherchant les parcelles de la nature choisie
Enfiler(&(*F), P); //on extrait leur objet et on enfile le pointeur de la tete de liste dans la file
}
}
}
}
//Afficher le theme
void AfficheTheme(File F)
{
int Th[n][m];
int i, j,x,y;
Pliste Tth;
for ( x = 0; x< n; x++)
{
for ( y = 0; y < m; y++)
{
Th[x][y] = 0;
}
}
while (!Filevide(F))
{
Defiler(&F, &Tth);
while (Tth != NULL)
{
Th[Tth->x][Tth->y] = Tth->nature;
Tth = Tth->Suiv;
}
}
printf("\n ");
printf("\t\t%c", 201);
for (i = 0; i < m; i++)
{
printf("%c", 205);
}
printf("%c", 187);
for (i = 0; i < n; i++)
{
printf("\n");
printf(" ");
printf("\t\t%c", 186);
for (j = 0; j < m; j++)
{
if (Th[i][j] == 0)
printf(" ");
else
{
if (Th[i][j] == 1)
{
SetColor(1);
}
if (Th[i][j] == 2)
{
SetColor(4);
}
if (Th[i][j] == 3)
{
SetColor(6);
}
if (Th[i][j] == 4)
{
SetColor(2);
}
printf("%c", 219);
}
}
SetColor(15);
printf("%c", 186);
}
printf("\n");
printf(" ");
printf("\t\t%c", 200);
for (i = 0; i < m; i++)
{
printf("%c", 205);
}
printf("%c", 188);
}
//procedure des statistiques
void stat(int T[][100], int n, int m)
{
int i, j, surface1, surface2, surface3, surface4;
surface1 = 0;
surface2 = 0; //chaque nature a son propre compteur
surface3 = 0;
surface4 = 0;
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
if (T[i][j] == 1)
{
surface1 = surface1 + 1;
}
if (T[i][j] == 2) //on parcourt la matrice en incrementant le compteur correspondant a chaque nature a chaque fois
{
surface2 = surface2 + 1;
}
if (T[i][j] == 3)
{
surface3 = surface3 + 1;
}
if (T[i][j] == 4)
{
surface4 = surface4 + 1;
}
}
}
printf("\n Sur la carte il y a :");
printf("\n\t\t\t %c",201);
for(int a=0;a<19;a++) printf("%c",205);
printf("%c",203);
for(int a=0;a<19;a++) printf("%c",205);
printf("%c",187);
printf("\n\t\t\t %c",186);
for(int a=0;a<7;a++) printf(" ");
SetColor(1);
if(surface1/10==0)
printf(" %d", surface1);
if(surface1/10<10 &&surface1/10!=0)
printf(" %d", surface1);
if(surface1/10>=10)
printf("%d", surface1);
SetColor(15);
for(int a=0;a<9;a++) printf(" ");
printf("%c",186);
for(int a=0;a<7;a++) printf(" ");
SetColor(4);
if(surface2/10==0)
printf(" %d", surface2);
if(surface2/10<10 &&surface2/10!=0)
printf(" %d", surface2);
if(surface2/10>=10)
printf("%d", surface2);
SetColor(15);
for(int a=0;a<9;a++) printf(" ");
printf("%c",186);
printf("\n\t\t\t %c",186);
//for(int a=0;a<19;a++) printf(" ");
SetColor(1);
printf(" zones agricoles ");
SetColor(15);
printf("%c",186);
//for(int a=0;a<19;a++) printf(" ");
SetColor(4);
printf("zones d'habitations");
SetColor(15);
printf("%c",186);
printf("\n\t\t\t %c",204);
for(int a=0;a<19;a++) printf("%c",205);
printf("%c",206);
for(int a=0;a<19;a++) printf("%c",205);
printf("%c",185);
printf("\n\t\t\t %c",186);
for(int a=0;a<7;a++) printf(" ");
SetColor(6);
if(surface3/10==0)
printf(" %d", surface3);
if(surface3/10<10 &&surface3/10!=0)
printf(" %d", surface3);
if(surface3/10>=10)
printf("%d", surface3);
SetColor(15);
for(int a=0;a<9;a++) printf(" ");
printf("%c",186);
for(int a=0;a<7;a++) printf(" ");
SetColor(2);
if(surface4/10==0)
printf(" %d", surface4);
if(surface4/10<10 &&surface4/10!=0)
printf(" %d", surface4);
if(surface4/10>=10)
printf("%d", surface4);
SetColor(15);
for(int a=0;a<9;a++) printf(" ");
printf("%c",186);
printf("\n\t\t\t %c",186);
SetColor(6);
printf(" forets ");
SetColor(15);
printf("%c",186);
SetColor(2);
printf("zones industrielles");
SetColor(15);
printf("%c",186);
printf("\n\t\t\t %c",200);
for(int a=0;a<19;a++) printf("%c",205);
printf("%c",202);
for(int a=0;a<19;a++) printf("%c",205);
printf("%c",188);
printf("\n -");
}
int main()
{
char rpns;
int x,y, nature;
Pliste P;
k=0;
printf("\n Veuillez entrer les dimensions de votre carte \n");
printf("\t\t La longueur: ");
scanf("%d", &n);
printf("\t\t La largeur: ");
scanf("%d", &m);
creercarte(T, n, m);
rpns=='O';
//Menu
do
{
affichecarte(T,n,m);
printf("\n Que voulez-vous faire? : \n");
printf("\n\t\t 1.Afficher un objet. ");
printf("\n\t\t 2.Afficher un theme. ");
printf("\n\t\t 3.Afficher les statistique de chaque type. ");
printf("\n\t\t 4.Pour quitter le programme. \n");
int d;
printf("\n Entrez un chiffre : ");
scanf("%d", &d);
switch(d)
{ case 1 :
Tete=NULL;
printf("\n Veuillez entrer les coordonnees : \n");
printf(" x :");
scanf("%d", &x);
while(x>=n)
{
printf(" Veuillez entrer une coordonnee valable. \n");
printf(" x :");
scanf("%d", &x);
}
printf(" y :");
scanf("%d", &y);
while(y>=m)
{
printf(" Veuillez entrer une coordonnee valable. \n");
printf(" y :");
scanf("%d", &y);
}
printf("\n Veuillez entrer la nature de la parcelle : ");
scanf("%d", &nature);
AfficheObjet(T, x, y, n, m, nature);
reintialiser(T, n, m);
break;
case 2:
printf("\n Veuillez entrer la nature du theme que vous voulez afficher : ");
int t;
scanf("%d", &t);
File F;
Tete = NULL;
ExtraireTheme(T, n, m, t, &F);
AfficheTheme(F);
Initfile(&F);
reintialiser(T, n, m);
break;
case 3 :
affichecarte(T,n,m);
stat(T,n, m);
break;
}
printf("\n\n Voulez vous essayer une autre option ? tapez 'O' pour Oui , ou 'N' pour Non\n");
fflush(stdin);
scanf("%c", &rpns);}while(rpns=='O');
if(rpns=='N')
printf("Merci et A tres bientot :) !");
return 0;
}
Editor is loading...