FSEG Tunis

EXERCICES CORRIGÉS LANGAGE C

Les outils de base de la programmation en langage C

Exercice 1 :

Ecrire un programme en langage C qui permute et affiche les valeurs de trois variables A, B, C de type entier qui sont entrées au clavier :

A ==> B , B ==> C , C ==> A

Solution exercice1 :

#include <stdio.h>

main()

{

               int A, B, C, AIDE;

               printf(« Introduisez trois nombres (A, B, C) : « );

               scanf(« %d %d %d », &A, &B, &C);

               /* Affichage à l’aide de tabulations */

               printf(« A = %d\tB = %d\tC = %d\n », A, B, C);

               AIDE=A;

               A=C;

               C=B;

               B=AIDE;

               printf(« A = %d\tB = %d\tC = %d\n », A, B, C);

               return 0;

}

Exercice 2 :

Ecrire un programme en langage C qui affiche le quotient et le reste de la division entière de deux nombres entiers entrés au clavier ainsi que le quotient rationnel de ces nombres.

Solution exercice 2 :

#include <stdio.h>

main()

{

                    int A, B;

                    printf(« Introduisez deux nombres entiers : « );

                    scanf(« %d %d », &A, &B);

                    printf(« Division entiere   :  %d\n », A/B);

                    printf(« Reste              :  %d\n », A%B);

                    printf(« Quotient rationnel :  %f\n », (float)A/B);

                    return 0;

}

Exercice 3 :

Ecrire un programme en langage C qui affiche la résistance équivalente à trois résistances R1, R2, R3 (type double),

– si les résistances sont branchées en série:

Rsér = R1+R2+R3

– si les résistances sont branchées en parallèle:

Rpar = (R1*R2*R3)/(R1*R2+R1*R3+R2*R3)

Solution exercice 3 :

#include <stdio.h>

main()

{

   double R1, R2, R3, RRES;

   printf(« Introduisez les valeurs pour R1, R2 et R3 : « );

   scanf(« %lf %lf %lf« , &R1, &R2, &R3);

   RRES=R1+R2+R3;

   printf(« Resistance resultante serielle   : %f\n », RRES);

   RRES=(R1*R2*R3)/(R1*R2+R1*R3+R2*R3);

   printf(« Resistance resultante parallele  : %f\n », RRES);

   return 0;

}

Exercice 4 :

Ecrire un programme en langage C qui calcule et affiche l’aire d’un triangle dont il faut entrer les longueurs des trois côtés. Utilisez la formule :

S= P(P-A)(P-B)(P-C)

où A, B, C sont les longueurs des trois côtés (type int) et P le demi-périmètre du triangle.

Solution exercice 4:

#include <stdio.h>

#include <math.h>

 main()

{

                     /* Pour ne pas perdre de précision lors de la division, */

                     /* déclarons P comme rationnel. */

   int A, B, C;

   float P;

   printf(« Introduisez les valeurs pour A, B et C : « );

   scanf(« %d %d %d« , &A, &B, &C);

                     /* En forçant la conversion de A, les autres opérandes */

                     /* sont converties automatiquement. */

   P=((float)A+B+C)/2;

   printf(« Surface du triangle S = %f\n »,sqrt(P*(P-A)*(P-B)*(P-C)));

    return 0;

}

Exercice 5 :

Ecrire un programme en langage C qui calcule la somme de quatre nombres du type int entrés au clavier.

Solution exercice 5 :

main()

{

int  A;

 long SOM;

 SOM = 0;

  printf(« Entrez le premier   nombre : « );

 scanf(« %d », &A);

 SOM+=A;

  printf(« Entrez le deuxième  nombre : « );

 scanf(« %d », &A);

 SOM+=A;

  printf(« Entrez le troisième nombre : « );

 scanf(« %d », &A);

 SOM+=A;

  printf(« Entrez le quatrième nombre : « );

 scanf(« %d », &A);

 SOM+=A;

  printf(« La somme des nombres entrés est %ld\n », SOM);

 return 0;

}

Exercice 6 :

Ecrire un programme en langage C qui calcule et affiche la distance DIST (type double) entre deux points A et B du plan dont les coordonnées (XA, YA) et (XB, YB) sont entrées au clavier comme entiers.

Solution exercice 6 :

#include <stdio.h>

#include <math.h>

 main()

{

 int XA, YA, XB, YB;

 double DIST;

 /* Attention: La chaîne de format que nous utilisons */

 /* s’attend à ce que les données soient séparées par */

 /* une virgule lors de l’entrée. */

 printf(« Entrez les coordonnées du point A :  XA,YA  « );

 scanf(« %d,%d« , &XA, &YA);

 printf(« Entrez les coordonnées du point B :  XB,YB  « );

 scanf(« %d,%d« , &XB, &YB);

 DIST=sqrt(pow(XA-XB,2)+pow(YA-YB,2));

 printf(« La distance entre A(%d,% d) et B(%d, %d) est %.2f\n »,

XA, YA, XB, YB, DIST);

  return 0;

}

Exercice 7:

Ecrire un programme en langage C qui lit un caractère au clavier et affiche le caractère ainsi que son code numérique.

Solution exercice 7 :

#include <stdio.h>

main()

{

 int C;

 printf(« Introduire un caractère suivi de ‘Enter’\n »);

 C = getchar();

  printf(« Le caractère %c a le code ASCII %d\n », CC);

 return 0;

}

 Les structures alternatives en langage c

Exercice 8:

Ecrivez un programme en langage C  qui lit trois valeurs entières (A, B et C) au clavier et qui affiche la plus grande des trois valeurs, en utilisant:

  1. a)if – elseet une variable d’aide MAX
  2. b)if – else if – … – elsesans variable d’aide
  3. c)les opérateurs conditionnels et une variable d’aide MAX
  4. d)les opérateurs conditionnels sans variable d’aide

Solution exercice 8 :

  1. a) if – elseet une variable d’aide MAX

#include <stdio.h>

main()

{

 int A, B, C;

 int MAX;

 printf(« Introduisez trois nombres entiers : »);

 scanf(« %i %i %i », &A, &B, &C);

 if (A>B)

     MAX=A;

 else

     MAX=B;

 if (C>MAX)

     MAX=C;

 printf(« La valeur maximale est %i\n », MAX);

  return 0;

}

  1. b) if – else if – … – elsesans variable d’aide

int A, B, C;

 printf(« Introduisez trois nombres entiers : »);

 scanf(« %i %i %i », &A, &B, &C);

 printf(« La valeur maximale est « );

 if (A>B && A>C)

     printf(« %i\n »,A);

 else if (B>C)

     printf(« %i\n »,B);

 else

     printf(« %i\n »,C);

  1. c)opérateurs conditionnels et une variable d’aide MAX

