Exercices langage C tableaux de pointeurs

Exercices langage C tableaux de pointeurs


Exercice 1


Considérez les déclarations de NOM1 et NOM2:

 

char *NOM1[] =    {"Marc",  "Jean-Marie",  "Paul",
"François-Xavier", "Claude" };

char NOM2[][16] = {"Marc", "Jean-Marie", "Paul",
"François-Xavier", "Claude" };

a) Représenter graphiquement la mémorisation des deux variables NOM1 et NOM2.

 

b) Imaginez que vous devez écrire un programme pour chacun des deux tableaux qui trie les chaînes selon l'ordre lexicographique. En supposant que vous utilisez le même algorithme de tri pour les deux programmes, lequel des deux programmes sera probablement le plus rapide?


Exercice 2


Ecrire un programme qui lit le jour, le mois et l'année d'une date au clavier et qui affiche la date en français et en allemand. Utiliser deux tableaux de pointeurs, MFRAN et MDEUT que vous initialisez avec les noms des mois dans les deux langues. La première composante de chaque tableau contiendra un message d'erreur qui sera affiché lors de l'introduction d'une donnée illégale.

Exemples:

   Introduisez la date: 1 4 1993
Luxembourg, le 1er avril 1993
Luxemburg, den 1. April 1993

Introduisez la date: 2 4 1993
Luxembourg, le 2 avril 1993
Luxemburg, den 2. April 1993

a) Représenter graphiquement la mémorisation des deux variables NOM1 et NOM2.

solex01 

b) Pour trier les chaînes du tableau de pointeurs, il faut uniquement changer les pointeurs. La durée d'une opération d'échange est constante, peu importe la longueur des chaînes.

Pour trier le tableau de chaînes de caractères, il faut changer tous les caractères des chaînes un à un. La durée d'une opération d'échange est dépendante de la longueur des chaînes de caractères.

Pour des chaînes de caractères d'une longueur 'normale', le tri d'un tableau de pointeurs est donc certainement plus rapide que le tri d'un tableau de chaînes de caractères.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <stdio.h>
main()
{
 /* Tableaux de pointeurs sur des chaînes de caractères */
  char *MFRAN[] = {"\aErreur d'entrée !", "janvier", "février",
                  "mars", "avril", "mai", "juin", "juillet", 
                  "août", "septembre", "octobre", "novembre", 
                  "décembre"}; 
 char *MDEUT[] = {"\aEingabefehler !", "Januar", "Februar",
                  "März", "April", "Mai", "Juni", "Juli",
                  "August", "September", "Oktober", "November", 
                  "Dezember"};
 int JOUR, MOIS, ANNEE; /* données pour la date */
 int CORRECT; /* indicateur logique: */
              /* vrai si la date entrée est correcte */
 /* Saisie des données */
 do
 {
  printf("Introduire le jour, le mois et l'année : ");
  scanf("%d %d %d", &JOUR, &MOIS, &ANNEE);
  CORRECT=1;
  if (JOUR<0||JOUR>31||MOIS<0||MOIS>12||ANNEE<0||ANNEE>3000)
     {
      CORRECT=0;
      puts(MFRAN[0]);
      puts(MDEUT[0]);
     }       
 } 
 while (!CORRECT);
 /* Affichage des dates */
 printf("Luxembourg, le %d%s %s %d \n",
 JOUR, (JOUR==1)?"er":"", MFRAN[MOIS], ANNEE); 
 printf("Luxemburg, den %d. %s %d \n",JOUR, MDEUT[MOIS], ANNEE);
  return 0;
}