Untitled
user_9243973
plain_text
2 years ago
17 kB
5
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...