int A, B, C;

 int MAX;

 printf(« Introduisez trois nombres entiers : »);

 scanf(« %i %i %i », &A, &B, &C);

 MAX = (A>B) ? A : B;

 MAX = (MAX>C) ? MAX : C;

 printf(« La valeur maximale est %i\n », MAX);

  1. d)opérateurs conditionnels sans variable d’aide

int A, B, C;

 printf(« Introduisez trois nombres entiers : »);

 scanf(« %i %i %i », &A, &B, &C);

 printf(« La valeur maximale est %i\n »,(A>((B>C)?B:C)) ? A : ((B>C)?B:C));

Exercice 9:

Écrivez un programme en langage C qui lit trois valeurs entières (A, B et C) au clavier. Triez les valeurs A, B et C par échanges successifs de manière à obtenir :

val(A) val(B) val(C)

Affichez les trois valeurs.

Solution exercice 9 :

#include <stdio.h>

main()

{

 /* Tri par ordre décroissant de trois entiers

    en échangeant les valeurs

 */

 int A, B, C, AIDE;

 printf(« Introduisez trois nombres entiers : »);

 scanf(« %i %i %i », &A, &B, &C);

 printf(« Avant le tri : \tA = %i\tB = %i\tC = %i\n », A, B, C);

 /* Valeur maximale -> A */

 if (A<B)

     {

      AIDE = A;

      A = B;

      B = AIDE;

     }

 if (A<C)

     {

      AIDE = A;

      A = C;

      C = AIDE;

     }

 /* trier B et C */

 if (B<C)

     {

      AIDE = B;

      B = C;

      C = AIDE;

     }

 printf(« Après le tri : \tA = %i\tB = %i\tC = %i\n », A, B, C);

  return 0;

}

Exercice 10:

Ecrivez un programme en langage C qui lit deux valeurs entières (A et B) au clavier et qui affiche le signe du produit de A et B sans faire la multiplication.

Solution exercice 10:

#include <stdio.h>

main()

{

 /* Afficher le signe du produit de deux entiers sans

    faire la multiplication

 */

 int A, B;

 printf(« Introduisez deux nombres entiers : »);

 scanf(« %i %i », &A, &B);

 if ((A>0 && B>0) || (A<0 && B<0))

   printf(« Le signe du produit %i * %i est positif\n », A, B);

 else if ((A<0 && B>0) || (A>0 && B<0))

   printf(« Le signe du produit %i * %i est négatif\n », A, B);

 else

   printf(« Le produit %i * %i est zéro\n », A, B);

  return 0;

}

Exercice 11:

Ecrivez un programme en langage C qui lit deux valeurs entières (A et B) au clavier et qui affiche le signe de la somme de A et B sans faire l’addition. Utilisez la fonction fabs de la bibliothèque<math.h>.

Solution exercice 11 :

#include <stdio.h>

#include <math.h>

 main()

{

 /* Afficher le signe de la somme de deux entiers sans

    faire l’addition

 */

 int A, B;

 printf(« Introduisez deux nombres entiers : »);

 scanf(« %i %i », &A, &B);

 if ((A>0 && B>0) || (A<0 && B>0 && fabs(A)<fabs(B))

                  || (A>0 && B<0 && fabs(A)>fabs(B)))

    printf(« Le signe de la somme %i + %i est positif\n »,A,B);

 else if ((A<0 && B<0) || (A<0 && B>0 && fabs(A)>fabs(B))

                       || (A>0 && B<0 && fabs(A)<fabs(B)))

    printf(« Le signe de la somme %i + %i est négatif\n »,A,B);

 else

    printf(« La somme %i + %i est zéro\n », A, B);

  return 0;

}

Exercice 12:

Ecrivez un programme en langage C qui calcule les solutions réelles d’une équation du second degréax2+bx+c = 0.

Solution exercice 12 :

#include <stdio.h>

#include <math.h>

 main()

{

 /* Calcul des solutions réelles d’une équation du second degré */

 int A, B, C;

 double D; /* Discriminant */

 printf(« Calcul des solutions réelles d’une équation du second \n »);

 printf(« degré de la forme   ax^2 + bx + c = 0 \n\n »);

 printf(« Introduisez les valeurs pour a, b, et c : « );

 scanf(« %i %i %i », &A, &B, &C);

 /* Calcul du discriminant b^2-4ac */

 D = pow(B,2) – 4.0*A*C;

 /* Distinction des différents cas */

 if (A==0 && B==0 && C==0) /* 0x = 0 */

                                         printf(« Tout réel est une solution de cette équation.\n »);

 else if (A==0 && B==0)  /* Contradiction: c # 0 et c = 0 */ 

                                         printf(« Cette équation ne possède pas de solutions.\n »);

 else if (A==0) /* bx + c = 0 */

    {

     printf(« La solution de cette équation du premier degré est :\n »);

     printf( » x = %.4f\n », (double)C/B);

    }

 else if (D<0)  /* b^2-4ac < 0 */

     printf(« Cette équation n’a pas de solutions réelles.\n »);

 else if (D==0) /* b^2-4ac = 0 */

    {

     printf(« Cette équation a une seule solution réelle :\n »);

     printf( » x =  %.4f\n », (double)-B/(2*A));

    }

 else /* b^2-4ac > 0 */

    {

     printf(« Les solutions réelles de cette équation sont :\n »);

     printf( » x1 = %.4f\n », (-B+sqrt(D))/(2*A));

     printf( » x2 = %.4f\n », (-B-sqrt(D))/(2*A));

    }

  return 0;

}

Les structures répétitives en langage C

Exercice 13:

Ecrivez un programme en langage C qui lit N nombres entiers au clavier et qui affiche leur somme, leur produit et leur moyenne. Choisissez un type approprié pour les valeurs à afficher. Le nombre N est à entrer au clavier. Résolvez ce problème,

  1. a) en utilisant while,
  2. b) en utilisant do – while,
  3. c) en utilisant for.
  4. d) Laquelle des trois variantes est la plus naturelle pour ce problème?

Solution exercice 13 :

  1. a) en utilisant while,

#include <stdio.h>

main()

