Untitled

 avatar
user_9243973
plain_text
2 years ago
17 kB
2
Indexable
Never
#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;
}