Cliquer ici pour imprimer

Dernière modification : 04/05/2020 à 14:55

Tableaux, Tableaux à deux dimensions, et affichage d'une grille

Rappels tableaux (Exercice 3, TP3 de 3R-IN1A)

Écrivez les fonctions suivantes, n'oubliez pas d'écrire une fonction main() permettant de les tester. Les arguments devant être fournis aux fonctions par le main() seront soit demandé à l'utilisateur avec un scanf, soit rentré sur la ligne de commande.

Découverte d'un nouvelle dimension

Vous pouvez utilement (re)lire ce document jusqu'au slide 9.

Il est donc possible en C de déclarer facilement des matrices à deux dimensions, allouées sur la pile.

Par exemple :

int matrice[5][10];

Alloue une matrice de 5 lignes et de 10 colonnes, chaque élément étant un entier. Pour utiliser la case 3 de la ligne 4 (les cases et les lignes sont numérotées à partir de 0), il faudra alors écrire :

matrice[4][3] = ...;

Attention, en mémoire, il n'y a aucune différence entre

int matrice[5][10];

et

int matrice[50];

Aussi, si vous voulez passer le tableau à une fonction, il faudra préciser au moins la dernière dimension (le nombre de colonne) pour que le compilateur puisse comprendre que matrice[i][j] équivaut à matrice[i*NB_COLONNE+j].

Pour notre exemple de matrice à 5 lignes, 10 colonnes, cela donne :

void fonction(int matrice[][10], int nb_ligne, int nb_col){...};

ou

void fonction(int matrice[5][10], int nb_ligne, int nb_col){...};

mais pas

void fonction(int matrice[][], int nb_ligne, int nb_col){...};

L'appel de fonction se fait comme pour un tableau normal :

fonction(matrice,5,10);

Pour chacune des fonctions suivantes, vous devez aussi faire le main() qui va avec !

Programme 1

#include <stdio.h>

#define NBL 1000
#define NBC 2000

int main()
{
    int matrice[NBL][NBC];
    int i,j,sum;
    for(i=0;i<NBL;i++)
        for(j=0;j<NBC;j++)
            sum+=matrice[i][j];
    return sum;     
}

Programme 2

#include <stdio.h>

#define NBL 1000
#define NBC 2000

int main()
{
    int matrice[NBL][NBC];
    int i,j,sum;
    for(j=0;j<NBC;j++)
        for(i=0;i<NBL;i++)
            sum+=matrice[i][j];
    return sum;     
}

Application au mini projet

On veut représenter en mémoire une grille constituée de cases soit blanches (vide), soit noires (mur), soit rouge (fruit). Cette grille sera représentée par une matrice de char, la valeur 'w' sera utilisée pour les cases blanches, et la valeur 'b' pour les cases noires et la valeur 'r' pour les cases rouges.

int main()
{
    char grid[8][7] = {
        "bwrwbw",
        "wrwbwr",
        "bwrwbw",
        "wrwbwr",
        "bwrwbw",
        "wrwbwr",
        "bwrwbw",
        "wrwbwr"
    };
    debug(grid,8,7);
    return 0;
}
int main()
{

    char grid[NBL][NBC+1] = {
        "w                                  w",
        "                                    ",
        "               f                    ",
        "                                    ",
        "     f               f              ",
        "                                    ",
        "                                    ",
        "               f                    ",
        "                                    ",
        "                                    ",
        "         wwwwwwwwww                 ",
        "                                    ",
        "                                    ",
        "                                    ",
        "                                    ",
        "                                    ",
        "                  f                 ",
        "                                    ",
        "         f                f         ",
        "                                    ",
        "                 f                  ",
        "w                                  w"
    };

    MLV_Keyboard_button touche = MLV_KEYBOARD_NONE;
    int width = 640, height = 480;


    /* Ouverture de la fenêtre graphique */
    MLV_create_window( "SNAKE", "3R-IN1B", width, height );
    MLV_change_frame_rate( 24 );

    while(
        MLV_get_event (
            &touche, NULL, NULL,
            NULL, NULL,
            NULL, NULL, NULL,
            NULL
        ) == MLV_NONE ||
        touche != MLV_KEYBOARD_ESCAPE
    ){


        MLV_clear_window( MLV_COLOR_BROWN );



        draw_grid(grid);


        MLV_actualise_window();


        touche = MLV_KEYBOARD_NONE;
        MLV_delay_according_to_frame_rate();
    }


    MLV_free_window();
    return 0;


}

Rendu

Dans un répertoire nommé login_tp2 copiez vos .c, makefile et .h. Vous pouvez y ajouter un fichier texte README si vous avez des choses à expliquer à joindre à votre rendu. Depuis le répertoire parent, tapez la commande tar czf login_tp2.tgz login_tp2. Déposez sur blackboard le fichier obtenu.