Home- Exercices - Solutions des exercices

 

Page Précédente - Page Suivante


Solutions des Exercices chapitre 8 (les chaines de caractères)

Exercice 8.1.
a) correcte
b) incorrecte: la chaîne d'initialisation dépasse taille réservée.
Correction: char b[14] = "un deux trois";
ou: char b[] = "un deux trois";
c) incorrecte: Les symboles '' encadrent des caractères
Correction: char c[] = "abcdefg";
d) incorrecte
Correction: char d[10] = {'x', '\0'}
ou mieux: char d[10] = "x";
e) correcte
f) correcte
g) correcte
h) incorrecte
Correction: char h[4] = {'a', 'b', 'c', '\0'};
i) correcte
Exercice 8.2
#include <stdio.h>
main()
{
 char M1[30], M2[30], M3[30], M4[30], M5[30];
 printf("Entrez 5 mots,:\n");
 scanf ("%s %s %s %s %s",  M1, M2, M3, M4, M5);
 printf("%s %s %s %s %s\n",M5, M4, M3, M2, M1);
}

Exercice 8.3
#include <stdio.h>
main()
{

 char TXT[201];
int I,J; 
 int L;   
 int C;   
 int AIDE;

 

 printf("Donnez votre texte :\n");
 gets(TXT);

 /* La marque de fin de chaîne '\0' est utilisée comme condition d'arrêt. */
 for (L=0; TXT[L]; L++)
     ;
 printf("Le texte est composé de %d caractères.\n",L);
 
 /* b) Compter les lettres 'e' dans le texte */
 C=0;
 for (I=0; TXT[I]; I++)
     if (TXT[I]=='e') C++;
 printf("Le texte contient %d lettres \'e\'.\n",C);
 

 for (I=L-1; I>=0; I--)
     putchar(TXT[I]);  /* ou printf("%c",TXT[I]); */
 putchar('\n');        /* ou printf("\n"); */
 

 for (I=0,J=L-1 ; I<J ; I++,J--)
    {
     AIDE=TXT[I];
     TXT[I]=TXT[J];
     TXT[J]=AIDE;
    }
 puts(TXT);  }

Exercice 8.4
#include <stdio.h>
main()
{

 char TXT[256];
 int  I,J;     

 printf("Entrez votre texte:\n");
 gets(TXT);
 
 for (J=0,I=0 ; TXT[I] ; I++)
    {
     TXT[J] = TXT[I];
     if (TXT[I] != 'e') J++;
    }
 /* Terminer la chaîne !! */
 TXT[J]='\0';

 puts(TXT);

}

Exercice 8.5
#include <stdio.h>
#include <string.h>
 main()
{
  char NOM[40], PRENOM[40];
  printf("donnez votre nom et votre prénom: \n");
  scanf("%s %s", NOM, PRENOM);
  printf("\nBonjour %s %s !\n", NOM, PRENOM);
  printf("Votre nom est composé de %d lettres.\n",
                                  strlen(NOM) + strlen(PRENOM));
 
}

Exercice 8.6
#include <stdlib.h>
#include <string.h>
 main()
{

 char CH1[200], CH2[200]; /*
 int RES; 

 printf("donnez la première chaîne: ");
 gets(CH1);
 printf("donnez la deuxième chaîne: ");
 gets(CH2);

 

 RES = strcmp(CH1,CH2);
 if (RES<0)
     printf("\"%s\" précède \"%s\"\n",CH1 ,CH2);
 else if (RES>0)
     printf("\"%s\" précède \"%s\"\n",CH2 ,CH1);
 else
     printf("\"%s\" est égal à \"%s\"\n",CH1, CH2);

}

Exercice 8.7

a) 
#include <stdio.h>
#include <string.h>
 main()
{

 char CH1[100], CH2[100];
 char CH3[100]="";       

 

 printf("donnez la première: ");
 gets(CH1);
 printf("donnez la deuxième: ");
 gets(CH2);

 

 strncpy(CH3, CH1, strlen(CH1)/2);
 strncat(CH3, CH2, strlen(CH2)/2);

 printf("Un demi \"%s\" plus un demi \"%s\" donne \"%s\"\n",
                                               CH1, CH2, CH3);

}
b) 
#include <stdio.h>
main()
{
 
 char CH1[100], CH2[100];
 char CH3[100]="";       
 int L1,L2;
 int I;    
 int J;     /*

 

 puts("donnez la première chaîne: ");
 gets(CH1);
 puts("donnez la deuxième chaîne: ");
 gets(CH2);
 

 

 for (L1=0; CH1[L1]; L1++) ;
 for (L2=0; CH2[L2]; L2++) ;

 

 for (I=0 ; I<(L1/2) ; I++)
     CH3[I]=CH1[I];

 

 J=I;
 for (I=0 ; I<(L2/2) ; I++)
    {
     CH3[J]=CH2[I];
     J++;
    }
 /* Terminer la chaîne CH3 */
 CH3[J]='\0';
 

 puts("Chaîne résultat : ");
 puts(CH3);

}
Exercice 8.8
#include <stdio.h>
#include <string.h>
 main()
{

 char VERB[20];
char AFFI[30];
int L;        

 printf("Verbe : ");
 gets(VERB);

 

 L=strlen(VERB);
 if ((VERB[L-2]!='e') || (VERB[L-1]!='r'))
      puts("\aCe n'est pas un verbe du premier groupe.!");
 else
     {
      /* Couper la terminaison 'er'. */
      VERB[L-2]='\0';
      /* Conjuguer ... */
      AFFI[0]='\0';
      strcat(AFFI, "je ");
      strcat(AFFI, VERB);
      strcat(AFFI, "e");
      puts(AFFI);
 
       . . .
 
      AFFI[0]='\0';
      strcat(AFFI, "ils ");
      strcat(AFFI, VERB);
      strcat(AFFI, "ent");
      puts(AFFI);
     }

}

