Pages

lundi 7 novembre 2011

Exercices corrigés : chaines de caractères et les pointeurs en langage C


Exercice 1 :

Ecrire un programme qui lit deux chaînes de caractères CH1 et CH2 au clavier et supprime la première occurrence de CH2 dans CH1. Utiliser uniquement des pointeurs, une variable logique TROUVE et la fonction strcpy.



Solution :
#include <stdio.h>
#include <string.h>
 main()
{
 /* Déclarations */
 char CH1[101], CH2[101]; /* chaînes données */
 char *P1, *P2; /* pointeurs d'aide dans CH1 et CH2 */
 int TROUVE; /* indicateur logique: vrai, si le caractère */
             /* actuel dans CH1 a été trouvé dans CH2.    */

 /* Saisie des données */
 printf("Entrez la chaîne à transformer"
        " (max.100 caractères) :\n");
 gets(CH1);
 printf("Entrez la chaîne à supprimer  "
        " (max.100 caractères) :\n");
 gets(CH2);
 /* Rechercher CH2 dans CH1 : */
 /* L'expression P2-CH2 est utilisée pour déterminer l'indice */
 /* de P2 dans CH2. On pourrait aussi résoudre le problème à  */
 /* l'aide d'un troisième pointeur P3 parcourant CH1. */
 TROUVE=0;
 for (P1=CH1 ; *P1 && !TROUVE ; P1++)
     {
      for (P2=CH2 ; *P2 == *(P1+(P2-CH2)) ; P2++)
          ;
      if (!*P2)
          TROUVE = 1;
     }

 /* A la fin de la boucle, P1 est incrémenté, donc */
 P1--;
 /* Si CH2 se trouve dans CH1, alors P1 indique la position */
 /* de la première occurence de CH2 dans CH1 et P2 pointe à */
 /* la fin de CH2. (P2-CH2) est alors la longueur de CH2.   */ 
 if (TROUVE)
     strcpy(P1, P1+(P2-CH2));

 /* Affichage du résultat */
 printf("Chaîne résultat : \"%s\" \n", CH1);
 return 0;
}

Exercice 2 :
Ecrire un programme qui lit une chaîne de caractères CH au clavier et qui compte les occurrences des lettres de l'alphabet en ne distinguant pas les majuscules et les minuscules. Utiliser un tableau ABC de dimension 26 pour mémoriser le résultat et un pointeur PCH pour parcourir la chaîne CH et un pointeur PABC pour parcourir ABC. Afficher seulement le nombre des lettres qui apparaissent au mois une fois dans le texte.
Exemple:
 Entrez un ligne de texte (max. 100 caractères) :
 Jeanne
 La chaîne "Jeanne" contient :
 1   fois la lettre 'A'
 2   fois la lettre 'E'
 1   fois la lettre 'J'
 3   fois la lettre 'N'

Solution :
#include <stdio.h>
main()
{
 /* Déclarations */
 char CH[101]; /* chaîne donnée */
 char *PCH;    /* pointeur d'aide dans CH  */
 int ABC[26];  /* compteurs des différents caractères */
  int *PABC;    /* pointeur d'aide dans ABC */

 /* Saisie des données */
 printf("Entrez une ligne de texte (max.100 caractères) :\n");
 gets(CH);
 /* Initialiser le tableau ABC */
 for (PABC=ABC; PABC<ABC+26; PABC++)
     *PABC=0;
 /* Compter les lettres */
 for (PCH=CH; *PCH; PCH++)
     {
      if (*PCH>='A' && *PCH<='Z')
         (*(ABC+(*PCH-'A')))++; /* Attention aux parenthèses! */
      if (*PCH>='a' && *PCH<='z')
         (*(ABC+(*PCH-'a')))++;
     }
 /* Affichage des résultats */
 /* (PABC-ABC) est le numéro de la lettre de l'alphabet. */
 printf("La chaîne \"%s\" contient :\n", CH);
 for (PABC=ABC; PABC<ABC+26; PABC++)
     if (*PABC)
        printf(" %d\tfois la lettre '%c' \n",
                                        *PABC, 'A'+(PABC-ABC));
  return 0;
}

Exercice 3:

Ecrire un programme qui lit 5 mots d'une longueur maximale de 50 caractères et les mémorise dans un tableau de chaînes de caractères TABCH. Inverser l'ordre des caractères à l'intérieur des 5 mots à l'aide de deux pointeurs P1 et P2. Afficher les mots.


Solution :
#include <stdio.h>
main()
{
 /* Déclarations */
 char TABCH[5][51];/* tableau de chaînes de caractères */
 char AIDE;        /* pour la permutation des caractères */
 char *P1, *P2;    /* pointeurs d'aide */
 int I;            /* indice courant   */

 /* TABCH+I est l'adresse de la I-ième chaîne du tableau */
 /* Il vaut mieux convertir TABCH+I en pointeur sur char */
  /* Saisie des données */
 printf("Entrez 5 mots :\n");
 for (I=0; I<5; I++)
     {
      printf("Mot %d (max.50 caractères) : ", I);
      gets((char *)(TABCH+I));
     }

 /* Inverser l'ordre des caractères à l'intérieur des mots */
 for (I=0; I<5; I++)
     {
      P1 = P2 = (char *)(TABCH+I);
      /* Placer P2 à la fin de la chaîne */
      while (*P2)
             P2++;
      P2--; /* sinon '\0' est placé au début de la chaîne */
      while (P1<P2)
           {
            AIDE = *P1;
            *P1  = *P2;
            *P2  = AIDE;
            P1++;
            P2--;
           }
     }

  /* Affichage des mots inversés */
 for (I=0; I<5; I++)
      puts((char *)(TABCH+I));
 return 0;
}




Aucun commentaire:

Enregistrer un commentaire

Partenaires

Computers Blogs

Contactez-nous

Nom

E-mail *

Message *

Tous droits resérvés-www.exercices-corriges.com Seo Blogger Templates