Untitled
user_9243973
plain_text
2 years ago
10 kB
3
Indexable
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <windows.h> #include <dos.h> #include <dir.h> //déclaration de la Pile typedef int Telm; typedef struct EPile* Pile; typedef struct EPile { Telm Val; Pile Suiv} CelluleP; typedef struct Liste*Pliste; typedef struct Liste{int x;int y;int nature;Pliste Suiv;}Cellule; int n,m,k1,k2; int T[100][100]; Pliste Tete; //déclaration de la File typedef struct Element* EFile; typedef struct Element { Pliste T; EFile Suiv} CelluleF; typedef struct {EFile Tete,Queue;} File; //primitives des Piles //procedure Initpile void Initpile(Pile *P) {(*P)=NULL;} //procedure Empiler void Empiler(Pile *P, Telm x) {Pile V; V=malloc(sizeof(CelluleP)); V->Val=x; V->Suiv=*P; *P=V; } //procedure Depiler void Depiler(Pile *P, Telm *x) {Pile V; *x=(*P)->Val; V=*P; *P=(*P)->Suiv; free(V); } //Fonction Pilevide int Pilevide(Pile P) {if (P==NULL) return 1; else return 0; } //Fonction SommetPile Telm SommetPile(Pile P) {return P->Val;} ////primitives des Files //procedure Initfile void Initfile(File *F) {(*F).Tete=NULL; (*F).Queue=NULL;} //procedure Enfiler void Enfiler(File *F, Pliste x) {EFile V; V=malloc(sizeof(CelluleF)); V->T=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, Pliste *x) {EFile V; V=(*F).Tete; *x=V->T; //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; } //Fonction Tetefile Pliste Tetefile(File F) {return F.Tete->T;} //Creation void creercarte(int T[][100],int n,int m) { int i,j,r; srand(time(NULL)); 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 x,y; printf("\n "); printf("%c",201); for (x=0;x<n;x++) //pour delimiter la carte : la premiere ligne de_ { printf("%c",205); } printf("%c",187); for(x=0;x<n;x++) { printf("\n"); printf(" "); printf("%c",186); for (y=0;y<m;y++) { if(T[x][y]==1){SetColor(1);} if(T[x][y]==2){SetColor(4);} //pour que chaque nature ait sa propre couleur if(T[x][y]==3){SetColor(6);} //on appelle la fonction des couleurs if(T[x][y]==4){SetColor(2);} printf("%d",T[x][y]); } SetColor(15); //(le 15 la couleur du blanc) pour quil n'y ait que les chiffres en couleurs et non les | printf("%c",186); } printf("\n"); printf(" "); printf("%c",200); for (x=0;x<n;x++) // la derniere ligne de _ { 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; //We use csbi for the wAttributes word. if(GetConsoleScreenBufferInfo(hStdOut, &csbi)) { //Mask out all but the background attribute, and add in the forgournd color wColor = (csbi.wAttributes & 0xF0) + (ForgC & 0x0F); SetConsoleTextAttribute(hStdOut, wColor); } return; } void afficheliste(Pliste Tete) { Pliste P; P=Tete; while(P!=NULL) { printf("(%d %d)",P->x,P->y);P=P->Suiv; } } void renitialiser(int T[][100],int n ,int m) { for (int x=0;x<n;x++) for (int y=0;y<m;y++) { if (T[x][y]==5){T[x][y]=1;} if (T[x][y]==6){T[x][y]=2;} if (T[x][y]==7){T[x][y]=3;} if (T[x][y]==8){T[x][y]=4;} } } void triliste(Pliste *Tete) { Pliste Q,P; int A,B; P=*Tete; while(P->Suiv!=NULL) { Q=P->Suiv; while(Q!=NULL) { if (P->x >= Q->x) { A=P->x; B=P->y; P->x=Q->x; P->y=Q->y; Q->x=A; Q->y=B; }; if (P->x == Q->x && P->y >= Q->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; } } 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;} k1=k1+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 haut if (x<n-1){ExtraireObjet(T,x+1,y,n,m,nature);}//bas if (y<m-1){ExtraireObjet(T,x,y+1,n,m,nature);}//droite P=malloc(sizeof(Cellule)); P->x=x; P->y=y; P->nature = nature; P->Suiv=Tete; Tete=P; k2=k2+1;k1=k1-1; } if(k1==0 && k2>0){triliste(&Tete);} return (Tete); } void AfficheObjet(int T[][100],int a,int b,int n,int m,int nature) { Pliste P; P= ExtraireObjet(T,a,b,n,m,nature); int x,y; printf(" "); printf("%c",201); for (x=0;x<n;x++) //pour delimiter la carte : la premiere ligne de_ { printf("%c",205); } printf("%c",187); for(x=0;x<n;x++) { printf("\n"); printf(" "); printf("%c",186); for(int y=0;y<m;y++) { 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(x==P->x && y==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 | printf("%c",186); } printf("\n"); printf(" "); printf("%c",200); for (x=0;x<n;x++) // la derniere ligne de _ { printf("%c",205); } printf("%c",188); } void ExtraireTheme(int T[][100], int n , int m, int nature, File *F) { int x,y; Initfile(&(*F)); Pliste P; for (x=0;x<n;x++) for (y=0;y<m;y++) { if (T[x][y]==nature) { P=ExtraireObjet(T,x,y,n,m,nature); printf("\n done \n"); Enfiler(&(*F),P); } } } void AfficheTheme(File F) { int Th[n][m]; for (int x=0;x<n;x++) for(int y=0;y<m;y++) Th[x][y]=0; while(!Filevide(F)) { Pliste Tth; Defiler(&F,&Tth); while(Tth!=NULL) { Th[Tth->x][Tth->y]=Tth->nature; Tth=Tth->Suiv; } } int x,y; printf("\n "); printf("%c",201); for (x=0;x<n;x++) //pour delimiter la carte : la premiere ligne de_ { printf("%c",205); } printf("%c",187); for(x=0;x<n;x++) { printf("\n"); printf(" "); printf("%c",186); for (y=0;y<m;y++) { if(Th[x][y]==0) printf(" "); else { if(Th[x][y]==1){SetColor(1);} if(Th[x][y]==2){SetColor(4);} //pour que chaque nature ait sa propre couleur if(Th[x][y]==3){SetColor(6);} //on appelle la fonction des couleurs if(Th[x][y]==4){SetColor(2);} printf("%c",219); } } SetColor(15); //(le 15 la couleur du blanc) pour quil n'y ait que les chiffres en couleurs et non les | printf("%c",186); } printf("\n"); printf(" "); printf("%c",200); for (x=0;x<n;x++) // la derniere ligne de _ { printf("%c",205); } printf("%c",188); } int main() { int i,j,nature; Pliste P; k1=0;k2=0; printf("\n Veuillez entrer les dimensions de votre carte \n"); printf(" La longueur: "); scanf("%d",&n); printf(" La largeur: "); scanf("%d",&m); printf("\n\n La carte : \n"); creercarte(T,n,m); affichecarte(T); printf("\n Que voulez-vous faire? : ") printf("\n 1.Extraire un objet: "); printf("\n 2.Extraire un theme: "); printf("\n 3.Afficher la statistique d'un type de parcelle: "); printf("\n Autre pour quitter le programme "); int c; scanf("%d",&c); while(c!=1 && c!=2 ) if(c==1) { printf("\n entrez les coordonnees i et j: "); scanf("%d",&i); scanf("%d",&j); printf("entrez la nature de la parcelle: "); scanf("%d",&nature); AfficheObjet(T,i,j,n,m,nature); renitialiser(T,n,m); } if(c==2) { affichecarte(T); ExtraireTheme(T,n,m,nature,&F); AfficheTheme(F); } if(c==3){} Tete=NULL; return 0; }
Editor is loading...