Exercice 8.9

Entrée: 

integer 

long 

double 

a) 

123 

123 

123 

123.000000 

b) 

-123 

-123 

-123 

-123.000000 

c) 

- 123 

0 

0 

-0.000000 

d) 

123.45 

123 

123 

123.45 

e) 

12E3 

12 

12 

12000.000000 

f) 

1234f5 

1234 

1234 

1234.000000 

g) 

-1234567 

dépassement 

-1234567 

-1234567.000000 

h) 

123e-02 

123 

123 

1.230000 

i) 

-0.1234 

0 

0 

-0.123400 

 

Exercice 8.10
#include <stdio.h>
#include <stdlib.h>
 main()
{
 long N;
 char STR[200];
 do
    {
     puts("donnez un nombre :");
     scanf("%ld",&N);
     printf("Entrée  = %ld\n", N);
     printf("base 2  = %s\n", ltoa(N, STR, 2));
     printf("base 8  = %s\n", ltoa(N, STR, 8));
     printf("base 16 = %s\n", ltoa(N, STR, 16));
    }
 while(N);
}

Exercice 8.11
#include <stdio.h>
#include <string.h>
main()
{

 char MOT[10][50];
  char AIDE[50]; 
 int I;   
 int J;   

 int PMOT;

          

 for (J=0; J<10; J++)
   {
    printf("Mot %d : ", J);
    gets(MOT[J]);
    }

 

 for (I=0; I<9; I++)
    {

     PMOT=I;
     for (J=I+1; J<10; J++)
        if (strcmp(MOT[J], MOT[PMOT]) < 0)
            PMOT=J;

     strcpy(AIDE, MOT[I]);
     strcpy(MOT[I], MOT[PMOT]);
     strcpy(MOT[PMOT], AIDE);
    }
 

 printf("Tableau trié:\n");
 for (J=0; J<10; J++)
     puts(MOT[J]);  /* ou :  printf("%s\n",MOT[J]); */
 printf("\n");
}

Exercice 8.12
#include <stdio.h>
main()
{

 int N; 
 char JOUR[8][9] = {"\aErreur!", "lundi", "mardi", "mercredi",
                    "jeudi", "vendredi", "samedi","dimanche"};

 

 printf("Donnez un nombre entre 1 et 7 : ");
 scanf("%d", &N);

 if (N>0 && N<8)
     printf("Le %de%c jour de la semaine est %s.\n",
                                   N, (N==1)?'r':' ', JOUR[N]);
 else
     puts(JOUR[0]);

}

Exercice 8.13
#include <stdio.h>

main()
{

 char MOT[5][50];
 int I;          

 printf("donnez 5 mots:\n");

 

 for (I=0; I<5; I++)
     scanf("%s", MOT[I]);

 for (I=4; I>=0; I--)
    printf("%s ", MOT[I]);
 printf("\n");

}

Exercice 8.14
#include <stdio.h>
#include <string.h>
main()
{

 

 char SUJ[6][5]  = {"je","tu","il","nous","vous","ils"};
 char TERM[6][5] = {"e","es","e","ons","ez","ent"};
  char VERB[20];
 int L;        
int I;        

 

 printf("Verbe : ");
 scanf("%s", VERB);

 

 L=strlen(VERB);
 if ((VERB[L-2] != 'e') || (VERB[L-1] != 'r'))
  printf("\"%s\" n'est pas un verbe du premier groupe.\n",VERB);
 else
     {

      VERB[L-2]='\0';
      /* Conjuguer ... */
      for (I=0; I<6; I++)
          printf("%s %s%s\n",SUJ[I], VERB, TERM[I]);
      }

}

