Exercice langage C corrigé les chaines de caractères en fonctions

Exercice 1

int LONG_CH(char *CH)
{
 char *P;
 for (P=CH ; *P; P++) ;
 return P-CH;
}

Exercice 2

void MAJ_CH(char *CH)
{
 for ( ; *CH; CH++)
      if (*CH>='a' && *CH<='z')
          *CH = *CH-'a'+'A';
}

Exercice 3

void AJOUTE_CH(char *CH1, char *CH2)
{
 while (*CH1) /* chercher la fin de CH1 */
        CH1++;
 while (*CH2) /* copier CH2 à la fin de CH1 */
       {
        *CH1 = *CH2;
        CH1++;
        CH2++;
       }
 *CH1=''; /* terminer la chaîne CH1 */
}

Solution plus compacte :

void AJOUTE_CH(char *CH1, char *CH2)
{
 for ( ; *CH1 ; CH1++) ;
 for ( ; *CH1 = *CH2 ; CH1++, CH2++) ;
}

Comme la condition d’arrêt est évaluée lors de l’affectation, le symbole de fin de chaîne est aussi copié.

Exercice 4

void INVERSER_CH (char *CH)
{
 /* Prototypes des fonctions appelées */
 int LONG_CH(char *CH);
 void PERMUTER_CH(char *A, char *B);
 /* Variables locales */
 int I,J;
 /* Inverser la chaîne par permutations successives */
 J = LONG_CH(CH)-1;
 for (I=0 ; I<J ; I++,J--)
      PERMUTER_CH(CH+I, CH+J);
}

void PERMUTER_CH(char *A, char *B)
{
 char AIDE;
 AIDE = *A;
 *A   = *B;
 *B   = AIDE;
}

int LONG_CH(char *CH)
{
 . . .
}

Exercice 5

#include <ctype.h>

int NMOTS_CH(char *CH)
{
 /* Variables locales */
 int N;        /* nombre de mots */
 int DANS_MOT; /* indicateur logique : */
               /* vrai si CH pointe à l'intérieur d'un mot */
 DANS_MOT=0;
 for (N=0; *CH; CH++)
     if (isspace(*CH))
         DANS_MOT=0;
     else if (!DANS_MOT)
         {
          DANS_MOT=1;
          N++;
         }
 return N;
}

Exercice 6

#include <ctype.h>

char *MOT_CH(int N, char *CH)
{
 /* Variables locales */
 int DANS_MOT; /* indicateur logique : */
               /* vrai si CH pointe à l'intérieur d'un mot */
 DANS_MOT=0;
 for ( ; N>0 && *CH ; CH++)
     if (isspace(*CH))
         DANS_MOT=0;
     else if (!DANS_MOT)
         {
          DANS_MOT=1;
          N--;
          CH--; /* Pour réajuster l'effet de l'incrémentation */
         }
 return CH;
}

Exercice 7

int EGAL_N_CH(int N, char *CH1, char *CH2)
{
 while (--N && *CH1==*CH2)
    {
     CH1++;
     CH2++;
    }
 return (*CH1==*CH2);
}

Exercice 8

char *CHERCHE_CH(char *CH1, char *CH2)
{
 /* Prototypes des fonctions appelées */
 int LONG_CH(char *CH);
 int EGAL_N_CH(int N, char *CH1, char *CH2);
 /* Variables locales */
 int L;
 /* Recherche de CH1 dans CH2 */
 L=LONG_CH(CH1);
 while (*CH2 && !EGAL_N_CH(L, CH1, CH2))
          CH2++;
 return CH2;
}

int LONG_CH(char *CH)
{
 . . .
}

int EGAL_N_CH(int N, char *CH1, char *CH2)
{
 . . .
}

Exercice 9

long CH_ENTIER(char *CH)
{
 /* Variables locales */
 long N;
 int SIGNE;
 /* Traitement du signe */
 SIGNE = 1;
 if (*CH=='-') SIGNE = -1;
 if (*CH=='-' || *CH=='+') CH++;
 /* Conversion des chiffres */ 
 for (N=0 ; *CH>='0' && *CH<='9' ; CH++)
         N = N*10 + (*CH-'0');
 return SIGNE*N;
}

Exercice 10

#include <ctype.h>
#include <math.h>

double CH_DOUBLE(char *CH)
{
 /* Variables locales */
 double N; /* résultat numérique */
 int SIGNE; /* signe de la valeur rationnelle */
 int DEC; /* positions derrière la virgule  */

 /* Initialisation des variables */
 N = 0.0;
 SIGNE = 1;
 /* Traitement du signe */
 if (*CH=='-') SIGNE = -1;
 if (*CH=='-' || *CH=='+') CH++;
 /* Positions devant le point décimal */
 for ( ; isdigit(*CH); CH++)
     N = N*10.0 + (*CH-'0');
 /* Traitement du point décimal */
 if (*CH=='.') CH++;

 /* Traitement des positions derrière le point décimal */
 for (DEC=0; isdigit(*CH); CH++)
    {
     N = N*10.0 + (*CH-'0');
     DEC++;
    }
 /* Calcul de la valeur à partir du signe et */
 /* du nombre de décimales. */
 return SIGNE*N/pow(10,DEC);
}

Exercice 11

#include <stdio.h>

void ENTIER_CH(long N, char *CH)
{
  /* Prototypes des fonctions appelées */
 void INVERSER_CH(char *CH);
 /* Variables locales */
 int I;
 int SIGNE;
 /* Traitement du signe */
 SIGNE = (N<0) ? -1 : 1;
 if (N<0) N=-N;
 /* Conversion des chiffres (à rebours) */
 I=0;
 do
    {
     *(CH+I) = N % 10 + '0';
     I++;
    }
 while ((N/=10) > 0);
 /* Ajouter le signe à la fin de la chaîne */
 if (SIGNE<0)
    {
     *(CH+I)='-';
     I++;
    }
 /* Terminer la chaîne */
 *(CH+I)='';
 /* Inverser la chaîne */
 INVERSER_CH(CH);
}

void INVERSER_CH (char *CH)
{
 /* Prototypes des fonctions appelées */
 int LONG_CH(char *CH);
 void PERMUTER_CH(char *A, char *B);
 . . .
}

int LONG_CH(char *CH)
{
 . . .
}

void PERMUTER_CH(char *A, char *B)
{
 . . .
}

Exercice 12

Exercice langage C

void DOUBLE_CH(double N, char *CH)

{ /* Prototypes des fonctions appelées */
 int LONG_CH(char *CH); 
void ENTIER_CH(long N, char *CH); 
/* Variables locales */ 
int I,L; 
/* Conversion */ 
N *= 10000.0; 
ENTIER_CH((long)N, CH); 
/* Conversion forcée est facultative */ 
L=LONG_CH(CH); for (I=L; I>=L-4; I--) 
/* Libérer une position pour le */
 *(CH+I+1) = *(CH+I); 
/* point décimal. */
 *(CH+L-4)='.'; 
} 
void ENTIER_CH(long N, char *CH) 
{ 
/* Prototypes des fonctions appelées */ 
void INVERSER_CH(char *CH);
 . . . } 
void INVERSER_CH (char *CH) { 
/* Prototypes des fonctions appelées */
 int LONG_CH(char *CH); 
void PERMUTER_CH(char *A, char *B);
 . . . } 
int LONG_CH(char *CH) { . . . } 
void PERMUTER_CH(char *A, char *B) { . . . }

Télécharger aussi :

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *