Allocation dynamique de mémoire Exercice 1 : Ecrire un programme qui lit 10 phr
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: Introduisez la date: 1 4 1993 Luxembourg, le 1er avril 1993 Luxemburg, the 1. April 1993 Introduisez la date: 2 4 1993 Luxembourg, le 2 avril 1993 Luxemburg, the 2. April 1993 Correction : #include <stdio.h> #include <string.h> #include <stdlib.h> main() { /* Déclarations */ char INTRO[500]; /* chaîne pour l'introduction des données */ char *TEXTE[10]; /* Tableau des pointeurs sur les 10 chaînes */ char *PAIDE; /* pointeur d'aide pour l'échange des pointeurs */ 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 */ TEXTE[I] = malloc(strlen(INTRO)+1); /* S'il y a assez de mémoire, ... */ if (TEXTE[I]) /* copier la phrase à l'adresse */ /* fournie par malloc, */ strcpy(TEXTE[I], INTRO); else { /* sinon afficher un message d'erreur */ printf("\aPas assez de mémoire \n"); /* et quitter le programme. */ exit(-1); } } /* Afficher le tableau donné */ puts("Contenu du tableau donné :"); for (I=0; I<10; I++) puts(TEXTE[I]); /* Inverser l'ordre des phrases avec le pointeur PAIDE */ for (I=0,J=9 ; I<J ; I++,J--) { PAIDE = TEXTE[I]; TEXTE[I] = TEXTE[J]; TEXTE[J] = PAIDE; } /* Afficher le tableau résultat */ puts("Contenu du tableau résultat :"); for (I=0; I<10; I++) puts(TEXTE[I]); 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 */ 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; } uploads/Litterature/ allocation-dynamique-de-memoire.pdf
Documents similaires
-
12
-
0
-
0
Licence et utilisation
Gratuit pour un usage personnel Attribution requise- Détails
- Publié le Mai 18, 2021
- Catégorie Literature / Litté...
- Langue French
- Taille du fichier 0.1475MB