{

 int N;       /* nombre de données */

 int NOMB;    /* nombre courant    */

 int I;       /* compteur */

 long SOM;    /* la somme   des nombres entrés */

 double PROD; /* le produit des nombres entrés */

 printf(« Nombre de données : « );

 scanf(« %d », &N);

 SOM=0;

 PROD=1;

 I=1;

 while(I<=N)

    {

     printf(« %d. nombre : « , I);

     scanf(« %d », &NOMB);

     SOM  += NOMB;

     PROD *= NOMB;

     I++;

    }

 printf(« La somme   des %d nombres est %ld \n », N, SOM);

 printf(« Le produit des %d nombres est %.0f\n », N, PROD);

 printf(« La moyenne des %d nombres est %.4f\n », N, (float)SOM/N);

 return 0;

}

  1. b) en utilisant do – while,

#include <stdio.h>

main()

{

 int N;       /* nombre de données */

 int NOMB;    /* nombre courant    */

 int I;       /* compteur */

 long SOM;    /* la somme   des nombres entrés */

 double PROD; /* le produit des nombres entrés */

 printf(« Nombre de données : « );

 scanf(« %d », &N);

 SOM=0;

 PROD=1;

 I=1;

 do

    {

     printf(« %d. nombre : « , I);

     scanf(« %d », &NOMB);

     SOM  += NOMB;

     PROD *= NOMB;

     I++;

    }

 while(I<=N);

 printf(« La somme   des %d nombres est %ld \n », N, SOM);

 printf(« Le produit des %d nombres est %.0f\n », N, PROD);

 printf(« La moyenne des %d nombres est %.4f\n », N, (float)SOM/N);

 return 0;

}

  1. c) en utilisant for.

main()

{

 int N;       /* nombre de données */

 int NOMB;    /* nombre courant    */

 int I;       /* compteur */

 long SOM;    /* la somme   des nombres entrés */

 double PROD; /* le produit des nombres entrés */

 printf(« Nombre de données : « );

 scanf(« %d », &N);

 for (SOM=0, PROD=1, I=1 ; I<=N ; I++)

    {

     printf(« %d. nombre : « , I);

     scanf(« %d », &NOMB);

     SOM  += NOMB;

     PROD *= NOMB;

    }

 printf(« La somme   des %d nombres est %ld \n », N, SOM);

 printf(« Le produit des %d nombres est %.0f\n », N, PROD);

 printf(« La moyenne des %d nombres est %.4f\n », N, (float)SOM/N);

 return 0;

}

  1. d) Laquelle des trois variantes est la plus naturelle pour ce problème?

La structure for est la plus compacte et celle qui exprime le mieux l’idée de l’algorithme. D’autre part, elle permet d’intégrer très confortablement l’initialisation et l’incrémentation des variables dans la structure.

Exercice 14:

Calculez par des soustractions successives le quotient entier et le reste de la division entière de deux entiers entrés au clavier.

Solution exercice 14 :

#include <stdio.h>

main()

{

 int NUM;   /* numérateur   de la division entière */

 int DEN;   /* dénominateur de la division entière */

 int DIV;   /* résultat de la division entière */

 int RES;   /* reste    de la division entière */

 printf(« Introduisez le numérateur   : « );

 scanf(« %d », &NUM);

 printf(« Introduisez le dénominateur : « );

 scanf(« %d », &DEN);

 RES=NUM;

 DIV=0;

 while(RES>=DEN)

    {

     RES-=DEN;

     DIV++;

    }

/* ou mieux encore : */

/*

 for (RES=NUM, DIV=0 ; RES>=DEN ; DIV++)

      RES-=DEN;

 */

 printf( » %d divisé par %d est %d reste %d\n », NUM, DEN, DIV, RES);

 return 0;

}

Exercice 14:

Calculez la factorielle N! = 1*2*3*…*(N-1)*N d’un entier naturel N en respectant que 0!=1.

  1. a) Utilisez while,
  2. b) Utilisez for.

Solution exercice 14:

  1. a)  avec la boucle while,

#include <stdio.h>

main()

{

int  N;      /* La donnée   */

int  I;      /* Le compteur */

double FACT; /* La factorielle N! – Type double à */

/* cause de la grandeur du résultat. */

 do

    {

printf(« Entrez un entier naturel : « );

scanf(« %d », &N);

    }

 while (N<0);

/* a */

/* Pour N=0, le résultat sera automatiquement 0!=1 */

 I=1;

 FACT=1;

 while (I<=N)

       {

        FACT*=I;

        I++;

       }

printf (« %d! = %.0f\n », N, FACT);

return 0;

}

  1. b)  avec la boucle for,

#include <stdio.h>

main()

{

int  N;      /* La donnée   */

int  I;      /* Le compteur */

double FACT; /* La factorielle N! – Type double à */

/* cause de la grandeur du résultat. */

 do

    {

printf(« Entrez un entier naturel : « );

scanf(« %d », &N);

    }

 while (N<0);

for (FACT=1.0, I=1 ; I<=N ; I++)

        FACT*=I;

printf (« %d! = %.0f\n », N, FACT);

return 0;

}

Exercice 15:

Calculez par multiplications successives XN de deux entiers naturels X et N entrés au clavier.

Solution exercice 15 :

#include <stdio.h>

main()

{

int  X, N;   /* Les données */

int  I;      /* Le compteur */

double RESU; /* Type double à cause de la */

/* grandeur du résultat.     */

 do

    {

printf(« Entrez l’entier naturel X : « );

scanf(« %d », &X);

    }

 while (X<0);

 do

    {

printf(« Entrez l’exposant       N : « );

scanf(« %d », &N);

    }

 while (N<0);

/* Pour N=0, le résultat sera automatiquement X^0=1 */

 for (RESU=1.0, I=1 ; I<=N ; I++)

        RESU*=X;

/* Attention: Pour X=0 et N=0 , 0^0 n’est pas défini */

 if (N==0 && X==0)

     printf(« zéro exposant zéro n’est pas défini !\n »);

 else

     printf(« Résultat : %d ^ %d = %.0f\n », X, N, RESU);

return 0;

}

Exercice 16:

Calculez la somme des N premiers termes de la série harmonique :

1 + 1/2 + 1/3 + … + 1/N

Solution exercice 16 :

#include <stdio.h>

main()

{

int N;     /* nombre de termes à calculer */

int I;     /* compteur pour la boucle */

float SOM; /* Type float à cause de la précision du résultat.   */

 do

   {

printf (« Nombre de termes: « );

scanf (« %d », &N);

   }

 while (N<1);

 for (SOM=0.0, I=1 ; I<=N ; I++)

    SOM += (float)1/I;

printf(« La somme des %d premiers termes est %f \n », N, SOM);

return 0;

}

Exercice 17:

Calculez la somme, le produit et la moyenne d’une suite de chiffres non nuls entrés au clavier, sachant que la suite est terminée par zéro. Retenez seulement les chiffres (0, 1 … 9) lors de l’entrée des données et effectuez un signal sonore si les données sortent de ce domaine.

