Allocation Dynamique de Mémoire
Allocation Dynamique de Mémoire
Allocation Dynamique de Mémoire
Exercice 1 :
Ecrire un programme qui lit 10 phrases d'une longueur maximale de 200 caractères au clavier et qui les
mémorise dans un tableau de pointeurs sur char en réservant dynamiquement l'emplacement en mémoire pour
les chaînes. Ensuite, l'ordre des phrases est inversé en modifiant les pointeurs et le tableau résultant est affiché.
Exercice 2
Ecrire un programme qui lit 10 mots au clavier (longueur maximale: 50 caractères) et attribue leurs adresses à un
tableau de pointeurs MOT. Effacer les 10 mots un à un, en suivant l'ordre lexicographique et en libérant leur
espace en mémoire. Afficher à chaque fois les mots restants en attendant la confirmation de l'utilisateur (par
'Enter').
Exercice 3
Ecrire un programme qui lit 10 mots au clavier (longueur maximale: 50 caractères) et attribue leurs adresses à un
tableau de pointeurs MOT. Copier les mots selon l'ordre lexicographique en une seule 'phrase' dont l'adresse est
affectée à un pointeur PHRASE. Réserver l'espace nécessaire à la PHRASE avant de copier les mots. Libérer la
mémoire occupée par chaque mot après l'avoir copié. Utiliser les fonctions de <string>
Exercice 4
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
anglais. Utiliser deux tableaux de pointeurs, MFRAN et MANG 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:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
main()
{
/* Déclarations */
char INTRO[51];/* chaîne pour l'introduction des données */
char *MOT[10]; /* Tableau de pointeurs sur les 10 chaînes */
int MAX; /* indice du prochain candidat à supprimer */
int I,J; /* indices courants */
/* Saisie des données et allocation dynamique de mémoire */
puts("Introduire 10 phrases terminées chaque fois"
" par un retour à la ligne :");
for (I=0; I<10; I++)
{
/* Lecture d'une phrase */
printf("Phrase %d : ",I);
gets(INTRO);
/* Réservation de la mémoire */
MOT[I] = malloc(strlen(INTRO)+1);
/* S'il y a assez de mémoire, ... */
if (MOT[I])
/* copier la phrase à l'adresse */
/* fournie par malloc, */
strcpy(MOT[I], INTRO);
else
{
/* sinon afficher un message d'erreur */
printf("\aPas assez de mémoire \n");
/* et quitter le programme. */
exit(-1);
}
}
/* Suppression des mots du tableau par ordre lexicographique */
for (I=0; I<10; I++)
{
/* Recherche de la dernière chaîne dans l'ordre */
/* lexicographique : Initialiser d'abord MAX avec */
/* l'indice d'une chaîne encore existante. */
/* Les conditions de la forme MOT[I] ou !MOT[I] */
/* contrôlent si la chaîne I a déjà été supprimée */
/* ou non. */
for (MAX=0 ; !MOT[MAX] ; MAX++)
;
for (J=MAX; J<10; J++)
if (MOT[J] && strcmp(MOT[MAX], MOT[J])>0)
MAX=J;
/* Suppression de la chaîne */
free(MOT[MAX]);
MOT[MAX]=0;
/* Affichage des mots restants */
printf("Passage No.%d :\n", I);
for (J=0; J<10; J++)
if (MOT[J]) puts(MOT[J]);
printf("Poussez Enter pour continuer ...\n");
getchar();
}
return 0;
}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
main()
{
/* Déclarations */
char INTRO[51];/* chaîne pour l'introduction des données */
char *MOT[10]; /* Tableau de pointeurs sur les 10 chaînes */
char *PHRASE; /* Pointeur cible */
int MAX; /* indice du prochain candidat à copier */
int I,J; /* indices courants */
int L; /* Longueur de la phrase */
/* Saisie des données et allocation dynamique de mémoire */
puts("Introduire 10 phrases terminées chaque fois"
" par un retour à la ligne :");
for (I=0; I<10; I++)
{
/* Lecture d'une phrase */
printf("Phrase %d : ",I);
gets(INTRO);
/* Réservation de la mémoire */
MOT[I] = malloc(strlen(INTRO)+1);
if (MOT[I])
strcpy(MOT[I], INTRO);
else
{
printf("\aPas assez de mémoire \n");
exit(-1);
}
}
/* Calcul de la longueur totale de la 'phrase' */
L=11; /* pour les espaces et le symbole de fin de chaîne */
for (I=0; I<10; I++)
L += (strlen(MOT[I])+1);
/* Réservation de la mémoire pour la 'phrase' */
PHRASE = malloc(L);
if (!PHRASE)
{
printf("\aPas assez de mémoire pour"
" mémoriser la phrase.\n");
exit(-1);
}
/* Initialisation de la PHRASE */
PHRASE[0]='\0';
/* Copier et supprimer les mots du tableau par */
/* ordre lexicographique */
for (I=0; I<10; I++)
{
/* Recherche de la dernière chaîne dans l'ordre */
/* lexicographique : Initialiser d'abord MAX avec */
/* l'indice d'une chaîne encore existante. */
for (MAX=0 ; !MOT[MAX] ; MAX++) ;
for (J=MAX; J<10; J++)
if (MOT[J] && strcmp(MOT[MAX], MOT[J])>0)
MAX=J;
/* Copier la chaîne dans la PHRASE */
strcat(PHRASE,MOT[MAX]);
strcat(PHRASE," ");
/* Suppression de la chaîne */
free(MOT[MAX]);
MOT[MAX]=0;
}
/* Affichage de la PHRASE */
puts("Résultat :");
puts(PHRASE);
return 0;
}
#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;
}