TP2 - Les tableaux dynamiques

Les tableaux dynamiques

Durée : 1h30

Objectifs :

  • Comprendre la différence entre un tableau dynamique et statique
  • Utiliser les tableaux dynamiques
  • Manipuler des chaînes de caractères avec des pointeurs

Attention :

À chaque étape de programmation, vous devez vérifier si le programme :

  • Compile sans warning
  • Obtient les résultats attendus
  • Avant de coder, il faut écrire un algo avec un papier et un stylo !

    logo

Exo 1 : Le carré magique

Un carré magique d’ordre n est un tableau n*n tel que la somme des entiers de chaque ligne, chaque colonne et des deux diagonales est identique. Par exemple :

8 1 6
3 5 7
4 9 2


0. Créer le fichier carreM.c dans un dossier TP2

#include <stdio.h>
#include <stdlib.h>
int main(){
    return 0;
}
gcc -Wall carreM.c -o carre
./carre

1. Réaliser la fonction pour allouer de manière dynamique un tableau dynamique n*n.

/* Auteur : ... */
/* Date :  ... */
/* Résumé :  ... */
/* Entrée(s) :  ... */
/* Sortie(s) :  ... */
int** allouerTableau(int nb_lignes,int nb_colonnes);

attention : avant de passer à la question 2, il faut vérifier que cela fonctionne !

2. Réaliser la procédure permettant à l’utilisateur d’initialiser son tableau dynamique.

/* Auteur : ... */
/* Date :  ... */
/* Résumé :  ... */
/* Entrée(s) :  ... */
/* Sortie(s) :  ... */
void initTableau(int** tableau,int nb_lignes,int nb_colonnes);

attention : avant de passer à la question suivante, il faut vérifier que cela fonctionne !

3. Réaliser la procédure permettant d’afficher un tableau dynamique.

/* Auteur : ... */
/* Date :  ... */
/* Résumé :  ... */
/* Entrée(s) :  ... */
/* Sortie(s) :  ... */
void afficherTableau(int** tableau, int nb_lignes, int nb_colonnes);

attention : avant de passer à la question suivante, il faut vérifier que cela fonctionne !

4. Écrire une fonction qui fait la somme d’une ligne donnée

/* Auteur : ... */
/* Date :  ... */
/* Résumé :  ... */
/* Entrée(s) :  ... */
/* Sortie(s) :  ... */
int cptLigne(int** carre,int ligne,int nb_colonnes);

attention : avant de passer à la question suivante, il faut vérifier que cela fonctionne !

Besoins

  • une boucle pour parcours les colonnes
  • une variable pour stocker la somme


5. Écrire une fonction qui fait la somme d’une colonne donnée

/* Auteur : ... */
/* Date :  ... */
/* Résumé :  ... */
/* Entrée(s) :  ... */
/* Sortie(s) :  ... */
int cptColonne(int** carre,int colonne,int nb_lignes);

attention : avant de passer à la question suivante, il faut vérifier que cela fonctionne !

Besoins

  • une boucle pour parcours les lignes
  • une variable pour stocker la somme


6. Écrire une fonction qui fait la somme de la diagonale (droite-gauche)

/* Auteur : ... */
/* Date :  ... */
/* Résumé :  ... */
/* Entrée(s) :  ... */
/* Sortie(s) :  ... */
int cptDiag1(int** carre,int nb_lignes,int nb_colonnes);

attention : avant de passer à la question suivante, il faut vérifier que cela fonctionne !


7. Écrire une fonction qui fait la somme de la diagonale (gauche-droite)

/* Auteur : ... */
/* Date :  ... */
/* Résumé :  ... */
/* Entrée(s) :  ... */
/* Sortie(s) :  ... */
int cptDiag2(int** carre,int nb_lignes,int nb_colonnes);

attention : avant de passer à la question suivante, il faut vérifier que cela fonctionne !


8. Écrire un prédicat permettant de savoir si un carré est magique

/* Auteur : ... */
/* Date :  ... */
/* Résumé :  ... */
/* Entrée(s) :  ... */
/* Sortie(s) :  ... */
int estMagique(int** carre,int nb_lignes,int nb_colonnes);

Questions que l’on peut se poser :

  • Est ce les boucles “pour” sont pertinantes ?
  • Par quoi je peux remplacer ces boucles “pour” ?
  • Faut-il que je compte la somme de la ligne 2 alors que la somme de la ligne 0 et 1 ne sont pas égales ?


Exo 2 : Le morpion

1. Réaliser la fonction pour allouer de manière dynamique un tableau dynamique d’entier 3*3.

/* Auteur : ... */
/* Date :  ... */
/* Résumé :  ... */
/* Entrée(s) :  ... */
/* Sortie(s) :  ... */
int** allouerTableau(int nb_lignes,int nb_colonnes);

attention : avant de passer à la question suivante, il faut vérifier que cela fonctionne !

2. Réaliser la méthode permettant d’initialiser le tableau dynamique (par défaut, toutes le cases sont à 0).

/* Auteur : ... */
/* Date :  ... */
/* Résumé :  ... */
/* Entrée(s) :  ... */
/* Sortie(s) :  ... */
void initTableau(int** maGrille,int nb_lignes,int nb_colonnes);

attention : avant de passer à la question suivante, il faut vérifier que cela fonctionne !

3. Créer la méthode permettant d’afficher le tableau.

/* Auteur : ... */
/* Date :  ... */
/* Résumé :  ... */
/* Entrée(s) :  ... */
/* Sortie(s) :  ... */
void afficherGrille(int** maGrille);

attention : avant de passer à la question suivante, il faut vérifier que cela fonctionne !

  • s’il y a un 1 alors on affiche une x
  • s’il y a un 2 alors on affiche une o
  • s’il y a un 0 alors on affiche un espace

4. Ecrire une méthode qui permet à un joueur de placer.

/* Auteur : ... */
/* Date :  ... */
/* Résumé :  ... */
/* Entrée(s) :  ... */
/* Sortie(s) :  ... */
void joue(int** maGrille, int numeroJoueur,int i,int j);

attention : avant de passer à la question suivante, il faut vérifier que cela fonctionne !

5. Ecrire la méthode permettant à un joueur de saisir les coordonnées de son pion.

/* Auteur : ... */
/* Date :  ... */
/* Résumé :  ... */
/* Entrée(s) :  ... */
/* Sortie(s) :  ... */
void tour2jeu(int** maGrille,int joueur);

attention : avant de passer à la question suivante, il faut vérifier que cela fonctionne !

Tant que le joueur n’a pas saisi des coordonnées correctes, il doit le programme doit continuer à lui demander de les saisir. Une coordonnée est correcte :

  • si elle est compris entre l’interval 3 x 3
  • s’il n’y a pas déjà un pion à l’interieur

6. Écrire un prédicat permettant de tester si un joueur à gagner.

/* Auteur : ... */
/* Date :  ... */
/* Résumé :  ... */
/* Entrée(s) :  ... */
/* Sortie(s) :  ... */
int gagne (int** maGrille, int joueur);

attention : avant de passer à la question suivante, il faut vérifier que cela fonctionne !


Pour gagner une partie de morpion il y a plusieurs cas !

cas N ° 1
2 2
2
1 1 1
cas N ° 2
1 2
1 2
1 2
cas N ° 3
1 2
1
2 2 1
cas N ° 4
2 1
1 2
1 2