Exercice 8.15
#include <stdio.h>
main()
{

 char CH1[50], CH2[50];
 int I;                

 

 printf("Donnez la première chaîne: ");
 gets(CH1);
 printf("Donnez la deuxième chaîne: ");
 gets(CH2);

 

 for (I=0; (CH1[I]==CH2[I]) && CH1[I] && CH2[I]; I++)
     ;

 

 if (CH1[I]==CH2[I])
     printf("\"%s\" est égal à \"%s\"\n", CH1, CH2);
 else if (CH1[I]<CH2[I])
     printf("\"%s\" précède \"%s\"\n", CH1, CH2);
 else
     printf("\"%s\" précède \"%s\"\n", CH2, CH1);

}

Exercice 8.16
#include <stdio.h>
main()
{

 char CH[100];
 int I;       

 

 printf("donnez la chaîne à convertir : ");
 gets(CH);

 

 for (I=0; CH[I]; I++)
    {
     if (CH[I]>='A' && CH[I]<='Z')
                 CH[I] = CH[I]-'A'+'a';
     else if (CH[I]>='a' && CH[I]<='z')
                 CH[I] = CH[I]-'a'+'A';
    }

 printf("Chaîne convertie : %s\n", CH);

}

Exercice 8.17
#include <stdio.h>
#include <ctype.h>
 main()
{

 char CH[100];
 long N;
 int I; 
 int OK;    

 

 printf("donnez un nombre entier et positif : ");
 gets(CH);

 OK=1;
 N=0;
 for (I=0; OK && CH[I]; I++)
     if (isdigit(CH[I]))
        N = N*10 + (CH[I]-'0');
     else
        OK=0;
 

 if (OK)
     printf("Valeur numérique : %ld\n", N);
 else
     printf("\a\"%s\" ne représente pas correctement "
           "un entier et positif.\n", CH);

}

Exercice 8.18
#include <stdio.h>
#include <ctype.h>
 main()
{

 char CH[100];
 long N;
 int I; 
 int OK;

 

 printf("donnez un nombre hexadécimal entier et positif : ");
 gets(CH);

 OK=1;
 N=0;
 for (I=0; OK && CH[I]; I++)
     if (isxdigit(CH[I]))
       {
        CH[I] = toupper(CH[I]);
        if (isdigit(CH[I]))
           N = N*16 + (CH[I]-'0');
        else
           N = N*16 + 10 + (CH[I]-'A');
       }
     else
        OK=0;
 

 if (OK)
   {
    printf("Valeur numérique hexadécimale : %lX\n", N);
    printf("Valeur numérique décimale     : %ld\n", N);
   }
 else
    printf("\a\"%s\" n'est pas une valeur "
           "hexadécimale correcte.\n", CH);

}

Exercice 8.19
#include <stdio.h>
#include <math.h>
#include <ctype.h>
main()
{

 char CH[100];
 double N;
 int I;   
 int SIG; 
 int DEC; 
 int OK;  

 

 printf("donnez un nombre rationnel : ");
 gets(CH);

 

  OK=1;
 N=0.0;
 I=0;
 SIG=1;

  if (CH[I]=='-') SIG=-1;
 if (CH[I]=='-' || CH[I]=='+')
     I++;

  for ( ; isdigit(CH[I]); I++)

N = N*10.0 + (CH[I]-'0');

  if (CH[I]=='.')
     I++;
 else if (CH[I])
     OK=0;

 

  for (DEC=0; isdigit(CH[I]); I++, DEC++)
     N = N*10.0 + (CH[I]-'0');
 if (CH[I]) OK=0;

 

  N = SIG*N/pow(10,DEC);

 if (OK)
    printf("Valeur numérique : %f\n", N);
 else
    printf("\a\"%s\" n'est pas une valeur "
           "rationnelle correcte.\n", CH);

}

