#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; }