TP8 - Les tableaux de structures et les chaînes de caractères

Inès de Courchelle

Durée : 3h

Objectifs :

  • Utiliser les chaînes de caractères sans complexe
  • Référencer des données plus complexes
  • Manipuler des données multi-type
  • Chercher des solutions dans la doc
  • Lier des données
  • Trouver des astuces de traitement d’entrées utilisateurs plus rapides
  • Soulever les problèmes souvent rencontrés lorsqu’on manipule des chaînes de caractères

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

Exercice 1 - Les chaînes de caractères (Opérations de bases)

1. Créer le fichier exo1.c comme suit :

#include <stdio.h>
#include <stdlib.h>
int main(){
    return 0;
}

2. Vérifier que programme compile dans le terminal

gcc -Wall exo1.c -o exo1

3. Créer une variable de type char

char maChaine1[10];

4. Récupérer une entrée clavier dans la variable maChaine

printf("Entrer une chaîne de caractère : \n");
scanf("%s",maChaine1);

5. Afficher le contenu de la chaîne

printf("L'utilisateur a rentré la chaine suivante : %s \n",maChaine1);

6. Copier le contenu de cette variable dans la variable maChaine2, à l’aide de la commande strcpy

Pour comprendre le fonctionnement de strcpy, vous pouvez taper la commande ci-dessous :

man 3 strcpy

Exercice 2 - Le cat

L’objectif de cet exercice est de vous présentez une astuce afin de remplir plus facilement les entrées utilisateurs (C’est pas vraiment un exo mais un HelloWorld)

1. Télécharger les fichiers ci-dessous :

2. Compiler le programme main.c à l’aide de la commande ci-dessous :

gcc -Wall exo2.c -o exo2

3. Éxecuter le programme main.c à l’aide de la commande ci-dessous :

./exo2

4. Afficher le contenu du fichier cat.c dans votre éditeur préféré :

emacs exo2.c &

5. Afficher le conteu du fichier entrees.txt dans votre terminal à l’aide de la commande ci-dessous :

cat entrees.txt

6. Afficher puis exécuter exo2.c à l’aide de la commande ci-dessous :

cat entrees.txt | ./exo2

7. Que remarquez vous ?

Exercice 3 - Football

Nous désirons représenter un joueur de foot avec les données suivantes :
Chaque joueur de foot appartient à une équipe. Une équipe est représentée de la manière suivante :

Nous désirons réaliser le programme suivant :

0. Comment vont être représentées données dans notre programme ?

1. Créer les différents fichiers

2. Définir la structure joueur dans le fichier soccer.h

3. Définir la structure équipe dans le ficher soccer.h

4. Tester la compilation de l’ensemble de ces fichiers. L’utilisation d’un makefile est plutôt conseillée.

5. Coder les fonctions/procédures suivantes dans le fichier soccer.c, n’oublier pas d’ajouter les entêtes dans le fichier soccer.h.

Créer un joueur
/* Auteur : ... */
/* Date :   ... */
/* Résumé : ... */
/* Entrée(s) : ... */
/* Sortie(s) :  ...  */

void creationJoueur(Joueur* j);
Il faut allouer :
- Les chaînes de caractères pour le nom et le prénom du joueur
- Le joueur. C'est un joueur* donc il doit aussi être alloué


Afficher un joueur
/* Auteur : ... */
/* Date :   ... */
/* Résumé : ... */
/* Entrée(s) : ... */
/* Sortie(s) :  ...  */

void afficherJoueur(Joueur j);
Créer une équipe
/* Auteur : ... */
/* Date :   ... */
/* Résumé : ... */
/* Entrée(s) : ... */
/* Sortie(s) :  ...  */

void creationEquipe(Equipe* e, int nbJoueurs);
Il faut allouer :
- Les chaînes de caractères pour le nom de l'équipe
- L'équipe. C'est une equipe* donc elle doit aussi être allouée


Ajouter un joueur dans une équipe
/* Auteur : ... */
/* Date :   ... */
/* Résumé : ... */
/* Entrée(s) : ... */
/* Sortie(s) :  ...  */

void ajouterJoueur(Equipe* e,Joueur j);

Il faut : - vérifier si c’est la première fois qu’on ajoute un joueur à l’équipe - réallouer de l’espace pour le tableau de joueur dans l’équipe (realloc) car on rajoute un joueur.


Afficher une équipe
/* Auteur : ... */
/* Date :   ... */
/* Résumé : ... */
/* Entrée(s) : ... */
/* Sortie(s) :  ...  */

void afficherEquipe(Equipe e);
PROCEDURE afficherEquipe(e : equipe)
VARIABLES

DEBUT
    ECRIRE("NOM  : ", e.nom)
    ECRIRE("PAYS : ",e.pays)
    ECRIRE("CHAMPIONNAT : ",e.championnat)
    ECRIRE("CLASSEMENT",e.classement)
    ECRIRE("NOMBRE DE JOUEURS",e.nbJoueurs)

    POUR i allant de 0 à nbJoueurs FAIRE
        afficherJoueur(e.mesJoueurs[i])
    FIN POUR
FIN


Trouver le meilleur buteur d’une équipe
/* Auteur : ... */
/* Date :   ... */
/* Résumé : ... */
/* Entrée(s) : ... */
/* Sortie(s) :  ...  */

Joueur meilleurButeur(Equipe e);


Savoir quelle équipe à un meilleur classement
/* Auteur : ... */
/* Date :   ... */
/* Résumé : ... */
/* Entrée(s) : ... */
/* Sortie(s) :  ...  */

int compareEquipe(Equipe e1,Equipe e2);


6. Reproduire, le même exemple que la vidéo

Pour pouvoir réaliser le même scénario que dans la vidéo, vous pouvez utiliser ce mesJoueurs.txt


Exercice 4 - Rock

Nous considérons les données suivantes :

Réaliser le programme permettant de représenter ces données.

attention n’oubliez pas d’utiliser la compilation séparées