Solution exercice 17 :

#include <stdio.h>

main()

{

int  X;      /* Le chiffre courant      */

int  N=0;    /* Le compteur des données */

int  SOM=0;  /* La somme actuelle       */

long PROD=1; /* Le produit actuel  –  Type long à */

/* cause de la grandeur du résultat. */

*/

 do

    {

/* Saisie des données (pour perfectionnistes) */

printf(« Entrez le %d%s chiffre : « , (N+1), (N)? »e »: »er »);

scanf(« %d », &X);

     if (X<0||X>9)

        printf(« \a »);

     else if (X)

        {

         N++;

         SOM+=X;

         PROD*=X;

        }

     else if (!X && N>0)

{/* Seulement si au moins un chiffre a été accepté */

printf(« La somme   des chiffres est %d \n », SOM);

printf(« Le produit des chiffres est %ld\n », PROD);

printf(« La moyenne des chiffres est %f \n », (float)SOM/N);

}

    }

 while (X);

return 0;

}

Exercice 18:

Calculez le nombre lu à rebours d’un nombre positif entré au clavier en supposant que le fichier d’entrée standard contient une suite de chiffres non nuls, terminée par zéro (Contrôlez s’il s’agit vraiment de chiffres). Exemple: Entrée: 1 2 3 4 0 Affichage: 4321

Solution exercice 18:

#include <stdio.h>

main()

{

int  X;       /* Le chiffre courant        */

int  N=0;     /* Le compteur des décimales */

long VALD=1;  /* Valeur de la position décimale courante */

long NOMB=0;  /* Le nombre résultat                      */

 do

    {

printf(« Entrez le %d%s chiffre : « , (N+1), (N)? »e »: »er »);

scanf(« %d », &X);

     if (X<0||X>9)

        printf(« \a »);

     else if (X)

        {

         NOMB += VALD*X;

         N++;

         VALD *= 10;

        }

     else

        printf(« La valeur du nombre renversé est %ld\n », NOMB);

    }

 while (X);

return 0;

}

Exercice 19:

Calculez le nombre lu à rebours d’un nombre positif entré au clavier en supposant que le fichier d’entrée standard contient le nombre à inverser. Exemple: Entrée: 1234 Affichage: 4321

Solution exercice 19 :

#include <stdio.h>

main()

{

int  NOMB;   /* Le nombre à inverser */

int  NINV;   /* Le nombre inversé    */

/* Attention: en utilisant le type int, il est impossible */

/* d’inverser correctement des nombres comme 10033 …    */

 do

   {

printf(« Entrez un nombre positif (<10000) : « , NOMB);

scanf(« %d », &NOMB);

   }

 while (NOMB<0 || NOMB>9999);

 NINV=0;

 while(NOMB>0)

    {

     NINV *= 10;

     NINV += NOMB%10;

     NOMB /= 10;

    }

/* Autre possibilité : */

/* for (NINV=0 ; NOMB>0 ; NOMB/=10)

        NINV = NINV*10 + NOMB%10;

*/

printf(« Le nombre ‘inversé’ est : %d\n », NINV);

return 0;

}

Exercice 20:

Calculez le P.G.C.D. de deux entiers naturels entrés au clavier en utilisant l’algorithme d’EUCLIDE.

Solution exercice 20:

#include <stdio.h>

main()

{

int A, B;         /* données */

int X, Y, RESTE;  /* var. d’aide pour l’algorithme d’Euclide */

 do

    {

printf(« Entrer l’entier A (non nul) : « );

scanf(« %d », &A);

    }

 while(!A);

 do

    {

printf(« Entrer l’entier B (non nul) : « );

scanf(« %d », &B);

    }

 while(!B);

 for (RESTE=A, X=A, Y=B ; RESTE ; X=Y, Y=RESTE)

      RESTE = X%Y;

printf(« Le PGCD de %d et de %d est %d\n », A, B, X);

return 0;

}

 

Les tableaux en langage C

Exercice 20:

Ecrire un programme en langage C qui lit la dimension N d’un tableau T du type int(dimension maximale: 50 composantes), remplit le tableau par des valeurs entrées au clavier et affiche le tableau.

Calculer et afficher ensuite la somme des éléments du tableau.

Solution exercice 20 :

#include <stdio.h>

main()

{

/* Déclarations */

int T[50]; /* tableau donné  */

int N;     /* dimension      */

int I;     /* indice courant */

long SOM;  /* somme des éléments – type long à cause */

/* de la grandeur prévisible du résultat. */

/* Saisie des données */

printf(« Dimension du tableau (max.50) : « );

scanf(« %d », &N );

 for (I=0; I<N; I++)

    {

     printf(« Elément %d : « , I);

     scanf(« %d », &T[I]);

    }

/* Affichage du tableau */

printf(« Tableau donné :\n »);

 for (I=0; I<N; I++)

     printf(« %d « , T[I]);

 printf(« \n »);

/* Calcul de la somme */

 for (SOM=0, I=0; I<N; I++)

     SOM += T[I];

/* Edition du résultat */

printf(« Somme de éléments : %ld\n », SOM);

return 0;

}

Exercice 21:

Ecrire un programme en langage C qui lit la dimension N d’un tableau T du type int(dimension maximale: 50 composantes), remplit le tableau par des valeurs entrées au clavier et affiche le tableau.

Effacer ensuite toutes les occurrences de la valeur 0 dans le tableau T et tasser les éléments restants. Afficher le tableau résultant.

Solution exercice 21 :

#include <stdio.h>

main()

{

/* Déclarations */

int T[50]; /* tableau donné    */

int N;     /* dimension        */

int I,J;   /* indices courants */

/* Saisie des données */

printf(« Dimension du tableau (max.50) : « );

scanf(« %d », &N );

for (I=0; I<N; I++)

{

printf(« Elément %d : « , I);

scanf(« %d », &T[I]);

}

/* Affichage du tableau */

printf(« Tableau donné : \n »);

for (I=0; I<N; I++)

printf(« %d « , T[I]);

printf(« \n »);

 /* Effacer les zéros et comprimer :        */

 /* Copier tous les éléments de I vers J et */

 /* augmenter J pour les éléments non nuls. */

 for (I=0, J=0 ; I<N ; I++)

     {

      T[J] = T[I];

      if (T[I]) J++;

     }

 /* Nouvelle dimension du tableau ! */

 N = J;

/* Edition des résultats */

printf(« Tableau résultat :\n »);

for (I=0; I<N; I++)

printf(« %d « , T[I]);

printf(« \n »);

return 0;

}

Exercice 22:

Ecrire un programme en langage C  qui lit la dimension N d’un tableau T du type int(dimension maximale: 50 composantes), remplit le tableau par des valeurs entrées au clavier et affiche le tableau.

Ranger ensuite les éléments du tableau T dans l’ordre inverse sans utiliser de tableau d’aide. Afficher le tableau résultant.

Idée: Echanger les éléments du tableau à l’aide de deux indices qui parcourent le tableau en commençant respectivement au début et à la fin du tableau et qui se rencontrent en son milieu.

Solution exercice 22 :

#include <stdio.h>

main()

{

/* Déclarations */

int T[50]; /* tableau donné */

int N;     /* dimension     */

int I,J;   /* indices courants */

int AIDE;  /* pour l’échange   */

/* Saisie des données */

printf(« Dimension du tableau (max.50) : « );

scanf(« %d », &N );

for (I=0; I<N; I++)

{

printf(« Elément %d : « , I);

scanf(« %d », &T[I]);

}

/* Affichage du tableau */

printf(« Tableau donné : \n »);

for (I=0; I<N; I++)

printf(« %d « , T[I]);

printf(« \n »);

 /* Inverser le tableau */

 for (I=0, J=N-1 ; I<J ; I++,J–)

      /* Echange de T[I] et T[J] */

        {

         AIDE = T[I];

         T[I] = T[J];

         T[J] = AIDE;

        }

/* Edition des résultats */

printf(« Tableau résultat :\n »);

for (I=0; I<N; I++)

printf(« %d « , T[I]);

printf(« \n »);

return 0;

}

Exercice 23:

Ecrire un programme en langage C qui lit la dimension N d’un tableau T du type int(dimension maximale: 50 composantes), remplit le tableau par des valeurs entrées au clavier et affiche le tableau.

Copiez ensuite toutes les composantes strictement positives dans un deuxième tableau TPOS et toutes les valeurs strictement négatives dans un troisième tableau TNEG. Afficher les tableaux TPOS et TNEG.

Solution exercice 23 :

#include <stdio.h>

main()

{

/* Déclarations */

/* Les tableaux et leurs dimensions */

int T[50], TPOS[50], TNEG[50];

int N,     NPOS,     NNEG;

int I; /* indice courant */

/* Saisie des données */

printf(« Dimension du tableau (max.50) : « );

scanf(« %d », &N );

for (I=0; I<N; I++)

{

printf(« Elément %d : « , I);

scanf(« %d », &T[I]);

}

/* Affichage du tableau */

printf(« Tableau donné :\n »);

for (I=0; I<N; I++)

printf(« %d « , T[I]);

printf(« \n »);

 /* Initialisation des dimensions de TPOS et TNEG */

 NPOS=0;

 NNEG=0;

 /* Transfer des données */

 for (I=0; I<N; I++)

      { if (T[I]>0) {

                     TPOS[NPOS]=T[I];

                     NPOS++;

                    }

        if (T[I]<0) {

                     TNEG[NNEG]=T[I];

                     NNEG++;

                    }

      }

/* Edition du résultat */

printf(« Tableau TPOS :\n »);

for (I=0; I<NPOS; I++)

printf(« %d « , TPOS[I]);

printf(« \n »);

printf(« Tableau TNEG :\n »);

for (I=0; I<NNEG; I++)

printf(« %d « , TNEG[I]);

printf(« \n »);

return 0;

}

Exercice 24:

Ecrire un programme en langage C qui lit les dimensions L et C d’un tableau T à deux dimensions du type int (dimensions maximales: 50 lignes et 50 colonnes). Remplir le tableau par des valeurs entrées au clavier et afficher le tableau ainsi que la somme de tous ses éléments.

Solution exercice 24 :

#include <stdio.h>

main()

{

/* Déclarations */

int T[50][50]; /* tableau donné */

int L, C;  /* dimensions        */

int I, J;  /* indices courants  */

long SOM;  /* somme des éléments – type long à cause */

/* de la grandeur prévisible du résultat. */

/* Saisie des données */

printf(« Nombre de lignes   (max.50) : « );

scanf(« %d », &L );

printf(« Nombre de colonnes (max.50) : « );

scanf(« %d », &C );

 for (I=0; I<L; I++)

    for (J=0; J<C; J++)

        {

         printf(« Elément[%d][%d] : « ,I,J);

         scanf(« %d », &T[I][J]);

        }

/* Affichage du tableau */

printf(« Tableau donné :\n »);

 for (I=0; I<L; I++)

    {

     for (J=0; J<C; J++)

         printf(« %7d », T[I][J]);

     printf(« \n »);

    }

/* Calcul de la somme  */

 for (SOM=0, I=0; I<L; I++)

     for (J=0; J<C; J++)

         SOM += T[I][J];

/* Edition du résultat */

printf(« Somme des éléments : %ld\n », SOM);

return 0;

}

Exercice 25:

Ecrire un programme en langage C qui lit les dimensions L et C d’un tableau T à deux dimensions du type int (dimensions maximales: 50 lignes et 50 colonnes). Remplir le tableau par des valeurs entrées au clavier et afficher le tableau ainsi que la somme de chaque ligne et de chaque colonne en n’utilisant qu’une variable d’aide pour la somme.

Solution exercice 25 :

#include <stdio.h>

main()

{

/* Déclarations */

int T[50][50]; /* tableau donné    */

int L, C;      /* dimensions       */

int I, J;      /* indices courants */

long SOM;  /* somme des éléments – type long à cause   */

/* de la grandeur prévisible des résultats. */

/* Saisie des données */

printf(« Nombre de lignes   (max.50) : « );

scanf(« %d », &L );

printf(« Nombre de colonnes (max.50) : « );

scanf(« %d », &C );

for (I=0; I<L; I++)

for (J=0; J<C; J++)

{

printf(« Elément[%d][%d] : « ,I,J);

scanf(« %d », &T[I][J]);

}

/* Affichage du tableau */

printf(« Tableau donné :\n »);

for (I=0; I<L; I++)

{

for (J=0; J<C; J++)

printf(« %7d », T[I][J]);

printf(« \n »);

}

 /* Calcul et affichage de la somme des lignes */

 for (I=0; I<L; I++)

     {

      for (SOM=0, J=0; J<C; J++)

             SOM += T[I][J];

      printf(« Somme – ligne %d : %ld\n »,I,SOM);

     }

 /* Calcul et affichage de la somme des colonnes */

 for (J=0; J<C; J++)

     {

      for (SOM=0, I=0; I<L; I++)

             SOM += T[I][J];

      printf(« Somme – colonne %d : %ld\n »,J,SOM);

     }

return 0;

}

Exercice 26:

