TP2 - Les tableaux dynamiques

Les tableaux dynamiques

Inès de Courchelle - Peio Loubiere

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 frigo

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

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

1. Écrire une structure ingredient définie par son nom et sa quantité

2. Écrire une procedure d’affichage d’un ingrédient

3. Écrire une procédure qui affiche un tableau dynamique (frigo) d’ingrédients

4. Écrire une fonction qui ajoute un nouvel ingredient dans un frigo

5. Écrire une fonction qui modifie la quantité d’un ingrédient du frigo

6. Écrire une fonciton qui récupère dans un tableau l’ensemble des ingrédients dont la quantité = 0

Exo 2 : 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 3 : 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