Exercice 8.20
#include <stdio.h>
#include <math.h>
#include <ctype.h>
main()
{
 char CH[100];
 double N;
 int I;   
 int SIG; 
 int DEC; 
 int SIGE;
 int EXP; 
 int OK;  
             

 printf("donnez un nombre rationnel : ");
 gets(CH);

 

  OK=1;
 N=0.0;
 I=0;
 SIG=1;
 SIGE=1;

  if (CH[I]=='-') SIG=-1;
 if (CH[I]=='-' || CH[I]=='+') I++;

  for ( ; isdigit(CH[I]); I++)
     N = N*10.0 + (CH[I]-'0');

  if (CH[I]=='.')
     I++;

  for (DEC=0; isdigit(CH[I]); I++, DEC++)
     N = N*10.0 + (CH[I]-'0');

  if (CH[I]=='e'||CH[I]=='E')
     I++;
 else if (CH[I])
     OK=0;

  if (CH[I]=='-') SIGE=-1;
 if (CH[I]=='-' || CH[I]=='+') I++;

  for (EXP=0; isdigit(CH[I]); I++)
     EXP = EXP*10 + (CH[I]-'0');
 if (CH[I]) OK=0;

 

  EXP = SIGE*EXP - DEC;

 

  N = SIG*N*pow(10,EXP);

 

 if (OK)
    printf("Valeur numérique : %f\n", N);
 else
    printf("\a\"%s\" n'est pas une valeur "
           "rationnelle correcte.\n", CH);

}
Exercice 8.21
#include <stdio.h>
main()
{

 char SUJ[100];
 char OBJ[100];
 int I;        
 int J;        
 int TROUVE;   

 

 printf("donnez la chaîne à supprimer   : ");
 gets(OBJ);
 printf("donnez la chaîne à transformer : ");
 gets(SUJ);

 TROUVE=0;
 for (I=0; SUJ[I] && !TROUVE; I++)

    if (SUJ[I]==OBJ[0])
        {

         for (J=1; OBJ[J] && (OBJ[J]==SUJ[I+J]); J++)
            ;
         if (OBJ[J]=='\0') TROUVE=1;
        }

 

 if (TROUVE)
    {
     I--;

 

     for (; SUJ[I+J]; I++)
          SUJ[I]=SUJ[I+J];
     SUJ[I]='\0';
    }

 printf("Chaîne résultat : \"%s\"\n", SUJ);

}

Exercice 8.22
#include <stdio.h>
main()
{

 char SUJ[100];
 char CH1[100];
 char CH2[100];
 char FIN[100];
 int I;     
 int J;     
 int K;     
 int TROUVE;

 

 printf("donnez la chaîne à rechercher  CH1 : ");
 gets(CH1);
 printf("donnez la chaîne à remplacer   CH2 : ");
 gets(CH2);
 printf("donnez la chaîne à transformer SUJ : ");
 gets(SUJ);

 

 TROUVE=0;
 for (I=0; SUJ[I] && !TROUVE; I++)
    if (SUJ[I]==CH1[0])
        {
         for (J=1; CH1[J] && (CH1[J]==SUJ[I+J]); J++)
            ;
         if (CH1[J]=='\0') TROUVE=1;
        }
      

 
 if (TROUVE)
    {
     I--;
    
     for (K=0; SUJ[K+I+J]; K++)
          FIN[K]=SUJ[K+I+J];
     FIN[K]='\0';

     for (K=0; CH2[K]; K++,I++)
          SUJ[I]=CH2[K];

     for (K=0; FIN[K]; K++,I++)
          SUJ[I]=FIN[K];

     SUJ[I]='\0';
    }
 

 printf("Chaîne résultat : \"%s\"\n", SUJ);

}

Exercice 8.23
#include <stdio.h>
main()
{

 char SUJ[100];
 char CH1[100];
 char CH2[100];
 char FIN[100];

 int I;     
 int J;     
int K;     

 

 printf("donnez la chaîne à rechercher  CH1 : ");
 gets(CH1);
 printf("donnez la chaîne à remplacer   CH2 : ");
 gets(CH2);
 printf("donnez la chaîne à transformer SUJ : ");
 gets(SUJ);

for (I=0; SUJ[I]; I++)
    if (SUJ[I]==CH1[0])
       {
        for (J=1; CH1[J] && (CH1[J]==SUJ[I+J]); J++)
            ;
        if (CH1[J]=='\0') /* TROUVE ! */
          {
          

           for (K=0; SUJ[K+I+J]; K++)
              FIN[K]=SUJ[K+I+J];
           FIN[K]='\0';

 

           for (K=0; CH2[K]; K++,I++)
               SUJ[I]=CH2[K];

           for (K=0; FIN[K]; K++)
               SUJ[I+K]=FIN[K];

           SUJ[I+K]='\0';
           I--;
          }
       }
 

 printf("Chaîne résultat : \"%s\"\n", SUJ);

}


 


Home- Exercices - Solutions des exercices
Copyright © 2019