Ecrire un programme en langage C qui transfère un tableau M à deux dimensions L et C (dimensions maximales: 10 lignes et 10 colonnes) dans un tableau V à une dimension L*C.

Exemple:

     /         \

   | a b c d |             /                                \

   |  e f g h |  ==>   | a b c d e f g h i j k l |

    | i j k l  |               \                                 /

     \         /

Solution exercice 26 :

#include <stdio.h>

main()

{

/* Déclarations */

int M[10][10]; /* tableau à 2 dimensions */

int V[100];    /* tableau à 1 dimension  */

int L, C;      /* dimensions       */

int I, J;      /* indices courants */

/* Saisie des données */

printf(« Nombre de lignes   (max.10) : « );

scanf(« %d », &L );

printf(« Nombre de colonnes (max.10) : « );

scanf(« %d », &C );

for (I=0; I<L; I++)

for (J=0; J<C; J++)

{

printf(« Elément[%d][%d] : « ,I,J);

scanf(« %d », &M[I][J]);

}

/* Affichage du tableau 2-dim */

printf(« Tableau donné :\n »);

for (I=0; I<L; I++)

{

for (J=0; J<C; J++)

printf(« %7d », M[I][J]);

printf(« \n »);

}

 /* Transfer des éléments ligne par ligne */

 for (I=0; I<L; I++)

      for (J=0; J<C; J++)

             V[I*C+J] = M[I][J];

/* Affichage du tableau 1-dim */

printf(« Tableau résultat : « );

for (I=0; I<L*C; I++)

printf(« %d « , V[I]);

printf(« \n »);

return 0;

}

Exercice 27:

Ecrire un programme en langage C qui calcule le produit scalaire de deux vecteurs d’entiers U et V (de même dimension).

Exemple:

   /          \   /          \

   | 3  2  -4 | * | 2  -3  5 | = 3*2+2*(-3)+(-4)*5 = -20

   \          /   \          /

Solution exercice 27 :

#include <stdio.h>

main()

{

/* Déclarations */

int U[50], V[50]; /* tableaux donnés */

int N;     /* dimension        */

int I;     /* indice courant   */

long PS;   /* produit scalaire */

/* Saisie des données */

printf(« Dimension des tableaux (max.50) : « );

scanf(« %d », &N );

printf(« ** Premier tableau **\n »);

for (I=0; I<N; I++)

{

printf(« Elément %d : « , I);

scanf(« %d », &U[I]);

}

printf(« ** Deuxième tableau **\n »);

for (I=0; I<N; I++)

{

printf(« Elément %d : « , I);

scanf(« %d », &V[I]);

}

 /* Calcul du produit scalaire */

 for (PS=0, I=0; I<N; I++)

      PS += (long)U[I]*V[I];

/* Edition du résultat */

printf(« Produit scalaire : %ld\n », PS);

return 0;

}

Exercice 28:

Ecrire un programme en langage C qui détermine la plus grande et la plus petite valeur dans un tableau d’entiers A. Afficher ensuite la valeur et la position du maximum et du minimum. Si le tableau contient plusieurs maxima ou minima, le programme retiendra la position du premier maximum ou minimum rencontré.

Solution exercice 28 :

#include <stdio.h>

main()

{

/* Déclarations */

int A[50]; /* tableau donné  */

int N;     /* dimension      */

int I;     /* indice courant */

int MIN;   /* position du minimum */

int MAX;   /* position du maximum */

/* Saisie des données */

printf(« Dimension du tableau (max.50) : « );

scanf(« %d », &N );

for (I=0; I<N; I++)

{

printf(« Elément %d : « , I);

scanf(« %d », &A[I]);

}

Les chaines de caractères en langage C

Exercice 29 :

Ecrire un programme en langage C qui lit 5 mots, séparés par des espaces et qui les affiche ensuite dans une ligne, mais dans l’ordre inverse. Les mots sont mémorisés dans 5 variables M1, … ,M5.

Exemple

   voici une petite phrase !

   ! phrase petite une voici

Solution exercice 29 :

#include <stdio.h>

main()

{

char M1[30], M2[30], M3[30], M4[30], M5[30];

printf(« Entrez 5 mots, séparés par des espaces :\n »);

 scanf (« %s %s %s %s %s »,  M1, M2, M3, M4, M5);

 printf(« %s %s %s %s %s\n »,M5, M4, M3, M2, M1);

return 0;

}

Exercice 30 :

Ecrire un programme en langage C qui lit une ligne de texte (ne dépassant pas 200 caractères) la mémorise dans une variable TXT et affiche ensuite:

  1. a)la longueur L de la chaîne.
  2. b)le nombre de ‘e’contenus dans le texte.
  3. c)toute la phrase à rebours, sans changer le contenu de la
    variable TXT.
  4. d)toute la phrase à rebours, après avoir inversé l’ordre des
    caractères dans TXT:

            voici une petite phrase !

            ! esarhp etitep enu iciov

Solution exercice 30:

#include <stdio.h>

main()

{

/* Déclarations */

char TXT[201]; /* chaîne donnée       */

int I,J;  /* indices courants         */

int L;    /* longueur de la chaîne    */

int C;    /* compteur des lettres ‘e’ */

int AIDE; /* pour l’échange des caractères */

/* Saisie des données */

printf(« Entrez une ligne de texte (max.200 caractères) :\n »);

gets(TXT); /* L’utilisation de scanf est impossible pour */

/* lire une phrase contenant un nombre variable de mots. */

 /* a) Compter les caractères */

 /* 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);

 /* c) Afficher la phrase à l’envers */

 for (I=L-1; I>=0; I–)

     putchar(TXT[I]);  /* ou printf(« %c »,TXT[I]); */

 putchar(‘\n’);        /* ou printf(« \n »); */

 /* d) Inverser l’ordre des caractères */

 for (I=0,J=L-1 ; I<J ; I++,J–)

    {

     AIDE=TXT[I];

     TXT[I]=TXT[J];

     TXT[J]=AIDE;

    }

 puts(TXT);  /* ou printf(« %s\n »,TXT); */

return 0;

}

Exercice 31 :

Ecrire un programme en langage C qui lit un texte TXT (de moins de 200 caractères) et qui enlève toutes les apparitions du charactère ‘e’ en tassant les éléments restants. Les modifications se feront dans la même variable TXT.

Exemple:

   Cette ligne contient quelques lettres e.

   Ctt lign contint qulqus lttrs .

Solution exercice 31 :

#include <stdio.h>

main()

