Untitled

 avatar
user_9243973
plain_text
2 years ago
14 kB
4
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>
#include "LibPileFileInt.c"


// Déclaration
typedef struct Objet *Pliste;
typedef struct Objet
{
    int x;
    int y;
    int nature;
    Pliste Suiv;
} Parcelle;

    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("%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("%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("%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 Tete,P,Q;
    int k,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("%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("%c", 186);

        for (j = 0; j < m; j++)
        {
         if(P!=NULL)
         {
            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);}

            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("%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(int T[][100],int n,int m,File F)
{
    int i, j;
    int Th[n][m];
    Pliste Tth;

    for ( i = 0; i< n; i++)
      {                                        //on cree une matrice nulle Th de taille n x m
        for ( j = 0; j < m; j++)
        {
            Th[i][j] = 0;
        }
     }

    while (!Filevide(F))                         //on vide la file element par element en parcourant chaque liste et en remplacant les 0 de la matrice nulle par les natures de ses parcelles
    {                                            //ayant les coordonnees correspondantes
        Defiler(&F, &Tth);
        while (Tth != NULL)
        {
            Th[Tth->x][Tth->y] = Tth->nature;
            Tth = Tth->Suiv;
        }
    }

    printf("\n\n  La carte : \n");
    printf("  ");
    printf("%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");                                  //on parcourt la matrice Th et on l'affiche
        printf("  ");
        printf("%c", 186);

        for (j = 0; j < m; j++)
        {
            if (Th[i][j] == 1){SetColor(1);}
            if (Th[i][j] == 2){SetColor(4);}              // pour que chaque nature ait sa propre couleur
            if (Th[i][j] == 3){SetColor(6);}              // on appelle la fonction des couleurs
            if (Th[i][j] == 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 signes
        printf("%c", 186);
    }
    printf("\n");
    printf("  ");

    printf("%c", 200);

    for (i = 0; i < m; i++)             // la derniere colonne de signes
    {
        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;
    surface3 = 0;                 //chaque nature a son propre compteur
    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){surface2 = surface2 + 1;}
            if (T[i][j] == 3){surface3 = surface3 + 1;}      //on parcourt la matrice en incrementant le compteur correspondant a chaque nature a chaque fois
            if (T[i][j] == 4){surface4 = surface4 + 1;}
        }
    }

    printf("\n Sur la carte il y a :");
    printf("\n  -");
    printf("%d", surface1);
    printf(" zones agricoles.");
    printf("\n  -");
    printf("%d", surface2);
    printf(" zones d'habitations.");
    printf("\n  -");
    printf("%d", surface3);
    printf(" forets.");
    printf("\n  -");
    printf("%d", surface4);
    printf(" zones industrielles.");
}


int main()
{

    int n, m, k;
    int T[100][100];
    int x, y, nature;
    Pliste P;
    Pliste Tete;
    k=0;

    printf("\n  Veuillez entrer les dimensions de votre carte \n");
    printf("    La longueur: ");
    scanf("%d", &n);
    printf("    La largeur: ");
    scanf("%d", &m);
    creercarte(T, n, m);
    //Menu
    for (int e = 0; e < 100; e++)
    {
        affichecarte(T,n,m);
        printf("\n  Que voulez-vous faire? : \n");
        printf("\n      1.Afficher un objet. ");
        printf("\n      2.Afficher un theme. ");
        printf("\n      3.Afficher les statistique de chaque type. ");
        printf("\n      4.Pour quitter le programme. \n");
        int d;
        printf("\n  Entrez un chiffre : ");
        scanf("%d", &d);
        if (d == 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);
            printf("\n  Appuyez sur n'importe quelle touche pour continuer.");
            char cc;
            scanf("%s", &cc);
            printf("\n");
        }
        if (d == 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(T,n,m,F);
            Initfile(&F);
            reintialiser(T, n, m);
            printf("\n  Appuyez sur n'importe quelle touche pour continuer.");
            char cc;
            scanf("%s", &cc);
            printf("\n");
        }

        if (d== 3)
        {
            affichecarte(T,n,m);
            Stat(T, n, m);
            printf("\n  Appuyez sur n'importe quelle touche pour continuer.");
            char cc;
            scanf("%s", &cc);
            printf("\n");
        }
        if (d == 4)
        {
            printf("  Merci !");
            return 0;
        }
    }
}
Editor is loading...