{

/* Déclarations */

char TXT[201]; /* chaîne donnée    */

int  I,J;      /* indices courants */

/* Saisie des données */

printf(« Entrez une ligne de texte (max.200 caractères) :\n »);

 gets(TXT);

 /* Eliminer les lettres ‘e’ et comprimer :  */

 /* Copier les caractères de I vers J et incrémenter J */

 /* seulement pour les caractères différents de ‘e’.   */

 for (J=0,I=0 ; TXT[I] ; I++)

    {

     TXT[J] = TXT[I];

     if (TXT[I] != ‘e’) J++;

    }

 /* Terminer la chaîne !! */

 TXT[J]=’\0′;

/* Edition du résultat */

 puts(TXT);

return 0;

}

Exercice 32 :

Ecrire un programme en langage C qui demande l’introduction du nom et du prénom de l’utilisateur et qui affiche alors la longueur totale du nom sans compter les espaces. Employer la fonction strlen.

Solution exercice 32 :

#include <stdio.h>

#include <string.h>

main()

{

char NOM[40], PRENOM[40];

printf(« Introduisez 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));

/* ou bien

printf(« Votre nom est composé de %d lettres.\n »,

                                  strlen(strcat(NOM,PRENOM)));

*/

return 0;

}

Exercice 33 :

Ecrire un programme en langage C qui lit un verbe régulier en « er » au clavier et qui en affiche la conjugaison au présent de l’indicatif de ce verbe. Contrôlez s’il s’agit bien d’un verbe en « er » avant de conjuguer. Utiliser les fonctions getsputsstrcat et strlen.

Solution exercice 33:

#include <stdio.h>

#include <string.h>

main()

{

/* Déclarations */

char VERB[20]; /* chaîne contenant le verbe */

char AFFI[30]; /* chaîne pour l’affichage   */

int L;         /* longueur de la chaîne     */

/* Saisie des données */

printf(« Verbe : « );

gets(VERB);

 /* Contrôler s’il s’agit d’un verbe en ‘er’ */

 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);

     }

return 0;

}

Exercice 34 :

Ecrire un programme en langage C qui lit deux chaînes de caractères CH1 et CH2 et qui copie la première moitié de CH1 et la première moitié de CH2 dans une troisième chaîne CH3. Afficher le résultat.

  1. a)Utiliser les fonctions spéciales de <string>.
  2. b)Utiliser uniquement les fonctions getset puts.

Solution exercice 34:

  1. a)Utiliser les fonctions spéciales de <string>.

#include <stdio.h>

#include <string.h>

main()

{

/* Déclarations */

char CH1[100], CH2[100]; /* chaînes données */

char CH3[100]= » »;        /* chaîne résultat */

/* Saisie des données */

printf(« Introduisez la première chaîne de caractères : « );

gets(CH1);

printf(« Introduisez la deuxième chaîne de caractères : « );

gets(CH2);

 /* Traitements */

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

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

/* Affichage du résultat */

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

return 0;

}

  1. b)Utiliser uniquement les fonctions getset puts.

#include <stdio.h>

main()

{

/* Déclarations */

char CH1[100], CH2[100]; /* chaînes données  */

char CH3[100]= » »;        /* chaîne résultat  */

int L1,L2; /* longueurs de CH1 et CH2        */

int I;     /* indice courant dans CH1 et CH2 */

int J;     /* indice courant dans CH3        */

/* Saisie des données */

puts(« Introduisez la première chaîne de caractères : « );

gets(CH1);

puts(« Introduisez la deuxième chaîne de caractères : « );

gets(CH2);

 /* Détermination les longueurs de CH1 et CH2 */

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

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

 /* Copier la première moitié de CH1 vers CH3 */

 for (I=0 ; I<(L1/2) ; I++)

     CH3[I]=CH1[I];

 /* Copier la première moitié de CH2 vers CH3 */

 J=I;

 for (I=0 ; I<(L2/2) ; I++)

    {

     CH3[J]=CH2[I];

     J++;

    }

 /* Terminer la chaîne CH3 */

 CH3[J]=’\0′;

/* Affichage du résultat */

puts(« Chaîne résultat : « );

puts(CH3);

return 0;
}

 

Les pointeurs en langage C

Exercice 35 :

Soit P un pointeur qui ‘pointe’ sur un tableau A:

   int A[] = {12, 23, 34, 45, 56, 67, 78, 89, 90};

   int *P;

   P = A;

Quelles valeurs ou adresses fournissent ces expressions:

  1. a)                 *P+2          
  2. b)                 *(P+2)       
  3. c)                 &P+1         
  4. d)                 &A[4]-3     
  5. e)                 A+3            
  6. f)                  &A[7]-P     
  7. g)                 P+(*P-10) 
  8. h)                 *(P+*(P+8)-A[7])         

Solution exercice 35:

Soit P un pointeur qui ‘pointe’ sur un tableau A:

int A[] = {12, 23, 34, 45, 56, 67, 78, 89, 90};

int *P;

P = A;

Quelles valeurs ou adresses fournissent ces expressions:

a) *P+2 => la valeur 14
b) *(P+2) => la valeur 34
c) &P+1 => l’adresse du pointeur derrière le pointeur P
(rarement utilisée)
d) &A[4]-3 => l’adresse de la composante A[1]
e) A+3 => l’adresse de la composante A[3]
f) &A[7]-P => la valeur (indice) 7
g) P+(*P-10) => l’adresse de la composante A[2]
h) *(P+*(P+8)-A[7]) => la valeur 23

Exercice 36 :

Ecrire un programme en langage C qui lit un entier X et un tableau A du type int au clavier et élimine toutes les occurrences de X dans A en tassant les éléments restants. Le programme utilisera les pointeurs P1 et P2 pour parcourir le tableau.

                   

Solution exercice 36 :

#include <stdio.h>

main()

{

/* Déclarations */

int A[50];    /* tableau donné        */

int N;        /* dimension du tableau */

int X;        /* valeur à éliminer    */

int *P1, *P2; /* pointeurs d’aide     */

/* Saisie des données */

printf(« Dimension du tableau (max.50) : « );

scanf(« %d », &N );

 for (P1=A; P1<A+N; P1++)

     {

      printf(« Elément %d : « , P1-A);

      scanf(« %d », P1);

     }

printf(« Introduire l’élément X à éliminer du tableau : « );

scanf(« %d », &X );

/* Affichage du tableau */

 for (P1=A; P1<A+N; P1++)

     printf(« %d « , *P1);

printf(« \n »);

/* Effacer toutes les occurrences de X et comprimer :  */

/* Copier tous les éléments de P1 vers P2 et augmenter */

/* P2 pour tous les éléments différents de X.          */

 for (P1=P2=A; P1<A+N; P1++)

     {

      *P2 = *P1;

      if (*P2 != X)

           P2++;

     }

/* Nouvelle dimension de A */

 N = P2-A;

/* Edition du résultat */

 for (P1=A; P1<A+N; P1++)

     printf(« %d « , *P1);

printf(« \n »);

return 0;

}

Exercice 37 :

Ecrire un programme en langage C qui range les éléments d’un tableau A du type intdans l’ordre inverse. Le programme utilisera des pointeurs P1 et P2 et une variable numérique AIDE pour la permutation des éléments.

Solution exercice 37 :

#include <stdio.h>

main()

{

/* Déclarations */

int A[50];    /* tableau donné        */

int N;        /* dimension du tableau */

int AIDE;     /* pour la permutation  */

int *P1, *P2; /* pointeurs d’aide     */

/* Saisie des données */

printf(« Dimension du tableau (max.50) : « );

scanf(« %d », &N );

 for (P1=A; P1<A+N; P1++)

     {

      printf(« Elément %d : « , P1-A);

      scanf(« %d », P1);

     }

/* Affichage du tableau */

 for (P1=A; P1<A+N; P1++)

     printf(« %d « , *P1);

printf(« \n »);

/* Inverser la tableau */

 for (P1=A,P2=A+(N-1); P1<P2; P1++,P2–)

     {

      AIDE = *P1;

      *P1  = *P2;

      *P2  = AIDE;

     }

/* Edition du résultat */

 for (P1=A; P1<A+N; P1++)

      printf(« %d « , *P1);

printf(« \n »);

return 0;

}

Exercice 38 :

Ecrire un programme en langage C qui lit deux tableaux d’entiers A et B et leurs dimensions N et M au clavier et qui ajoute les éléments de B à la fin de A. Utiliser deux pointeurs PA et PB pour le transfer et afficher le tableau résultant A.

Solution exercice 38:

#include <stdio.h>

main()

{

/* Déclarations */

int A[100], B[50]; /* tableaux */

int N, M;    /* dimensions des tableaux */

int *PA,*PB; /* pointeurs d’aide        */

/* Saisie des données */

printf(« Dimension du tableau A (max.50) : « );

scanf(« %d », &N );

 for (PA=A; PA<A+N; PA++)

     {

      printf(« Elément %d : « , PA-A);

      scanf(« %d », PA);

     }

printf(« Dimension du tableau B (max.50) : « );

scanf(« %d », &M );

 for (PB=B; PB<B+M; PB++)

     {

      printf(« Elément %d : « , PB-B);

      scanf(« %d », PB);

     }

/* Affichage des tableaux */

printf(« Tableau donné A :\n »);

 for (PA=A; PA<A+N; PA++)

      printf(« %d « , *PA);

printf(« \n »);

printf(« Tableau donné B :\n »);

 for (PB=B; PB<B+M; PB++)

      printf(« %d « , *PB);

printf(« \n »);

 /* Copier B à la fin de A */

 for (PA=A+N,PB=B ; PB<B+M ; PA++,PB++)

      *PA = *PB;

 /* Nouvelle dimension de A */

 N += M;

/* Edition du résultat */

printf(« Tableau résultat A :\n »);

for (PA=A; PA<A+N; PA++)

printf(« %d « , *PA);

printf(« \n »);

return 0;

}

Exercice 39 :

Ecrire de deux façons différentes, un programme en langage C  qui vérifie sans utiliser une fonction de <string>, si une chaîne CH introduite au clavier est un palindrome:

  1. a)en utilisant uniquement le formalisme tableau
  2. b)en utilisant des pointeurs au lieu des indices numériques

Rappel: Un palindrome est un mot qui reste le même qu’on le lise de gauche à droite ou de droite à gauche:

Solution exercice 39 :

  1. a)en utilisant uniquement le formalisme tableau

#include <stdio.h>

main()

{

/* Déclarations */

char CH[101]; /* chaîne donnée    */

int I,J;      /* indices courants */

 int PALI;     /* indicateur logique:          */

               /* vrai si CH est un palindrome */

/* Saisie des données */

printf(« Entrez une ligne de texte (max.100 caractères) :\n »);

gets(CH);

 /* Placer J sur la dernière lettre de la chaîne */

 for(J=0; CH[J]; J++)

     ;

 J–;

 /* Contrôler si CH est un palindrome */

 PALI=1;

 for (I=0 ; PALI && I<J ; I++,J–)

      if (CH[I] != CH[J])

          PALI=0;

/* Affichage du résultat */

if (PALI)

printf(« La chaîne \ »%s\ » est un palindrome.\n », CH);

else

printf(« La chaîne \ »%s\ » n’est pas un palindrome.\n », CH);

return 0;

}

  1. b)en utilisant des pointeurs au lieu des indices numériques :

#include <stdio.h>

main()

{

/* Déclarations */

char CH[101];  /* chaîne donnée    */

 char *P1,*P2;  /* pointeurs d’aide */

int PALI;  /* indicateur logique:          */

/* vrai si CH est un palindrome */

/* Saisie des données */

printf(« Entrez une ligne de texte (max.100 caractères) :\n »);

gets(CH);

 /* Placer P2 sur la dernière lettre de la chaîne */

 for (P2=CH; *P2; P2++)

      ;

 P2–;

 /* Contrôler si CH est un palindrome */

 PALI=1;

 for (P1=CH ; PALI && P1<P2 ; P1++,P2–)

      if (*P1 != *P2) PALI=0;

/* Affichage du résultat */

if (PALI)

printf(« La chaîne \ »%s\ » est un palindrome.\n », CH);

else

printf(« La chaîne \ »%s\ » n’est pas un palindrome.\n », CH);

return 0;

}

Exercice 40 :

Ecrire un programme en langage C qui lit une chaîne de caractères CH et détermine la longueur de la chaîne à l’aide d’un pointeur P. Le programme n’utilisera pas de variables numériques.

Solution exercice 40 :

#include <stdio.h>

main()

{

/* Déclarations */

char CH[101];  /* chaîne donnée   */

char *P;       /* pointeur d’aide */

/* Saisie des données */

printf(« Entrez une ligne de texte (max.100 caractères) :\n »);

gets(CH);

 /* Placer P à la fin de la chaîne */

 for (P=CH; *P; P++)

      ;

/* Affichage du résultat */

printf(« La chaîne \ »%s\ » est formée de %d caractères.\n »,

CH, P-CH);

return 0;

}

4.5 2 votes
Évaluation de l'article
S’abonner
Notification pour

0 Commentaires
Commentaires en ligne
Afficher tous les commentaires
Bouton retour en haut de la page
0
Nous aimerions avoir votre avis, veuillez laisser un commentaire.x