Exercices en langage C by pawre12

VIEWS: 16 PAGES: 245

									Exercices en langage C

    C. Delannoy
2                        angage C
         Exe rcice s e n l




                                                     PREM I         E
                                                           ERE PARTI :

                                             EXERCI           I   O
                                                   CES D 'APPLCATI N




    t                  ie ous                                                               a
Ce t e pre m iè re part v propose des exercices, à ré s oudre , de préfé re nce , pe ndant l ph ase d'étude du l angage C l ui-
m ê m e . El é pous e l st ure d'un cours "cl
              le          a ruct                    assique"1, sous l form e de 7 ch apit s : t
                                                                    a                      re                           e
                                                                                                 ypes de bas e , opé rat urs e t
                 e ré         ie     e
e xpre s s ions ; nt e s -sort s conv rsationne l s ; ruct
                                                l inst ions de cont e ;e s fonct
                                                 e                      rôl l                  l abl             e        e
                                                                                         ions ;e s t e aux e t ls point urs ;
 e         nes          è       l ruct
ls ch aî de caract re s ;e s s t ure s .

                re       e
Ch aq ue ch apit com port :

                          icat            e    iné      it 'assim il ion du cours corre s pondant
    - des exe rcices d'appl ion im m édiat dest s à facil e r l    at                            ,
                                           t gorit
                                            é                  t             re es         e
    - des exe rcice s , sans grande difficul al h m iq ue m e t ant e n oe uv l diffé re nt s notions acq uis e s au cours des
               s         re
    pré cédent ch apit s .
   e        'ut isat                            a      ion                                        t                  ie ce
Not z q ue l il ion de s fich ie rs, ainsi que l ge s t dynam iq ue ne s ont pas abordés dans ce t e pre m iè re part ; s
          s                'obj              re              a                ie   'ouv
deux point fe ront ch acun l e t d'un ch apit approprié dans l s e conde part de l rage .




1 Un t cours v
      el                                   e,                                                                               et
              ous e s t proposé, par exem pl dans "Apprendre à program m er en Turbo C" ou dans "C norm e ANSI - Guide com pl de
program m ation" du m ê m e aut        em
                               eur, égal ent aux édit         l
                                                     ions Eyroles.
                                                I : TYPES D E BASE,
                                                    O PERA TEURS
                                                 ET EXPRESSI NSO




                                                        Exe rcice I.1

___________________________________________________________________________

Enoncé

 im      e         h                ues    e                      ant
El ine r ls pare nt è s e s s upe rfl dans ls e xpre s s ions suiv e s :

   a = (x+5)                    /*   expression     1   */
   a = (x=y) + 2                /*   expression     2   */
   a = (x==y)                   /*   expression     3   */
   (a<b) && (c<d)               /*   expression     4   */
   (i++) * (n+p)                /*   expression     5   */

___________________________________________________________________________


  ut
Sol ion


   a = x+5                      /* expression 1 */

L        e
 'opé rat ur + e s t priorit          'opé e            at
                            aire s ur l rat ur d'affe ct ion =.

   a = (x=y) + 2                /* expression 2 */

     'opé e        ant
Ici, l rat ur + é t priorit             e         h                         e
                           aire s ur =, ls pare nt è s e s s ont indispensabls .

   a = x==y                     /* expression 3 */
4                           angage C
            Exe rcice s e n l

L        e
 'opé rat ur == e s t prioritaire s ur =.

    a<b && c<d                    /* expression 4 */

L        e
 'opé rat ur & & e s t priorit          'opé e
                              aire s ur l rat ur < .

    i++ * (n+p)                   /* expression 5 */

L         e
 'opé rat ur + + e s t priorit            e
                              aire s ur *; n re vanch e , *e s t priorit             de   e                  im      es
                                                                        aire s ur + ; sort q u'on ne pe ut é l ine r l derniè re s
       h
pare nt è s e s .




                                                       Exe rcice I.2

___________________________________________________________________________

Enoncé

        es   arat
Soie nt l décl ions :

    char c = '\x01' ;
    short int p = 10 ;

   s      e ype e t l v e ur de ch acune d e s e xpre s s ions suiv e s :
Quel sont l t       a al                                           ant

    p   +   3                 /* 1 */
    c   +   1                 /* 2 */
    p   +   c                 /* 3 */
    3   *   p + 5 * c          /* 4 */

___________________________________________________________________________


  ut
Sol ion

                             a     e           é    iq
1) p e s t d'abord soum is à l conv rsion "syst m at ue " sh ort -> int av d'ê t aj é à l v e ur 3 (int L ré s ul 13
                                                                       , ant    re out  a al           ). e     tat
e s t de type int.

                             a     e           é
2) c e s t d'abord soum is à l conv rsion "syst m at ue " ch ar -> int (ce q ui about à l v e ur 1), av d'ê t aj é à l
                                                    iq                               it a al           ant   re out  a
 al            ). e      tat
v e ur 1 (int L ré s ul 2 e s t de t ype int.
                                                                                                   e
                                                                       I. Types de base, opérat urs e t e xpre s s ions     5
                             a     e          é     iq
3) p e s t d'abord soum is à l conv rsion syst m at ue sh ort -> int t
                                                                    , andis q ue c e s t soum is à l conv rsion syst m at ue
                                                                                                    a    e            é  iq
                l       tat
ch ar -> int ;e s ré s ul s sont al addit
                                  ors                        ir a al
                                           ionné s pour about à l v e ur 11 de t ype int   .

                                          e           é    iq
4) p e t c sont d'abord aux m ê m e s conv rsions syst m at ue s q ue ci-de s s us ;e ré s ul 35 e s t de t
                                                                                    l       tat            ype int.




                                                        Exe rcice I.3

___________________________________________________________________________

Enoncé

        es   arat
Soie nt l décl ions :

   char c = '\x05' ;
   int n = 5 ;
   long p = 1000 ;
   float x = 1.25 ;
   double z = 5.5 ;

   s      e ype e t l v e ur de ch acune d e s e xpre s s ions suiv e s :
Quel sont l t       a al                                           ant

   n + c + p                        /*   1   */
   2 * x + c                        /*   2   */
   (char) n + c                     /*   3   */
   (float) z + n / 2                /*   4   */

___________________________________________________________________________



  ut
Sol ion

            out          e i        , ant    re out         e     t
1) c e s t t d'abord conv rt e n int av d'ê t aj é à n. L ré s ul (10), de t
                                                                   at              ,       ors   e i     ong, av
                                                                            ype int e s t al conv rt e n l      ant
     re out             ie        e     a al
d'ê t aj é à p. O n obt nt finalm e nt l v e ur 1010, de t    ong.
                                                          ype l

          al             a al            x,
2) O n é v ue d'abord l v e ur de 2* e n conv rt     e issant 2 (int e n f oat ce q ui fournit l v e ur 2.5 (de t
                                                                    )     l ,                  a al                   l ).
                                                                                                                 ype f oat Par
   l
   e                 e i               e           é
ail urs, c e s t conv rt e n int (conv rsion syst m at ue ). O n é v ue e nsuit l v e ur de 2* e n conv rt
                                                        iq            al        e a al            x,                        )
                                                                                                             e issant 2 (int e n
 l ,                   a al
f oat ce q ui fournit l v e ur 2.5 (de t    ype f oat Pour e ffe ct r l
                                                 l ).              ue 'addit               e it ors a al           iè
                                                                              ion, on conv rt al l v e ur e nt re 5 (c) e n
 l , ant          'aj e            tat
f oat av de l out r au ré s ul pré cédent O n obt nt finalm e nt l v e ur 7.75, de t
                                                 .         ie      e       a al                    l .
                                                                                              ype f oat
6         Exe rcice s e n langage C
3) n e s t t                    e i                       'opé e
             out d'abord conv rt e n ch ar (à cause de l rat ur de "cast t                                     e i      e
                                                                                    "), andis q ue c e s t conv rt (conv rsion
    é     iq             .
syst m at ue ) e n int Puis, pour procéder à l  'addit                                      e ir a al
                                                      ion, ile s t né ce s s aire de re conv rt l v e ur de (ch ar) n e n int.
      e       ,        ie a al
Finalm e nt on obt nt l v e ur 10, de t  ype int.

                        e i     l ,                   a al                    iv                ,        ie       al
4) z e s t d'abord conv rt e n f oat ce q ui fournit l v e ur 5.5 (approxim at e , car, e n fait on obt nt une v e ur un pe u
                          e                              e         l
                                                                   e                    a
m oins précise que ne l s e rait 5.5 e xprim é e n doubl). Par ail urs, on procè de à l div             iè
                                                                                              ision e nt re de n par 2, ce q ui
           a al        iè          t
fournit l v e ur e nt re 2. Ce t e derniè re e s t e nsuit conv rt e n f oat av d'ê t aj é e à 5.5, ce q ui fournit l
                                                           e    e ie     l , ant           re out                             e
      tat
ré s ul 7.5, de t       l .
                   ype f oat


R e m arque :

          a
   D ans l pre m iè re définit                            ch
                              ion de K e rnigh an e t R it ie , ls v e urs de t
                                                                e al                l       aie , l  e
                                                                               ype f oat é t nt e l s aussi, soum ises à une
        e           é   iq            e
   conv rsion syst m at ue e n doubl. Dans ce cas, ls e xpre s s ions 3 et 4 é t nt al de t
                                                          e                     aie    ors              e
                                                                                                ype doubl.




                                                        Exe rcice I.4

___________________________________________________________________________

Enoncé

        es   arat       ant
Soie nt l décl ions suiv e s :

   int n = 5, p = 9 ;
   int q ;
   float x ;

   le      a al
Quel e s t l v e ur affe ct e aux diffé re nt s v
                           é                        e                                     ruct      ant
                                             e ariabls conce rné e s par ch acune des inst ions suiv e s :

   q   =   n < p ;                        /*   1   */
   q   =   n == p ;                       /*   2   */
   q   =   p % n + p > n ;                /*   3   */
   x   =   p / n ;                        /*   4   */
   x   =   (float) p / n ;                /*   5   */
   x   =   (p + 0.5) / n ;                /*   6   */
   x   =   (int) (p + 0.5) / n ;          /*   7   */
   q   =   n * (p > n ? n : p) ;          /*   8   */
   q   =   n * (p < n ? n : p) ;          /*   9   *:

___________________________________________________________________________
                                                                                                 e
                                                                         I. Types de base, opérat urs e t e xpre s s ions   7

  ut
Sol ion

1) 1

2) 0

           aut andis q ue p> n v 1)
3) 5 (p%n v 4, t                aut

                           al         ,
4) 1 (p/n e s t d'abord é v ué e n int ce q ui fournit 1 ;     e
                                                          puis l ré s ul e s t conv rt e n f oat av d'ê t affe ct à x).
                                                                       tat         e i      l , ant      re      é

                    e i      l , ant      re  isé
5) 1.8 (p e s t conv rt e n f oat av d'ê t div par l ré s ul de l conv rsion de n en f oat
                                                   e       tat  a     e               l ).

                    e i      l , ant      re out       l       t
6) 1.9 (p e s t conv rt e n f oat av d'ê t aj é à 0.5 ;e ré s ul e s t div par l ré s ul de l conv rsion de n en
                                                                at        isé  e       tat  a     e
 l ).
f oat

                  e i      l , ant      re out       l       t
7) 1 (p e s t conv rt e n f oat av d'ê t aj é à 0.5 ;e ré s ul (5.5) e s t al conv rt e n int av d'ê t div par n).
                                                              at            ors   e i           ant   re  isé

8) 25

9 ) 45




                                                     Exe rcice I.5

___________________________________________________________________________

Enoncé

   s       tat         e                  ant
Quel ré s ul s fournit l program m e s uiv :

   #include <stdio.h>
   main ()
   {
      int i, j, n ;

         i = 0 ; n = i++ ;
         printf ("A : i = %d         n = %d \n", i, n ) ;

         i = 10 ; n = ++ i ;
         printf ("B : i = %d         n = %d \n", i, n ) ;
8                           angage C
            Exe rcice s e n l
            i = 20 ; j = 5 ; n = i++ * ++ j ;
            printf ("C : i = %d j = %d n = %d \n", i, j, n ) ;

            i = 15 ; n = i += 3 ;
            printf ("D : i = %d n = %d \n", i, n) ;

            i = 3 ; j = 5 ; n = i *= --j ;
            printf ("E : i = %d j = %d n = %d \n", i, n) ;

    }
___________________________________________________________________________


  ut
Sol ion


    A   :    i   =   1 n = 0
    B   :    i   =   11 n = 11
    C   :    i   =   21 j = 6 n = 120
    D   :    i   =   18 n = 18
    E   :    i   =   12 j = 12 n = 6



                                                   Exe rcice I.6

___________________________________________________________________________

Enoncé

   s       tat
Quel ré s ul s fournira ce program m e :

    #include <stdio.h>
    main()
    {
       int n=10, p=5, q=10, r ;

            r = n == (p = q) ;
            printf ("A : n = %d        p = %d   q = %d   r = %d\n", n, p, q, r) ;

            n = p = q = 5 ;
            n += p += q ;
            printf ("B : n = %d        p = %d   q = %d\n", n, p, q) ;
                                                                                                   e
                                                                           I. Types de base, opérat urs e t e xpre s s ions   9

           q = n < p ? n++ : p++ ;
           printf ("C : n = %d p = %d                  q = %d\n", n, p, q) ;

           q = n > p ? n++ : p++ ;
           printf ("D : n = %d p = %d                  q = %d\n", n, p, q) ;
   }
___________________________________________________________________________


  ut
Sol ion


   A   :    n   =   10   p   =   10   q   =   10   r = 1
   B   :    n   =   15   p   =   10   q   =   5
   C   :    n   =   15   p   =   11   q   =   10
   D   :    n   =   16   p   =   11   q   =   15




                                                           Exe rcice I.7

___________________________________________________________________________

Enoncé

   s       tat
Quel ré s ul s fournira ce program m e :

   #include <stdio.h>
   main()
   {
      int n, p, q ;

           n = 5 ; p = 2 ;                                                 /* cas 1 */
           q = n++ >p || p++ != 3 ;
           printf ("A : n = %d p = %d                  q = %d\n", n, p, q) ;

           n = 5 ; p = 2 ;                                                 /* cas 2 */
           q = n++<p || p++ != 3 ;
           printf ("B : n = %d p = %d                  q = %d\n", n, p, q) ;

           n = 5 ; p = 2 ;                                                 /* cas 3 */
10                            angage C
              Exe rcice s e n l
             q = ++n == 3 && ++p == 3 ;
             printf ("C : n = %d p = %d          q = %d\n", n, p, q) ;

             n = 5 ; p = 2 ;                                              /* cas 4 */
             q = ++n == 6 && ++p == 3 ;
             printf ("D : n = %d p = %d          q = %d\n", n, p, q) ;
     }
___________________________________________________________________________


  ut
Sol ion

                    ie       e       e                    al       e                             ors     a
Ilne faut pas oubl r q ue ls opé rat urs & & e t || n'é v ue nt lur de uxiè m e opé rande q ue l q ue ce l e s t né ce s s aire .
              n'e         al       e
Ainsi, ici, il s t pas é v ué dans ls cas 1 et 3. Voici ls ré s ul s fournis par l program m e :
                                                        e        tat             e

     A   :   n   =   6   p   =   2   q   =   1
     B   :   n   =   6   p   =   3   q   =   1
     C   :   n   =   6   p   =   2   q   =   0
     D   :   n   =   6   p   =   3   q   =   1
                                         I ES
                                        I : L ENTREES-SO RTIES
                                         CO NV       O    L
                                              ERSA TI NNEL ES




                                                                I
                                                     Exe rcice I.1

___________________________________________________________________________

Enoncé

   s          e        tat
Quel s e ront ls ré s ul s fournis par ce program m e :

   #include <stdio.h>
   main ()
   {   int n = 543 ;
       int p = 5 ;
       float x = 34.5678;
       printf ("A : %d %f\n", n, x) ;
       printf ("B : %4d %10f\n", n, x) ;
       printf ("C : %2d %3f\n", n, x) ;
       printf ("D : %10.3f %10.3e\n", x, x) ;
       printf ("E : %-5d %f\n", n, x) ;
       printf ("F : %*d\n", p, n) ;
       printf ("G : %*.*f\n", 12, 5, x) ;
       printf ("H : %x : %8x :\n", n, n) ;
       printf ("I : %o : %8o :\n", n, n) ;
   }
_______________________________________________________________



  ut
Sol ion

   A : 543 34.567799
   B : 543 34.567799
12                           angage C
             Exe rcice s e n l
     C   :   543 34.567799
     D   :       34.568 3.457e+01
     E   :   543    34.567799
     F   :     543
     G   :       34.56780
     H   :   21f :     21f :
     I   :   1037 :    1037 :




                                                                I
                                                     Exe rcice I.2

___________________________________________________________________________

Enoncé

   s          e        tat
Quel s e ront ls ré s ul s fournis par ce program m e :

     #include <stdio.h>
     main()
     {   char c ;
         int n ;
         c = 'S' ;
         printf ("A : %c\n", c)          ;
         n = c ;
         printf ("B : %c\n", n)          ;
         printf ("C : %d %d\n",          c, n) ;
         printf ("D : %x %x\n",          c, n) ;
     }
_______________________________________________________________


  ut
Sol ion

     A   :   S
     B   :   S
     C   :   83 83
     D   :   53 53
                                                                          e      ré        ie     e
                                                                     II. L s e nt e s -sort s conv rsat       l
                                                                                                       ionne le s   13
                                                            I
                                                 Exe rcice I.3

___________________________________________________________________________

Enoncé

   le           e al       ues
Quel s s e ront ls v e urs l dans ls v
                                  e ariabls n e t p (de t
                                         e                      ),   'inst ion  ant
                                                         ype int par l ruct suiv e :

     scanf ("%d %d", &n, &p) ;

ors        ui         es            ant
l q u'on l fournit l données suiv e s (l sym bol ^ re pré s e nt un e s pace e t l sym bol @ re pré s e nt une fin de
                                        e      e                e                e       e                e
igne       -à            al ion") :
l , c'e s t -dire une "v idat

a)
     253^45@
b)
     ^253^@
     ^^ 4 ^ 5 @
_______________________________________________________________


  ut
Sol ion

a) n = 243, p = 45

                    es               è       a
b) n = 253, p = 4 (l dernie rs caract res de l deuxiè m e l
                                                          igne pourront é v nt l m e nt ê t ut isés par une inst ion
                                                                           e ue l
                                                                                e          re il                ruct
    e ure t é
de lct ul rie ure ).



                                                            I
                                                 Exe rcice I.4

___________________________________________________________________________

Enoncé

   le           e al       ues
Quel s s e ront ls v e urs l dans ls v
                                  e ariabls n e t p (de t
                                         e                      ),   'inst ion  ant
                                                         ype int par l ruct suiv e :

     scanf ("%4d %2d", &n, &p) ;

ors        ui         es            ant
l q u'on l fournit l données suiv e s (l sym bol ^ re pré s e nt un e s pace e t l sym bol @ re pré s e nt une fin de
                                        e      e                e                e       e                e
igne       -à            al ion") :
l , c'e s t -dire une "v idat
14                        angage C
          Exe rcice s e n l
a)
     12^45@
b)
     123456@
c)
     123456^7@
d)
     1^458@
e)
     ^^^4567^^8912@

_______________________________________________________________


  ut
Sol ion

         ons      ors              ion
R appe l q ue l q u'une indicat de l                                  e     e                                                    e e
                                             ongue ur e s t pré s e nt dans l code form at fourni à scanf (com m e , par e xe m pl, l
                          e                  orat           e                                      è        é
4 de %4d), scanf int rrom pt son expl ion si l nom bre corre s pondant de caract re s a é t e xpl , sans q u'un     oré
         e                  anc") n'ait é t t
s é parat ur (ou "e s pace bl                     é        e
                                           é rouv . Not z bie n, ce pe ndant q ue ls é v nt l caract re s s é parat urs "saut s "
                                                                               ,      e     e ue s        è             e         é
           ant
auparav ne s ont pas considérés dans ce com pt . V                  e     tat    e
                                                     e oici ls ré s ul s obt nus :

a) n=12, p=45
b) n=1234, p=56
c) n=1234, p=56
d) n=1, p=45
e) n=4567, p=89
                ie              e       e                   t
En a, on obt ndrait e xact m e nt ls m ê m e s ré s ul s sans indicat
                                                             at              ion de l                     -à          e
                                                                                         ongue ur (c'e s t -dire av c %d %d). En b, e n
re vanch e , sans l         ion
                    'indicat de l    ongue ur 4, ls ré s ul s s e raie nt diffé re nt (n v
                                                    e        tat                      s     audrait 123456, t     andis q u'ilm anq ue rait des
inform at                         e
           ions pour p). En c, ls inform at      ions ^ et 7 ne s ont pas prises en com pt par scanf (e l s l s e ront é v nt l m e nt
                                                                                             e                  e
                                                                                                               l e              e ue l  e
                        e ure
par une proch aine lct !) ;              a                      ion
                                  sans l pre m iè re indicat de l      ongue ur, ls ré s ul s s e raie nt diffé re nt : 123456 pour n (e n
                                                                                    e        tat                       s
                      a                              al                   abl
supposant q ue ce l ne conduis e pas à une v e ur non re pré s e nt e dans l t                      )                           t
                                                                                         e ype int e t 7 pour p. En d, ce t e fois, c'e s t
l'indicat  ion de l                         'im
                     ongue ur 2 q ui a de l port      ance ; n son abscence, n v
                                                               e                                         iv
                                                                                         audrait e ffe ct e m e nt 1, m ais p v  audrait 458.
                   es
Enfin, e n e , l deux indicat       ions de l                           ant
                                                 ongue ur sont im port e s ;not z bie n q ue ls t
                                                                                       e                                      acé
                                                                                                        e rois e s pace s pl s av      ant lse
       è                     e                        e                acé     ant e            è
caract re s pris e n com pt pour n, ainsi que ls 2 e s pace s pl s av ls caract re s pris e n com pt pour p ne s ont pas e
         abil
com pt isés dans l l     a ongue ur im pos é e .



                                                                      I
                                                           Exe rcice I.5

___________________________________________________________________________
                                                                                   e      ré        ie     e
                                                                              II. L s e nt e s -sort s conv rsat       l
                                                                                                                ionne le s       15
Enoncé

     e                  ant
Soit l program m e s uiv :

   #include <stdio.h>
   main()
   {
      int n, p ;

         do
            { printf ("donnez 2 entiers (0 pour finir) : ") ;
              scanf("%4d%2d", &n, &p) ;
              printf ("merci pour : %d %d\n", n, p) ;
            }
         while (n) ;
   }

     s      tat            -il
Quel ré s ul s fournira-t , e n supposant q u'on l e nt l données suiv e s (at e nt
                                                       ui    re es               ant                                es
                                                                                         t ion, on supposera q ue l données
                    av         e        tat               'é                                                  re            e
sont frappé e s au cl ie r e t ls ré s ul s affich é s à l cran, ce q ui signifie q u'ily aura "m ixage " e nt ces deux sort s
d'inform ations) :

   1 2
    3
      4
   123456
   78901234 5
   6 7 8 9 10
   0
   0
   12
_______________________________________________________________



  ut
Sol ion

Ici, on re t      e e
            rouv l m é canism e l à lié     'indicat d'une l
                                                    ion                          e       e              ,
                                                            ongue ur m axim al dans l code form at com m e dans l xe rcice 'e
           .         us,         oit e
pré cédent De pl on e xpl e l fait q ue ls inform at e       ions d'une l                          é                    e ors
                                                                            igne q ui n'ont pas é t pris e s e n com pt l d'une
 e ure re s t nt disponibls pour l lct
lct           e             e           a e ure s uiv e . Enfin, rappe l q ue , t
                                                        ant                ons                                       u
                                                                                      ant q ue scanf n'a pas re ç suffisam m e nt
d'inform at              e e                    s
             ion, com pt t nu des diffé re nt code s form at spécifié s (e t non pas des v ariabls indiq ué e s ), e l e n at e nd de
                                                                                                 e                   le       t
      e l
        e
nouv l s . V    oici finalm e nt ls ré s ul s obt nus :
                         e       e        tat     e

   donnez 2 entiers (0 pour finir)
   1 2
   merci pour : 1 2
16                       angage C
         Exe rcice s e n l
     donnez 2 entiers (0 pour       finir)
       3
         4
     merci pour : 3 4
     donnez 2 entiers (0 pour       finir)
     123456
     merci pour : 1234 56
     donnez 2 entiers (0 pour       finir)
     78901234 5
     merci pour : 7890 12
     donnez 2 entiers (0 pour       finir)
     merci pour : 34 5
     donnez 2 entiers (0 pour       finir)
     6 7 8 9 10
     merci pour : 6 7
     donnez 2 entiers (0 pour       finir)
     merci pour : 8 9
     donnez 2 entiers (0 pour       finir)
     0
     merci pour : 10 0
     donnez 2 entiers (0 pour       finir)
     0
     12
     merci pour : 0 12
                                         I    ES NSTRUCTI NS
                                        II : L I            O
                                             D E CO NTRO LE




                                                             I.1
                                                  Exe rcice II

___________________________________________________________________________

Enoncé

   le                   é                                           ruct      ant
Quel s e rre urs ont é t com m ises dans ch acun de s groupes d'inst ions suiv s :

1)
     if (a<b) printf ("ascendant")
         else printf ("non ascendant") ;
2)
     int n ;
       ...
     switch (2*n+1)
     { case 1 : printf ("petit") ;
       case n : printf ("moyen") ;
     }
3)
     #define LIMITE 100
     int n ;
       ...
     switch (n)
     { case LIMITE-1 : printf ("un peu moins") ;
       case LIMITE   : printf ("juste") ;
       case LIMITE+1 : printf ("un peu plus") ;
     }
4)
     const int LIMITE=100
     int n ;
18                        angage C
          Exe rcice s e n l
       ...
     switch   (n)
     { case   LIMITE-1 : printf ("un peu moins") ;
       case   LIMITE   : printf ("juste") ;
       case   LIMITE+1 : printf ("un peu plus") ;
     }

_______________________________________________________________


  ut
Sol ion

     m               -v   e a                          f
1) Il anq ue un point irgul à l fin du pre m ie r print :

     if (a<b) printf ("ascendant") ;
         else printf ("non ascendant") ;

    e al           ant e             e     igat             re                         ant            -à
2) L s v e urs suiv l m ot cas e doiv nt obl oire m e nt ê t des "e xpre s s ions const e s ", c'e s t -dire d e s e xpre s s ions
   cul e        e        at ui-m                     e
cal abls par l com pil e ur l ê m e . Ce n'e s t pas l cas de n.

                    e                   e l
                                          e        IM        ant                        ant
3) Aucune e rre ur, ls e xpre s s ions t l s q ue L ITE-1 é t bien des expressions const e s .

        e                      ant e                   us                        ant        e         e IM       é
4) Ici, ls e xpre s s ions suiv l m ot cas e ne s ont pl des expre s s ions const e s , car l sym bol L ITE a é t défini
                            ant      iq                        ,           ruct                 e
sous form e d'une "const e sym bol ue " (e n C+ + , ce pe ndant ce s inst ions s e ront corre ct s ).




                                                                I.2
                                                     Exe rcice II

___________________________________________________________________________

Enoncé

     e                  ant
Soit l program m e s uiv :

     #include <stdio.h>
     main()
     {   int n ;
         scanf ("%d", &n) ;
         switch (n)
         { case 0 : printf ("Nul\n") ;
            case 1 :
                                                                         e      ruct         rôl
                                                                   III. L s inst ions de cont e    19
                 case 2 : printf ("Petit\n") ;
                          break ;
                 case 3 :
                 case 4 :
                 case 5 : printf ("Moyen\n") ;
                 default : printf ("Grand\n") ;
             }
     }

   s       tat            -il ors   ui
Quel ré s ul s affich e -t l q u'on l fournit e n donné e :

     a) 0
     b) 1
     c) 4
     d) 10
     e) -5
___________________________________________________________________________


  ut
Sol ion

a)
     Nul
     Petit
b)
     Petit
c)
     Moyen
     Grand
d)
     Grand
e)
     Grand




                                                             I.3
                                                  Exe rcice II

___________________________________________________________________________
20                       angage C
         Exe rcice s e n l
Enoncé

   le                   é                                 ruct      ant
Quel s e rre urs ont é t com m ises dans ch acune des inst ions suiv e s :

a)
     do c = getchar() while (c != '\n') ;
b)
     do while ( (c = getchar()) != '\n') ;
c)
     do {} while (1) ;

___________________________________________________________________________



  ut
Sol ion

     m               -v   e
a) Il anq ue un point irgul :

     do c = getchar() ; while (c != '\n') ;

     m               ruct     e ue l
                                   e
b) Il anq ue une inst ion (é v nt l m e nt "v             e                                             e
                                             ide") aprè s l m ot do. O n pourrait é crire , par e xe m pl :

     do {} while ( (c = getchar()) != '\n') ;

ou :

     do ; while ( (c = getchar()) != '\n') ;

     n'y                         at     t e
c) Il aura pas d'erreur de com pil ion ;out fois, il                  e
                                                    s'agit d'une "boucl infinie ".



                                                               I.4
                                                    Exe rcice II

___________________________________________________________________________

Enoncé

        us isibl
Ecrire pl l e m e nt :

     do {} while (printf("donnez un nombre >0 "), scanf ("%d", &n), n<=0) ;
___________________________________________________________________________
                                                                                     e      ruct         rôl
                                                                               III. L s inst ions de cont e    21

  ut
Sol ion

Pl                   it      e ,                    "
  usieurs possibil é s e xist nt puis q u'il "suffit de re port r, dans l corps de l boucl, des inst ions figurant
                                                                e       e          a     e          ruct
"art       le      "                                 a      ion
    ificie l m e nt sous form e d'expressions dans l condit de poursuit : e

   do
      printf("donnez un nombre >0 ") ;
   while (scanf ("%d", &n), n<=0) ;

ou, m ie ux :

   do
     { printf("donnez un nombre >0 ") ;
       scanf ("%d", &n) ;
     }
   while (n<=0) ;




                                                            I.5
                                                 Exe rcice II

___________________________________________________________________________

Enoncé

     e     it                ant
Soit l pe t program m e s uiv :

   #include <stdio.h>
   main()
   { int i, n, som ;
      som = 0 ;
      for (i=0 ; i<4 ; i++)
          { printf ("donnez un entier ") ;
            scanf ("%d", &n) ;
            som += n ;
          }
      printf ("Somme : %d\n", som) ;
   }

                          isant e xact m e nt l m ê m e ch os e , e n e m pl
Ecrire un program m e ré al           e       a                                 , a ace    'inst ion or
                                                                           oyant à l pl de l ruct f :
22        Exe rcice s e n l angage C
           ruct
a) une inst ion w h il,   e

           ruct             e
b) une inst ion do ... w h il.

___________________________________________________________________________


  ut
Sol ion

a)

     #include <stdio.h>
     main()
     { int i, n, som ;
        som = 0 ;
        i = 0 ;                   /* ne pas oublier cette "initialisation" */
        while (i<4)
            { printf ("donnez un entier ") ;
              scanf ("%d", &n) ;
              som += n ;
              i++ ;               /* ni cette "incrémentation" */
            }
        printf ("Somme : %d\n", som) ;
     }

b)
     #include <stdio.h>
     main()
     { int i, n, som ;
        som = 0 ;
        i = 0 ;                   /* ne pas oublier cette "initialisation" */
        do
            { printf ("donnez un entier ") ;
              scanf ("%d", &n) ;
              som += n ;
              i++ ;               /* ni cette "incrémentation" */
            }
        while (i<4) ;             /* attention, ici, toujours <4 */
        printf ("Somme : %d\n", som) ;
     }
                                                                        e      ruct         rôl
                                                                  III. L s inst ions de cont e    23
                                                           I.6
                                                Exe rcice II

___________________________________________________________________________

Enoncé

   s       tat         e                  ant
Quel ré s ul s fournit l program m e s uiv :

   #include <stdio.h>
   main()
   { int n=0 ;
      do
         { if (n%2==0) { printf ("%d est pair\n", n) ;
                         n += 3 ;
                         continue ;
                       }
           if (n%3==0) { printf ("%d est multiple de 3\n", n) ;
                         n += 5 ;
                       }
           if (n%5==0) { printf ("%d est multiple de 5\n", n) ;
                         break ;
                       }
           n += 1 ;
         }
      while (1) ;
   }
___________________________________________________________________________


  ut
Sol ion


   0 est pair
   3 est multiple de 3
   9 est multiple de 3
   15 est multiple de 3
   20 est multiple de 5
24                           angage C
             Exe rcice s e n l
                                                           I.7
                                                Exe rcice II

___________________________________________________________________________

Enoncé

   s       tat         e                  ant
Quel ré s ul s fournit l program m e s uiv :

     #include <stdio.h>
     main()
     {   int n, p ;

             n=0 ;
             while (n<=5) n++ ;
             printf ("A : n = %d\n", n) ;

             n=p=0 ;
             while (n<=8) n += p++ ;
             printf ("B : n = %d\n", n) ;

             n=p=0 ;
             while (n<=8) n += ++p ;
             printf ("C : n = %d\n", n) ;

             n=p=0 ;
             while (p<=5) n+= p++ ;
             printf ("D : n = %d\n", n) ;

             n=p=0 ;
             while (p<=5) n+= ++p ;
             printf ("D : n = %d\n", n) ;
     }

___________________________________________________________________________


  ut
Sol ion


     A   :   n   =   6
     B   :   n   =   10
     C   :   n   =   10
     D   :   n   =   15
                                                                        e      ruct         rôl
                                                                  III. L s inst ions de cont e    25
   D : n = 21




                                                           I.8
                                                Exe rcice II

___________________________________________________________________________

Enoncé

   s       tat         e                  ant
Quel ré s ul s fournit l program m e s uiv :

   #include <stdio.h>
   main()
   {   int n, p ;

        n=p=0 ;
        while (n<5) n+=2 ; p++ ;
        printf ("A : n = %d, p = %d \n", n, p) ;

        n=p=0 ;
        while (n<5) { n+=2 ; p++ ; }
        printf ("B : n = %d, p = %d \n", n, p) ;
   }

___________________________________________________________________________



  ut
Sol ion

   A : n = 6, p = 1
   B : n = 6, p = 3




                                                           I.9
                                                Exe rcice II

___________________________________________________________________________
26                           angage C
             Exe rcice s e n l
Enoncé

   s       tat         e                  ant
Quel ré s ul s fournit l program m e s uiv :

     #include <stdio.h>

     main()
     {   int i, n ;

             for (i=0, n=0 ; i<5 ; i++) n++ ;
             printf ("A : i = %d, n = %d\n", i, n) ;

             for (i=0, n=0 ; i<5 ; i++, n++) {}
             printf ("B : i = %d, n = %d\n", i, n) ;

             for (i=0, n=50 ; n>10 ; i++, n-= i ) {}
             printf ("C : i = %d, n = %d\n", i, n) ;

             for (i=0, n=0 ; i<3 ; i++, n+=i, printf ("D : i = %d, n = %d\n", i, n) ) ;
             printf ("E : i = %d, n = %d\n", i, n) ;
     }

___________________________________________________________________________



  ut
Sol ion

     A   :   i   =   5,   n   =   5
     B   :   i   =   5,   n   =   5
     C   :   i   =   9,   n   =   5
     D   :   i   =   1,   n   =   1
     D   :   i   =   2,   n   =   3
     D   :   i   =   3,   n   =   6
     E   :   i   =   3,   n   =   6
                                                                                        e      ruct         rôl
                                                                                  III. L s inst ions de cont e           27
                                                             I.10
                                                  Exe rcice II

___________________________________________________________________________

Enoncé

                              cul e                                                                  e   orq    ui         a
Ecrire un program m e q ui cal e ls racine s carré e s d e nom bre s fournis e n donné e . Ils'arrê t ra l u'on l fournira l
 al         re        e al            iv                 ion            e
v e ur 0. Il fus e ra ls v e urs négat e s . Son e xé cut s e pré s e nt ra ainsi :

   donnez un nombre       positif : 2
   sa racine carrée       est : 1.414214e+00
   donnez un nombre       positif : -1
   svp positif
   donnez un nombre       positif : 5
   sa racine carrée       est : 2.236068e+00
   donnez un nombre       positif : 0

       ons    a      ion             a
R appe l q ue l fonct s q rt fournit l racine carré e (doubl) de l v e ur (doubl) q u'on l fournit e n argum e nt
                                                           e     a al          e         ui                      .

___________________________________________________________________________


  ut
Sol ion

  e    e
Il xist beaucoup de "rédact           e     e oici 3 :
                           ions possibls " ; n v

   #include <stdio.h>
   #include <math.h>          /* indispensable pour sqrt (qui fourni un résultat */
                              /*              de type double                     */
   main()
   { double x ;
      do
          { printf ("donnez un nombre positif : ") ;
            scanf ("%le", &x) ;
            if (x < 0) printf ("svp positif \n") ;
            if (x <=0) continue ;
            printf ("sa racine carrée est : %le\n", sqrt (x) ) ;
          }
      while (x) ;
   }
28                        angage C
          Exe rcice s e n l
     #include <stdio.h>
     #include <math.h>
     main()
     { double x ;
        do
            { printf ("donnez un nombre positif : ") ;
              scanf ("%le", &x) ;

                if (x < 0) { printf ("svp positif \n") ;
                             continue ;
                           }
                if (x>0) printf ("sa racine carrée est : %le\n", sqrt (x) ) ;
            }
         while (x) ;
     }




     #include <stdio.h>
     #include <math.h>
     main()
     { double x ;
        do
            { printf ("donnez un nombre positif : ") ;
              scanf ("%le", &x) ;

                if (x < 0) { printf ("svp positif \n") ;
                             continue ;
                           }
                if (x>0) printf ("sa racine carrée est : %le\n", sqrt (x) ) ;
                if (x==0) break ;
            }
         while (1) ;
     }


R e m arque :

                      out           ie      ude
     Ilne faut surt pas oubl r #incl < m at .h > car, sinon, l com pil e ur considè re (e n l
                                                 h           e       at                                       ot
                                                                                            'absce nce du prot ype )
                                  tat
     q ue s q rt fournit un ré s ul de type int.
                                                                                             e      ruct         rôl
                                                                                       III. L s inst ions de cont e    29
                                                                I.11
                                                     Exe rcice II

___________________________________________________________________________

Enoncé

  cul a                              e         a                                  -à     a
Cal e r l som m e des n pre m ie rs t rm es de l "s é rie h arm oniq ue ", c'e s t -dire l som m e :

         1 + 1/2 + 1/3 + 1/4 + ..... + 1/n

 a al                ue
L v e ur de n s e ra l e n donné e .

___________________________________________________________________________


  ut
Sol ion


   #include <stdio.h>
   main()
   {
      int nt ;                    /* nombre de termes de la série harmonique */
      float som ;                 /* pour la somme de la série */
      int i ;

        do
          { printf ("combien de termes : ") ;
            scanf ("%d", &nt) ;
          }
        while (nt<1) ;
        for (i=1, som=0 ; i<=nt ; i++) som += (float)1/i ;
        printf ("Somme des %d premiers termes = %f", nt, som) ;
   }



R e m arques :

             ons
   1) R appe l q ue dans :
                  som += (float)1/i

   'e                     e         al            e issant d'abord 1 e t i e n f oat
   l xpre s s ion de droit e s t é v ué e e n conv rt                           l .
30         Exe rcice s e n langage C
     Il        it
       faut é v e r d'é crire :
                    som += 1/i

                    e al                          ouj le                          'opé e      ors         e
     auq ue lcas, ls v e urs de 1/i seraient t ours nul s (sauf pour i=1) puiq ue l rat ur /, l q u'ilport s ur de s
         ie                  a
     e nt rs, corre s pond à l div          iè
                                  ision e nt re .
                             ant
     D e m ê m e , e n é criv :
                    som += (float) (1/i)

     e       tat                us
     l ré s ul ne s e rait pas pl satisfaisant puis q ue l conv rsion en fl t n'aurait l u q u'aprè s l div
                                                         a     e          ot ant       ie             a                   ie
                                                                                                           ision (e n e nt r).
     En re vanch e , on pourrait é crire :
                    som += 1.0/i ;



              'on                      e                              al   e é
     2) Si l ch e rch ait à e xé cut r ce program m e pour de s v e urs é lv e s d e n (e n pré voyant al une v
                                                                                                        ors             e
                                                                                                                 ariabl de t   ype
      l               e             at          a al         a
     f oat ou doubl), on const e rait q ue l v e ur de l som m e s e m bl "conv rge r" v rs une l it (bie n q u'e n t é orie l
                                                                           e        e        e       im e                h        a
                                e           a      ie
     s é rie h arm oniq ue "div rge "). Ce l prov nt t sim plm e nt de ce q ue , dè s q ue l v e ur de 1/i e s t "pe t e " dev
                                                         out       e                           a al                   it        ant
              e      tat
     som , l ré s ul de l     'addit ion de 1/i e t de som e s t exact ent som . O n pourrait t e fois am é l r l ré s ul e n
                                                                       em                       out         iore e           tat
     e ffe ct      a              'e e               ,
             uant l som m e "à l nv rs" (e n e ffe t dans ce cas, l rapport e nt l v e ur à aj e r e t l som m e courant s e rait
                                                                     e          re a al         out      a                 e
         us      e
     pl faibl q ue pré cédem m e nt)..



                                                                I.12
                                                     Exe rcice II

___________________________________________________________________________

Enoncé

Affich e r un t      e       e             oil     a
                riangl isocè l form é d'ét e s . L h aut ur du t
                                                          e              e        -à      e             igne
                                                                   riangl (c'e s t -dire l nom bre de l s ) s e ra fourni e n
                         'e      e                                         a
donné e , com m e dans l xe m pl ci-de s s ous. O n s'arrange ra pour q ue l derniè re ligne du t     e                  e
                                                                                                 riangl s 'affich e s ur l bord
             'é
gauch e de l cran.

     combien de lignes ? 10
              *
             ***
            *****
           *******
          *********
         ***********
        *************
       ***************
                                                                                           e      ruct         rôl
                                                                                     III. L s inst ions de cont e            31
    *****************
   *******************

___________________________________________________________________________


  ut
Sol ion

   #include <stdio.h>

   #define car '*'                    /* caractère de remplissage */

   main()
   {   int    nlignes ;               /* nombre total de lignes */
       int    nl ;                    /* compteur de ligne */
       int    nesp ;                  /* nombre d'espaces précédent une étoile */
       int    j ;

         printf ("combien de lignes ? ") ;
         scanf ("%d", &nlignes) ;
         for (nl=0 ; nl<nlignes ; nl++)
            { nesp = nlignes - nl - 1 ;
              for (j=0 ; j<nesp ; j++)   putchar (' ') ;
              for (j=0 ; j<2*nl+1 ; j++) putchar (car) ;
              putchar ('\n') ;
            }
   }




                                                              I.13
                                                   Exe rcice II

___________________________________________________________________________

Enoncé

            out e                     es      e                  e                            im     im              im
Affich e r t e s ls m aniè re s possibl d'obt nir un franc av c des piè ces de 2 ce nt e s , 5 ce nt e s e t 10 ce nt e s . Dire
                    it           é
com bien de possibil é s ont é t ainsi t    é       e        tat
                                        rouv e s . L s ré s ul s s e ront affich é s com m e s uit :

   1 F = 50 X 2c
32                           angage C
             Exe rcice s e n l
     1   F   =   45   X   2c 2    X   5c
     1   F   =   40   X   2c 4    X   5c
     1   F   =   35   X   2c 6    X   5c
     1   F   =   30   X   2c 8    X   5c
     1   F   =   25   X   2c 10   X   5c
     1   F   =   20   X   2c 12   X   5c
     1   F   =   15   X   2c 14   X   5c
     1   F   =   10   X   2c 16   X   5c
     1   F   =    5   X   2c 18   X   5c
     1   F   =   20   X   5c
     1   F   =   45   X   2c 1    X   10c
     1   F   =   40   X   2c 2    X   5c        1    X   10c
     1   F   =   35   X   2c 4    X   5c        1    X   10c
     1   F   =   10   X   2c 2    X   5c        7    X   10c
     1   F   =    5   X   2c 4    X   5c        7    X   10c
     1   F   =    6   X   5c 7    X   10c
     1   F   =   10   X   2c 8    X   10c
     1   F   =    5   X   2c 2    X   5c        8 X 10c
     1   F   =    4   X   5c 8    X   10c
     1   F   =    5   X   2c 9    X   10c
     1   F   =    2   X   5c 9    X   10c
     1   F   =   10   X   10c

     En tout, il y a 66 façons de faire 1 F

___________________________________________________________________________


  ut
Sol ion


     #include <stdio.h>
     main()
     {
         int nbf ;                         /*       compteur du nombre de façons de faire 1 F */
         int n10 ;                         /*       nombre de pièces de 10 centimes */
         int n5 ;                          /*       nombre de pièces de 5 centimes */
         int n2 ;                          /*       nombre de pièces de 2 centimes */

             nbf = 0 ;
             for (n10=0 ; n10<=10 ; n10++)
               for (n5=0 ; n5<=20 ; n5++)
               for (n2=0 ; n2<=50 ; n2++)
                                                                                     e      ruct         rôl
                                                                               III. L s inst ions de cont e          33
            if ( 2*n2 + 5*n5 + 10*n10 ==         100)
               { nbf ++ ;
                 printf ("1 F = ") ;
                 if (n2) printf ("%2d X          2c ", n2 ) ;
                 if (n5) printf ("%2d X          5c ", n5 ) ;
                 if (n10) printf ("%2d X         10c", n10) ;
                 printf ("\n") ;
               }

       printf ("\nEn tout, il y a %d façons de faire 1 F\n", nbf) ;
   }




                                                           I.14
                                                Exe rcice II

___________________________________________________________________________

Enoncé

Ecrire un program m e q ui dé t rm ine l nie m e v e ur un (n é t fourni e n donné e ) de l "suit de Fibonacci" dé finie
                               e       a          al             ant                      a      e
com m e s uit :

   u1 = 1
   u2 = 1
   un = un-1 + un-2     pour n> 2

_______________________________________________________________


  ut
Sol ion

   #include <stdio.h>

   main()
   {
      int u1, u2, u3 ;                   /* pour "parcourir" la suite */
      int n ;                            /* rang du terme demandé */
      int i ;                            /* compteur */
34                         angage C
           Exe rcice s e n l

          do
            { printf ("rang du terme demandé (au moins 3) ? ") ;
              scanf ("%d", &n) ;
            }
          while (n<3) ;

          u2 = u1 = 1 ;                     /* les deux premiers termes */
          i = 2 ;
          while (i++ < n)                   /* attention, l'algorithme ne fonctionne */
             { u3 = u1 + u2 ;               /*           que pour n > 2              */
               u1 = u2 ;
               u2 = u3 ;
             }

         /*             autre formulation possible :                                  */
         /* for (i=3 ; i<=n ; i++, u1=u2, u2=u3) u3 = u1 + u2 ;                       */

          printf ("Valeur du terme de rang %d : %d", n, u3) ;
     }

     e
Not z q ue , com m e à l          um                            at
                          'accout é e e n C, be aucoup de form ul ions sont possibls . Nous e n av
                                                                                  e                       le     acé
                                                                                                  ons d'ail urs pl une
s e conde e n com m e nt           re
                        aire de not program m e .




                                                                 I.15
                                                      Exe rcice II

___________________________________________________________________________

Enoncé

Ecrire un program m e q ui t         e a us             a us      it al                               e               ie     re
                                rouv l pl grande e t l pl pet e v e ur d'une s ucce s s ion de not s (nom bre s e nt rs e nt 0
                                            e                                                           é t
e t 20) fournie s e n donné e s , ainsi que l nom bre de fois où ce m axim um e t ce m inim um ont é t at ribué s . O n supposera
      e     e                                'av
q ue ls not s , e n nom bre non connu à l ance , s e ront t rm iné e s par une v e ur né gat e . O n s'ast indra à ne pas ut iser
                                                             e                  al          iv            re                il
      abl         'e     ion                                    e
de "t e au". L xé cut du program m e pourra s e pré s e nt r ainsi :

     donnez    une   note   (-1   pour   finir)   :   12
     donnez    une   note   (-1   pour   finir)   :   8
     donnez    une   note   (-1   pour   finir)   :   13
     donnez    une   note   (-1   pour   finir)   :   7
                                                                             e      ruct         rôl
                                                                       III. L s inst ions de cont e    35
  donnez    une   note   (-1   pour    finir)   :   11
  donnez    une   note   (-1   pour    finir)   :   12
  donnez    une   note   (-1   pour    finir)   :   7
  donnez    une   note   (-1   pour    finir)   :   9
  donnez    une   note   (-1   pour    finir)   :   -1

  note maximale : 13 attribuée 1 fois
  note minimale : 7 attribuée 2 fois

_______________________________________________________________



  ut
Sol ion

  #include <stdio.h>

  main()
  {
      int    note ;             /*    note "courante" */
      int    max ;              /*    note maxi */
      int    min ;              /*    note mini */
      int    nmax ;             /*    nombre de fois où la note maxi a été trouvée */
      int    nmin ;             /*    nombre de fois où la note mini a été trouvée */

      max = -1 ;       /* initialisation max (possible car toutes notes >=0 */
      min = 21 ;       /* initialisation min (possible car toutes notes < 21) */
      while (printf ("donnez une note (-1 pour finir) : "),
             scanf ("%d", &note),
             note >=0)
         { if (note == max) nmax++ ;
           if (note > max) { max = note ;
                             nmax = 1 ;
                           }
           if (note == min) nmin++ ;
           if (note < min) { min = note ;
                             nmin = 1 ;
                           }
         }

            /* attention, si aucune note (cad si max<0) */
            /* les résultats sont sans signification    */
      if (max >= 0)
         { printf ("\nnote maximale : %d attribuée %d fois\n", max, nmax) ;
36                       angage C
         Exe rcice s e n l
                printf      ("note minimale : %d attribuée %d fois\n", min, nmin) ;
            }
     }




                                                           I.16
                                                Exe rcice II

___________________________________________________________________________

Enoncé

                                    a abl        tipl ion" de s nom bres de 1 à 10, sous l form e s uiv e :
Ecrire un program m e q ui affich e l "t e de m ul icat                                  a             ant

           I   1   2   3   4   5   6   7   8   9 10
     -----------------------------------------------
        1 I    1   2   3   4   5   6   7   8   9 10
        2 I    2   4   6   8 10 12 14 16 18 20
        3 I    3   6   9 12 15 18 21 24 27 30
        4 I    4   8 12 16 20 24 28 32 36 40
        5 I    5 10 15 20 25 30 35 40 45 50
        6 I    6 12 18 24 30 36 42 48 54 60
        7 I    7 14 21 28 35 42 49 56 63 70
        8 I    8 16 24 32 40 48 56 64 72 80
        9 I    9 18 27 36 45 54 63 72 81 90
       10 I 10 20 30 40 50 60 70 80 90 100

_______________________________________________________________


  ut
Sol ion

     #include <stdio.h>
     #define NMAX 10                         /* nombre de valeurs */

     main()
     {   int i, j ;

              /* affichage ligne en-tête */
         printf ("      I") ;
         for (j=1 ; j<=NMAX ; j++) printf ("%4d", j) ;
                                                    e      ruct         rôl
                                              III. L s inst ions de cont e    37
printf ("\n") ;
printf ("-------") ;
for (j=1 ; j<=NMAX ; j++) printf ("----") ;
printf ("\n") ;

     /* affichage des différentes lignes */
for (i=1 ; i<=NMAX ; i++)
   { printf ("%4d I", i) ;
     for (j=1 ; j<=NMAX ; j++)
        printf ("%4d", i*j) ;
     printf ("\n") ;
   }
                                               V ES        O
                                              I : L FO NCTI NS




N.B. Ici, on ne t      e                                e e                  e                                            t
                 rouv ra aucun e xe rcice faisant int rv nir de s point urs, e t par cons é q ue nt aucun e xe rcice m e t ant e n
     re
oe uv une t                          s                     e s
            ransm ission d'argum e nt par adre s s e . De t l e xe rcice s apparaî
                                                                                 t          e        re    ant
                                                                                  ront dans l ch apit s uiv .




                                                                V
                                                     Exe rcice I .1

___________________________________________________________________________

Enoncé

               e                  ant
a) Que fournit l program m e s uiv :

   #include <stdio.h>
   main()
   {
      int n, p=5 ;
      n = fct (p) ;
      printf ("p = %d, n = %d\n", p, n) ;
   }
   int fct (int r)
   { return 2*r ;
   }

     out         arat      e   e    a      ion ct
b) Aj e r une décl ion conv nabl de l fonct f :

          a        a us      e      e      ant a
   - sous l form e l pl brè v possibl (suiv l norm e ANSI),
40                         angage C
           Exe rcice s e n l
                              ot
     - sous form e d'un "prot ype ".
_______________________________________________________________



  ut
Sol ion

                                         arat          a       ion ct e                               .           , a
a) Bie n q u'ilne possè de pas de décl ion de l fonct f , l program m e m ain e s t corre ct En e ffe t l norm e ANSI
   oris                  ion                  aré                  l
aut e q u'une fonct ne s oit pas décl e , auq ue lcas e l e s t considérée com m e fournissant un ré s ul de t
                                                                    e                                               tat   ype int.
    t       it        out         e                 lé
Ce t e facil é e s t t e fois fort m e nt décons e il e (e t e l ne s e ra pl acce pt e d e C+ + ). V
                                                               le           us       é                    e         tat
                                                                                                     oici ls ré s ul s fournis par
 e
l program m e :

     p = 5, n = 10




    a   arat  a us      e
b) L décl ion l pl brè v s e ra :

     int fct () ;

 a   arat    iv                lé                        ot
L décl ion (v e m e nt cons e il e ), sous form e de prot ype s e ra :

     int fct (int) ;

       e ue l
            e      ,                     ot         e "
ou, é v nt l m e nt sous form e d'un prot ype "com plt :

     int fct (int r) ;

                       e                               ion        il      e
D ans ce dernie r cas, l nom r n'a aucune s ignificat : on ut ise souv nt l m ê m e nom (l q u'on l connaî q ue dans
                                                                             e            ors     e      t!)
'e ê e       a
l n-t t de l fonct   ion, m ais ilpourrait s'agir de n'im port q ue l re nom de v
                                                              e      aut              e
                                                                                 ariabl).




                                                               V
                                                     Exe rcice I .2

___________________________________________________________________________

Enoncé

Ecrire :
                                                                                                e onct
                                                                                           IV. L s f    ions     41
   - une fonct                1,       e ant d'affich e r "bonj
              ion, nom m é e f s e cont nt                     our" (e l ne possédera aucun argum e nt ni v e ur de
                                                                       le                             ,      al
   re tour),
   - une fonct                2,
              ion, nom m é e f q ui affich e "bonj                               a al         ue                  )
                                                  our" un nom bre de fois é galà l v e ur re ç e n argum e nt (int e t q ui ne
        oie         al
   re nv aucune v e ur,
   - une fonct                3,         a                       2,               us,    oie a al      )
              ion, nom m é e f q ui fait l m ê m e ch os e q ue f m ais q ui, de pl re nv l v e ur (int 0.
              it                ant           e
Ecrire un pe t program m e appe l succe s s iv m e nt ch acune de ce s 3 fonctions, aprè s ls av conv nablm e nt décl e s
                                                                                           e    oir  e   e          aré
                     ot
sous form e d'un prot ype .

_______________________________________________________________

  ut
Sol ion

   #include <stdio.h>

   void f1 (void)
   {
      printf ("bonjour\n") ;
   }

   void f2 (int n)
   {
      int i ;
      for (i=0 ; i<n ; i++)
          printf ("bonjour\n") ;
   }

   int f3 (int n)
   {
      int i ;
      for (i=0 ; i<n ; i++)
          printf ("bonjour\n") ;
      return 0 ;
   }

   main()
   {
      void f1 (void) ;
      void f2 (int) ;
      int f3 (int) ;
      f1 () ;
      f2 (3) ;
      f3 (3) ;
42                       angage C
         Exe rcice s e n l
     }




                                                         V
                                              Exe rcice I .3

___________________________________________________________________________

Enoncé

   s       tat
Quel ré s ul s fournira ce program m e :

     #include <stdio.h>
     int n=10, q=2 ;

     main()
     {
        int fct (int) ;
        void f (void) ;
        int n=0, p=5 ;
        n = fct(p) ;
        printf ("A : dans main, n = %d, p = %d, q = %d\n", n, p, q) ;
        f() ;
     }

     int fct (int p)
     {
        int q ;
        q = 2 * p + n ;
        printf ("B : dans fct,         n = %d, p = %d, q = %d\n", n, p, q) ;
        return q ;
     }

     void f (void)
     {
        int p = q * n ;
        printf ("C : dans f,           n = %d, p = %d, q = %d\n", n, p, q) ;
     }

_______________________________________________________________
                                                                                                       e onct
                                                                                                  IV. L s f  ions         43

  ut
Sol ion

   B : dans fct, n = 10, p = 5, q = 20
   A : dans main, n = 20, p = 5, q = 2
   C : dans f,    n = 10, p = 20, q = 2




                                                              V
                                                   Exe rcice I .4

___________________________________________________________________________

Enoncé

                    ion        oit              s               ot ant              è                       tat
Ecrire une fonct q ui re ç e n argum e nt 2 nom bre s fl t s e t un caract re e t q ui fournit un ré s ul corre s pondant à
l'une des 4 opé rat            iq
                      ions appl ué e s à ses deux pre m ie rs argum e nt e n fonct de l v e ur du de rnie r, à sav : addit
                                                                        s,        ion      a al                   oir     ion
        e         è           ract                 t
pour l caract re + , soust ion pour -, m ul icat pour *e t div
                                                    ipl ion                                out re         è      'un       é
                                                                            ision pour / (t aut caract re q ue l de s 4 cit s
          e      é
s e ra int rpré t com m e une addit               ie                 e
                                    ion). O n ne t ndra pas com pt des ris q ues de div  ision par zé ro.

              it                     il         t       ion           ue e
Ecrire un pe t program m e (m ain) ut isant ce t e fonct pour e ffe ct r ls 4 opé rations sur de ux nom bre s fournis e n
donné e .

_______________________________________________________________


  ut
Sol ion

   #include <stdio.h>

   float oper (float v1, float            v2, char op)
   {   float res ;
       switch (op)
       { case '+' : res = v1 +            v2 ;
                    break ;
         case '-' : res = v1 -            v2 ;
                    break ;
         case '*' : res = v1 *            v2 ;
                    break ;
         case '/' : res = v1 /            v2 ;
44                       angage C
         Exe rcice s e n l
                         break ;
           default     : res = v1 + v2 ;
         }
         return res ;
     }


     main()
     {
         float oper (float, float, char) ;                   /* prototype de oper */
         float x, y ;

         printf ("donnez deux nombres réels : ") ;
         scanf ("%e %e", &x, &y) ;

         printf   ("leur   somme est :      %e\n", oper            (x,   y,   '+')   )   ;
         printf   ("leur   différence est : %e\n", oper            (x,   y,   '-')   )   ;
         printf   ("leur   produit est :    %e\n", oper            (x,   y,   '*')   )   ;
         printf   ("leur   quotient est :   %e\n", oper            (x,   y,   '/')   )   ;
     }




                                                             V
                                                  Exe rcice I .5

___________________________________________________________________________

Enoncé

              e                   ion                   'e                                           a      ion
Transform e r l program m e (fonct + m ain) é crit dans l xe rcice pré cédent de m aniè re à ce q ue l fonct ne dispose
  us                   s, e        è           a ure
pl q ue de 2 argum e nt l caract re indiq uant l nat de l rat à e ffe ct r é t pré cis é , ce t e fois, à l
                                                           'opé ion            ue   ant              t          'aide d'une
v     e obal
 ariabl gl e .

_______________________________________________________________


  ut
Sol ion

     #include <stdio.h>
                                                                                           e onct
                                                                                      IV. L s f  ions      45
   char op ;         /* variable globale pour la nature de l'opération */
                     /* attention : doit être déclarée avant d'être utilisée */

   float oper (float v1, float       v2)
   {   float res ;
       switch (op)
       { case '+' : res = v1 +       v2 ;
                    break ;
         case '-' : res = v1 -       v2 ;
                    break ;
         case '*' : res = v1 *       v2 ;
                     break ;
         case '/' : res = v1 /       v2 ;
                    break ;
         default : res = v1 +        v2 ;
       }
       return res ;
   }


   main()
   {
       float oper (float, float) ;      /* prototype de oper */
       float x, y ;
       printf ("donnez deux nombres réels : ") ;
       scanf ("%e %e", &x, &y) ;
       op = '+' ;
       printf ("leur somme est :      %e\n", oper (x, y) ) ;
       op = '-' ;
       printf ("leur différence est : %e\n", oper (x, y) ) ;
       op = '*' ;
       printf ("leur produit est :    %e\n", oper (x, y) ) ;
       op = '/' ;
       printf ("leur quotient est :   %e\n", oper (x, y) ) ;
   }



R e m arque :

                                           e      iné        'ut isat
   Ils'agissait ici d'un e xe rcice d'"é col" dest à force r l il ion d'une v     e obal             a     iq
                                                                             ariabl gl e . Dans l prat ue , on
      it    e us         e                          ion     oris rop arge    e                  s
   é v e ra l pl possibl ce ge nre de program m at q ui fav e t l m e nt ls ris q ues d'"e ffe t de bord".
46                       angage C
         Exe rcice s e n l
                                                                V
                                                     Exe rcice I .6

___________________________________________________________________________

Enoncé

Ecrire une fonct                         al
                ion, sans argum e nt ni v e ur de re t                  e e                               , e          ot
                                                      our, q ui s e cont nt d'affich e r, à ch aq ue appe l l nom bre t alde fois
     le     é     é        a
où e l a é t appe le s ous l form e :

     appel numéro 3

_______________________________________________________________


  ut
Sol ion

  a     le       ut           e
L m e il ure s ol ion consist à pré v                    a
                                       oir, au s e in de l fonct e n q ue s t
                                                                ion          ion, une v     e      as      at        le
                                                                                       ariabl de cl s e s t iq ue . El s e ra
    ial            e                   out     re al
init isée une seul fois à zé ro (ou à t e aut v e ur é v nt l m e nt e xpl é e ) au début de l xé cut du program m e .
                                                            e ue le           icit              'e     ion
Ici, nous av         us,      u       it
            ons, de pl pré v un pe t program m e d'essai.


     #include <stdio.h>

     void fcompte (void)
     {
        static int i ;     /* il est inutile, mais pas défendu, d'écrire i=0 */
        i++ ;
        printf ("appel numéro %d\n", i) ;
     }

          /* petit programme d'essai de fcompte */
     main()
     { void fcompte (void) ;
        int i ;
        for (i=0 ; i<3 ; i++) fcompte () ;
     }

 à          a                      ant   il
L e ncore , l dém arch e consist à ut iser com m e com pt ur d'appe l une v
                                                         e          s           e obal           rait ors re
                                                                           ariabl gl e (q ui de v al ê t connue
                 il e
du program m e ut isat ur) e s t à proscrire .
                                                                                                        e onct
                                                                                                   IV. L s f  ions         47
                                                              V
                                                    Exe rcice I .7

___________________________________________________________________________

Enoncé

Ecrire 2 fonct                         ie           al
              ions à un argum e nt e nt r e t une v e ur de re tour e nt re pe rm e t ant de préciser si l
                                                                        iè           t                   'argum e nt re ç e s t
                                                                                                                         u
    tipl            a
m ul e de 2 (pour l pre m iè re fonction) ou m ul e de 3 (pour l s e conde fonct
                                                 tipl             a                ion).

    il
Ut iser ces deux fonct                    it                  it            ie                                      tipl
                      ions dans un pe t program m e q ui l un nom bre e nt r e t q ui pré cis e s 'ile s t pair, m ul e de 3
          tipl                                e    y
e t/ou m ul e de 6, com m e dans ce t e xe m pl (il a de ux e xé cutions) :

   donnez un entier : 9
   il est multiple de 3
             _______________

   donnez    un entier : 12
   il est    pair
   il est    multiple de 3
   il est    divisible par 6
_______________________________________________________________


  ut
Sol ion

   #include <stdio.h>

   int mul2 (int n)
   {
      if (n%2) return 0 ;
          else return 1 ;
   }

   int mul3 (int n)
   {
      if (n%3) return 0 ;
          else return 1 ;
   }

   main()
   {
      int mul2 (int) ;
48                        angage C
          Exe rcice s e n l
         int mul3 (int) ;
         int n ;
         printf ("donnez un entier : ")   ;
         scanf ("%d", &n) ;
         if (mul2(n))            printf   ("il est pair\n") ;
         if (mul3(n))            printf   ("il est multiple de 3\n") ;
         if (mul2(n) && mul3(n)) printf   ("il est divisible par 6\n") ;
     }
                                           V : TA BLEAUX ET
                                              PO INTEURS




                                             Exe rcice V.1

___________________________________________________________________________

Enoncé

   s       tat
Quel ré s ul s fournira ce program m e :

   #include <stdio.h>

   main()
   {
      int t [3] ;
      int i, j ;
      int * adt ;

       for (i=0, j=0 ; i<3 ; i++) t[i] = j++ + i ;                    /* 1 */

       for (i=0 ; i<3 ; i++) printf ("%d ", t[i]) ;                   /* 2 */
       printf ("\n") ;

       for (i=0 ; i<3 ; i++) printf ("%d ", *(t+i)) ;                 /* 3 */
       printf ("\n") ;

       for (adt = t ; adt < t+3 ; adt++) printf ("%d ", *adt) ;       /* 4 */
       printf ("\n") ;

       for (adt = t+2 ; adt>=t ; adt--) printf ("%d ", *adt) ;        /* 5 */
50                            angage C
              Exe rcice s e n l
             printf ("\n") ;
     }

_______________________________________________________________


  ut
Sol ion

  1*       it e abl      e e al                                        on
/* / re m pl l t e au av c ls v e urs 0 (0+ 0), 2 (1+ 1) e t 4 (2+ 2) ; obt ndrait pl sim plm e nt l m ê m e ré s ul
                                                                           ie       us     e       e               tat
  e 'e
av c l xpre s s ion 2*i.

     /           assiquem e nt ls v e urs du t e au t dans l
/*2 * affich e "cl            " e al          abl ,                   ure ".
                                                           'ordre "nat l

        /        a                    il     e
/* 3 * fait l m ê m e ch os e , e n ut isant l form al e point ur au l u du form al e t e au. Ainsi, * + i) e s t
                                                     ism      e      ie           ism  abl            (t
       e              al
parfait m e nt é q uiv e nt à t[i].

      /       a                      il     a v ue
/*4 * fait l m ê m e ch os e , e n ut isant l "lal " adt (à l ue l on a affe ct init e m e nt l
                                                             aq l  e            é   ial                         abl
                                                                                              'adre s s e t du t e au) e t e n
 'incré m e nt " pour parcourir l diffé re nt s adresses des 4 é lm e nt du t e au.
"l            ant                   es         e                 é      s    abl

      /        e al           , 'e e            il     e               ism      e
/*5 * affich e ls v e urs de t à l nv rs, e n ut isant l m ê m e form al e point ur q ue dans 4. O n aurait pu é crire , de
   on      al e
faç é q uiv e nt :

     for (i=2 ; i>=0 ; i--) printf ("%d ", t[i]) ;




V     e        tat
 oici ls ré s ul s fournis par ce program m e :


     0   2    4
     0   2    4
     0   2    4
     4   2    0




                                                    Exe rcice V.2

___________________________________________________________________________
                                                                                           .   e             e
                                                                                          V Tablaux e t point urs       51
Enoncé

                    ons         e                        it                 ie           abl     ant                  e us
Ecrire , de deux faç diffé re nt s , un program m e q ui l 10 nom bre s e nt rs dans un t e au av d'en rech e rch e r l pl
           e us    it
grand e t l pl pet :

            il                    e        ism abl
   a) e n ut isant uniq ue m e nt l "form al e t e au",
            il     e        ism      e                             a             e
   b) e n ut isant l "form al e point ur", à ch aq ue fois q ue ce l e s t possibl
_______________________________________________________________


  ut
Sol ion

    a            ion ,
a) L program m at e s t ici, "cl                       ons
                                  assique". Nous av sim plm e nt défini un sym bol NV dest à cont nir l nom bre
                                                                e                     e    AL  iné       e     e
     al        abl            e
de v e urs du t e au. Not z bie n q ue l décl ion int t AL e s t acce pt e puis q ue NV
                                            a       arat          [NV ]             é          AL e s t une "e xpre s s ion
     ant
const e ". En re v           le
                  anch e , e l ne l'aurait pas é t s i nous av
                                                  é                                e    AL             ant         iq
                                                              ions défini ce sym bol NV par une "const e sym bol ue "
             AL
(const int NV = 10).

   #include <stdio.h>
   #define NVAL 10                           /* nombre de valeurs du tableau */
   main()
   {   int i, min, max ;
       int t[NVAL] ;

        printf ("donnez %d valeurs\n", NVAL) ;
        for (i=0 ; i<NVAL ; i++) scanf ("%d", &t[i]) ;

        max = min = t[0] ;
        for (i=1 ; i<NVAL ; i++)
          { if (t[i] > max) max = t[i] ;                   /* ou max = t[i]>max ? t[i] : max */
            if (t[i] < min) min = t[i] ;                   /* ou min = t[i]<min ? t[i] : min */
          }

        printf ("valeur max : %d\n", max) ;
        printf ("valeur min : %d\n", min) ;
   }

                   ace     é    iq        , [i]   (t
b) O n pe ut re m pl r syst m at ue m e nt t par * + i)./ D e pl dans scanf on pe ut re m pl r & t par t i. V
                                                               us,         ,               ace    [i]   +    oici
     e       e               e
finalm e nt l program m e obt nu :

   #include <stdio.h>
   #define NVAL 10                           /* nombre de valeurs du tableau */
   main()
   {   int i, min, max ;
52                        angage C
          Exe rcice s e n l
         int t[NVAL] ;

         printf ("donnez %d valeurs\n", NVAL) ;
         for (i=0 ; i<NVAL ; i++) scanf ("%d", t+i) ;                      /* attention t+i et non *(t+i) */

         max = min = *t ;
         for (i=1 ; i<NVAL ; i++)
           { if (*(t+i) > max) max = *(t+i) ;
             if (*(t+i) < min) min = *(t+i) ;
           }

         printf ("valeur max : %d\n", max) ;
         printf ("valeur min : %d\n", min) ;
     }




                                                     Exe rcice V.3

___________________________________________________________________________

Enoncé

              abl     1     2    aré
Soie nt deux t e aux t e t t dé cl s ainsi :

     float t1[10], t2[10] ;

         e      ruct              t
Ecrire ls inst ions perm e t ant de re copie r, dans t t           e
                                                           1, ous ls é lm e nt posit de t e n com plt é v nt l m e nt t
                                                                        é     s     ifs     2,           é ant e ue l  e       1
                                                                             e          il         é    iq         e       ism
par de s zé ros. Ici, on ne ch e rch e ra pas à fournir un program m e com plt e t on ut isera syst m at ue m e nt l form al e
 abl
t e au.

_______________________________________________________________


  ut
Sol ion

                                  ir 1             ant             e    é      s     ifs  2
O n pe ut com m e nce r par re m pl t de zé ros, av d'y re copie r ls é lm e nt posit de t :

         int i, j ;
         for (i=0 ; i<10 ; i++) t1[i] = 0 ;
                  /* i sert à pointer dans t1 et j dans t2 */
         for (i=0, j=0 ; j<10 ; j++)
                                                                                              .   e             e
                                                                                             V Tablaux e t point urs         53
             if (t2[j] > 0) t1[i++] = t2[j] ;

                                          1 e    é     s
M ais, on pe ut re copie r d'abord dans t ls é lm e nt posit de t av de com plt r é v nt l m e nt par de s zé ros.
                                                              ifs       2, ant            é e     e ue l e
    t                    at                 e      a
Ce t e deuxiè m e form ul ion, m oins sim pl q ue l pré cédent , s e ré v lrait t e fois pl e fficace s ur de grands t e aux :
                                                              e          é e     out      us                          abl

       int i, j ;
       for (i=0, j=0 ; j<10 ; j++)
           if (t2[j] > 0) t1[i++] = t2[j] ;
       for (j=i ; j<10 ; j++) t1[j] = 0 ;




                                                     Exe rcice V.4

___________________________________________________________________________

Enoncé

   s       tat
Quel ré s ul s fournira ce program m e :

   #include <stdio.h>
   main()
   { int t[4] = {10, 20, 30, 40} ;
      int * ad [4] ;
      int i ;
      for (i=0 ; i<4 ; i++) ad[i] = t+i ;                                            /* 1 */
      for (i=0 ; i<4 ; i++) printf ("%d ", * ad[i]) ;                                /* 2 */
      printf ("\n") ;
      printf ("%d %d \n", * (ad[1] + 1), * ad[1] + 1) ;                              /* 3 */
   }

_______________________________________________________________


  ut
Sol ion

  e abl                  abl              é    s ch
L t e au ad e s t un t e au de 4 é lm e nt ; acun de ce s é lm e nt e s t un point ur sur un int L
                                                                    é        s              e                       ruct
                                                                                                             . 'inst ion /* 1 */
       it e abl           e e                    é      s     abl
re m pl l t e au ad av c ls adresses des 4 é lm e nt du t e au t L      . 'inst ion /*2 * affich e finalm e nt ls 4 é lm e nt
                                                                                ruct             /              e     e   é    s
     abl      e        ,
du t e au t ; n e ffe t *ad[i] re pré s e nt l v e ur sit e à l
                                            e a al       ué                            /             al e
                                                               'adre s s e ad[i]. /*2 * e s t é q uiv e nt ici à :

   for (i=0 ; i<4 ; i++) printf ("%d", t[i]) ;
54                       angage C
         Exe rcice s e n l
             'inst ion
Enfin, dans l ruct /*3 * *                                    e a al       ué       'e ie       ant ui
                                  /, (ad[1] + 1) re pré s e nt l v e ur sit e à l nt r suiv ce l d'adre s s e ad[1] ; s'agit il
donc de t[2]. En re v anch e , *                       e a al
                                ad[1] + 1 re pré s e nt l v e ur sit e à l
                                                                    ué                                é            re           [1]
                                                                           'adre s s e ad[1] augm e nt e d e 1, aut m e nt dit t +
1.

V                  iv e          tat
 oici, e n dé finit e , ls ré s ul s fournis par ce program m e :

   10 20 30 40
   30 21




                                                      Exe rcice V.5

___________________________________________________________________________

Enoncé

     e abl         aré
Soit l t e au t décl ainsi :

   float t[3] [4] ;

       e        e        ruct          t
Ecrire ls (s e uls ) inst ions perm e t ant de cal e r, dans une v
                                                 cul                   e                 a                 é      s
                                                                  ariabl nom m é e som , l som m e d e s é lm e nt de t :

            il     e        ism      des abl
   a) e n ut isant l "form al e usuel t e aux à deux indice s ",
            il     e        ism      e
   b) e n ut isant l "form al e point ur".
_______________________________________________________________


  ut
Sol ion

    a               ut                       è        icul
a) L pre m iè re s ol ion ne pos e aucun problm e part ie r :

        int i, j ;
        som = 0 ;
        for (i=0 ; i<3 ; i++)
           for (j=0 ; j<4 ; j++)
              som += t[i] [j] ;



      e         ism          e
b) L form al e point ur e s t ici m oins facil à appl ue r q ue dans l cas des t e aux à un indice . En e ffe t av c, par
                                                     e         iq              e         abl                            , e
        e l
e xe m pl, f oat t  [4], t e s t de t                                       e       e              é           abl
                                     ype int * e t ilcorre s pond à un point ur sur l pre m ie r é lm e nt du t e au. Ilsuffit donc
              e        e       e                        ous e      é    s
d'incré m e nt r conv nablm e nt t pour parcourir t ls é lm e nt du t e au.   abl
                                                                                               .      e           e
                                                                                             V Tablaux e t point urs      55
En re v           e      re abl l
       anch e , av c not t e au f oat t [3] [4], t e s t du type point ur sur des t eaux de 4 fl t s(t
                                                                      e             abl           ot ant ype : f oat * L
                                                                                                                l [4] ). a
   at      (t                 e
not ion * + i) e s t gé né ralm e nt inut isabl s ous ce t e form e puis q ue , d'une part e l corre s pond à des v e urs de
                                         il e               t                              , le                     al
 abl               ot ant               re
t e aux de 4 fl t s e t q ue , d'aut part l   , 'incré m e nt i port , non pl sur de s fl t s, m ais sur des bl de 4
                                                                      e         us          ot ant                  ocs
  ot ant par            e +
fl t s ; e xe m pl, t 2 re pré s e nt l                      iè
                                        e 'adresse du h uit m e fl t , com pt à part de ce l d'adre s s e t
                                                                    ot ant        é     ir       ui          .

        ut          e       e ir" a al
Une s ol ion consist à "conv rt l v e ur de t e n un point ur de t
                                                          e            l     .                     e e
                                                                  ype f oat * O n pourrait s e cont nt r de procéder
ainsi :

    float * adt ;
       .....
    adt = t ;

          ,                'affe at    raî               e                 l     ,                       'adre s s e
En e ffe t dans ce cas, l ct ion e nt ne une conv rsion forcé e d e t e n f oat * ce q ui ne ch ange pas l
corre s pondant 1 (s e ul l nat du point ur a ch angé ).
               e        e a ure         e

        e      ,
Gé né ralm e nt on y gagne ra e n l       it           icit
                                    isibil é e n e xpl ant l conv rsion m ise en oeuv à l
                                                                  a     e                     re              'opé e
                                                                                                    'aide de l rat ur de "cast".
    e                  , a            it
Not z q ue , d'une part ce l pe ut é v e r ce rt                      e issem e nt ("w arnings") de l part du com pil e ur.
                                                ains m e s s ages d'av rt                            a              at

V         e                              re e    ruct
 oici finalm e nt ce q ue pourraie nt ê t ls inst ions dem andé e s :

         int    i ;
         int    * adt ;
         som    = 0 ;
         adt    = (float *) t ;
         for    (i=0 ; i<12 ; i++)
               som += * (adt+i);




                                                              Exe rcice V.6

___________________________________________________________________________

Enoncé

                  ion              al           our a              é      s      abl       ot ant ransm is, ainsi q ue s a
Ecrire une fonct q ui fournit e n v e ur de re t l som m e d e s é lm e nt d'un t e au de fl t s t
dim e nsion, e n argum e nt.

              it
Ecrire un pe t program m e d'essai.


1 At ent     a          rai             'on
    t ion, cel n'e s t v q ue parce que l passe de pointeurs sur des groupes d'él ent à un point sur ces él ent Aut ent dit aucune
                                                                                ém s            eur       ém s.    rem     ,
"cont     e
     raint d'al
              ignem ent ne risque de nuire ici. Il
                       "                                                               e,
                                                  n'en irait pas de m ê m e, par exem pl pour des conversions de ch ar *e n int *.
56                    angage C
      Exe rcice s e n l
_______________________________________________________________


  ut
Sol ion

                      e abl         ot ant      u             ,
En ce q ui conce rne l t e au de fl t s re ç e n argum e nt ilne pe ut ê t tre ransm is que par adresse. Quant au nom bre
   é
d'élm e nt (de t       ),
                ype int nous l t           t
                                e ransm e t rons cl
                                                  assiquem e nt par v e ur. L n-t t de not fonct pourra s e pré s e nt r
                                                                     al      'e ê e         re    ion                  e
     'une des form e s s uiv e s :
sous l                      ant


    float somme (float t[], int n)
    float somme (float * t, int n)
    float somme (float t[5], int n)                        /* déconseillé car laisse croire que t */
                                                           /*      est de dimension fixe 5        */

           , a                le                                e      ruct
En e ffe t l dim e nsion ré e l de t n'a aucune incide nce s ur ls inst ions de l fonct e l -m ê m e (e l n'int rv nt pas
                                                                                 a     ion le           le     e ie
         e   cul 'adresse d'un é lm e nt du t e au2 e t e l ne s e rt pas à "al r" un e m pl m e nt puis q ue l t e au e n
dans l cal de l                      é         abl           le               loue         ace                e abl
        ion      é l  oué        a      ion      ant
q ue s t aura é t al dans l fonct appe l som m e ).

V                         re a    ion
 oici ce q ue pourrait ê t l fonct de m andé e :

    float somme (float t[], int n)                         /* on pourrait écrire somme (float * t, ... */
                                                           /*          ou encore somme (float t[4], ... */
                                                           /*          mais pas somme (float t[n], ... */
    {     int i ;
          float s = 0 ;
          for (i=0 ; i<n ; i++)
             s += t[i] ;                                   /* on pourrait écrire s += * (t+i) ; */
          return s ;
    }

                                      il ion de l fonct
Pour ce q ui e s t du program m e d'ut isat     a                            , à                  e      ot
                                                       ion som m e , on pe ut l e ncore , é crire l "prot ype " sous
           e
diffé re nt s form e s :

    float somme (float [], int ) ;
    float somme (float * , int ) ;
    float somme (float [5], int ) ;                        /* déconseillé car laisse croire que t */
                                                           /*      est de dimension fixe 5        */

V                e       e program m e :
 oici un e xe m pl d'un t l

    #include <stdio.h>
    main()

2Il                                    abl      usieurs indices.
   n'en irait pas de m ê m e pour des t eaux à pl
                                                                                               .   e             e
                                                                                              V Tablaux e t point urs         57
   {
       float somme (float *, int) ;
       float t[4] = {3, 2.5, 5.1, 3.5} ;
       printf ("somme de t : %f\n", somme (t, 4) ) ;
   }




                                                     Exe rcice V.7

___________________________________________________________________________

Enoncé

                ion              oie       al             e
Ecrire une fonct q ui ne re nv aucune v e ur e t q ui dé t rm ine l v e ur m axim al e t l v e ur m inim al d'un t e au
                                                                  a al             e     a al             e       abl
     ie                     aile
d'ent rs (à un indice ) de t l q ue l ue . Il
                                     conq                     oir           s e abl                       e
                                             faudra donc pré v 4 argum e nt : l t e au, sa dim e nsion, l m axim um e t
 e
l m inim um .

              it
Ecrire un pe t program m e d'essai.

_______________________________________________________________



  ut
Sol ion

En l                abl
    angage C, un t e au ne pe ut ê t t                                   out                       oris
                                      re ransm is que par adresse (en t e rigue ur, C n'aut e q ue l t         a ransm ission par
 al                 e            abl
v e ur m ais, dans l cas d'un t e au, on t    ransm e t une v e ur de t
                                                              al                  e                         re
                                                                       ype point ur q ui n'e s t rie n d'aut q ue l   'adresse du
 abl                                             é      s,
t e au!). En ce q ui conce rne s on nom bre d'élm e nt on pe ut indiffé re m m e nt e n t         t 'adre s s e (sous form e d'un
                                                                                         ransm e t re l
     e
point ur de t         ),
             ype int* ou l v e ur ; l s e conde s ol ion e s t l pl norm al.
                            a al       ici, a              ut       a us            e

En re v                                 e               e
       anch e , e n ce q ui conce rne l m axim um e t l m inim um , il ne peuv nt pas ê t t
                                                                       s       e                              al
                                                                                           re ransm is par v e ur, puis q u'il s
    e                       re  e
doiv nt pré cis é m e nt ê t dét rm iné s par l fonct
                                              a                          igat              oir                     e
                                                     ion. Ilfaut donc obl oire m e nt pré v de pas s e r de s point urs sur de s
 l . 'e ê e                re     ion                       e                          us out e          ure
f oat L n-t t de not fonct pourra donc s e pré s e nt r ainsi (nous ne donnons pl t e s ls é crit s possibls ) :      e

   void maxmin (int t[], int n, int * admax, int * admin)



 'al h                                                              re   q         ui   'e          .2,        aç
L gorit m e de re ch e rch e de m axim um e t de m inim um pe ut ê t calué s ur ce l de l xe rcice V e n re m pl ant m ax
     adm                 adm         a                 a      ion
par * ax e t m in par * in. Ce l nous conduit à l fonct suiv e :       ant

   void maxmin (int t[], int n, int * admax, int * admin)
58                       angage C
         Exe rcice s e n l
     {
         int i ;
         *admax = t[1] ;
         *admin = t[1] ;
         for (i=1 ; i<n ; i++)
            { if (t[i] > *admax) *admax = t[i] ;
              if (t[i] < *admin) *admin = t[i] ;
            }
     }

    'on      e it e
Si l souh ait é v e r ls "indire ct                               é    iq              e      ruct
                                   ions" q ui apparais s e nt syst m at ue m e nt dans ls inst ions de com paraison, on pe ut
  rav l ee
"t ail r" t m poraire m e nt sur des v       e ocal          a       ion                               a
                                      ariabls l e s à l fonct (nom m é e s ici m ax e t m in). Ce l nous conduit à une
      ion  a            ant
fonct de l form e s uiv e :

     void maxmin (int t[], int n, int * admax, int * admin)
     {
        int i, max, min ;
        max = t[1] ;
        min = t[1] ;
        for (i=1 ; i<n ; i++)
           { if (t[i] > max) max = t[i] ;
              if (t[i] < min) min = t[i] ;
           }
        *admax = max ;
        *admin = min ;
     }

V            it       e                    il ion      re    ion
 oici un pe t e xe m pl de program m e d'ut isat de not fonct :

     #include <stdio.h>
     main()
     {
        void maxmin (int [], int, int *, int *) ;
        int t[8] = { 2, 5, 7, 2, 9, 3, 9, 4} ;
        int max, min ;
        maxmin (t, 8, &max, &min) ;
        printf ("valeur maxi : %d\n", max) ;
        printf ("valeur mini : %d\n", min) ;
     }
                                                                                                   .   e             e
                                                                                                  V Tablaux e t point urs          59
                                                       Exe rcice V.8

___________________________________________________________________________

Enoncé

Ecrire une fonct   ion q ui fournit e n re t    a
                                            our l som m e des v e urs d'un t e au de fl t s à
                                                               al           abl       ot ant                                   e
                                                                                                             deux indices dont ls
dim e nsions sont fournie s e n argum e nt.

_______________________________________________________________


  ut
Sol ion

Par anal           e
         ogie av c ce q ue nous av                  'e            .6,                             are e abl
                                    ions fait dans l xe rcice V nous pourrions songe r à décl r l t e au conce rné dans
 'e ê e         a      ion      a
l n-t t de l fonct sous l form e t        [][]. M ais, ce l n'e s t pl possibl car, ce t e fois, pour dé t rm ine r l
                                                          a            us    e          t                 e         'adresse d'un
  é
é lm e nt t             e t e     e         at                     t a
                                                                    re
           [i][j] d'un t l ablau, l com pil e ur doit e n connaî l deuxiè m e dim e nsion.

       ut           e                        oit         e
Une s ol ion consist à considérer qu'on reç un point ur (de t     ype f oat ) sur l début du t e au e t d'en parcourir t
                                                                       l *        e           abl                       ous
 e   é      s
ls é lm e nt (au nom bre de n* si n et p dé s igne nt l dim e nsions du t e au) com m e s i l av affaire à un t e au à
                              p                       es                 abl                'on ait               abl
une dim e nsion.

   a                    t       ion
Ce l nous conduit à ce t e fonct :

   float somme (float * adt, int n, int p)
   {
      int i ;
      float s ;
      for (i=0 ; i<n*p ; i++) s += adt[i] ;                             /* ou s += *(adt+i) */
      return s ;
   }

         il       e l
                    e
Pour ut iser une t l fonct        a       e
                            ion, l s e ul difficul consist à l t
                                                     té        e               t           iv       'adresse de début du t e au,
                                                                  ui ransm e t re e ffe ct e m e nt l                       abl
       a                e
sous l form e d'un point ur de t ype int * O r, av c, par e xe m pl t
                                             .          e                         ,                          a
                                                                       e [3][4], t s'ilcorrre s pond bie n à l bonne adre s s e , e s t
du t           e             abl                ot ant
    ype "point ur sur des t e aux de 4 fl t s". A priori, t e fois, com pt t nu de l pré s e nce du prot ype , l
                                                                       out              e e          a                    ot         a
     e      oul                        re     om iq
conv rsion v ue s e ra m ise en oeuv aut at ue m e nt par l com pil e ur. Tout fois, com m e nous l ons déj dit dans
                                                                 e          at           e                    'av       à
 'e         .5,
l xe rcice V on y gagne ra e n l    isibil é (e t e n é v nt l m e s s ages d'av rt
                                          it              e ue s                              !)                    'opé e
                                                                                 e issem e nt e n faisant appe là l rat ur de
"cast".

V         e                  e       e program m e d'ut isat de not fonct :
 oici finalm e nt un e xe m pl d'un t l                il ion      re    ion

   #include <stdio.h>
   main()
   {
60                        angage C
          Exe rcice s e n l
         float somme (float *, int, int) ;
         float t[3] [4] = { {1,2,3,4}, {5,6,7,8}, {9,10,11,12} } ;
         printf ("somme : %f\n", somme ((float *)t, 3, 4) ) ;
     }
                                               I ES
                                              V: L CH A INES D E
                                                 CARACTERES




                                                                I
                                                     Exe rcice V.1

___________________________________________________________________________

Enoncé

   s       tat
Quel ré s ul s fournira ce program m e :

   #include <stdio.h>
   main()
   {
      char * ad1 ;
      ad1 = "bonjour" ;
      printf ("%s\n", ad1) ;
      ad1 = "monsieur" ;
      printf ("%s\n", ad1) ;
   }

_______________________________________________________________


  ut
Sol ion

L      ruct                        ace
  'inst ion ad1 = "bonjour" pl dans l v             e
                                           a ariabl ad1 l  'adresse de l ch aî const e "bonj
                                                                         a        ne     ant         our". L       ruct
                                                                                                             'inst ion print     f
                        e e            a al        a     ne
("%s\n", ad1) s e cont nt d'affich e r l v e ur de l ch aî dont l                                      -à
                                                                   'adre s s e figure dans ad1, c'e s t -dire , e n l'occurre nce
"bonj                               e 'inst ion
      our". D e m aniè re com parabl, l ruct ad1 = "m onsie ur" pl l                         a       ne        ant
                                                                          ace 'adresse de l ch aî const e "m onsieur"
62                         angage C
           Exe rcice s e n l
             l ruct            f                 a al
dans ad1 ;'inst ion print ("%s\n", ad1) affich e l v e ur de l ch aî ayant m aint nant l
                                                             a     ne            e                     e
                                                                                       'adre s s e cont nue dans ad1,
       -à           e
c'e s t -dire m aint nant "m onsieur".

    e      ,                         out   e
Finalm e nt ce program m e affich e t sim plm e nt :

   bonjour
   monsieur

              e    us     e       e               tat         ant
O n aurait obt nu pl sim plm e nt l m ê m e ré s ul e n é criv :

   printf ("bonjour\nmonsieur\n") ;




                                                               I
                                                    Exe rcice V.2

___________________________________________________________________________

Enoncé

   s       tat
Quel ré s ul s fournira ce program m e :

   #include <stdio.h>
   main()
   {
      char * adr = "bonjour" ;                                      /* 1 */
      int i ;
      for (i=0 ; i<3 ; i++) putchar (adr[i]) ;                      /* 2 */
      printf ("\n") ;
      i = 0 ;
      while (adr[i]) putchar (adr[i++]) ;                           /* 3 */
   }

_______________________________________________________________


  ut
Sol ion

   a   arat           / ace
L décl ion /*1 * pl dans l v                     e
                                     a ariabl adr, l    'adresse de l ch aî const e bonjour. L
                                                                       a     ne       ant                   ruct      /
                                                                                                       'inst ion /*2 * affich e
 e       è                                       -à     e
ls caract re s adr[0], adr[1] e t adr[2], c'e s t -dire ls 3 pre m ie rs caract res de ce t e ch aî . L
                                                                               è           t                ruct      /
                                                                                                  ne 'inst ion /*3 * affich e
t    e         è          ir        ui
 ous ls caract re s à part de ce l d'adre s s e adr, t q ue l a pas affaire à un caract re nul com m e not ch aî
                                                          ant      'on                              è       ;        re     ne
                                                                                          I. e       ne          è
                                                                                        V L s ch aî s d e caract re s     63
"bonj                             e                 e       è     ,
     our" e s t pré cis é m e nt t rm iné e par un t lcaract re nul ce t e inst ion affich e finalm e nt un par un, t
                                                                        t      ruct              e      ,                 e
                                                                                                                      ous ls
      è
caract res de "bonj  our".

           iv e                            e       e        tat     ant
En dé finit e , l program m e fournit sim plm e nt ls ré s ul s suiv s :

   bon
   bonjour




                                                               I
                                                    Exe rcice V.3

___________________________________________________________________________

Enoncé

       e
Ecrire l program m e pré cédent (Exe rcice V             il
                                            I.2), sans ut iser l "form al e t eau" (il xist pl
                                                               e        ism abl       e                ut
                                                                                           e usieurs sol ions).

_______________________________________________________________


  ut
Sol ion

V             ut           e
 oici de ux sol ions possibls :

                   ace     é    iq         a    at
a) O n pe ut re m pl r syst m at ue m e nt l not ion adr[i] par *(adr+ i), ce q ui conduit à ce program m e :

   #include <stdio.h>
   main()
   {
      char * adr = "bonjour" ;
      int i ;
      for (i=0 ; i<3 ; i++) putchar (*(adr+i)) ;
      printf ("\n") ;
      i = 0 ;
      while (adr[i]) putchar (*(adr+i++)) ;
   }

                 e                    re   ne       us 'aide d'un "indice " i, m ais e n incré m e nt un point ur de t
b) O n pe ut é galm e nt parcourir not ch aî , non pl à l                                            ant           e      ype
ch ar *: il                 out       e
           pourrait s'agir t sim plm e nt de adr, m ais généralm e nt on pré fé re ra ne pas dét
                                                              e      ,                                    t           ion
                                                                                                ruire ce t e inform at e t e n
      oye
e m pl r une copie :
64                        angage C
          Exe rcice s e n l
     #include <stdio.h>
     main()
     {
        char * adr = "bonjour" ;
        char * adb ;
        for (adb=adr ; adb<adr+3 ; adb++) putchar (*adb) ;
        printf ("\n") ;
        adb = adr ;
        while (*adb) putchar (*(adb++)) ;
     }

   e
Not z bie n q ue s i nous incré m e nt           e                a                 ruct                                      us
                                      ions direct m e nt adr dans l pre m iè re inst ion d'affich age , nous ne disposerions pl
   a                           a                ruct
de l "bonne adre s s e " pour l deuxiè m e inst ion d'affich age .




                                                                   I
                                                        Exe rcice V.4

___________________________________________________________________________

Enoncé

                                         'ut isat      ui                        ie     re                     e
Ecrire un program m e q ui de m ande à l il e ur de l fournir un nom bre e nt r e nt 1 e t 7 e t q ui affich e l nom du jour
   a                  e                    undi pour 1, m ardi pour 2, ... dim anch e pour 7).
de l s e m aine ayant l num é ro indiq ué (l

_______________________________________________________________


  ut
Sol ion

                         e               abl                e                 ne
Une dém arch e consist à cré e r un "t e au de 7 point urs sur de s ch aî s ", corre s pondant ch acune au nom d'un j  our de
 a                              ne                 ant                  e                e abl               arat
l s e m aine . Com m e ce s ch aî s s ont ici const e s , ile s t possibl de cré e r un t lt e au par une décl ion com portant
        ial ion        a
une int isat de l form e :

     char * jour [7] = { "lundi", "mardi", ...

      ie        ors                ie
N'oubl z pas al q ue jour[0] cont ndra l               a
                                           'adresse de l pre m iè re ch aî , c'e s t -dire l
                                                                         ne         -à                 a     ne     ant
                                                                                           'adresse de l ch aî const e
 undi" ;
"l                   ie    'adresse de "m ardi", ...
         jour[1] cont ndra l

                a al        a     ne
Pour affich e r l v e ur de l ch aî de rang i, il                                                        e
                                                 suffit de re m arq ue r q ue s on adre s s e e s t sim plm e nt jour[i-1].

      e
D 'où l program m e dem andé :
                                                                                            I. e     ne            è
                                                                                           V L s ch aî s d e caract re s        65
   #include <stdio.h>
   main()
   {
      char * jour [7] = { "lundi",     "mardi", "mercredi", "jeudi",
                           "vendredi", "samedi", "dimanche"
                         } ;
      int i ;
      do
          { printf ("donnez un nombre entier entre 1 et 7 : ") ;
            scanf ("%d", &i) ;
          }
      while ( i<=0 || i>7) ;
      printf ("le jour numéro %d de la semaine est %s", i, jour[i-1]) ;
   }




                                                                I
                                                     Exe rcice V.5

___________________________________________________________________________

Enoncé

                               it                      ie              igat                         igne e
Ecrire un program m e q ui l deux nom bre s e nt rs fournis obl oire m e nt sur une m ê m e l . L program m e ne dev            ra
             ant                                         e          è      al                e
pas "s e pl e r" e n cas de ré pons e incorre ct (caract re s inv ides) com m e l fe rait scanf ("%d %d", ...) m ais
      e                                                          re                ra     le             ors     a
sim plm e nt affich e r un m e s s age e t redem ande r une aut ré pons e . Ildev e n al r de m ê m e l q ue l ré pons e fournie
              e
ne com port pas as s e z d'inform at     ions. En re v           ors
                                                        anch e , l q ue l ré pons e com port ra t
                                                                         a                   e   rop d'inform at      es
                                                                                                                ions, l derniè re s
dev         re
    ront ê t ignoré e s .

 e rait                                                   ra           re us            e
L t e m e nt (dem ande de 2 nom bre s e t affich age ) dev s e poursuiv j q u'à ce q ue l pre m ie r nom bre fourni soit 0.

V                e         ion    e program m e :
 oici un e xe m pl d'exécut d'un t l

   --- donnez deux        entiers : é
   réponse erronée        - redonnez-la : 2 15
   merci pour 2 15
   --- donnez deux        entiers : 5
   réponse erronée        - redonnez-la : 4 12
   merci pour 4 12
   --- donnez deux        entiers : 4 8 6 9
   merci pour 4 8
   --- donnez deux        entiers : 5 é3
66                        angage C
          Exe rcice s e n l
     réponse erronée - redonnez-la : 5 23
     merci pour 5 23
     --- donnez deux entiers : 0 0
     merci pour 0 0

                         il    e
R e m arque : on pe ut ut iser ls fonct         s
                                       ions ge t e t sscanf.

_______________________________________________________________


  ut
Sol ion

        e            a               'é
Com m e l s uggè re l re m arq ue de l noncé , on pe ut ré s oudre ls problm e s pos é s e n e ffe ct
                                                                   e      è                                          e     a e ure
                                                                                                     uant e n de ux t m ps l lct
          e       ie
d'un coupl d'ent rs :

       e ure d'une ch aî de caract re s (c'e s t -dire une s uit de caract re s absol ent quel
     - lct                ne        è           -à              e         è         um                 al
                                                                                             conques, v idée par
     "re t        e a       ion
          urn") av c l fonct ge ts,
                          t      ne e         ,    ant         ",                        e                        ,
     - "décodage " de ce t e ch aî av c sscanf suiv un "form at d'une m aniè re com parabl à ce q ue fe rait scanf à
         ir         am           ré
     part de s on "t pon d'e nt e ".
        ons             , out               ,
R appe l q ue sscanf t com m e scanf fournit e n re t      our l nom bre d'inform at
                                                                 e                                 e        ue          e
                                                                                      ions corre ct m e nt l s , de sort q u'il
                 e es
suffit de ré pé t r l deux opé rat              e us               a al                                 e
                                  ions précédent s j q u'à ce q ue l v e ur fournie par sscanf soit é gal à 2.

  'é                            h          e                    de        è       'ut isat          re
L noncé ne fait aucune h ypot è s e s ur l nom bre m axim al caract re s q ue l il e ur pourra ê t am e né à fournir. Ici,
         ons                  us             è                         il
nous av suppos é q u'au pl 128 caract re s s e raie nt fournis ; s'agit l d'une h ypot è s e q ui, dans l prat ue , s'av re
                                                                             à             h            a     iq        è
     ist        a                                                       igne
ré al e , dans l m e s ure où on ris q ue rare m e nt de frappe r de s l s pl l            de       t,
                                                                               us ongue s ; surcroî ils'agit m ê m e d'une
 im at         ure l
                   e
l it ion "nat l " de ce rt    ains e nv              s                icul
                                        ironne m e nt (DOS, e n part ie r).

V     e
 oici l program m e dem andé :

     #include <stdio.h>
     #define LG 128                    /* longueur maximale d'une ligne */
     main()
     {
         int n1, n2 ;                  /* entiers à lire en donnée */
         int compte ;                  /* pour la valeur de retour de sscanf */
         char ligne [LG+1] ;           /* pour lire une ligne (+1 pour \0) */

                   /* boucle de lecture des différents couples de valeurs */
          do
               {        /* boucle de lecture d'un couple de valeur jusqu'à OK */
                     printf ("--- donnez deux entiers : ") ;
                     do
                     { gets (ligne) ;
                         compte = sscanf (ligne, "%d %d", &n1, &n2) ;
                                                                                                      I. e     ne            è
                                                                                                     V L s ch aî s d e caract re s            67
                          if (compte<2) printf ("réponse erronée - redonnez-la : ") ;
                       }
                       while (compte < 2) ;
                       printf ("merci pour %d %d\n", n1, n2) ;
               }
          while (n1) ;
    }



R e m arques

          'ut isat              us           è                                               ie              è      us
    1) Si l il e ur fournit pl de caract re s q u'iln'e n faut pour form e r 2 nom bre s e nt rs, ce s caract re s (l dans
     igne                 il                   m gré out s
    l ) ne s e ront pas ut isés par sscanf ; al t , il ne seront pas e xpl é s ul rie ure m e nt puis q ue , l q ue l
                                                                               oit    t é                       ors    'on
                        e        ie         ira        e l
                                                         e    ne
    redem ande ra 2 nouv aux e nt rs, on re l une nouv l ch aî par ge t s.
            'on         e         um
    2) Si l souh ait absol e nt pouv l it r l loir im e a ongue ur de l ch aî l au cl ie r, e n ut isant des inst ions
                                                                           a      ne ue     av         il             ruct
    "port e s ", ilfaut s e t
          abl                   ourne r v rs l fonct f t
                                          e a        ion ge s 1 dest e à l une ch aî dans un fich ie r, e t l
                                                                     iné   ire         ne                       iq
                                                                                                            'appl ue r à st   din.
                ace   'inst ion          s igne
    O n re m pl ra l ruct ge t (l ) par f t (l , L st                               im e     G e                   è
                                                       ge s igne G, din) q ui l it ra à L l nom bre de caract re s pris e n
           e        e out                                e
    com pt . Not z t e fois q ue , dans ce cas, ls caract re s e xcédent s (e t donc non "v
                                                                   è             aire                          ge s)      e
                                                                                                    us" par f t re s t ront
               e
    disponibls pour une proch aine lct                                                   a uat      ue l e
                                             e ure (ce q ui n'e s t pas pire q ue dans l sit ion act l où ce s caract re s  è
     ie                              ace      s              ué          à  abl igne
    v ndraie nt é cras e r de s e m pl m e nt m é m oire s it s au-de l du t e au l !).
                 aine        é      at                 and
    D ans ce rt s im plm e nt ions (Turbo/Borl C/C+ + e t Quick C/C M icrosoft), il e xist une fonct      e          ion (non
          abl                       ue      a
    port e , puis q ue non pré v par l norm e ANSI) nom m é e cge t q ui, ut isée à l pl de ge t (ou f t pe rm e t de
                                                                        s       il        a ace         s    ge s)
          e e           è       oq               ,
    ré glr l problm e é v ué . En e ffe t cge t pe rm e t de l une ch aî , e n l it
                                                      s             ire           ne                e                     è
                                                                                            im ant l nom bre de caract re s
            iv                      av       n'e
    e ffe ct e m e nt fournis au cl ie r : il s t pas possibl à l il e ur d'e n frappe r pl q ue pré v de s ort q ue l ris q ue
                                                            e 'ut isat                     us         u,       e      e
               è               aire
    de caract re s e xcédent s n'e xist pl  e us!




                                                                      I
                                                           Exe rcice V.6

___________________________________________________________________________




1 M ais, si v       isez
             ous réal ces exercices en accom pagnem ent d'un cours de l
                                                                      angage C, ile s t probabl q ue v n'aurez pas e ncore ét
                                                                                              e       ous                         a
                                                                                                                             udié l fonction
 ge s         , l e
f t (en général el e s t int      e
                            roduit dans l ch apit rel if au t em ent des fich iers). Cert
                                        e        re at       rait                                           a               ie
                                                                                         ains e xercices de l s e conde part de cet ouvrage feront
      à   s,
appel fget et/ou à s s canf.
68                        angage C
          Exe rcice s e n l
Enoncé

                         e         e            e t                 e        e                e e
Ecrire un program m e dét rm inant l nom bre de lt re s e (m inuscul) cont nues dans un t xt fourni e n donné e s ous
                  e igne ne dépassant pas 128 caract re s . O n ch e rch e ra, ici, à n'ut iser aucune des fonct
form e d'une seul l                                    è                                  il                    ions de
 rait             ne
t e m e nt de ch aî .

_______________________________________________________________


  ut
Sol ion

      e e
Com pt t nu de s cont     e
                     raint s im pos é e s par l noncé , nous ne pouv pas faire appe là l fonct st e n. Pour "e xpl r"
                                               'é                    ons                  a      ion rl             ore
   re    ne         il         e
not ch aî , nous ut iserons l fait q u'e l e s t t rm iné e par un caract re nul
                                            le    e                      è                 e
                                                                                (\0]. D'où l program m e propos é :

     #define LG_LIG 128
     #include <stdio.h>
     main()
     {
        char ligne [LG_LIG+1] ;               /* pour lire une ligne au clavier   +1 pour \0 */
        int i ;                               /* pour explorer les différents caractères de ligne */
        int ne ;                              /* pour compter le nombre de 'e' */

         printf ("donnez un texte de moins d'une ligne : \n") ;
         gets (ligne) ;

         ne = 0 ;
         i = 0 ;
         while (ligne[i])       if (ligne[i++] == 'e') ne++ ;

         printf ("votre texte comporte %d lettres e", ne) ;
     }




                                                               I
                                                    Exe rcice V.7

___________________________________________________________________________

Enoncé

                           it                    e                                              a
Ecrire un program m e q ui l , e n donné e , un v rbe du prem ie r groupe e t q ui e n affich e l conjugaison au pré s e nt de
'indicat sous l form e :
l       if,     a
                                                                                         I. e     ne            è
                                                                                        V L s ch aî s d e caract re s      69
   je chante
   tu chantes
   il chante
   nous chantons
   vous chantez
   ils chantent

                      e                 e                                                       e         ie aut
O n s'assure ra q ue l m ot fourni s e t rm ine bien par "er". O n supposera q u'ils'agit d'un v rbe ré gul r ; re m e nt dit,
          t         'ut isat                         e    e q             e                          ors
on adm e t ra q ue l il e ur ne fournira pas un v rbe t l ue m ange r (l program m e affich e rait al : nous m angons!).

_______________________________________________________________


  ut
Sol ion

     ira
O n l "cl                "        ,                        ne
            assiquem e nt un m ot sous form e d'une ch aî à l   'aide de l fonct ge t Pour v rifie r sa t rm inaison par
                                                                          a      ion     s.        é          e
                        e a       ne      ant         a     ne
"e r", on com pare ra av c l ch aî const e "e r", l ch aî ayant com m e adre s s e l                        ,
                                                                                     'adresse de fin du m ot dim inué e d e 2.
L 'adresse de fin se déduira de l'adresse de début e t de l l
                                                          a ongue ur de l ch aî (obt nue par l fonct st e n).
                                                                        a     ne      e        a       ion rl

           a                  oul       le
Quant à l com paraison v ue , e l s e fe ra à l       'aide de l fonct
                                                                a            rcm        ons       t               oit
                                                                      ion st p ;rappe l q ue ce t e derniè re re ç e n
                     e                     ne          le
argum e nt 2 point urs sur de s ch aî s e t q u'e l fournit e n re t     our une v e ur nul l q ue l deux ch aî s
                                                                                  al        l ors
                                                                                            e        es              ne
               e            e           al          le       ous e    re
corre s pondant s s ont é gals e t une v e ur non nul dans t ls aut s cas.

    es         e                    e        ie
 L diffé re nt s pe rsonnes du v rbe s 'obt nne nt e n re m pl ant dans l ch aî e n q ue s t
                                                             aç ,       a       ne                a e
                                                                                            ion, l t rm inaison "e r" par une
  e                                   ,        a, il     a     ion rcpy q ui re copie une ch aî donnée (ici l t rm inaison)
 t rm inaison approprié e . O n pe ut pour ce l ut iser l fonct st                             ne              a e
                                 l à
                                  e       il           rcm        é          e e         e
à une adresse donné e (ici, ce l déj ut isée dans st p pour v rifie r q ue l v rbe s e t rm ine bien par "er").

  es         e e                      e
L diffé re nt s t rm inaisons possibls s e ront rangées dans un t e au de ch aî s const e s (pl précisém e nt dans un
                                                                 abl            ne         ant     us             ,
 abl            e                  ne       ant
t e au de point urs sur de s ch aî s const e s ). Nous fe rons de m ê m e pour l diffé re nt suj t (j , t
                                                                               es           s                  e
                                                                                                e s e u...) ; n re vanch e ,
                                    e         é          e
ici, nous ne ch e rch e rons pas à ls "concat ne r" au v rbe conj ugué ;                  e ons de ls é crire , au m om e nt
                                                                          nous nous cont nt           e
opport un.

V         e       e
 oici finalm e nt l program m e dem andé :

   #include <stdio.h>
   #include <string.h>
   #define LG_VERBE 30        /* longueur maximale du verbe fourni en donnée */
   main()
   { char verbe [LG_VERBE+1] ;          /* verbe à conjuguer +1 pour \0 */
      char * sujet [6] = { "je", "tu", "il", "nous", "vous", "ils"} ; /* sujets */
      char * term [6] = { "e", "es", "e", "ons", "ez",       "ent" } ;/* terminaisons */
      int i ;
      char * adterm ;                   /* pointeur sur la terminaison du verbe */
70                        angage C
          Exe rcice s e n l
         do
           { printf ("donnez un verbe régulier du premier groupe : ") ;
             gets (verbe) ;
             adterm = verbe + strlen(verbe) - 2 ;
           }
         while (strcmp (adterm, "er") ) ;

         printf ("conjugaison à l\'indicatif présent :\n") ;
         for (i=0 ; i<6 ; i++)
           { strcpy (adterm, term[i]) ;
             printf ("%s %s\n", sujet[i], verbe) ;
           }
     }



                        ons
R e m arque : rappe l q ue st                                  rôl a            ne
                                 rcpy re copie (sans aucun cont e ) l ch aî dont l      'adre s s e e s t fournie e n pre m ie r argum e nt
        -à               , ous e        è          ir
(c'e s t -dire , e n fait t ls caract re s à part de ce t e adre s s e , j q u'à ce q ue l re ncont un \0) à l
                                                           t              us              'on              re           'adre s s e fournie
                           de us, l e        è e       e out e                è
e n s e cond argum e nt ; pl e l com plt bien l t av c un caract re nul fin de ch aî .de                 ne




                                                                    I
                                                         Exe rcice V.8

___________________________________________________________________________

Enoncé

                                        out e e t                  e       e e
Ecrire un program m e q ui supprim e t e s ls lt re s e (m inuscul) d'un t xt de m oins d'une l    igne (ne dépassant pas 128
      è                                                       e e e                                                a ace
caract re s ) fourni e n donné e . O n s'arrange ra pour q ue l t xt ainsi m odifié s oit cré é e n m é m oire , à l pl de
l'ancien.

                 il    a      ion rch
N.B. on pourra ut iser l fonct st r.

_______________________________________________________________


  ut
Sol ion

 a
L fonct      rch
       ion st r pe rm e t de trouv r un caract re donné dans une ch aî . El e s t donc t
                                  e           è                       ne     le               out à fait approprié e pour
ocal     e       il      out
l iser ls 'e ' ; faut t e fois not r q ue , pour l iser t
                                    e              ocal        e                                        e 'appe lde ce t e
                                                          ous ls 'e ', ile s t né ce s s aire de ré pé t r l            t
                                                                                         I. e         ne         è
                                                                                        V L s ch aî s d e caract re s        71
fonct                                     'adresse de début de l ch aî conce rné e (ilfaut é v e r de bouclr sur l re ch e rch e
      ion, e n m odifiant à ch aq ue fois l                    a     ne                       it          e      a
                  è
du m ê m e caract re 'e ').

     a       ion rch
   L fonct st r fournit l                     aq l
                                'adre s s e à l ue l on a t
                                                    e            é e                 è                 a al                  è
                                                            rouv l pre m ie r caract re indiq ué (ou l v e ur 0 si ce caract re
           e       a
   n'e xist pas). L suppre s s ion du 'e ' t      é
                                              rouv pe ut s e faire e n re copiant l "re s t " de l ch aî à l
                                                                                  e        e     a     ne                  'on
                                                                                                            'adre s s e où l a
   t     é e
    rouv l 'e '.
   V            ut          e
    oici une s ol ion possibl :



   #include <stdio.h>
   #include <string.h>

   #define LG_LIG 128                /* longueur maximum d'une ligne de données */
   #define CAR 'e'                   /* caractère à supprimer */

   main()
   {
      char ligne [LG_LIG+1] ;               /* pour lire une ligne   +1 pour \0 */
      char * adr ;                          /* pointeur à l'intérieur de la ligne */

       printf ("donnez un texte de moins d'une ligne : \n") ;
       gets (ligne) ;
       adr = ligne ;
       while (adr = strchr (adr,'e') ) strcpy (adr, adr+1) ;
       printf ("voici votre texte, privé des caractères %c :\n") ;
       puts (ligne) ;
   }
                                            I    ES
                                           VI : L STRUCTURES




                                                              I.1
                                                   Exe rcice VI

___________________________________________________________________________

Enoncé

     e       e ype       ruct      ant
Soit l m odè l (t ) de st ure s uiv :

   struct s_point
   { char c ;
       int x, y ;
   } ;

                ion       oit                    ruct
Ecrire une fonct q ui re ç e n argum e nt une s t ure de t                                  e     e        a
                                                          ype s_point e t q ui e n affich e l cont nu sous l form e :

   point B de coordonnées 10 12

a) En t         t                   a al       a ruct
       ransm e t ant e n argum e nt l v eur de l st ure conce rné e ,

b) En t         t                   'adresse de l st ure conce rné e .
       ransm e t ant e n argum e nt l           a ruct

      es                            it                      a      ion       isée.
D ans l deux cas, on é crira un pe t program m e d'essai de l fonct ainsi réal

_______________________________________________________________


  ut
Sol ion

a) V     a      ion
    oici l fonct de m andé e :

   #include <stdio.h>
74                       angage C
         Exe rcice s e n l

     void affiche (struct s_point p)
     {   printf ("point %c de coordonnées %d %d\n", p.c, p.x, p.y) ;
     }

   e                 at                e  igat          a
Not z q ue s a com pil ion né ce s s it obl oire m e nt l décl ion du t
                                                             arat                 ,       -à     e      ruct
                                                                       ype s_point c'e s t -dire ls inst ions :

     struct s_point
        { char c ;
          int x, y ;
        } ;

V              it                      e e al                                    s                 ruct
  oici un pe t program m e q ui affe ct ls v e urs 'A', 10 e t 12 aux diffé re nt ch am ps d'une st ure nom m é e s , avant
                 e al        'aide de l fonct pré cédent :
d'en affich e r ls v e urs à l        a      ion         e

     main()
     {   void affiche (struct s_point) ;               // déclaration (prototype) de affiche
         struct s_point s ;
         s.c = 'A' ;
         s.x = 10 ;
         s.y = 12 ;
         affiche (s) ;
     }

    ure l  e      , a                        e
Nat l m e nt l re m arq ue pré cédent s 'appl ue é galm e nt ici. En prat ue , l décl ion de l st ure s_point
                                                     iq     e                    iq     a  arat         a ruct
                                     e           'on      e e                          ude               a       at
figure ra dans un fich ie r d'e xt nsion h q ue l s e cont nt ra d'incorpore r par #incl au m om e nt de l com pil ion. D e
             e                       ure dio.h .
m ê m e , il s t né ce s s aire d'incl st


b) V     a     e l
                 e     ion
    oici l nouv l fonct de m andé e :

     #include <stdio.h>

     void affiche (struct s_point * adp)
     {   printf ("point %c de coordonnées %d %d\n", adp->c, adp->x, adp->y) ;
     }

    e       'on     ,    t
Not z q ue l doit ce t e fois, faire appe là l rat ur -> , à l pl de l rat ur point (.), puis q ue l "t ail "
                                               'opé e             a ace           'opé e                     'on rav l    e
            e              ruct             us       a al
sur un point ur sur une s t ure , e t non pl sur l v e ur de l st ure e l -m ê m e . Tout fois l
                                                                 a ruct           le              e 'usage de -> n'e s t pas
 ot e                  e        a                         e                       al
t alm e nt indispensabl, dans l m e s ure où, par e xe m pl, adp-> x e s t é q uiv e nt à (*adp).x.

V     'adapt ion du program m e d'essai pré cédent :
 oici l     at

     main()
     {
                                                                                                      II. e   ruct
                                                                                                     V L s s t ure s            75
         void affiche (struct s_point *) ;
         struct s_point s ;
         s.c = 'A' ;
         s.x = 10 ;
         s.y = 12 ;
         affiche (&s) ;
   }

R e m arque :

       ie           e        al                                  re ruct            es
   Au l u d'affe ct r de s v e urs aux ch am ps c, x e t y de not s t ure s (dans l deux program m es d'essai), nous
                     il    e         it          ial ion       e     e angage C, e n é criv :
   pourrions (ici) ut iser ls possibil é s d'init isat offe rt s par l l                   ant
         struct s_point s = {'A', 10, 12} ;




                                                                I.2
                                                     Exe rcice VI

___________________________________________________________________________

Enoncé

Ecrire une fonct                             es         s                 ruct
                  ion q ui "m e t à zé ro" l diffé re nt ch am ps d'une st ure du t                           'e
                                                                                     ype s_point (défini dans l xe rcice
                 ui
pré cédent) q ui l e s t t                       . a      ion         e          al
                          ransm ise en argum e nt L fonct ne com port ra pas de v e ur de re tour.

_______________________________________________________________


  ut
Sol ion

                'é         e
Ici, bie n q ue l noncé ne l pré cis e pas, ile s t né ce s s aire de t         t     a      ion                     a al
                                                                       ransm e t re à l fonct conce rné e , non pas l v e ur, m ais
l               a ruct               t
 'adresse de l st ure à "re m e t re à zé ro". V      oici l fonct
                                                               a       ion de m andé e (ici, nous av               a    arat
                                                                                                    ons re produit l décl ion de
s_point :)

   #include <stdio.h>
   struct s_point
      { char c ;
        int x, y ;
      } ;

   void raz (struct s_point * adr)
76                        angage C
          Exe rcice s e n l
     {   adr->c = 0 ;
         adr->x = 0 ;
         adr->y = 0 ;
     }

V           it        if,     it
  oici, à t re indicat un pe t program m e d'essai (sa com pil ion né ce s s it l décl ion de s_point ainsi que l fich ie r
                                                             at                e a   arat            ,          e
stdio.h ) :

     main()
     {   struct s_point p ;
         void raz (struct s_point *) ;     // déclaration de raz
         raz (&p) ;
                                /* on écrit c en %d pour voir son code */
         printf ("après : %d %d %d", p.c, p.x, p.y) ;
     }




                                                                I.3
                                                     Exe rcice VI

___________________________________________________________________________

Enoncé

                 ion       oit
Ecrire une fonct q ui re ç e n argum e nt l                  ruct
                                           'adresse d'une s t ure du t                               'e
                                                                         ype s_point (défini dans l xe rcice V    II.1) e t q ui
     oie        tat      ruct
re nv e n ré s ul une s t ure de m ê m e type corre s pondant à un point de m ê m e nom (c) e t de coordonné e s oppos é e s .

              it
Ecrire un pe t program m e d'essai.

_______________________________________________________________


  ut
Sol ion

              'é                       e         tat        re
Bie n q ue l noncé ne pré cis e rie n, l ré s ul de not fonct ne pe ut ê t t
                                                                    ion                              al               ,         t
                                                                                re ransm is que par v e ur. En e ffe t ce ré s ulat
        re                    a     ion l  e             ce a
doit ê t cré é au s e in de l fonct e l -m ê m e ; l signifie q u'il e ra dé t
                                                                            s              a     ie  a      ion e ransm e t re
                                                                                 ruit dè s l sort de l fonct ; n t              t
l                ie             oye 'adre s s e d e q ue lue ch ose dest à disparaî ...
 'adre s s e re v ndrait à re nv r l                     q              iné        tre

V                         re  re
 oici ce q ue pourrait ê t not fonct (ici, e ncore , nous av re produit l décl ion de s_point :
                                    ion                     ons         a    arat            )

     #include <stdio.h>
     struct s_point
        { char c ;
                                                                                              II. e   ruct
                                                                                             V L s s t ure s          77
        int x, y ;
      } ;
   struct s_point sym (struct s_point * adr)
   { struct s_point res ;
      res.c = adr->c ;
      res.x = - adr->x ;
      res.y = - adr->y ;
      return res ;
   }

   e a             rie       ruct
Not z l "dissym é t " d'inst ions t l s q ue re s .c = adr-> c ; y fait appe là l rat ur . à gauch e e t à l rat ur
                                        e le                    on              'opé e                     'opé e
          e
-> à droit (on pourrait ce pe ndant é crire re s .c = (*adr).c.

V                 e              re    ion
 oici un e xe m pl d'essai de not fonct (ici, nous avons ut isé ls possibil és d'init isat d'une s t ure pour
                                                           il e           it         ial ion        ruct
              al
donne r de s v e urs à p1) :

   main()
   {
      struct s_point sym (struct s_point *) ;
      struct s_point p1 = {'P', 5, 8} ;
      struct s_point p2 ;
      p2 = sym (&p1) ;
      printf ("p1 = %c %d %d\n", p1.c, p1.x, p1.y) ;
      printf ("p2 = %c %d %d\n", p2.c, p2.x, p2.y) ;
   }



                                                            I.4
                                                 Exe rcice VI

___________________________________________________________________________

Enoncé

     a ruct        ant               ant             an
Soit l st ure s uiv e , re pré s e nt un point d'un pl :

   struct s_point
      { char c ;
        int x, y ;
      } ;

          a    arat        abl                                s                               ruct      ine
1) Ecrire l décl ion d'un t e au (nom m é courbe ) de NP point (NP supposé défini par une inst ion #de f )

                   ion           f                      e al                      s      s"   abl
2) Ecrire une fonct (nom m é e af ich e ) q ui affich e ls v e urs des diffé re nt "point du t e au courbe , transm is en
          ,     a
argum e nt sous l form e :
78                        angage C
          Exe rcice s e n l
     point D de coordonnées 10 2

3) Ecrire un program m e q ui :

       it                      al        e abl
     - l e n données des v e urs pour l t e au courbe ;on ut isera de préfé re nce ls fonct
                                                                   il                   e               s          ,
                                                                                               ions ge t e t sscanf de
                             oir e ue l
                                      e       'e
     pré fé re nce à scanf (v é v nt l m e nt l xe rcice V      on                 igne de donnée ne peut pas dépas s e r
                                                          I.5) ; supposera q u'une l
                  è
     128 caract re s ,
                  à a     ion        e     e
     - fait appe l l fonct pré cédent pour ls affich e r.
_______________________________________________________________


  ut
Sol ion


1) Il             are     abl         ruct
     suffit de décl r un t e au de s t ure s :

        struct s_point courbe [NP] ;



                            abl
2) Com m e courbe e s t un t e au, on ne pe ut q u'e n t         t 'adre s s e e n argum e nt de af ich e . Ile s t pré fé rabl de
                                                        ransm e t re l                             f                          e
     oir   e                     e                 s. oici ce q ue pourrait ê t not fonct :
pré v é galm e nt e n argum e nt l nom bre de point V                          re     re      ion

     void affiche (struct s_point courbe [], int np)
          /* courbe : adresse de la première structure du tableau */
          /*     (on pourrait écrire struct s_point * courbe)      */
          /* np : nombre de points de la courbe */
     {
        int i ;
        for (i=0 ; i<np ; i++)
           printf ("point %c de coordonnées %d %d\n", courbe[i].c,
                                                      courbe[i].x, courbe[i].x) ;
     }

                       e      abl
Com m e pour n'im port q ue lt e au à une dim e nsion t                          ,            e
                                                         ransm is en argum e nt ile s t possibl de ne pas e n m e nt         a
                                                                                                                     ionne r l
                 'e ê e      a
dim e nsion dans l n-t t de l fonct                 e                       , 'ide ificat ur courbe n'e s t q u'un point ur de
                                     ion. Bie n e nt ndu, com m e , e n fait l nt        e                              e
t                   e       a               ruct       abl                            e
 ype s_point*(point ur sur l pre m iè re s t ure du t e au), nous aurions pu égalm e nt é crire s_point*courbe .

    e
Not z q ue , com m e à l          um       e
                         'accout é e , l "form al e t e au" e t l "form al e point ur" pe uv nt ê t indiffé re m m e nt
                                                   ism abl         e          ism       e   e      re
  il
ut isés (v                               e     re     ion            e
          oire com biné s ). Par e xe m pl, not fonct aurait pu é galm e nt s'é crire :

     void affiche (struct s_point * courbe, int np)
     {
        struct s_point * adp ;
        int i ;
                                                                                             II. e   ruct
                                                                                            V L s s t ure s          79
       for (i=0, adp=courbe ; i<np ; i++, adp++)
          printf ("point %c de coordonnées %d %d", courbe->c, courbe->x, courbe->y) ;
   }




                   ons      e            'e
3) Com m e nous av appris à l faire dans l xe rcice VI.5, nous l
                                                               irons ls inform at
                                                                     e                   at e                  s     s
                                                                                 ions re l iv s aux diffé re nt point à
l'aide des deux fonctions :

         s,    ire                       ne      igne
   - ge t pour l , sous form e d'une ch aî , une l d'inform ation,
           ,                   ant         e     e      a     ne      ue
   - sscanf pour dé code r suiv un form at l cont nu de l ch aî ainsi l .
V                       e                                  ons
 oici ce q ue pourrait l program m e dem andé (ici, nous av re produit à l fois l décl ion de s_point e t l fonct
                                                                      , a       a    arat                 a      ion
  f                e
af ich e pré cédent ) :


   #include <stdio.h>
   struct s_point
      { char c ;
        int x, y ;
      } ;
   #define NP 10                   /* nombre de points d'une courbe */
   #define LG_LIG 128              /* longueur maximale d'une ligne de donnée */
   main()
   { struct s_point courbe [NP] ;
      int i ;
      char ligne [LG_LIG+1] ;
      void affiche (struct s_point [], int) ;

            /* lecture des différents points de la courbe */
       for (i=0 ; i<NP ; i++)
          { printf ("nom (1 caractère) et coordonnées point %d : ", i+1) ;
             gets (ligne) ;
             sscanf (ligne, "%c %d %d", &courbe[i].c, &courbe[i].x, &courbe[i].y) ;
          }
        affiche (courbe, NP) ;
   }

   void affiche (struct s_point courbe [], int np)
   {
      int i ;
      for (i=0 ; i<np ; i++)
         printf ("point %c de coordonnées %d %d\n", courbe[i].c,
                                                    courbe[i].x, courbe[i].x) ;
   }
80                        angage C
          Exe rcice s e n l




                                                                I.5
                                                     Exe rcice VI

___________________________________________________________________________

Enoncé

        e               a
Ecrire l program m e de l q ue s t          'e
                                  ion 3 de l xe rcice pré cédent sans ut iser de st
                                                                ,       il         ructures. O n pré v      ouj
                                                                                                      oira t ours une
     ion     ire e
fonct pour l ls inform at            at e
                            ions re l iv s à un point .

_______________________________________________________________


  ut
Sol ion

                       igat                oir abl               s
Ici, ilnous faut obl oire m e nt pré v 3 t e aux diffé re nt de m ê m e t l : un pour ls nom s de point un pour lurs
                                                                               aile            e                s,          e
                         e                    e                        e              té      icul                      é
abscis s e s e t un pour lurs ordonné e s . L program m e ne pré s e nt pas de difficul s part iè re s (son principalint rê t e s t
     re
d'ê t com paré au pré cédent    !).


     #include <stdio.h>

     #define NP 10                   /* nombre de points d'une courbe */
     #define LG_LIG 128              /* longueur maximale d'une ligne de donnée */
     main()
     {
        char c [NP] ;                /* noms des différents points */
        int x [NP] ;                 /* abscisses des différents points */
        int y [NP] ;                 /* ordonnées des différents points */
        int i ;
        char ligne [LG_LIG+1] ;
        void affiche (char [], int[], int[], int) ;

              /* lecture des différents points de la courbe */
         for (i=0 ; i<NP ; i++)
            { printf ("nom (1 caractère) et coordonnées point %d : ", i+1) ;
               gets (ligne) ;
               sscanf (ligne, "%c %d %d", &c[i], &x[i], &y[i]) ;
            }
          affiche (c, x, y, NP) ;
     }
                                                                                                 II. e   ruct
                                                                                                V L s s t ure s           81

   void affiche (char c[], int x[], int y[], int np)
   {
      int i ;
      for (i=0 ; i<np ; i++)
         printf ("point %c de coordonnées %d %d\n", c[i], x[i], x[i]) ;
   }




                                                             I.6
                                                  Exe rcice VI

___________________________________________________________________________

Enoncé

        es           es     ruct    e                 aré
Soie nt l deux m odè l de st ure dat e t pe rsonne décl s ainsi :

   #define LG_NOM 30
   struct date
       { int jour ;
         int mois ;
         int annee ;
       } ;
   struct personne
       { char nom [LG_NOM+1] ;    /* chaîne de caractères représentant le nom */
         struct date date_embauche ;
         struct date date_poste ;
       } ;

                  ion      oit                     ruct
Ecrire une fonct q ui re ç e n argum e nt une s t ure de t                                   it es          s           e
                                                            ype pe rsonne e t q ui e n re m pl l diffé re nt ch am ps av c un
   ogue s e pré s e nt sous l
dial                  ant                            ant
                            'une des 2 form e s s uiv e s :

   nom : DUPONT
   date embauche (jj mm aa) : 16 1 75
   date poste = date embauche ? (O/N) : O


   nom : DUPONT
   date embauche (jj mm aa) : 10 3 81
   date poste = date embauche ? (O/N) : N
   date poste (jj mm aa) : 23 8 91
82                    angage C
      Exe rcice s e n l
_______________________________________________________________



  ut
Sol ion

    re
Not fonct                            e    e
                ion doit m odifie r l cont nu d'une s t ure de t
                                                       ruct                                                       le        oiv
                                                                 ype pe rsonne ;ile s t donc né ce s s aire q u'e l e n re ç e
l                          .      'é                            e ion      icul                   e e ure
 'adre s s e e n argum e nt Ici, l noncé n'im posant aucune prot ct part iè re conce rnant ls lct s au cl ie r, nous av
lirons "cl                " e            s
             assiquem e nt l nom par ge t e t ls t
                                              e rois aut s inform at
                                                          re                                     . oici ce q ue pourrait ê t l
                                                                    ions num é riq ue s par scanf V                         re a
      ion
fonct de m andé e :


   void remplit (struct personne * adp)
   {
       char rep ;              /* pour lire une réponse de type O/N */

         printf ("nom : ") ;
         gets (adp->nom) ;                /* attention, pas de contrôle de longueur */

         printf ("date embauche (jj mm aa) : ") ;
         scanf ("%d %d %d", &adp->date_embauche.jour,
                            &adp->date_embauche.mois,
                            &adp->date_embauche.annee) ;

         printf ("date poste = date embauche ? (O/N) : ") ;
         getchar () ; rep = getchar () ;   /* premier getchar pour sauter \n */
         if (rep == 'O') adp->date_poste = adp->date_embauche ;
                else { printf ("date poste (jj mm aa) : ") ;
                        scanf ("%d %d %d", &adp->date_poste.jour,
                                           &adp->date_poste.mois,
                                           &adp->date_poste.annee) ;
                      }
   }


    e
Not z q ue , com m e à l              um             ors
                            'accout é e , dè s l q u'une lct de v e urs num é riq ue s (ici par scanf e s t suiv d'une lct
                                                                e ure           al                   )          ie     e ure
             è                     ch            e                 è                    e   e
d'un caract re (ici par ge t ar, m ais l m ê m e problm e s e pos e rait av c scanf e t l code %c), ile s t né ce s s aire de
      e
"saut r" art          le        e
               ificie l m e nt l caract re ayant s e rv à l v idat de l derniè re inform at num é riq ue ; n e ffe t dans l
                                           è             i a al ion                 a        ion               e     ,      e
cas cont                                           è                                 e
        raire , c'e s t pré cis é m e nt ce caract re (\n) q ui e s t pris e n com pt .

      out           a                      il                  l
En t e rigue ur, l dém arch e ainsi ut isée n'est pas infail e : si l il e ur fournit des inform at
                                                                 ibl      'ut isat                                    é
                                                                                                          ions supplm e nt saire
        a           al                             -ce             e
aprè s l derniè re v e ur num é riq ue (ne s e rait q u'un sim pl e s pace ), l caract re l ul rie ure m e nt ne s e ra pas ce l
                                                                               e        è u t é                                 ui
   t          e                  ors             è         ue s" ié
at e ndu. Tout fois, ils'agit al des "problm e s h abit l l s à l fournit d'inform at
                                                                        a        ure                          aire      s
                                                                                             ions e xcédent s . Il peuv nt    e
   re     us               e e                         ons
ê t ré s ol par diffé re nt s t ch niq ues dont nous av parl, not m e nt dans l xe rcice V
                                                               é     am      ,       'e       I.5.
                                                                                        II. e       ruct
                                                                                      V L s s t ure s         83
V          it         if,      it
  oici, à t re indicat un pe t program m e d'essai de not fonct
                                                         re                  at                e es      arat
                                                               ion (sa com pil ion né ce s s it l décl ions des
  ruct        e
st ure s dat e t pe rsonne ) :

   main()
   {
      struct personne bloc ;
      remplit (&bloc) ;
      printf ("nom : %s \n date embauche : %d %d %d \n date poste    : %d %d %d",
             bloc.nom,
             bloc.date_embauche.jour, bloc.date_embauche.mois, bloc.date_embauche.annee,
             bloc.date_poste.jour,    bloc.date_poste.mois,    bloc.date_poste.annee ) ;
   }
         EM      E
   D EUXI E PARTI :

EXERCICES TH EM A TIQUES
                                              I           O
                                               NTRO D UCTI N
                                             A        EM
                                          A L D EUXI E PARTI E




           re ous         q         icat                a                           us e      è
Ce ch apit v fournit q ue lue s e xpl ions conce rnant l m aniè re dont sont conç ls problm e s proposés dans ce t e t
                ie 'ouv         e      q        e                                         a
deuxiè m e part de l rage e t ls q ue lue s rè gls q ue nous nous som m e s fixé e s pour l rédaction de s program m e s
corre s pondants.



                                       as
                             1 - Cane v com m un à ch aq ue e xe rcice

                                  ons   é e
Pour ch aq ue e xe rcice , nous av adopt l m ê m e cane vas.



   'e             è
a)L xpos é du problm e


  e            it                                        e              e     it                          e     ire ant
Il s t const ué d'un énoncé accom pagné d'un exem pl. Ce t e ns e m bl const ue ce q u'ile s t indispensabl de l av de
 e e                     e       è         e  'e
t nt r de ré s oudre l problm e . Ce rt s , l xe m pl pe rm e t d'il re r e t de concré t
                                                       e            lust                       'é                  us,
                                                                                          iser l noncé m ais, de pl ill     e
                    icul           icit  a
pré cis e , e n part ie r e n e xpl ant l m aniè re dont l program m e dial
                                                         e                       e 'ut isat             e                   e
                                                                          ogue av c l il e ur. O n not ra q ue ce t e xe m pl
                      e                             e      e e                             ut
corre s pond e xact m e nt à une im age d'écran obt nue av c l program m e propos é e n sol ion.



b)L    y
   'anals e


   le                         e     gorit            t
El s pé cifie (ou pré cis e ) ls al h m e s à m e t re e n oe uv pour about à une sol ion. El garde un caract re gé né ral
                                                                re          ir       ut         le                 è           ;
    am         , l it
                    e             é
not m e nt e l é v e de s'int re s s e r à ce rt ains dét s de program m at dont l ch oix e s t re j t au m om e nt de l crit
                                                         ail               ion     e                e é                'é    ure
                                l
                                e         à     ie
du program m e . A priori, e l fait déj part de l sol ion ;out fois, si v s é ch e z sur l noncé l ê m e , rie n ne v
                                                       a ut        t e         ous            'é        ui-m                ous
                      a e ure        t      yse,
e m pê ch e , aprè s l lct de ce t e anal de t nt r d'é crire l program m e corre s pondant En e ffe t un t le xe rcice , bie n
                                                     e e            e                         .          ,    e
86                        angage C
          Exe rcice s e n l
     im é      a
q ue l it à l sim pl t          ion       gorit        angage , n'e n possè de pas m oins un int rê t propre e n ce q ui
                        e raduct d'un al h m e dans un l                                        é
conce rne l'appre nt           angage l ê m e .
                     issage du l      ui-m



   e
c)L program m e


                   e        e
Bie n q u'ilsuiv e xact m e nt l   'anal proposée, iln'e n re s t pas m oins q u'ilfail l considérer com m e une rédact
                                         yse                            e                        e
                                                                                                l e                              ion
        e                           re             ie
possibl parm i beaucoup d'aut s . N'oubl z pas q u'à ce niv au ile s t bien difficil de port r un j m e nt de v e ur sur
                                                                        e                       e       e       uge        al
 e         it       es        s   e l e
ls q ual é s ou l défaut de t l ou t l rédacte le                ant       'on                 e    è       e       it
                                                          ion, t q ue l n'a pas précisé ls crit re s re t nus (v esse d'e xé cution,
 ail e                 art      a
t l m é m oire , cl é de l rédact       ion, re s pe ct de ce rt s rè gl de st e , ...) ; l e s t d'aut pl v q ue ce rt
                                                                aine        es    yl         ce a         ant us rai         ains de
         è           e        é               ibl
ce s crit re s pe uv nt s'av re r incom pat e s e nt e ux. Ce s re m arq ue s s 'appl ue nt d'ail urs déj aux e xe rcice s propos é s
                                                         re                             iq          l e       à
                           a              ie
pré cédem m e nt dans l pre m iè re part de ce t ouv                      e                é
                                                            rage m ais av c m oins d'accuit .



   e            aire
d)L s com m e nt s


 s                     aine   icat
Il fournis s e nt ce rt s e xpl ions q ue nous avons j e s ut e s à l com pré h e nsion du program m e l ê m e . Ilpe ut
                                                      ugé    il     a                                  ui-m             ,
             e
par e xe m pl, s'agir :

              s                     ruct             ion       le
   - de rappe l conce rnant une inst ion ou une fonct pe u usuel ,
         ust
   - de j ifications de ce rt                isés                           a       ion
                             ains ch oix ré al uniquem e nt au m om e nt de l rédact du program m e ,
   - de m ise en év              aine   icul é            it      angage ,
                   idence de cert s part arit s ou original és du l
   - etc.



    a
e )L dis cus s ion


 le     it           e
El const ue une s ort d'ouv rt fondé e s ur une ré flxion de caract re gé né ral ui pe ut port r sur :
                           e ure                    e              è            q             e

      e                   e ue l es                          am                                         e
   - ls insuffisance s é v nt l du program m e propos é , not m e nt e n ce q ui conce rne s on com port m e nt face à des
                a         'ut isat
   e rre urs de l part de l il e ur,
     e       iorat        e          e    ui      e
   - ls am é l ions q u'il s t possibl de l apport r,
                 isat         è
   - une gé né ral ion du problm e pos é ,
   - etc.
                                                                                       Int      ion a
                                                                                          roduct à l de uxiè m e partie             87
                 2 - Prote ction de s program m e s par rapport aux donné e s


                      re angage s , ls inst ions usuel de lct au cl ie r du l
Com m e beaucoup d'aut s l             e        ruct     les     e ure   av                                 ot e
                                                                                     angage C ne s ont pas t alm e nt
    é          e ue l
                    e                        es      a
prot gées d'é v nt l s ré pons e s incorre ct de l part de l il e ur. Ce l s -ci pe uv nt e nt ne r un com port m e nt
                                                             'ut isat    le           e       raî              e
         du
anorm al program m e .

                         e            è           rôl
D 'une m aniè re gé né ral, ce problm e de cont e des données peut ê t ré s ol par l m pl de t ch niq ue s approprié e s
                                                                             re       u    'e      oi      e
 e le         le
t l s q ue ce l s q ue nous av  ons re ncontrées dans l xe rcice V de l pre m iè re part . Tout fois, ce l s -ci pré s e nt nt
                                                      'e           I.5       a               ie       e            e
                                                                                                                   l                 e
l        é
 'inconv nie nt d'al        e e e
                    ourdir l t xt du program m e . C'e s t pourq uoi nous av é v é d'int
                                                                              ons it                      é     iq
                                                                                            roduire syst m at ue m e nt de t l s   e l e
      e ions dans t nos exem pls , ce q ui aurait m anife s t m e nt m as q ué l e ct e s s e nt lde l xe rcice (bie n e nt ndu,
prot ct            ous              e                         e                   'obj if       ie      'e                       e
         e ions pourraie nt dev nir indispe nsabl dans un program m e ré e l Not z t e fois q ue ce rt
ce s prot ct                     e                es                            ).    e out                 ains e xe rcice s , de par
 e       ure                            e l
                                          e
lur nat m ê m e , re q uiè re nt une t l prot ct ; l -ci s e ra al cl m e nt dem andée dans l noncé l ê m e .
                                              e ion ce l  e           ors aire                          'é          ui-m



                                                                        e
                                 3 - A propos d e s s tructure s de boucl


              ors    'anal d'un problm e fait int rv nir une ré pé t ion, ilfaudrait pour ê t com plt e n pré cis e r l
En principe , l q ue l   yse        è            e e                it              ,        re    e ,                e
type :

            it
   - ré pé t ion déf           e
                    inie (ou av c com pt ur) : e l e s t ré al en C av c l ruct f
                                        e        le          isée     e 'inst ion or,
            it
   - ré pé t ion t                 aq l e e
                                         e                   e
                  ant q u e , dans l ue l l t s t de poursuit a l u e n début de boucl : e l e s t ré al
                                                                ie                   e     le                      e
                                                                                                       isée en C av c
    'inst ion
   l ruct w h il,     e
            it                aq l e e
                                    e                   ie
   - ré pé t ion jusqu'à dans l ue l l t s t d'arrê t a l u e n fin de boucl : e l e s t ré al en C av c l ruct do ...
                                                                           e     le          isée     e 'inst ion
         e
   w h il.
       ,        e usieurs raisons de ne pas t ours spé cifie r l ch oix du t
En fait ile xist pl                          ouj               e            ype d'une répét ion au niv au de l
                                                                                           it         e      'anal et
                                                                                                                 yse
   e        e        e      'é    ure
de l re port r au niv au de l crit du program m e :

                , e
   - d'une part l ch oix d'un t             e              ouj
                                 ype de boucl n'e s t pas t ours dict im pé rat e m e nt par l problm e : par e xe m pl, un
                                                                     é         iv            e     è                  e
     gorit         il              it
   al h m e ut isant une ré pé t ion de t   ype jusqu'à pe ut t ours ê t t
                                                                ouj                                gorit        il
                                                                          re ransform é e n un al h m e ut isant une
          it
   ré pé t ion de t     ant
                   ype t q u e ,
          re     ,              'av      à
   - d'aut part com m e nous l ons déj e nt v dans l ch apit III de l pre m iè re part , l l
                                             re u         e    re       a                  ie e angage C aut     orise des
                     it    us arié
   form es de ré pé t ion pl v e s q ue ls t
                                        e rois q ue nous v nons d'év ue r (e t q ui sont ce l s propos é e s cl
                                                            e       oq                       e
                                                                                             l                assiquem e nt
        a               ion ruct                        e
   par l "program m at st uré e ") : ainsi, par e xe m pl :
                    a
       *grâ ce à l not                 e              ie ,
                          ion d'opé rat ur s é q ue nt l on pe ut ré al
                                                                      iser, à l
                                                                              'aide de l ruct         e          es
                                                                                       'inst ion w h il, des boucl dans
       e       l e e
                e                     e ie              us        ,
       ls q ue l s l t s t de poursuit a l u, non pl e n début m ais e n cours de boucl, e
        'inst ion
       *l ruct bre ak aut              e        ie    tipl
                         orise des boucls à sort s m ul e s .
88                         angage C
           Exe rcice s e n l
     e                  e e                 à             it
Ce rt s , on pe ut obj ct r q ue ce s ont l des possibil é s q ui sont contraire s à l s prit de l program m at
                                                                                      'e          a                  ruct
                                                                                                               ion st uré e .
            , il                     , l e
Ce pe ndant ut isées à bon e s cie nt e l s pe uv nt am é l r l concision et l t m ps d'exécut de s program m e s . Com pt
                                                 e        iore a               e e               ion                       e
 e        'orie at
t nu de l nt ion du l                    ne                        un               e ot e                 it
                             angage C, il nous a pas paru opport de nous priv r t alm e nt de ce s facil é s .

           iv
En dé finit e , il          e       e ,
                  nous arriv ra souv nt au cours de l
                                                    'anal de nous cont nt r de pré cis e r l (ou ls ) condit
                                                          yse,                 e e               a    e       ion(s) d'arrê t
        é ion                e       e       a
d'une it rat e t de re port r au niv au de l program m at m ê m e l ch oix de s inst ions à ut iser. On not ra q u'e n
                                                           ion             e               ruct       il           e
                                  e     ogiq            e                                 a       ion                aq l e
procédant ainsi un effort de ré flxion l ue pe ut re s t r né ce s s aire au m om e nt de l rédact du program m e , l ue l ,
dans ce cas, s e t    e re us                e raduct l t ral!
                  rouv ê t pl q u'une s im pl t      ion it é e



                                         4 - A propos d e s fonctions


                      'av         à
a) Com m e nous l ons déj re m arq ué dans l ant                a                   e
                                                 'av -propos, l norm e ANSI acce pt deux form es de définition de
fonct ions. V                    e          ons
               oici, par e xe m pl, deux faç d'écrire l n-t t d'une fonct f re ce v deux argum e nt de t
                                                      'e ê e             ion ct    ant             s    ype int e t
ch are t re nv             al
              oyant une v e ur de t          e
                                    ype doubl :

       double fct (int x, char * p)


       double fct (x, p)
       int x ;
       char * p ;

               à              es
Ilne s 'agit l q ue de sim pl diffé re nces de rédact                                    e an
                                                      ion, sans aucune incide nce s ur l pl fonct             .
                                                                                                      ionne l Ici, nous av ons
     é     iq            oyé a                      a                                            a                l e
                                                                                                                   e
syst m at ue m e nt e m pl l pre m iè re form e (on l nom m e parfois form e "m ode rne "), dans l m e s ure où e l a t ndance
              iser           us, s'agit de l s e ul form e acce pt e par l C+ + .
à s e gé né ral et où, de pl il             a     e               é      e



    e
b) L s fonct          ouj      é
            ions ont t ours é t décl
                                   arées dans ls fonct
                                              e            e    il
                                                      ions ls ut isant bien q u'a priori :

        a                igat        e
   - ce l ne s oit pas obl oire pour ls fonctions fournissant un ré s ul de t
                                                                       tat   ype int,
        a                igat   ors
   - ce l ne s oit pas obl oire l q u'une fonct a é t définie , dans l m ê m e s ource , av d'ê t ut isée.
                                               ion   é               e                     ant   re il


          es        arat
c) D ans l décl ions des fonct                       ons il a
                                       ions, nous av ut isé l form e prot ype aut é e par l s t
                                                                               ot        oris                              l
                                                                                                                           e
                                                                                                  e andard ANSI. Ce l -ci s e
    è e
ré v l s urt                       ors
             out fort pré cie us e l q ue l e xpl e ls possibil és de com pil ion s é paré e e t q ue l a donc affaire à
                                             'on     oit e            it              at                   'on
pl                                      s.      e
   usieurs fich ie rs source diffé re nt Ce rt s , ce n'e s t pas l cas ici, m ais, com pt t nu de ce q u'e l e s t prat ue m e nt
                                                                  e                       e e               le          iq
        é
acce pt e d e t       e         at
               ous ls com pil e urs act l e t q ue , de pl e l e s t e s t obl oire e n C+ + , ilnous a paru j
                                           ue s               us, l e           igat                               udicie ux d'e n
                 ude
faire une h abit .
                                        ARI O         GO TH
                                   I : V A TI NS A L RI M I QUES
                                              ES NSTRUCTI NS
                                         SUR L I          O
                                                D E BASE




          re ous             è                       q
Ce ch apit v propose des problm e s ne faisant appe l u'aux not                angage C, à sav :
                                                               ions de base du l              oir

         ré        ie     e
   - e nt e s -sort s conv rsat      l
                               ionne l s (ge t ar, scanf ge t put ar, print ),
                                      e       ch        ,    s,  ch        f
         ruct         rôl
   - inst ions de cont e ,
      abl
   - t e aux,
         ne
   - ch aî s ,
   - fonctions.




                                                 -1     e
                                                I Triangl de Pas cal

______________________________________________________________________________
Enoncé

Affich e r un "t     e         "
                riangl de Pascal dont l nom bre de l s e s t fourni e n donné e . Nous v rappe l q ue ls "cas e s " d'un
                                      e              igne                               ous    ons     e
 e t        e     ie      e al                     s                                                é      s
t l riangl cont nne nt ls v e urs des coe fficie nt du binom e C (ou nom bre de com binaisons de n élm e nt pris p à p).
                                                                      n,p
    t al             acée dans l cas e corre s pondant à l e rs e ct
Ce t e v e ur e s t pl         a                         'int       ion de l l
                                                                           a igne de rang n e t l col
                                                                                                a                   a
                                                                                                    onne de rang p (l
         at              ant
num é rot ion com m e nç à 0).

       it         cul             e                      au
O n é v e ra de cal e r ch aq ue t rm e s é paré m e nt ; cont                               oit a at
                                                              raire , on ch e rch e ra à e xpl e r l re l ion de ré curre nce :
90                          angage C
            Exe rcice s e n l
        C     = C          + C
          i,j       i-1, j      i-1,j-1

     im e        e            ignes dem andé e s par l il e ur e t on re s pe ct ra l pré s e nt ion proposée dans l xe m pl
O n l it ra à 15 l nom bre de l                      'ut isat                   e   a           at                 'e      e
ci-de s s ous.

       e
Exe m pl
     combien de lignes voulez vous ? 12

    p       0    1    2    3    4    5    6    7    8    9   10   11
    n
   -----------------------------------------------------------------
    0 --    1
    1 --    1    1
    2 --    1    2    1
    3 --    1    3    3    1
    4 --    1    4    6    4    1
    5 --    1    5   10   10    5    1
    6 --    1    6   15   20   15    6    1
    7 --    1    7   21   35   35   21    7    1
    8 --    1    8   28   56   70   56   28    8    1
    9 --    1    9   36   84 126 126     84   36    9    1
   10 --    1   10   45 120 210 252 210 120        45   10    1
   11 --    1   11   55 165 330 462 462 330 165         55   11    1
______________________________________________________________________________



ANALYSE


                             il         abl                                ant          é   s
A priori, nous pourrions ut iser un t e au t à deux dim e nsions com port 15x15 é lm e nt e t décide r (arbitraire m e nt)
      e                                             igne du t
q ue l pre m ie r indice corre s pond au rang d'une l             e e                ui        onne
                                                             riangl, l s e cond à ce l d'une col . Nous re m pl    irions
  ors     ie le          abl
al part l m e nt ce t e au av c ls v e urs C v ue s (i v rait de 0 à n-1 si n re pré s e nt l nom bre de l s
                                    e e al            oul        arie                           e e                 igne
                                                     i,j
                ,               al             arie
dem andé e s e t pour ch aq ue v e ur de i, j v rait de 0 à i).

         oit a
Pour e xpl e r l ré curre nce propos é e , il                ors
                                             nous suffirait al de procéder com m e s uit :

        ace a al
     - pl r l v e ur 1 e n t                    it a              igne
                            (0,0) (ce q ui const ue l pre m iè re l ),
                     igne de rang i, à part de i=1, procéder ainsi :
     - pour ch aq ue l                     ir
          ace a al
        *pl r l v e ur 1 e n t(i,0) e t t           ré és    a igne de rang i),
                                         (i,i) (e xt m it de l l
        *pour j variant de 1 à i-1, faire :
                t(i,j) = t(i-1,j) + t(i-1,j-1)
                                                        I. V ariat  ions al     h            e       ruct
                                                                           gorit m iques sur ls inst ions de base       91
       ,              e        il            abl
En fait ile s t possibl de n'ut iser qu'un t e au à une s e ul dim e nsion, dans lq ue lon v nt cal e r succe s s iv m e nt
                                                                e                     e          ie       cul       e
ch acune des lignes du t     e
                        riangl (ilfaut al bie n sûr, affich e r ch aq ue l dè s q u'e l a é t dét rm iné e ).
                                        ors,                              igne          le     é    e

                    ,               ant                                abl                 al
Supposons, en effe t q u'à un inst donné , nous disposions dans ce t e au t des i+1 v e urs de l l    a igne de rang i e t
v                    e            les   a igne de rang i+1. Nous const ons q ue l ré curre nce propos é e pe rm e t de définir
 oyons com m e nt dét rm ine r ce l de l l                            at         a
a      e l al
         e                é
l nouv l v e ur d'un é lm e nt de t e n fonct de s on ancie nne v e ur e t de l
                                             ion                  al                      al       'é é
                                                                              'ancie nne v e ur de l lm e nt pré cédent   .

     e
Ce rt s , si nous répét                at      a
                       ions une affe ct ion de l form e :

           (j)        (j
          t = t(j) + t -1)
             arie
e n faisant v r j de 1 à i-1, nous n'about                     t
                                             irions pas au résul e s com pt puis q u'al l v e ur de t dépendrait de l
                                                                at         é          ors a al       (j)            a
      e l al
         e          abl         t           (j
nouv l v e ur pré al e m e nt at ribué e à t -1).

                   e         re
M ais, ile s t facil de m ont r q u'e n e xpl       a igne de droit à gauch e , c'e s t -dire e n ré pé t l ct ion ci-de s s us
                                              orant l l            e                   -à                ant 'affe at
                   tre             e        è
e n faisant décroî j de i-1 à 0, l problm e ne s e pos e pl  us.


V         e       'al h                   il
 oici finalm e nt l gorit m e q ue nous ut iserons :

          arie                            al
   Faire v r i de 0 à n-1. Pour ch aq ue v e ur de i :
                e                    tre
       - ré pé t r, e n faisant décroî j de i-1 à 1 :
                  (j)        (j
                 t = t(j) + t -1)
          ace a al
       - pl r l v e ur 1 dans t(i).


R e m arques :

            q    'al h         ie
   1) Te l ue l gorit m e v nt d'ê t é noncé , nous const ons q ue pour i=0, j doit décroî de -1 à 1! Nous adm e t rons
                                         re                     at                              tre                        t
             a                              rait                   iser                                          ors
   q ue ce l signifie e n fait q u'aucun t e m e nt n'e s t à ré al dans ce cas (ce qui est norm alpuis q ue al not l   re igne
                e a       e al         aq l    e
   e s t réduit à l s e ul v e ur 1, l ue l s e ra pl e par l ct ion t
                                                      acé         'affe at                  a                          ant ors
                                                                             (i)=1). Ile n v de m ê m e pour i=1, j dev al
            tre                  e
   décroî de 0 à 1. O n not ra q u'e n l      angage C l boucl f pe rm e t de t nir com pt de ce s cas part ie rs (l t s t de
                                                        a        e or            e          e                 icul     e e
              e          e ant      isé                       out          à         e        isabl ous e angage s .
   poursuit de boucl é t ré al en début). Ce n'e s t t e fois pas l une rè gl gé né ral e à t ls l
        e e
   2) Av c ls pré caut                e         oq     'al h              ial      ui-m
                      ions q ue nous v nons d'év ue r, l gorit m e "s'init ise" de l ê m e .



Program m e

   #include <stdio.h>
   #define NMAX 15                        /* nombre maximal de lignes */

   main()
   { int t [NMAX],                        /* tableau représentant une ligne du triangle */
92                        angage C
          Exe rcice s e n l
             nl,                         /* nombre de lignes souhaitées */
             i,                          /* indice de la ligne courante */
             j ;                         /* indice courant de colonne */

              /* lecture nombre de lignes souhaitées et affichage titres */
         printf ("combien de lignes voulez vous ? ") ;
         scanf ("%d", &nl) ;
         if (nl > NMAX) nl = NMAX ;
         printf ("\n\n p   ") ;
         for (i=0 ; i<nl ;i++)
            printf ("%5d", i) ;
         printf ("\n n\n") ;
         for (i=0 ; i<=nl ; i++)
            printf ("-----") ;
         printf ("\n") ;

              /* création et affichage de chaque ligne */
         for (i=0 ; i<nl ;i++)
            { t[i] = 1 ;
              for (j=i-1 ; j>0 ; j--)
                 t[j] = t[j-1] + t[j] ;
              printf ("%2d --", i) ;
              for (j=0 ; j<=i ; j++)
                  printf ("%5d", t[j]) ;
              printf ("\n") ;
            }
     }



          aire
Com m e nt s


*En l             e               abl
       angage C, ls indices d'un t e au com m e nce nt à 0. Ici, ce t e part arit s 'av re int re s s ant puis q ue nos
                                                                     t      icul é     è      é          e
             igne
num é ros de l s ou de col          e
                          onnes doiv nt aussi com m e nce r à 0.


      ut          il             e
*Pl ôt q ue d'ut iser direct m e nt l const e 15 dans not program m e , nous av préfé ré faire appe là l ruct
                                         a        ant            re                        ons                         'inst ion
      ine                                              e                      t al                                us
#de f du pré proce s s e ur pour dé finir un sym bol NMAX possédant ce t e v e ur. Ile s t ainsi beaucoup pl facil, l cas e e
          ,                  t al                          ors     e e                                               e
é ch é ant de m odifie r ce t e v e ur (puis q u'ilsuffit al d'int rv nir e n un s e ule ndroit du program m e ). Not z q ue nous
                     il       a     arat              ant       iq
n'aurions pas pu ut iser l décl ion de const e sym bol ue (const int NM AX = 15), car, dans ce cas, NM AX n'aurait
        é                         ant                              'ut iser
pas é t une "e xpre s s ion const e ", e t nous n'aurions pas pu l il com m e dim e nsion d'un t e au.abl


           ie
*Ne pas oubl r q ue t                  e
                     [NM A X] ré s e rv NMAX élm e nt (c'e s t -dire 15), dont ls indice s v nt de 0 à 14.
                                              é      s        -à               e            arie
                                                               I. Variat      gorit m iques sur ls inst ions de base
                                                                        ions al    h            e      ruct                     93

    'ut isat                          igne                     e                     e e    im e       t
*Si l il e ur de m ande un nom bre de l s s upé rie ur à NMAX, l program m e s e cont nt de l it r ce t e dem ande à
a al
l v e ur NM A X.



DI      O
  SCUSSI N

                   e           e   a
*Nous aurions pu t nir com pt de l sym é t de ch aq ue l
                                            rie                                          re     q         ruct
                                                             igne par rapport à son ce nt ;q ue lue s inst ions
    é      aire               ors           é            ion    e         cul
supplm e nt s nous auraie nt al perm is une lgè re réduct du t m ps de cal .


   'é          im ait       e
*L noncé l it à 15 l nom bre de l           ignes de not t
                                                        re riangl. En e ffe t au-de l, iln'e s t gé né ralm e nt pl possibl
                                                                e            ,      à                    e        us      e
              out e al                     e igne
d'affich e r t e s ls v e urs sur une s e ul l d'écran.


      re                          é         e        'ut isat                                         a         ion
*Not program m e n'e s t pas prot gé dans l cas où l il e ur fournit une ré pons e non num é riq ue à l q ue s t pos é e .
               out      a uat                  rè      e e
D ans ce cas, t e fois, l sit ion n'e s t pas t s grav ; n e ffe t l v e ur de nle s t ce rt s , alat
                                                                  , a al              ,     e                       out
                                                                                                  é oire m ais, de t e
   on, l e      im é            e
faç e l s e ra l it e à 15 par l program m e .

Si v            ie                 rait
    ous souh ait z q uand m ê m e t e r ce t ype d'anom al , ilv
                                                          ie                                   e
                                                                 ous suffirait d'exam ine r l code de re t       a
                                                                                                          our de l fonction
scanf (il          e            al         e
         fournit l nom bre de v e urs conv nablm e nt l s ) e t de v rifie r q u'il s t bien égal 1.
                                                 e      ue          é              e             à



                                                -2   e
                                               I Cribl d'Eratos th è ne

________________________________________________________________________________________

        e         h          e       ion
Ile xist une m é t ode de dét rm inat de nom bre s pre m ie rs connue s ous l nom de "cribl d'Erast h è ne ". El pe rm e t
                                                                            e             e        ot          le
      e    ous e                                         al
d'obt nir t ls nom bre s pre m ie rs infé rie urs à une v e ur donné e n.

 a     h            l
L m é t ode (m anue l ) consist à dre s s e r une l e des nom bre s considérés (de 1 à n) e t à y raye r t
                      e        e                  ist                                                                 e
                                                                                                                 ous ls nom bre s
   tipl       re     ie      e s                                                         us             ,
m ul es d'aut s e nt rs (de t l nom bre s s ont né ce s s aire m e nt non pre m ie rs). Pl précisém e nt on procè de ainsi :

            e
1 - on raye l 1 (q ui, par dé finition, n'e s t pas un nom bre pre m ie r).

                             ir                                              a                        ie
2 - on re ch e rch e , à part du de rnie r nom bre pre m ie r considéré (l pre m iè re fois, on conv nt q u'ils'agit du 1), l     e
                                           re                               ie ,
pre m ie r nom bre non rayé (on pe ut m ont r q u'ile s t pre m ie r). Ildev nt à son t     e
                                                                                       our, l dernie r nom bre pre m ie r considéré
             ous          tipl
e t on raye t s e s m ul e s .

              e e         us             e                                               a                                  ors
3 - on ré pè t l point 2 j q u'à ce q ue l nom bre pre m ie r considéré soit supérieur à l racine carré e d e n. O n pe ut al
     re         ous e                              é            a ist
m ont r q ue t ls nom bre s non pre m ie rs ont é t rayés de l l e .
94                        angage C
          Exe rcice s e n l
Enoncé

                                     t       h
Ecrire un program m e bas é s ur ce t e m é t ode re ch e rch ant t    e                                     re        a al
                                                                   ous ls nom bre s pre m ie rs com pris e nt 1 e t n (l v e ur de n
   ant          e
é t fixée dans l program m e )


       e
Exe m pl

     entre 1 et 1000, les nombres premiers sont :
           2      3      5      7     11     13                        17        19         23        29
          31     37     41     43     47     53                        59        61         67        71
          73     79     83     89     97    101                       103       107        109       113
         127    131    137    139    149    151                       157       163        167       173
         179    181    191    193    197    199                       211       223        227       229
         233    239    241    251    257    263                       269       271        277       281
         283    293    307    311    313    317                       331       337        347       349
         353    359    367    373    379    383                       389       397        401       409
         419    421    431    433    439    443                       449       457        461       463
         467    479    487    491    499    503                       509       521        523       541
         547    557    563    569    571    577                       587       593        599       601
         607    613    617    619    631    641                       643       647        653       659
         661    673    677    683    691    701                       709       719        727       733
         739    743    751    757    761    769                       773       787        797       809
         811    821    823    827    829    839                       853       857        859       863
         877    881    883    887    907    911                       919       929        937       941
         947    953    967    971    977    983                       991       997

________________________________________________________________________________________



ANALYSE


 a     h             le              il
L m é t ode m anue l s uggè re d'ut iser un t e au. Tout fois, dev
                                              abl          e                              ogie          e             ie
                                                                     ons-nous, par anal , y range r ls nom bre s e nt rs de
              ,    a                    il            ors                                              e abl
1 à n?En fait ce l ne s e rait guè re ut e puis q ue al ch aq ue nom bre s e rait é galà son rang dans l t e au (du m oins, à
         é           ant e
une unit prè s, suiv ls conv nt                'on       e
                                 e ions q ue l adopt rait pour l                           é
                                                                   'indice du prem ie r é lm e nt).

         it e                e         'al h                        e          re
En ré al é , l bon déroulm e nt de l gorit m e nous im pos e s e ulm e nt d'ê t e n m e s ure de faire corre s pondre à ch aq ue
    ie     re                      ion
e nt r e nt 1 e t n, une inform at pré cisant à ch aq ue inst , s'ile s t rayé ou non (ce t e inform at pouv é v ue r au
                                              ,              ant                           t           ion       ant ol
               e                                 à out ure l   e
fildu déroulm e nt du program m e ). Ils'agit l t nat l m e nt d'une inform at        ion de t        ogiq        rai
                                                                                                ype "l ue " (v ou faux).
Com m e ce t              e         ant    e
              ype n'e xist pas e n t q ue t le n langage C, nous l s im ulrons à l
                                                                  e        e                             ant      iè       R
                                                                                   'aide de deux const e s e nt re s : V A I
      al                    al          e     e           a al                                      a
de v e ur 1, FAUX de v e ur 0. Not z q ue l ch oix de l v e ur 0 pour FAUX est im pos é par l m aniè re dont l l      e angage
                                                            I. Variations al     h            e      ruct
                                                                            gorit m iques sur ls inst ions de base       95
C considè re une e xpre s s ion num é riq ue apparaissant dans une condit         l al                  re          re
                                                                           ion ; a v e ur 1, par cont , pourrait ê t , sans
      é      ,      acé
inconv nie nt re m pl e par n'im port q ue l v e ur non nul .
                                          e     e
                                               l al             le


Not               e abl                                                'e ie                   e e             e ions du
    ons raye un t lt e au e t supposons q ue raye [i] corre s pond à l nt r i (ce q ui, com pt t nu de s conv nt
l                                           il        re gorit                          a race du dernier nom bre pre m ie r
 angage C, signifie q ue raye [0] e s t inut isé). Not al h m e nous im pose de garde r l t
                  e                          a                 l
                                                               e
considéré. Nous l nom m e rons pre m . L dém arch e m anue l s e t           ors
                                                                  ranspose al com m e s uit :

        ial ion
   *Init isat :
             t           ous e é      s    abl
      - m e t re à FAUX t ls é lm e nt du t e au raye ,
             t          e              é
      - m e t re à FAUX l pre m ie r é lm e nt de raye , e t faire :
                pre m = 1
      é ion
   *It rat :
                               ir          e                                              -à                 e a al
      - re ch e rch e r, à part de pre m , l pre m ie r nom bre non e ncore rayé , c'e s t -dire incré m e nt r l v e ur de pre m
       us                   [pre                    out                                            e
      j q u'à ce q ue t m ] soit FAUX (en t e rigue ur, ilfaut se dem ande r s'ile xist e ncore un t lnom bre danse
          re abl                  im e 'incré m e nt ion de pre m à N).
      not t e au, e t donc l it r l                 at
                ous e  tipl                 e            e nom bre a é t t
      - raye r t ls m ul es de pre m , dans l cas où un t l                   é
                                                                        é rouv .
      'it ion propos é e pe ut ê t ré pé t e , indiffé re m m e nt (l deux form ul ions é t
   *L é rat                       re      é                         es           at                   al es
                                                                                           ant é q uiv e nt dè s q ue N est
                    à
   supérieur ou égal 1) :
      -j               a al                                a
        usqu'à ce q ue l v e ur de pre m soit supérieure à l racine carrée de N,
            ant    a al                                        e a
      - ou t q u e l v e ur de pre m e s t infé rie ure ou é gal à l racine carrée de N.


Program m e


   #include <stdio.h>
   #define N 1000                             /* plus grand entier à examiner */
   #define VRAI 1                             /* pour "simuler" des ..... */
   #define FAUX 0                             /* ..... valeurs logiques */

   main()
   {
      int raye [N+1],                         /* tableau servant de crible */
          prem,                               /* dernier nombre premier considéré */
          na,                                 /* compteur de nombres affichés */
          i ;

                            /* initialisations */
       for (i=1 ; i<=N ; i++)                                          /* mise à zéro du crible */
96                        angage C
          Exe rcice s e n l
            raye[i] = FAUX ;
         raye[1] = VRAI ;                                                 /* on raye le nombre 1 */

                            /* passage au crible */
         prem = 1 ;
         while (prem*prem <= N)
            { while (raye[++prem] && prem<N ) {}
                                          /* recherche premier nombre non rayé */
              for (i=2*prem ; i<=N ; i+=prem) /* on raye tous ses multiples */
                  raye[i] = VRAI ;
            }

                                 /* affichage résultats */

         printf ("entre 1 et %d, les nombres premiers sont :\n", N) ;
         na = 0 ;
         for (i=1 ; i<=N ; i++)
            if ( !raye[i] )
               { printf ("%7d",i) ;
                  na++ ;
                  if ( na%10 == 0) printf ("\n") ;     /* 10 nombres par ligne */
               }
     }



          aire
Com m e nt s


  a                                                            isée  a      e     ruct
*L re ch e rch e du prem ie r nom bre non e ncore rayé est ré al par l s e ul inst ion :

             while (raye[++prem] && prem<N) {}

   e        a                  at             une
Not z bie n l pré -incré m e nt ion de pre m ; post             at
                                                   -incré m e nt ion :

             while (t[prem++] && prem<N) {}

                           e               e
aurait conduit à une boucl infinie s ur l pre m ie r nom bre pre m ie r t     é        -à
                                                                         rouv , c'e s t -dire 2 (du m oins si N est supérieur ou
     à
é gal 2). Il           out                   e
            suffirait t e fois d'incré m e nt r pre m une fois av d'ent r dans l boucl pour q ue ce l fonct
                                                                 ant       re         a      e              a     ionne .


        ons       é e
*Nous av cons e rv l garde -fou :

          prem < N
                                                           I. Variat      gorit m iques sur ls inst ions de base
                                                                    ions al    h            e      ruct                  97
              out            re                                                        ouj
O n pourrait t e fois dém ont r q ue , dè s q ue N est supérieur ou égalà 2, on e s t t ours assuré de t    e
                                                                                                        rouv r au m oins un
                    ant a         abl             e e                 'on              'e orat       e
nom bre non rayé av l fin du t e au (com pt t nu de ce q ue l com m e nce l xpl ion av c un nom bre infé rie ur
        à a
ou é gal l racine carrée de N).


*Nous av             u                                                           igne                                    è
            ons prév d'affich e r nos nom bre s pre m ie rs, à raison de 10 par l , ch aq ue nom bre occupant 7 caract re s .
                          il
Pour ce faire , nous ut isons une v        e                           t            abil   e
                                     ariabl nom m é e na nous perm e t ant de com pt iser l nom bre de nom bre s affich é s . A
                               tipl                oq
ch aq ue fois q ue na e s t m ul e de 10, nous prov uons un saut de l .  igne



DI      O
  SCUSSI N


                                  e              rait e                       e
*Te lq u'ile s t propos é ici, l program m e t e l cas n=1000. Pour l faire fonct                     e      re al
                                                                                           ionne r av c d'aut s v e urs, ile s t
                    e e           e                   ui-m
né ce s s aire d'int rv nir au niv au du program m e l ê m e e t de l re com pilr. Si v souh ait z q ue l v e ur de n puis s e
                                                                      e          e      ous         e      a al
   re
ê t fournie e n donné e , il        ui           al
                              faut l fixe r une v e ur m axim al, afin de pré v l ré s e rv ion du t e au corre s pondant
                                                               e               oir a       at         abl                .

    e out             e         it          ion
Not z t e fois q ue ls possibil és de ge s t dynam iq ue du l     angage C offre nt une s ol ion pl agré abl à ce problm e
                                                                                           ut     us       e          è
de dim e nsions v      e    ous
                 ariabls . V e n t     e
                                   rouv re z ce rtains e xe m pl dans l ch apit consacré à l ge s t dynam iq ue .
                                                               es      e       re              a   ion


    e abl
*L t e au raye , ainsi que ls v             e                   é
                                  e ariabls pre m e t i, ont é t décl de t
                                                                     arés              ,                  aine       é  at
                                                                              ype int ce q ui, dans ce rt s im plm e nt ions,
        im e                e al                            e                           ouj                        il
pe ut l it r à 32767 ls v e urs q u'ile s t ainsi possibl d'exam ine r. O n pe ut t ours faire m ie ux, e n ut isant l te ype
               ,
unsigne d int ou m ie ux l t        ong
                              e ype l ou unsigne d l              e                                       'on
                                                       ong. Tout fois, dans ce cas, on s'assure ra q ue l n'e s t pas soum is à
des cont        e         a aile              s    e      e s,
           raint s s ur l t l des diffé re nt m oduls obj t sur l t l de l pil ou, e ncore , t sim plm e nt sur l t l
                                                                    a ail e    a e                 out         e    ,   a ail   e
               s      e s      e        e
des diffé re nt obj t q u'il s t possibl de m anipulr. Il s t pas rare , e n e ffe t q ue l re ncont des l it ions à 64 KO
                                                     e     n'e                      ,      'on        re       im at
         e          ue l  e
(c'e s t l cas, act l m e nt des com pil e urs Borl
                               ,           at                               il
                                                     and/Turbo C/C+ + ut isés dans l nv   'e ironne m e nt D O S).




                                -3 e
                               I L ttre s com m une s à de ux m ots (1)

________________________________________________________________________________________


Enoncé

     iser                           e e t                             s            av
R é al un program m e q ui affich e ls lt re s com m une s à deux m ot fournis au cl ie r. O n pré v                   usieurs
                                                                                                    oira d'affich e r pl
          e t             t   usieurs reprises dans ch acun des deux m ot
fois une lt re q ui apparaîà pl                                          s.
98                       angage C
         Exe rcice s e n l
                            s       e               e   us
O n supposera q ue ce s m ot ne peuv nt pas com port r pl de 26 caract re s e t on ls l à l
                                                                      è                           a
                                                                                   e ira 'aide de l fonctions ge ts.


       e
Exe m pls

   donnez un      premier mot : monsieur
   donnez un      deuxième mot : bonjour
   la lettre      o est commune aux deux mots
   la lettre      n est commune aux deux mots
   la lettre      u est commune aux deux mots
   la lettre      r est commune aux deux mots

                        _________________

   donnez un      premier mot : barbara
   donnez un      deuxième mot : ravage
   la lettre      a est commune aux deux mots
   la lettre      r est commune aux deux mots
   la lettre      a est commune aux deux mots

________________________________________________________________________________________



ANALYSE

 'é                             il      s,
L noncé nous im pose d'ut iser ge t donc de re pré s e nt r nos m ot sous form e de ch aî de caract re s (suit de
                                                              e       s                       nes          è        es
       è     e                e      è
caract re s t rm iné e s par l caract re nul not e n C : \0). Nous ut iserons à ce t e ffe t des t e aux de caract res de
                                            ,     é                  il                           abl             è
                           e t                         è
dim e nsion 27 (pour 26 lt re s m axim um e t un caract re de fin).

   a                e t                               s                                                 è       a
L re ch e rch e des lt re s com m une s aux de ux m ot peut s e faire e n com parant ch acun de s caract res de l pre m iè re ch aî ne
                      è         a                a                    ure l
à ch acun de s caract res de l s e conde . Ce l nous conduit nat l m e nt à l il ion de deux boucls av c com pt ur
                                                                           e        'ut isat                    e     e           e
      ruct      or)
 (inst ions f im briq ué e s .

    e
Tout fois, nous dev        e         e                      e t                   usieurs fois dans un m ê m e m ot Dans ces
                     ons t nir com pt de ce q u'une m ê m e lt re pe ut figure r pl                                .
conditions, il        it
              faut é v e r :

                    e t                                    re rouv e e n de ux e ndroit diffé re nt du second. Par e xe m pl,
   *q u'une m ê m e lt re du prem ie r m ot ne puis s e ê t t     é                    s           s                       e
     e
   av c :
           m onsieur
   et
           bonjour
                                                            I. Variations al     h            e      ruct
                                                                            gorit m iques sur ls inst ions de base       99
           oir rouv q ue l o de m onsie ur figurait e n posit
  aprè s av t         é     e                                      ion 2 de bonjour, ilfaut é v e r de s ignalr une nouv l
                                                                                                it           e          e l
                                                                                                                          e
                   re                              e
  coïncide nce e nt ce m ê m e o de m onsie ur e t l s e cond o de bonjour.
     e                            e         a                 re
  Il s t donc né ce s s aire d'int rrom pre l com paraison ent une lt re du prem ie r m ot av c t e s ce l du second m ot
                                                                   e t                       e out       les             ,
                                    é  e é
  dè s q u'une coïncide nce a é t dét ct e .
                   e t                                           e       e t               es                      e    e
  *q u'une m ê m e lt re du second m ot ne puis s e coïncide r av c deux lt res diffé re nt du second. Par e xe m pl, av c
     t ion 'ordre des m ot :
  (at e nt à l               s)
         bonjour
  et
         m onsieur
            it
  ilfaut é v e r de t     e                       re e                           'uniq ue o de m onsie ur e t une aut
                      rouv r une coïncide nce e nt l pre m ie r o de bonjour e t l                                   re
                   re e                         e
  coïncide nce e nt l s e cond o de bonjour e t l m ê m e o de m onsie ur.
                                              re          e     im          e               a e t              'obj
  Pour ce faire , une dém arch e (parm i d'aut s ) consist à é l ine r dans l s e cond m ot l lt re ayant fait l e t d'une
                   us             , suffit de re m pl r une t l lt re par un caract re dont on e s t sûr q u'iln'apparaî
  coïncide nce . Pl précisém e nt il                 ace       e l e t
                                                                  e                     è                               tra
                    .            ons        'e                                       rav le    e
  pas dans un m ot Ici, nous av ch oisi l s pace puis q ue nous som m e s ce ns é s t ail r av c des m ots.



Program m e


  #include <stdio.h>
  #include <string.h>
  #define LMAX 26

  main()
  {
     char mot1 [LMAX+1],                 /* premier mot */
          mot2 [LMAX+1] ;                /* deuxième mot */
     int i, j ;

              /* lecture des deux mots */
       printf ("donnez un premier mot : ") ;
       gets (mot1) ;
       printf ("donnez un deuxième mot : ") ;
       gets (mot2) ;

              /* comparaison */
       for (i=0 ; i<strlen(mot1) ; i++)
          for (j=0 ; j<strlen(mot2) ; j++)
             if (mot1[i] == mot2[j])
100                        angage C
           Exe rcice s e n l
                   { printf ("la lettre %c est commune aux deux mots\n", mot1[i]) ;
                     mot2[j] = ' ' ;
                     break ;
                   }
   }



          aire
Com m e nt s


           ons il e           e M                  e a ongue ur m axim al d'un m ot Not z bie n q ue ls t e aux
*Nous av ut isé l sym bol L A X pour re pré s e nt r l l                  e        .       e            e abl
    1        2          re    us
m ot e t m ot ont dû ê t pré v de dim e nsion L A X+1, afin de t nir com pt de l pré s e nce du caract re de fin de
                                               M                e          e   a                      è
    ne
ch aî .


                     il     a ace      a
*Nous aurions pu ut iser, à l pl de l s e conde boucl av c com pt ur (e n j), une boucl t q u e (w h il). Ce rt s , l
                                                        e e             e             e ant           e        e a
            ion       é us ruct
program m at e û t é t pl st uré e m ais, né anm oins, m oins concis e .



DI      O
  SCUSSI N


                               é        re                     us            è                             , e
Ce program m e n'e s t pas prot gé cont des ré ponses de pl de 26 caract re s . Dans ce cas, en effe t ls caract re s  è
         us               es
superfl iront é cras e r l données se t     ant       à
                                       rouv au-de l de l de s t e aux m ot ou m ot L s cons é q ue nce s pe uv nt ê t
                                                            'un     abl         1          2. e                     e    re
          arié
as s e z v e s (v            e             e e
                 ous pouv z e xpé rim e nt r l pré s e nt program m e dans div rs e s s it ions e t t nt r d'e xpl ue r ls
                                                                               e          uat        e e         iq      e
          e    s        é
com port m e nt observ s ).

  e    e           e     ons  it
Il xist diffé re nt s faç d'év e r ce ris q ue . Cit                 e
                                                    ons, par e xe m pl :

      ire ouj             s),        ne       ant                    è                  e é          'ut isat
   - l (t ours par ge t une ch aî com port un nom bre de caract re s s uffisam m e nt é lv pour q ue l il e ur ne
   ris q ue pas (t                      us.                                e                 è                aine
                  rop!) d'en fournir pl O n pourrait ch oisir, par e xe m pl 80 ou 128 caract re s (dans ce rt s
          é    at       n'e am
   im plm e nt ions, il s t j ais possibl de t r de s l
                                            e ape                us             è
                                                      ignes de pl de 128 caract re s ).
      im e     om iq          a ongue ur de l ch aî l , e n ut isant l fonct f t ; e xe m pl, av c f t (m ot
   - l it r aut at ue m e nt l l            a     ne ue       il     a      ion ge s par   e    e ge s      1,
     M
   L AX, st           im e
             din), on l it à L AX l nom bre de caract re s l sur st
                              M    e                 è     us      din.
       il               aine   é     at              and C/C+ + , C/Quick C M icrosoft), une fonct
   - ut iser, dans cert s im plm e nt ions (Turbo/Borl                                            ion (non
        abl
   port e !) nom m é e cge ts.
                                                          I. Variat      gorit m iques sur ls inst ions de base
                                                                   ions al    h            e      ruct                       101
                                -4 e
                               I L ttre s com m une s à de ux m ots (2)

________________________________________________________________________________________


Enoncé

     iser                             e e t                           s                          t
R é al un program m e q ui affich e ls lt re s com m une s à deux m ot fournis e n donné e . Ce t e fois, on n'im pos e ra pas de
 im e a ail      e     s                'ut isat                                  e     e                        è
l it à l t l des m ot fournis par l il e ur, m ais on ne pre ndra e n com pt q ue ls 26 pre m ie rs caract re s . Que lq ue
      e                  è            iv
soit l nom bre de caract re s e ffe ct e m e nt frappé s , l il e ur de v t ours v ider sa réponse par l frappe de l
                                                           'ut isat      ra ouj      al                         a               a
touch e re turn.

 à
L e ncore , on pré v                   usieurs fois une lt re q ui apparaîà pl
                    oira d'affich e r pl                e t              t   usieurs reprises dans ch acun de s m ots.

         re           il          a e ure   av          a
O n s'ast indra à n'ut iser pour l lct au cl ie r q ue l seul fonct get ar. De pl on ré al
                                                               e       ion    ch          us,         isera une fonct ion
    iné     ire                 abl
dest e à l un m ot dans un t e au q u'on l t
                                          ui ransm e t ra e n argum e nt ; l fournira, e n re t
                                                      t                     e
                                                                          e l                       a ongue ur e ffe ct e
                                                                                               our, l l                iv
du m ot ainsi lu.



       e
Exe m pls

 oir       'e
V ce ux de l xe rcice pré cédent

________________________________________________________________________________________



ANALYSE


 'é                       'e    oi       ch                                         s   ra re u      è
L noncé nous im pos e l m pl de ge t ar, ce q ui signifie q ue ch acun des deux m ot dev ê t l caract re par
      è
caract re . Dans ces condit               ons                   e          s
                           ions, nous pouv ch oisir de représent r nos m ot :

                                ne            è                   ors roduire nous-m ê m e s l caract re de fin de ch aî
   - soit sous form e d'une ch aî de caract re s . Ilnous faudra al int                      e       è                 ne
                            om iq
   (\0), ce q ue faisait aut at ue m e nt ge ts.
                                 e      e         è             -à                    è
   - soit sous form e d'une sim pl s uit de caract re s (c'e s t -dire s ans ce caract re de fin). Dans ce cas, ilnous faudra
     ors      oir        e
   al prév d'e n dé t rm ine r l "la ongue ur".
         'é                        a
Com m e l noncé nous im pos e q ue l fonct       e ure                   it a ongue ur, nous ch oisirons l s e conde
                                          ion de lct d'un m ot e n re s t ue l l                         a
  ut
sol ion.

  a e ure                     e        ire
L lct d'un m ot consist donc à l des caract re s au cl ie r j q u'à ce q ue l re ncont une v idat (\n) ou q ue
                                                      è         av us              'on      re al ion
 'on         e              è           us,
l ait obt nu 26 caract re s ;de pl dans l cas où l a obt nu 26 caract re s , ilfaut poursuiv l lct
                                                    e          'on       e           è           re a e ure de
      è         av            e                    e us               'on       re     al ion.
caract re s au cl ie r, sans ls pre ndre e n com pt , j q u'à ce q ue l re ncont une v idat
102                     angage C
        Exe rcice s e n l

Program m e

  #include <stdio.h>
  #define LMAX 26                  /* longueur maximale d'un mot */

  main()
  {
     int lire(char []) ;            /*   déclaration (prototype) fonction lecture d'un mot */
     char mot1 [LMAX],              /*   premier mot (sans '\0') */
          mot2 [LMAX] ;             /*   deuxième mot (sans '\0') */
     int l1,                        /*   longueur premier mot */
          l2,                       /*   longueur deuxième mot */
          i, j ;

              /* lecture des deux mots */
      printf ("donnez un premier mot : ") ;
      l1 = lire (mot1) ;
      printf ("donnez un deuxième mot : ") ;
      l2 = lire (mot2) ;

                /* comparaison */
      for (i=0 ; i<l1 ; i++)
         for (j=0 ; j<l2 ; j++)
            if (mot1[i] == mot2[j])
              { printf ("la lettre %c est commune aux deux mots\n", mot1[i]) ;
                 mot2[j] = ' ' ;
                 break ;
              }
  }

           /* Fonction de lecture d'un mot */
  int lire (char mot [LMAX])
  {
     int i ;                   /* rang du prochain caractère à lire */
     char c ;

      i = 0 ;
      while ( (c=getchar()) != '\n' && i<=LMAX )
         mot[i++] = c ;
                      /* ici, soit on a lu \n, soit on a lu LMAX caractères */
                      /* dans tous les cas, c contient le premier caractère */
                                                  /*     non pris en compte */
      if (c != '\n')
                                                           I. Variat      gorit m iques sur ls inst ions de base
                                                                    ions al    h            e      ruct                      103
            while (getchar() != '\n') {}                                          /* recherche '\n' */
        return(i) ;
   }

          aire
Com m e nt s


   à                 ons il e                e M                    e a ail
*L e ncore , nous av ut isé l sym bol L A X pour re pré s e nt r l t l m axim al d'un m ot Par cont , ce t e fois, l
                                                                           e        e           .       re   t        a
                 abl         1       2
dim e nsion des t e aux m ot e t m ot e s t é gal à L A X (e t non pl L A X+ 1), puis q ue nous n'av pas à y int
                                                e    M               us M                           ons         roduire
 e        è        é
l caract re s upplm e nt                     ne
                        aire de fin de ch aî .


                      a       ion            ire     e ure
*En ce q ui conce rne l fonct (nom m é e l ) de lct d'un m ot au cl ie r, v av               at              'av
                                                                                   ous const e z q ue nous l ons décl earé
        e                     (m                   a           tat
dans l program m e principal ain), bie n q ue ce l soit facul if, dans l m e s ure où e l fournit un ré s ul de t
                                                                          a             le                 tat   ype int (e n
       , out     ion                   icit
e ffe t t e fonct q ui n'e s t pas e xpl e m e nt décl e e s t supposée produire un résul de t
                                                     aré                                 tat    ype int).

        re     ,           'av         iq     'int
D 'aut part com m e nous l ons e xpl ué dans l roduct ion de ce t e s e conde part , nous av
                                                                 t                ie              il             t
                                                                                            ons ut isé, dans ce t e
     arat       a        ot       oris
décl ion, l form e "prot ype " aut é e par l norm e ANSI (ce prot ype assure ls cont es de t
                                           a                     ot            e      rôl                      s
                                                                                              ypes d'argum e nt e t
           ace    e ue l
                       e      e
m e t e n pl d'év nt l s conv rsions).

       le     'e ê e          re
Par ail urs, l n-t t de not fonct l a é t é crit suiv l form e "m ode rne ". L norm e ANSI aurait aut é l
                                    ion ire é        ant a                    a                      oris e
      ace            e     ê e
re m pl m e nt de not e n-t t par :

         int lire (mot)
         char mot [LMAX] ;



     e abl                è            ant 'uniq ue argum e nt de l doit obl oire m e nt ê t t
*L t e au de caract re s re pré s e nt l                          ire        igat             re ransm is par adre s s e puis q ue
     t        ion       re
ce t e fonct doit ê t e n m e s ure d'en m odifie r l cont nu. N'oubl z pas ce pe ndant q u'e n l
                                                    e     e           ie                         angage C un nom de t e auabl
         e      é       e        at
e s t int rpré t (par l com pil e ur) com m e un point ur (const
                                                        e                                    é      .                  ust
                                                                   ant) sur son pre m ie r é lm e nt C'e s t ce q ui j ifie l    a
                   e        s a       ion ire         1       2,                1
pré s e nce , dans ls appe l à l fonct l , de m ot ou m ot e t non de & m ot ou & m ot     2.


  a   arat     'argum e nt de l , dans son e n-t t :
*L décl ion de l              ire               ê e

           char mot [LMAX]

              e
aurait pu é galm e nt s'é crire :

           char mot []

ou m ê m e :

           char * mot
104         Exe rcice s e n langage C
       e
D ans l pre m ie r cas, on cont                           e e                   us              at                         abl
                                 inue de spé cifie r (au lct ur du program m e pl q u'au com pil e ur) q ue m ot e s t un t e au
          è                                                     re                  ire       e
de caract re s m ais q ue s a dim e nsion n'a pas besoin d'ê t connue au s e in de l . Dans l s e cond cas, on e xprim e pl    us
  aire                     e
cl m e nt q ue , finalm e nt l  , 'argum e nt re ç par l n'e s t rie n d'aut q u'un point ur sur des caract re s . Ce s
                                                    u       ire                 re             e                       è
       at            ot e              al e            e
form ul ions sont t alm e nt é q uiv e nt s pour l com pil e ur e t dans t ls cas (m ê m e l dernie r), ilre s t possibl de
                                                                at    ,      ous e              e                  e         e
            au            ism    abl
faire appe l "form al e " t e au au s e in de l , e n ut isant une not ion t l q ue :
                                                      ire      il           at      e
                                                                                  e l

           mot [i++]

     le          e       at          t                         al e
D 'ail urs, pour l com pil e ur, ce t e derniè re e s t é q uiv e nt à :

           * (mot + i++)

 e              e           iq        'é    ure     ot      ire
L s m ê m e re flxions s'appl ue nt à l crit du prot ype de l .



DI      O
  SCUSSI N

    e
 *L sym bol   e      M                         'e
                   L A X e s t défini pour l ns e m bl du source cont nant ici, l program m e principale t l fonct l .
                                                        e                e   ,      e                            a      ion ire
              t
M ais, si ce t e        ion     ait re
                   fonct de v ê t com pile s é paré m e nt du re s t , ils e rait al néce s s aire de faire figure r l définit
                                                  é                    e            ors                              a        ion
      ine
(#de f ) dans       es
                   l deux source s , ce q ui com port un ris q ue d'erreur. Dans une sit ion "ré e l ", on pourrait av int rê t
                                                      e                                 uat        le                  oir é
à faire appe l à   l                           ant
                    'une des dém arch e s s uiv e s :

   -t         t a al           M                      a      ion ire
     ransm e t re l v e ur de L A X e n argum e nt de l fonct l .
                 es
   - re groupe r l définit               e              usieurs sources dans un fich ie r s é paré q ue l appe l par
                          ions de sym bols com m uns à pl                                               'on    le
         ude
   #incl dans ch acun de s s ource s conce rné s .


*Cont                                'e                   ,   ui-ci s e t
      raire m e nt au program m e de l xe rcice pré cédent ce l          rouv prot gé de ré pons e s t l
                                                                             e    é                   rop ongues de l part de
                                                                                                                    a
'ut isat
l il e ur.




                                               -5            e
                                              I Com ptage de lttre s

________________________________________________________________________________________
                                                         I. Variat      gorit m iques sur ls inst ions de base
                                                                  ions al    h            e      ruct                      105
Enoncé

     iser                               e e                            e t     'al       e e      ré       av
R é al un program m e q ui com pt l nom bre de ch acune des lt res de l ph abet d'un t xt e nt au cl ie r. Pour
      ifie          ie              e                 e                    e e             è
sim pl r, on ne t ndra com pt q ue des m inusculs , m ais on com pt ra l nom bre des caract re s non re connus com m e
 e s       s     s
t l (q ue l q u'il soie nt : m aj     e        uat
                                 usculs , ponct ion, ch iffre s ,...).

   e                ra       e                conq
L program m e dev acce pt r un nom bre q ue l ue de l s . L il e ur t ra une "l
                                                         igne    'ut isat     ape         igne v                e
                                                                                                ide" pour signalr q u'ila
 e       a                  e e            ie                                                e a ouch e re t
t rm iné l frappe de son t xt (ce q ui re v nt à dire q u'ilfrappe ra donc de ux fois de suit l t                       a
                                                                                                            urn, aprè s l
                       igne
frappe de sa derniè re l ).

                        e igne                  av              e     am                         è            l
                                                                                                              e
O n supposera q ue ls l s frappé e s au cl ie r ne pe uv nt j ais dépas s e r 127 caract re s . Par ail urs, on fe ra
 'h    h                 rict e      iq
l ypot è s e (pe u re s t iv e n prat ue ) q ue ls "code s " des lt re s m inusculs a à z sont cons é cut (ce q ui e s t l cas,
                                                e                 e t            e                       ifs             e
    am      , e e
not m e nt av c l code A SCII).



       e
Exe m pl

   donnez votre texte, en le terminant par une ligne vide
   je me figure ce zouave qui joue
   du xylophone en buvant du whisky


   votre texte comporte 63 caractères dont :
   2 fois la lettre a
   1 fois la lettre b
   1 fois la lettre c
   2 fois la lettre d
   8 fois la lettre e
   1 fois la lettre f
        ......
        ......
   7 fois la lettre u
   2 fois la lettre v
   1 fois la lettre w
   1 fois la lettre x
   2 fois la lettre y
   1 fois la lettre z

   et 11 autres caractères

________________________________________________________________________________________
106                        angage C
           Exe rcice s e n l
ANALYSE


                     il         abl             ie
Ilnous faut donc ut iser un t e au de 26 e nt rs perm e t ant de com pt iser l nom bre de fois où l a re ncont
                                                          t              abil    e                     'on            ré
                e t               e      'al      .
ch acune des 26 lt re s (m inusculs ) de l ph abet Nous l nom m e rons com pt . Nous ut iserons égalm e nt un com pt ur
                                                        e                    e         il          e                e
           ot      e            ot           è
nom m é nt pour l nom bre t alde caract re s e t un aut nom m é naut s pour ls caract res diffé re nt d'une lt re
                                                          re              re       e         è           s         e t
         e
m inuscul.

                     e        age              , nous faut e xam ine r ch acune des lt res du t xt . Pour ce faire , ile xist
En ce q ui conce rne l com pt propre m e nt dit il                                  e t        e e                           e
                                    e
(au m oins) deux dém arch e s possibls :

             ue            it       rait                 è
   - e ffe ct r une ré pé t ion du t e m e nt d'un caract re ,
              ue           it       rait
   - e ffe ct r une ré pé t ion du t e m e nt d'une l , l ê m e const ué de l ré pé t ion du t e m e nt de ch acun de s
                                                    igne ui-m        it     a        it       rait
            è        le      ie .
   caract re s q u'e l cont nt
    a                            it           e
a) L pre m iè re dém arch e about à une s im pl boucl av c com pt ur. El ne dem ande d'accéder q u'à un s e ulcaract re à
                                                       e e          e       le                                            è
 a                   e         ch      l
l fois (par e xe m pl, par ge t ar). El né ce s s it , par cont , l l inat
                                        e           e          re 'é im                       è              igne \n (q ui sont
                                                                               ion de s caract res de fin de l
t                  e     re
 ransm is com m e ls aut s par ge t ar), puis q u'il ne font pas v
                                    ch             s                             ie     e e
                                                                  raim e nt part du t xt .

             t a
              ,
D e s urcroî l dét ct             a
                      e ion de l fin du t xt obl à cons e rv r e n pe rm ane nce l "caract re pré cédent L q ue ce
                                           e e     ige          e                   e        è             ". ors
       è                e       è          ,
caract re , ainsi que l caract re courant sont é gaux à \n, c'e s t q ue l a at e int l fin du t xt . Ilsuffit d'init iser
                                                                         'on   t      a         e e                  ial
art       le                è
   ificie l m e nt ce caract re pré cédent à une v e ur q ue l ue (aut q ue \n) pour é v e r de dev e ffe ct r un
                                                   al        conq         re                 it          oir        ue
 rait            icul         e              è
t e m e nt part ie r pour l pre m ie r caract re .

     a                         it          e                    l
b) L s e conde dém arch e about à deux boucls im briq ué e s . El pe rm e t de l direct m e nt ch aq ue l
                                                                 e             ire     e                             s. l
                                                                                                        igne par ge t Ele
    e                 ure l e
                          e       è             igne e t de fin de t xt .
rè gl de m aniè re nat l ls problm es de fin de l                    e e

      ous
Nous v proposons ici de ux program m e s , corre s pondant à ch acune de ces deux dé m arch e s .


                       a        it           e                  è
Program m e bas é s ur l ré pé t ion du trait m e nt d'un caract re

   #include <stdio.h>
   main()
   {
      char c,                         /*   pour lire un caractère frappé au clavier */
           cprec ;                    /*   caractère précédent */
      int compte[26] ;                /*   pour compter les différentes lettres */
      int numl,                       /*   rang lettre courante dans l'alphabet */
          ntot,                       /*   nombre de caractères du texte */
          nautres,                    /*   nb caractères autres qu'une lettre minuscule */
          i ;

                /* initialisations */
                                                        I. Variat      gorit m iques sur ls inst ions de base
                                                                 ions al    h            e      ruct                    107
       cprec = ' ' ;
       ntot = 0 ; nautres = 0 ;
       for (i=0 ; i<26 ; i++) compte[i]=0 ;

             /* lecture texte et comptages */
       printf ("donnez votre texte, en le terminant par une ligne vide\n") ;
       while ( (c=getchar()) != '\n' || cprec != '\n' )
         { if (c != '\n')
              { numl = c - 'a' ;       /* on donne le rang 0 à la lettre 'a' */
                if (numl >=0 && numl < 26) compte[numl]++ ;
                                           else nautres++ ;
                ntot++ ;
              }
            cprec = c ;
          }

             /* affichage résultats */
       printf ("\n\nvotre texte comporte %d caractères dont :\n", ntot) ;
       for (i=0; i<26 ; i++)
          printf ("%d fois la lettre %c\n", compte[i], 'a'+i) ;
       printf ("\net %d autres caractères\n", nautres) ;
   }




          aire
Com m e nt s


  'e
*L xpre s s ion :

          c - 'a'
               e    e              'al
pe rm e t d'obt nir l "rang" dans l ph abet du caract re cont nu dans c. N'oubl z pas q ue l l
                                                      è      e                    ie                                 e ype
                                                                                              e angage C considè re l t
                              us             ,     e            , e al                                  e ie
ch ar com m e num é riq ue . Pl précisém e nt dans l cas présent ls v e urs de c e t de 'a' sont conv rt s e n int (ce q ui
           a al                   e            ant              al     'e
fournit l v e ur num é riq ue de lur code ) av q ue ne s oit é v ué e l xpre s s ion c-'a'. Com m e nous avons suppos é q ue
 e                       e              ifs,
ls codes des m inusculs s ont cons é cut nous obt nons bien l ré s ul e s com pt .
                                                    e          e      tat            é


  e      ruct
*L s inst ions :

       if (c != '\n')
          { numl = c - 'a' ;
            if (numl >=0 && numl < 26) compte[numl]++ ;
                                       else nautres++ ;
            ntot++ ;
108                         angage C
            Exe rcice s e n l
            }
         cprec = c;

pourraie nt s e conde ns e r e n :

         if ( (cprec=c) != '\n')
            { numl = c - 'a' ;
              if (numl >=0 && numl < 26) compte[numl]++ ;
                                         else nautres++ ;
              ntot++ ;
            }




                       a        it           e             igne
Program m e bas é s ur l ré pé t ion du trait m e nt d'une l

    #include <stdio.h>
    #include <string.h>

    main()
    { char ligne[128] ;                /*   pour lire une ligne frappée au clavier */
       int compte[26] ;                /*   pour compter les différentes lettres */
       int numl,                       /*   rang lettre courante dans l'alphabet */
           ntot,                       /*   nombre de caractères du texte */
           nautres,                    /*   nombre de caractères autres qu'une lettre minuscule */
           i ;

               /* initialisations */
         ntot = 0 ; nautres = 0 ;
         for (i=0 ; i<26 ; i++) compte[i]=0 ;

               /* lecture texte et comptages */
         printf ("donnez votre texte, en le terminant par une ligne vide\n") ;
         do
            { gets(ligne) ;
              for (i=0 ; i<strlen(ligne) ; i++, ntot++)
                { numl = ligne[i] - 'a' ;/* on donne le rang 0 à la lettre 'a' */
                   if (numl >=0 && numl < 26) compte[numl]++ ;
                                                else nautres++ ;
                }
            }
         while (strlen(ligne)) ;

                  /* affichage résultats */
                                                            I. Variat      gorit m iques sur ls inst ions de base
                                                                     ions al    h            e      ruct                        109
        printf ("\n\nvotre texte comporte %d caractères dont :\n", ntot) ;
        for (i=0; i<26 ; i++)
           printf ("%d fois la lettre %c\n", compte[i], 'a'+i) ;
        printf ("\net %d autres caractères\n", nautres) ;
   }

DI      O
  SCUSSI N

                                                        è           e ion v -v des réponses fournie s par
*Aucun des deux program m e s propos é s ne pose de problm e de prot ct    is-à is
'ut isat
l il e ur.




                                               -6
                                              I Com ptage de m ots

________________________________________________________________________________________


Enoncé

                                t             e e                  s     e              e e              av      e e e
Ecrire un program m e pe rm e t ant de com pt r l nom bre de m ot cont nus dans un t xt fourni au cl ie r. L t xt pourra
          e
com port r pl          igne       'ut isat   ape
              usieurs l s e t l il e ur t ra une l        igne "v                e       e      e      a                     ie
                                                                 ide" pour signalr q u'il n a t rm iné l frappe (ce q ui re v nt
à dire q u'il                            e a ouch e re t aprè s av fourni l derniè re l ).
             frappe ra de ux fois de suit l t           urn         oir        a           igne

           t                 s      ouj                         usieurs des caract re s s uiv s :
O n adm e t ra q ue deux m ot sont t ours s é paré s par un ou pl                 è          ant

            igne
   - fin de l
   - e s pace
          uat
   - ponct ion :             ?
                         :.,; !
            h
   - pare nt è s e s :   ( )
        l s
         e
   - guil m e t :        "
   - apostroph e :       '
           t       e      ,
O n adm e t ra é galm e nt pour sim pl r, q u'aucun m ot ne pe ut ê t com m e ncé s ur une l
                                     ifie                            re                                         re    a
                                                                                           igne e t s e poursuiv s ur l
    ant
suiv e .

O n pré voira une fonct                   t                             è
                             ion pe rm e t ant de décide r si un caract re donné t                                              e
                                                                                  ransm is en argum e nt e s t un de s s é parat urs
m e nt                         l
                               e            a al       ors
      ionné s ci-de s s us. El fournira l v e ur 1 l q ue l caract re e s t un s é parat ur e t l v e ur 0 dans l cas cont
                                                                e     è                 e       a al             e          raire .
110                        angage C
           Exe rcice s e n l
       e
Exe m pl

   donnez votre texte, en le terminant par une ligne vide
   Le langage C a été conçu en 1972 par Denis Ritchie avec un objectif
   très précis : écrire un "système d'exploitation" (UNIX). A cet effet,
   il s'est inspiré du langage B (créé par K. Thompson) qu'il a haussé
   au niveau de langage évolué, notamment en l'enrichissant de structures
   et de types, et ceci tout en lui conservant ses aptitudes de
   programmation proche de la machine.


   votre texte comporte 68 mots

_______________________________________________________________________________________



ANALYSE


             'e                   , e     e                                    e
Com m e dans l xe rcice pré cédent il xist (au m oins) deux dém arch e s possibls :

             ue            it       rait                 è
   - e ffe ct r une ré pé t ion du t e m e nt d'un caract re ,
              ue           it       rait
   - e ffe ct r une ré pé t ion du t e m e nt d'une l , l ê m e const ué de l ré pé t ion du t e m e nt de ch acun de s
                                                    igne ui-m        it     a        it       rait
            è        le      ie .
   caract re s q u'e l cont nt


 a                              it         e     e
L pre m iè re dém arch e about à une s im pl boucl av c com pt ur. El dem ande s im plm e nt d'accéder à un s e ul
                                                     e        e     le               e
      è                e         ch
caract re (par e xe m pl par ge t ar).

  a                         it          e                    l
L s e conde dém arch e about à deux boucls im briq ué e s . El dem ande d'effe ct r une lct
                                                              e                  ue           igne par l
                                                                                        e ure l        igne (par
        e
e xe m pl par ge ts).

 à                              es
L e ncore , nous e xam ine rons l deux dé m arch e s e t nous proposerons un program m e corre s pondant à ch acune d'entre
   l
   e
el s.

        es                    ous e       è            e     oue
D ans l deux dé m arch e s , t ls caract re s s é parat urs j nt l m ê m e rôl, à condit d'y incl \n (si l t ail
                                                                  e           e         ion     ure              e
                                                                                                         'on rav l
  e        ch            'on rav l e
av c ge t ar) ou \0 (si l t ail av c ge t O n pe ut al dire que l a progressé d'un m ot dans l t xt , ch aq ue
                                     e        s).             ors          'on                        e e e
            'on   isé a                 ant
fois q ue l a ré al l s é q ue nce s uiv e :

                                      è                           e
   - re ch e rch e du prem ie r caract re diffé re nt d'un séparat ur,
                                      è        à            e
   - re ch e rch e du prem ie r caract re é gal un s é parat ur.
                                                                I. Variations al     h            e      ruct
                                                                                gorit m iques sur ls inst ions de base        111
                    e              e
O n pourrait ré pé t r succe s s iv m e nt ces deux opé rations, t q u e q ue l n'e s t pas arriv à l fin du t xt . En fait ile s t
                                                                   ant           'on               é a         e e         ,
  us      e       il                   e    ogiq
pl sim pl d'ut iser un "indicat ur l ue " (nous l            'appe l rons m ot n_cours) e t d'effe ct r pour ch aque caract re l
                                                                    le         _e                    ue                     è    e
 rait
t e m e nt suiv :ant

         e      è                     e              _e
   - si l caract re e s t un s é parat ur e t si m ot n_cours e s t vrai, augm e nt r de un l com pt ur de m ot e t re m e t re
                                                                                   e        e       e          s            t
        _e
   m ot n_cours à faux.
        e       è                         e              _e                        t       _e
   - si l caract re n'e s t pas un séparat ur e t si m ot n_cours e s t faux, m e t re m ot n_cours à vrai.
        a       ion      , l e                                   ant a              é
Quant à l condit d'arrê t e l s 'e xprim e diffé re m m e nt suiv l dém arch e adopt e :

                è               ifs                a                                          e                    a al
   - deux caract re s cons é cut é gaux à \n pour l pre m iè re , ce q ui im pose de cons e rv r e n pe rm ane nce l v e ur du
          è             " ce                   ial
   "caract re pré cédent ; dernie r s e ra init isé à une v e ur q ue l ue diffé re nt de \n pour é v e r un t e m e nt
                                                              al          conq             e                 it      rait
       icul                        è     e e
   part ie r du pre m ie r caract re du t xt .
    igne v pour l s e conde .
   -l     ide   a



                       a        it           e                  è
Program m e bas é s ur l ré pé t ion du trait m e nt d'un caract re


   #include <stdio.h>
   #define VRAI 1                        /* pour "simuler" des ..... */
   #define FAUX 0                        /* ..... valeurs logiques */

   main()
   { int sep(char) ;                     /*   prototype fonction test "caractère séparateur?" */
      char c,                            /*   pour lire un caractère frappé au clavier */
           cprec ;                       /*   caractère précédent */
      int nmots,                         /*   compteur du nombre de mots */
           fin_texte,                    /*   indicateurs logiques : - fin texte atteinte */
           mot_en_cours ;                /*                          - mot trouvé */

       cprec = ' ' ;
       fin_texte = FAUX ;
       mot_en_cours = FAUX ;
       nmots = 0 ;
       printf ("donnez votre texte, en le terminant par une ligne vide\n") ;

       while (!fin_texte)
          { if ( sep(c=getchar()) )
                { if (mot_en_cours)
                     { nmots++ ;
                       mot_en_cours = FAUX ;
                     }
112                       angage C
          Exe rcice s e n l
                 }
               else mot_en_cours = VRAI ;
             if ( c=='\n' && cprec=='\n') fin_texte = VRAI ;
             cprec = c ;
         }
       printf ("\n\nvotre texte comporte %d mots :\n", nmots) ;
   }

              /*******************************************/
              /*    fonction d'examen d'un caractère      */
              /*******************************************/
   int sep (char c)
   {
      char sep[12] = {'\n',                            /* fin de ligne */
                      ' ',                             /* espace */
                      ',', ';', ':', '.', '?', '!',    /* ponctuation */
                      '(', ')',                        /* parenthèses */
                      '"', '\'' } ;                 /* guillemets, apostrophe*/
      int nsep=12,                                  /* nombre de séparateurs */
          i ;

       i = 0 ;
       while ( c!=sep[i] && i++<nsep-1 ) ;
       if (i == nsep) return (0) ;
                 else return (1) ;
   }



          aire
Com m e nt s


          ons
*Nous av int     roduit une v      e ogiq
                              ariabl "l ue " nom m é e f e xt q ui nous facil e l dét ct de l fin du t xt . Nous
                                                        in_t e                   it a     e ion      a        e e
aurions pu nous en passer en int                  ruct                             e            e
                                roduisant une inst ion bre ak au s e in d'une boucl do ... w h il {1}     e
                                                                                                     (boucl infinie ).


           e rait                     è              ons         é
*D ans l t e m e nt de ch aq ue caract re , nous n'av pas respect "à l lt re " l gorit m e propos é l de l
                                                                     a e t     'al h                ors      yse.
                                                                                                         'anal
          ,             ons 'inst ion
En e ffe t nous e xé cut l ruct :

               mot_en_cours = VRAI

m ê m e si l         e       _e             à a al        R
             'indicat ur m ot n_cours a déj l v e ur V A I ; l nous é v e un t s t supplm e nt , sans m odifie r l
                                                               ce a         it      e         é    aire               e
           e                              a           ion           é
com port m e nt du program m e (puis q ue l m odificat ainsi apport e consist à m e t re à V A I l
                                                                             e       t      R            e    ors
                                                                                                 'indicat ur al q u'ily
         à
e s t déj ).
                                                             I. Variat      gorit m iques sur ls inst ions de base
                                                                      ions al    h            e      ruct                          113

       a      ion     a      e     ruct
*D ans l fonct s e p, l s e ul inst ion :

        while ( c!=sep[i] && i++<nsep-1 ) ;

                 oir      e         è
pe rm e t de sav si l caract re c e s t un s é parat ur. En e ffe t ilne faut pas oubl r q ue l rat ur & & n'é v ue s on
                                                           e              ,                   ie       'opé e                   al
                           ors          a                     re           ,   a                 ion
s e cond opé rande q ue l q ue ce l e s t né ce s s aire . Aut m e nt dit si l pre m iè re condit e s t faus s e (c e s t donc é galà un
          e    'e                                            al                                    é                re       t
s é parat ur), l xpre s s ion i++<nsep-1 n'e s t pas é v ué e e t i n'e s t donc pas incré m e nt e . Si, par cont , ce t e pre m iè re
         ion      é         ors                 oré a ot it
condit e s t v rifié e al q u'on a e xpl l t al é des séparat urs (i=11), l s e conde condit e s t é v ué e e t e l e s t
                                                                             e            a                ion          al         le
t      é                              e
 rouv e faus s e , m ais e n m ê m e t m ps, i s e t    e            é
                                                    rouv incré m e nt e (à 12).

            iv      oit    a            t
En dé finit e , on v q u'à l fin de ce t e inst ion, l q ue i v 12, ce l signifie q ue c ne figure pas dans l l e des
                                               ruct  ors       aut     a                                    a ist
         e
s é parat urs.


                       a        it           e             igne
Program m e bas é s ur l ré pé t ion du trait m e nt d'une l

   #include <stdio.h>
   #include <string.h>
   #define VRAI 1                         /* pour "simuler" des ..... */
   #define FAUX 0                         /* ..... valeurs logiques */
   main()
   {
      int sep(char) ;                     /*   prototype fonction test "caractère séparateur?" */
      char ligne[128] ;                   /*   pour lire une ligne frappée au clavier */
      int nmots,                          /*   compteur du nombre de mots */
           mot_en_cours,                  /*   indicateur logique : mot trouvé */
           i ;

        nmots = 0 ;
        mot_en_cours = FAUX ;
        printf ("donnez votre texte, en le terminant par une ligne vide\n") ;
        do
           { gets(ligne) ;
             for (i=0 ; i<=strlen(ligne) ; i++)    /* on traite aussi le '\0' */
                 if ( sep(ligne[i]) )
                    { if (mot_en_cours)
                        { nmots++ ;
                          mot_en_cours = FAUX ;
                        }
                    }
                 else mot_en_cours = VRAI ;
           }
        while (strlen(ligne)) ;
114                       angage C
          Exe rcice s e n l
       printf ("\n\nvotre texte comporte %d mots :\n", nmots) ;
   }
                 /********************************************/
                 /*     fonction d'examen d'un caractère      */
                 /********************************************/
   int sep (char c)
   {
      char sep[12] = {'\0',                         /* fin de ligne (chaîne) */
                      ' ',                             /* espace */
                      ',', ';', ':', '.', '?', '!',    /* ponctuation */
                      '(', ')',                        /* parenthèses */
                      '"', '\'' } ;                 /* guillemets, apostrophe*/
      int nsep=12,                                  /* nombre de séparateurs */
          i ;

       i = 0 ;
       while ( c!=sep[i] && i++<nsep-1 ) ;
       if (i == nsep) return (0) ;
                 else return (1) ;
   }


          aire
Com m e nt s

       ons
Nous av dû :

               ,             a      ion           ace e          e
   - d'une part au s e in de l fonct s e p, re m pl r l s é parat ur \n par \0,
          re        ,     a       e
   - d'aut part dans l boucl de t e m e nt des caract res d'une l , t e r com m e ls aut s ce caract re de fin de
                                        rait               è              igne rait           e re          è
   l             -à            arie           rl igne               rl igne                it        e
    igne (c'e s t -dire faire v r i de 0 à st e n(l ) e t non st e n(l )-1), afin d'é v e r de com pt r pour un s e ulm ot
    e
   l dernie r m ot d'une l                i            e        e               a     ant
                            igne (non suiv d'un séparat ur) e t l pre m ie r de l suiv e .



D is cus s ion

*En ce q ui conce rne l foncta                                  è
                                     ion d'e xam e n d'un caract re (nom m é e s e p), v         at         es      e
                                                                                        ous const e z (dans l deux v rsions
                          'av         arée      e
propos é e s ) q ue nous l ons décl dans l program m e principal ain), bie n q ue ce l soit facul if, dans l m e s ure où
                                                                       (m                    a         tat      a
  le                    tat
e l fournit un ré s ul de t    ype int .

                                                        è           e ion v -v des réponses fournie s par
*Aucun des deux program m e s propos é s ne pose de problm e de prot ct    is-à is
'ut isat
l il e ur.
                                                    I     LSATI N
                                                   I : UTI I   O
                                                   D E STRUCTURES




  e        re
L ch apit I v                                                       ruct
                ous a proposé des exe rcice s faisant appe laux inst ions de base du l           e
                                                                                      angage C. L s e xe rcices de ce
       re       e e           us, a
ch apit font int rv nir, e n pl l not de st ure sous des form es div rs e s (e n part ie r ls t e aux de s t ure s
                                      ion       ruct                     e           icul e abl               ruct
    e       ial ion).
e t lur init isat




                                                I
                                               I-1 Signe du zodiaq ue

________________________________________________________________________________________


Enoncé

           e                                              e                                        a
Affich e r l s igne du zodiaq ue corre s pondant à une dat de naissance fournie e n donné e , sous l form e :

        our
       j m ois
  es
L deux inform at                                                         a
                    ions s e ront s é paré e s par au m oins un espace. L pre m iè re s e ra fournie s ous form e num é riq ue , tandis
     a           e                                  ne         è
q ue l s e conde l s e ra sous form e d'une ch aî de caract re s .


      ous    ons    e                                                     e       ant
Nous v rappe l q ue ls pé riode s corre s pondant à ch aq ue s igne s ont ls s uiv e s :

        Capricorne              23 décembre - 19 janvier
        Verseau                 20 janvier - 19 février
        Poisson                 20 février - 20 mars
116                       angage C
          Exe rcice s e n l
       Bélier                21   mars - 19 avril
       Taureau               20   avril - 20 mai
       Gémeau                21   mai - 20 juin
       Cancer                21   juin - 21 juillet
       Lion                  22   juillet - 22 août
       Vierge                23   août - 22 septembre
       Balance               23   septembre - 22 octobre
       Scorpion              23   octobre - 21 novembre
       Sagittaire            22   novembre - 22 décembre


       e
Exe m pls

   donnez votre jour et votre mois (sans accent) de naissance ?
   11 july
   *** erreur de nom de mois ***
                   _______________________

   donnez votre jour et votre mois de naissance ?
   16 janvier
   vous êtes né sous le signe suivant : Capricorne
________________________________________________________________________________________



ANALYSE


 e                        re                 abl                           re e                        es     e im e
L program m e doit ê t e n m e s ure d'ét ir une corre s pondance e nt l nom d'un signe e t l deux dat s l it s
               e                 à   e        a
corre s pondant s . O n pe ut déj not r q ue l dat de fin d'un signe e s t l v il de ce l de début du suiv . Nous nous
                                                   e                       a e l  e        e
                                                                                           l              ant
    e e                            e             e
cont nt rons donc de ne cons e rv r q u'une s e ul de ces deux inform at                  e a e
                                                                        ions, par e xe m pl l dat de fin.

 a                          é           re   isée
L corre s pondance s ouh ait e pe ut ê t ré al :

          usieurs t e aux (j
   - par pl        abl                            ié           al
                            our, m ois, signe) re l s par une v e ur com m une d'indice .
                   abl        e                 é                   ruct         ant
   - par un s e ult e au dans lq ue lch aq ue é lm e nt e s t une st ure com port un num é ro de jour, un nom de m ois e t
   un nom de signe.


                    a               ut      l
Nous ch oisirons l s e conde s ol ion car e l pe rm e t de m ie ux m e t re e n é v
                                              e                         t                 a                      re e
                                                                                   idence l corre s pondance e nt ls
inform at                      'init isat
         ions, au m om e nt de l ial ion au s e in du program m e .

 a                                              e                ors  a                ant
L re ch e rch e du signe correspondant à une dat donnée se fait al de l m aniè re s uiv e :

                     out        'é é               e                    e          re abl            ruct      e
   - O n ch e rch e t d'abord l lm e nt (nous l nom m e rons x) appart nant à not t e au de s t ure s , dont l nom de
                           ui                           n'e  e        e       e
   m ois corre s pond à ce l propos é e n donné e . S'il xist pas, on l s ignal par un m e s s age approprié .
                                                                                                il ion     ruct
                                                                                         II. Ut isat de s t ure s               117
                         e    e              our                                 à   ui    'é é
   - O n re garde e nsuit s i l num é ro du j propos é e s t infé rie ur ou é gal ce l de l lm e nt x.
             'affirm at e , on pe ut e n concl q ue l dat propos é e e s t ant rie ure à l dat de fin du signe figurant dans
       D ans l         iv                      ure     a e                    é          a    e
       'é é                         a            oul
       l lm e nt x, ce q ui fournit l ré pons e v ue .
              e
       D ans l cas cont                      ut
                          raire , on e n concl q ue l dat propos é e e s t post rie ure à l dat de début du signe figurant dans
                                                    a    e                     é          a    e
        'é é           il                           'é é         ant
       l lm e nt x ; suffit donc d'e xam ine r l lm e nt suiv pour obt nir l ré pons e v ue . Tout fois, si x est l
                                                                                 e      a          oul          e             e
                  é               re abl
       dernie r é lm e nt de not t e au, il                                    ant            e            é           abl
                                              faudra considérer que son suiv e s t e n fait l pre m ie r é lm e nt du t e au.


                         'al h
O n re m arq ue ra q ue l gorit m e propos é fonct               iv                                            'anné e ne com port
                                                   ionne e ffe ct e m e nt parce q ue ch acun de s 12 m ois de l                   e
                                            a     ait       é e
q u'un s e ulch ange m e nt de signe. Si ce l n'av pas é t l cas, ilaurait fal "e ncadre r" l dat propos é e par de ux dat s
                                                                                    lu              a    e                       e
    é       s           ifs       re abl
d'élm e nt cons é cut de not t e au.



Program m e


   #include <stdio.h>
   #include <conio.h>
   #include <string.h>

   main()
   {
      struct s_date { int jour ;
                      char mois [10] ;
                      char signe [11] ;
                    } ;
      struct s_date date [12] = { 23, "decembre", "Sagittaire",
                                   20, "janvier",    "Capricorne",
                                   20, "fevrier",    "Verseau",
                                   21, "mars",       "Poisson",
                                   20, "avril",      "Bélier",
                                   21, "mai",        "Taureau",
                                   21, "juin",       "Gémeau",
                                   22, "juillet",    "Cancer",
                                   23, "aout",       "Lion",
                                   23, "septembre", "Vierge",
                                   23, "octobre",    "Balance",
                                   22, "novembre", "Scorpion"
                                 } ;
      int jour_n ;                   /* jour de naissance */
      char mois_n [10] ;             /* mois de naissance */
      int nbv, i ;
118                       angage C
          Exe rcice s e n l

                           /* lecture date de naissance */
       printf ("donnez votre jour et votre mois de naissance ?\n") ;
       scanf ("%d %s", &jour_n, mois_n) ;

                  /* recherche et affichage du signe correspondant */
       i = 0 ;
       while ( stricmp(date[i].mois, mois_n) && i++<11 ) { }

       if (i<12)
            { printf ("vous êtes né sous le signe suivant : ") ;
              if (jour_n >= date[i].jour) i = (i+1)%12 ;
              printf ("%s", date[i].signe) ;
            }
         else printf ("*** erreur de nom de mois ***") ;
   }




          aire
Com m e nt s


            ons                      e     ruct
*Nous av défini ici un m odè l de st ure nom m é s_dat , dans lq ue lnous t
                                                                e       e                ons
                                                                                     rouv un num é ro de j our, un nom de
          e                        .
m ois e t l s igne corre s pondant Nous av   ons prév 10 caract re s pour l nom de m ois, ce q ui aut
                                                     u            è         e                                       nes
                                                                                                     orise des ch aî de
l                             e            e e
 ongue ur infé rie ure ou é gal à 9 (com pt t nu du \0 de fin) ; m ê m e , nous av prév 11 caract re s pour l s igne .
                                                                de                ons     u        è          e

 e abl                 e            abl                é
L t e au nom m é dat e s t un t e au de 12 é lm e nt ayant ch acun l t
                                                             s                                e    'av       ial
                                                                                e ype s_dat . Nous l ons init isé dans sa
   arat                             t       e               leè                           e
décl ion, ce q ui pe rm e t de m e t re facilm e nt e n paral l ch aq ue s igne e t sa dat de fin.


                         a e ure     a    e     av
*En ce q ui conce rne l lct de l dat au cl ie r, nous n'av pas prév ici, de prot ct v -v d'év nt l s
                                                                 ons     u,     e ion is-à is      e
                                                                                              e ue l
                       'ut isat      a      ait               'é
e rre urs de frappe de l il e ur (ce l n'é t pas dem andé par l noncé ).


        ons      a      ion ricm p com pare , sans t nir com pt de l dist ion m aj
*R appe l q ue l fonct st                               e         e    a    inct             e            e es
                                                                                        usculs /m inusculs , l deux ch aî sne
        ui
dont on l fournit l                          . l e     it
                   'adre s s e e n argum e nt El re s t ue une v e ur non nul (q u'on pe ut int rpré t r com m e v
                                                                al           le                e      e                ors
                                                                                                                  rai) l q ue
 es         ne                   e          al
l deux ch aî s s ont diffé re nt s e t une v e ur nul (faux) l q u'e l s s ont é gals .
                                                    le        ors     le           e


  a                                        isée  a      e     ruct
*L re ch e rch e du nom de m ois e s t ré al par l s e ul inst ion :

          while ( stricmp(date[i].mois, mois_n) && i++<11 ) {}

    le                           e ant          t          ui
Ce l -ci possè de un doubl av age ;out d'abord, ce l de l concision ; nsuit , ce l de nous perm e t re de sav
                                                              a      e     e     ui                t         oir
       e          a                    é     ue
dire ct m e nt si l re ch e rch e a é t fruct us e ou non.
                                                                                              il ion         ruct
                                                                                        II. Ut isat de s t ure s           119
          ,                        ie          'opé e               al                            ors          a
En e ffe t ilne faut pas oubl r q ue l rat ur & & n'é v ue s on s e cond opé rande q ue l q ue ce l e s t né ce s s aire .
    re           ,      a                  ion                            it             ne    'e
Aut m e nt dit si l pre m iè re condit e s t faus s e (ily a donc é gal é des deux ch aî s ), l xpre s s ion i++<11 n'e s t pas
   al                                       é     a al                  ors 'é é     oul
é v ué e e t i n'e s t donc pas incré m e nt e . L v e ur de i désigne al l lm e nt v u.

              re    t                   ion
Si, par cont , ce t e pre m iè re condit e s t v rifié e (iln'y a donc pas é gal é des deux ch aî s ) al q u'on e s t arriv e n
                                                é                                  it                 ne      ors               é
          abl           a
fin de t e (i=11), l s e conde condit                    al          l
                                            ion e s t é v ué e e t e l e s t t
                                                                      e           é                                e
                                                                              rouv e faus s e , m ais e n m ê m e t m ps i se trouve
            é
incré m e nt e (à 12).

           iv       oit       a            t
En dé finit e , on v q ue , à l fin de ce t e inst ion, l q ue i v 12, ce l signifie q ue l lm e nt ch e rch é ne figure pas
                                                  ruct      ors       aut        a        'é é
      a abl           e
dans l t e . Dans l cas cont                              'é é
                               raire (i< 12), i dé s igne l lm e nt ch e rch é .

          e         t                      abl      ait                                 re                           e
Bie n e nt ndu, ce t e "re ch e rch e e n t e " pouv s e program m e r de beaucoup d'aut s m aniè re s . Par e xe m pl, nous
aurions pu écrire :

           while ( stricmp(date[i].mois, mois_n) && i<11 ) i++ ;

    e          t      ruct
Tout fois, ce t e inst ion n'e s t pas é q uiv e nt à l pré cédent . En e ffe t l q ue i v 11, ce l pe ut signifie r :
                                              al e a              e            , ors      aut     a

               'é é                                ion              e
   - soit q ue l lm e nt ch e rch é e s t e n posit 11 (pre m ie r t s t satisfait),
               'é é                                    a abl            e
   - soit q ue l lm e nt ch e rch é ne figure pas dans l t e (s e cond t s t satisfait).
Pour t             e                                                 ue                      é      aire
      ranch e r, il s t donc né ce s s aire , dans ce cas, d'e ffe ct r une com paraison supplm e nt .

   e                 re         ruct  e l
                                        e
Not z q ue , par cont , une inst ion t l q ue :

            while ( stricmp(date[i].mois, mois_n) && i++ <= 11) {}

              q                              ,     e        'é é                                         e abl
s e rait q ue lue pe u e rroné e . En e ffe t dans l cas où l lm e nt ch e rch é ne figure rait pas dans l t e au, on s e rait am e né à
    al 'e
é v ue r l xpre s s ion :

            date[i].mois

    e          al         e           -à
av c une v e ur i é gal à 12, c'e s t -dire désignant un é lm e nt sit e n de h ors du t e au. Ce rt s , e n gé né ral ce l ne
                                                               é        ué                    abl         e              ,    a
s e rait guè re v    e       e        e                             a                                       e        t al
                 isibl dans l com port m e nt du program m e , dans l m e s ure où ile s t bien peu probabl q ue ce t e v e ur soit
      e
é gal au nom de m ois v u...oul


     e 'e   oi   'opé e
*Not z l m pl de l rat ur arit m é t ue % q ui pe rm e t de ré glr l problm e du signe suiv l dernie r signe du
                              h     iq                          e e      è                 ant e
 abl
t e au.



DI      O
  SCUSSI N

                é     u,    re
*Te lq u'ila é t pré v not program m e acce pt des nom s de m ois é crit e n m inusculs ou e n m aj
                                                      e                      s              e          e
                                                                                                   usculs m ais sans
       .                         , s                 abl               e    us    ol
acce nt Dans un program m e ré e l il e rait souh ait e de faire pre uv de pl de t é rance .
120                         angage C
            Exe rcice s e n l

       re                               é      isée              gorit                          iele     abl gorit
*Not re ch e rch e du nom de m ois a é t ré al ici par un al h m e dit de rech erch e séquent l en t e (al h m e
                       'av     u,
q ui, com m e nous l ons v pe ut s e program m e r e n C à l       'aide d'une seul inst ion). D'aut s al h m e s pl
                                                                                  e     ruct         re   gorit      us
               e ,         icul     ui                          om         'e                                     e
rapide s e xist nt e n part ie r ce l dit de rech erch e dich ot ique. L xe rcice IV-5 vous en proposera un exem pl.




                                                I
                                               I-2 Codage m ors e
________________________________________________________________________________________


Enoncé

                                      e                         e e         av                             igne
Ecrire un program m e affich ant l codage e n m orse d'un t xt fourni au cl ie r e t ne dépassant pas une "l " de 127
      è        e        è              ibl      re
caract re s . L s caract re s s usce pt es d'ê t codé s e n m ors e s ont :

     e     e t       'al                   apé
   - ls 26 lt res de l ph abet (supposées t e s e n m aj    es),
                                                        uscul
     e
   - ls 10 ch iffres de 0 à 9 ,
     e
   - l point,
    e e e     ie       re       è
Si l t xt cont nt d'aut s caract re s q ue ce ux-ci, l program m e affich e ra sim plm e nt des point d'int rrogat à l
                                                     e                              e                s     e      ion a
  ace
pl du code m ors e .


   e
Tablau de s code s m ors e s

        A   .-             B      -...     C   -.-.       D   -..          E   .
        F   ..-.           G      --.      H   ....       I   ..           J   .---
        K   -.-            L      .-..     M   --         N   -.           O   ---
        P   .--.           Q      --.-     R   .-.        S   ...          T   -
        U   ..-            V      ...-     W   .--        X   -..-         Y   -.--
        Z   --..           .      .-.-.-
        0   -----          1      .----    2   ..---      3   ...--        4   ....-
        5   .....          6      -....    7   --...      8   ---..        9   ----.


       e
Exe m pl
   donnez votre message (1 ligne maxi) :
   LE LANGAGE C, CONCU EN 1972, EST L'OEUVRE DE DENIS RITCHIE.

      voici la traduction de votre message
                                                                                          il ion      ruct
                                                                                    II. Ut isat de s t ure s           121
      .-..      . ??????   .-..     .-     -.    --.     .-    --.      .
    ??????   -.-. ?????? ??????   -.-.    ---     -.   -.-.    ..- ??????
         .     -. ?????? .---- ----. --... ..--- ?????? ??????          .
       ...      - ??????   .-.. ??????    ---      .    ..-   ...-    .-.
         . ??????    -..      . ??????    -..      .     -.     ..    ...
    ??????    .-.     ..      -   -.-.   ....     ..      . .-.-.-
________________________________________________________________________________________


ANALYSE


  e                          re                    abl                           re        è                      à
L program m e doit donc ê t e n m e s ure d'ét ir une corre s pondance e nt un caract re e t son code m ors e . L e ncore ,
                   il             abl           ié              al                                 'e    oi
nous pourrions ut iser deux t e aux re l s par une v e ur com m une d'un indice . M ais l m pl d'un t e au de    abl
  ruct                             t
st ure s pe rm e t de m ie ux m e t re e n é vidence l corre s pondance e nt ls inform at
                                                      a                     re e               ors    'init isat
                                                                                         ions, l de l ial ion. Ch aq ue
  é          ruct       abl           ie
é lm e nt (st ure ) du t e au cont ndra :

              è
   - un caract re ,
     e                             ,                                 ne
   - l code m ors e corre s pondant e xprim é s ous form e d'une ch aî .
 e                  è              ors    e              ocal ion    e abl
L codage d'un caract re s e fe ra al sim plm e nt par sa l isat dans l t e au.



Program m e

   #include <stdio.h>
   #include <string.h>
   #define NL 37                                /* nombre de caractères codés */

   main()
   {
      struct code { char lettre ;
                    char * morse ;
                  } ;
      struct code table[NL] =                                                       /* code morse */
                  { 'A', ".-",                   'B',   "-...",            'C', "-.-.",
                    'D', "-..",                  'E',   ".",               'F', "..-.",
                    'G', "--.",                  'H',   "....",            'I', "..",
                    'J', ".---",                 'K',   "-.-",             'L', ".-..",
                    'M', "--",                   'N',   "-.",              'O', "---",
                    'P', ".--.",                 'Q',   "--.-",            'R',".-.",
                    'S', "...",                  'T',   "-",               'U', "..-",
                    'V', "...-",                 'W',   ".--",             'X', "-..-",
122                       angage C
          Exe rcice s e n l
                     'Y',       "-.--",        'Z', "--..",
                     '.',       ".-.-.-",
                     '0',       "-----",       '1', ".----",         '2', "..---",
                     '3',       "...--",       '4', "....-",         '5', ".....",
                     '6',       "-....",       '7', "--...",         '8', "---..",
                     '9',       "----."
                   } ;
       char ligne[128] ;                               /* pour lire une ligne au clavier */
       int i, j ;

               /* lecture message à traduire */
       printf ("donnez votre message (1 ligne maxi) : \n") ;
       gets (ligne) ;
       printf ("\n\n voici la traduction de votre message\n") ;

               /* traduction lettre par lettre */
       for (i=0 ; i<strlen(ligne) ; i++)

           { j=0 ;
             while (ligne[i] != table[j].lettre && j++<NL-1) ;
             if (j<NL) printf ("%7s", table[j].morse) ;
                 else printf (" ??????") ;
             if ( ! ((i+1)%10) ) printf ("\n") ; /* 10 codes morse par ligne */
           }
   }



          aire
Com m e nt s


        ons              e      ruct                       e
*Nous av défini un m odè l de st ure , nom m é code , dans lq ue lnous t    ons
                                                                        rouv :

              è
   - un caract re ,
   - un point                ne         è        iné      e    e
             eur sur une ch aî de caract res dest e à cont nir l code m ors e corre s pondant.
   e
Not z q ue , contraire m e nt à ce q ue nous avions fait dans l program m e de l xe rcice pré cédent nous av prév ici un
                                                              e                'e                   ,       ons  u
     e                 ne              abl             è
point ur sur une ch aî e t non un t e au de caract re s .

D ans ce s condit          e abl       abl                   e
                   ions, l t e au t e occupe ra s e ulm e nt 37 (v e ur de NL e m pl m e nt dont l t l s e ra
                                                                          al             )       ace     s    a aile
         e                      e s              e     è
gé né ralm e nt de 3 ou 5 oct t (1 pour l caract re e t 2 ou 4 pour l point ur). L m pl m e nt m ê m e des ch aî s
                                                                             e        e      'e    ace               ne
               e
corre s pondant s s e t    e                      é a
                       rouv ce pe ndant ré s e rv à l com pil ion, de par l fait q ue nous av init isé ce t e au l de sa
                                                             at           e                  ons     ial   abl   ors
     arat       ne               ie             ,          at    e l
                                                                   e
décl ion. Il faut pas oubl r, e n e ffe t q u'une not ion t l q ue :

   ".-.-."
                                                                                             il ion        ruct
                                                                                      II. Ut isat de s t ure s             123
         e      é      e       at
e s t int rpré t e par l com pil e ur com m e re pré s e nt l
                                                           ant 'adresse de l ch aî fournie , m ais q u'e n m ê m e t m ps ill
                                                                           a     ne                                 e       ui
         e         ace
ré s e rv un e m pl m e nt.

    t     on                         è e
Ce t e faç de procéder pe ut s e ré v lr pl é conom iq ue e n pl m é m oire q ue l pré cédent , dans l m e s ure où ch aq ue
                                            us                       ace              a             e       a
     ne             'e              ui                            out       out                       ne 'e
ch aî n'occupe q ue l s pace q ui l e s t né ce s s aire (ilfaut t e fois aj e r, pour ch aq ue ch aî , l s pace né ce s s aire à un
      e
point ur).



R e m arque :

        out            e abl       abl
   En t e rigue ur, l t e au t e e s t de cl s e aut at u e (puis q u'ilapparaî au s e in d'une fonct
                                                  as     om iq                      t                    ion - ici l e
                        ).          ace                l au m om e nt de l xé cut du program m e (c'e s t -dire , ici,
   program m e principal Son e m pl m e nt e s t donc aloué                'e     ion                     -à
        e          e       ant      ne
   dè s l début). L s const e s ch aî s , par cont , v nt lurs e m pl m e nt définis dè s l com pil ion.
                                                  re oie e          ace     s             a       at
         re abl      abl ait é          aré
   Si not t e au t e av é t décl de m aniè re gl e , ilaurait é t de cl s e st iq u e . Son e m pl m e nt aurait
                                               obal              é    as      at                 ace
     ors é         é     a       at
   al é t ré s e rv dè s l com pil ion.
          e l e     inct         out          at e
   Une t l dist ion e s t t e fois re l iv m e nt form e l e t e l n'a guè re d'incide nce e n prat ue . Ile s t e n e ffe t
                                                                   le    le                                 iq         ,         ,
            e      ,         e ant de considérer ls v
   gé né ralm e nt as s e z t nt                      e               es
                                                              ariabl décl                e
                                                                            arées dans l program m e principal com m e "q uasi
     at                a                                      é
   st iq ue s ", dans l m e s ure où, bie n q ue non ré s e rv e s à l com pil ion, e l s n'e n n'occupe nt pas m oins de l s pace
                                                                       a       at     le                                  'e
                out a            'e     ion
   pe ndant t e l duré e d e l xé cut du program m e .


  a                       è           re abl abl            isée  a      e     ruct
*L re ch e rch e du caract re dans not t e au t e e s t ré al par l s e ul inst ion :

   while (ligne[i] != table[j].lettre && j++<NL-1) ;




DI      O
  SCUSSI N


                            ",                  oir        e                   us       igne                     e
D ans un program m e "ré e l ilfaudrait pré v d'acce pt r un m e s s age de pl d'une l , ce q ui pos e rait l problm e de è
sa m é m orisat                     re                ui                ail
               ion. O n pourrait ê t am e né , soit à l im pos e r une t l m axim al, soit à s e t
                                                                           e       e                       e            h
                                                                                                  ourne r v rs des m é t odes de
       ion
"ge s t dynam iq ue ".




                                                I
                                               I-3 D é codage m ors e

________________________________________________________________________________________
124                        angage C
           Exe rcice s e n l
Enoncé

                               t                                                      av                           e         è
Ecrire un program m e pe rm e t ant de décode r un m e s s age e n m ors e fourni au cl ie r sous form e d'une suit de caract re s .
   le                   e
Ce l -ci pourra com port r :

              s         ire s           ant e
   - des point e t des t t re pré s e nt ls code s propre m e nt dits,
   - un ou pl                             es           s                                    'ut isat         oye
             usieurs espaces pour séparer l diffé re nt code s (on n'im pos e ra donc pas à l il e ur d'e m pl r un
           "
   "gabarit fixe pour ch aq ue code ).
                   e                                         igne de 127 caract re s . L s code s ine xist s s e ront t
O n supposera q ue l m e s s age fourni ne dépas s e pas une l                 è        e                 ant                s
                                                                                                                       raduit par
 e      è
l caract re "?".

      il     e abl                                      'e
O n ut isera l t e au de s code s m ors e s fourni dans l xe rcice pré cédent (II-2).


       e
Exe m pl

   donnez votre message (1 ligne maxi) :
   -...   --- -.       .---    ---       ..-                      .-.         .-.-.-       .-.-.


      voici la traduction de votre message
      B O N J O U R . ?

________________________________________________________________________________________



ANALYSE


                             abl                          re                           è
Ce program m e doit donc é t ir une corre s pondance e nt un code m ors e e t un caract re . Nous pouvons, pour ce faire ,
   il     a          ruct             'e
ut iser l m ê m e s t ure q ue dans l xe rcice pré cédent L décodage d'un caract re s e fe ra al e n e xpl
                                                         . e                      è            ors            ,
                                                                                                         orant non pl  us
 a     ie        è          a
l part caract re , m ais l part ch aî du t e au de s t ure . L gorit m e de re ch e rch e s e ra donc sim il , l
                                   ie      ne   abl          ruct     'al h                                      aire a
                        è      ant       acé                           ne
com paraison de caract re s é t re m pl e par une com paraison de ch aî s .

                         e
En ce q ui conce rne l m e s s age e n m ors e , nous pouv          e ire          s           abl                     è
                                                             ons l l par ge t dans un t e au de 128 caract re s , nom m é l .      igne
  e                  è                    ors
L principalproblm e q ui s e pos e al à nous e s t ce l de l     ui                                                  e         igne ; n
                                                                         'accè s à ch acun de s code s m ors e s cont nus dans l      e
       ,                    s e
e ffe t ce ux-ci sont é crit av c un gabarit v        e
                                                 ariabl e t s é paré s par un nom bre v         e
                                                                                         ariabl d'espace s .

                         e e rait            ant           'e   oi          e            è                    e abl
Nous proposons de ré pé t r l t e m e nt suiv , fondé s ur l m pl d'un point ur de caract re s (indice ) dans l t e au
igne :
l

   - Av       e      e     ant
       ance r l point ur, t q u'ildésigne un espace.
                                                                                             il ion        ruct
                                                                                       II. Ut isat de s t ure s                125
  - Ext               ir  a       ion                 e
        raire , à part de l posit indiq ué e par l point ur, à l
                                                              e                      ,           ne
                                                                      'aide de sscanf une ch aî de l    ongue ur m axim al 7   e
                                                 t ongue ur). Pour ce l nous fe rons appe lau code form at %7s, lq ue l
  (puis q ue aucun code m ors e ne dépas s e ce t e l                    a,                                                  e
     e           'e orat                            e              ré       ors    a ongue ur indiq ué e (7) e s t at e int .
  int rrom pt l xpl ion, soit q uand un s é parat ur e s t re ncont , soit l q ue l l                                t e
                e e       e      a ongue ur de l ch aî ainsi l (car, bie n sûr, il
  - Incré m e nt r l point ur de l l           a     ne      ue                                 é
                                                                                  n'aura pas é t m odifié par sscanf).



Program m e

  #include <stdio.h>
  #include <string.h>
  #define NL 37                                 /* nombre de caractères codés */
  #define LG 127                                /* longueur ligne clavier */

  main()
  {
     struct code { char lettre ;
                    char * morse ;
                 } ;
     struct code table[NL] =                                                      /* code morse */
                 { 'A', ".-",                    'B',   "-...",          'C', "-.-.",
                    'D', "-..",                  'E',   ".",             'F', "..-.",
                    'G', "--.",                  'H',   "....",          'I', "..",
                    'J', ".---",                 'K',   "-.-",           'L', ".-..",
                    'M', "--",                   'N',   "-.",            'O', "---",
                    'P', ".--.",                 'Q',   "--.-",          'R',".-.",
                    'S', "...",                  'T',   "-",             'U', "..-",
                    'V', "...-",                 'W',   ".--",           'X', "-..-",
                    'Y', "-.--",                 'Z',   "--..",
                    '.', ".-.-.-",
                    '0', "-----",                '1', ".----",           '2', "..---",
                    '3', "...--",                '4', "....-",           '5', ".....",
                    '6', "-....",                '7', "--...",           '8', "---..",
                    '9', "----."
                 } ;
     char ligne[LG+1] ;                                   /* pour lire une ligne au clavier */
     char code[7] ;                                       /* code courant à traduire */
     int i, j ;

              /* lecture message à traduire */
      printf ("donnez votre message (1 ligne maxi) : \n") ;
      gets (ligne) ;
      printf ("\n\n voici la traduction de votre message\n") ;
126                        angage C
           Exe rcice s e n l

                 /* traduction code par code */
       i=0 ;
       while (i<strlen(ligne))
          {
             while (ligne[i] == ' ') i++ ;       /* saut des espaces éventuels                              */
             if ( i<strlen(ligne) )                  /* si pas en fin de ligne                              */
               { sscanf (&ligne[i], "%6s", code); /* lecture code (6 car max)                               */
                  i += strlen(code) ;         /* incrément pointeur dans ligne                              */
                  j=0 ;                           /* recherche code dans table                              */
                  while ( stricmp (code, table[j].morse) && j++<NL-1) ;
                  if (j<NL) printf ("%2c", table[j].lettre) ;   /* code trouvé                              */
                      else printf (" ?") ;                  /* code non trouvé                              */
               }
          }
   }

          aire
Com m e nt s


       a      e                            e ue s,                            l
*D ans l boucl de saut des espace s é v nt l on ne ris q ue pas d'al r au-de l de l fin de l ch aî cont nue dans
                                                                               e    à a    a     ne    e
igne     e      è                                                  ira        ine l
                                                                                  e
l , car l caract re de fin (\0), diffé re nt d'un e s pace , s e rv de "s e nt l ".


            re    ant
*Par cont , av d'ext                    e                    ,                                         'on             e
                          raire un nouv au code par sscanf ile s t né ce s s aire de s'assure r q ue l n'e s t pas parv nu e n fin
    igne           ,                                      e            è           it              è
de l . En e ffe t dans ce cas, sscanf fournirait une s uit de caract re s const uée du caract re \0 (q ui n'e s t pas considéré
        t       ion                   e                 è
par ce t e fonct com m e un s é parat ur) e t des caract re s s uiv s (pré lv s e n de h ors du t e au l ). Not z q ue , e n
                                                                   ant        e é                     abl  igne       e
 'abs             e e , e                     rè      e
l e nce d'un t lt s t l m alne s e rait pas t s grav puis q u'ilre v ndrait sim plm e nt à pl r au pl 7 caract res dans
                                                                       ie              e             ace    us           è
                 ant
code , com m e nç par \0.


  a                                  e abl     abl          isée  a      e     ruct
*L re ch e rch e du code m orse dans l t e au t e e s t ré al par l s e ul inst ion :

       while ( stricmp (code, table[j].morse) && j++<NL-1) ;

  e                   es      e    riè
L s re m arq ue s fait dans l q uat m e com m e ntaire de l xe rcice II-1, à propos de l re ch e rch e s é q ue nt l e n t e ,
                                                          'e                           a                          ie l
                                                                                                                     e    abl
      iq           e
s'appl ue nt é galm e nt ici.



DI      O
  SCUSSI N
                                                                                         il ion      ruct
                                                                                   II. Ut isat de s t ure s     127
      re                 e e    e          'ut isat                                  us           è
Not program m e ne dét ct pas l cas où l il e ur fournit un code m orse de pl de 6 caract re s . Dans ce cas, en
       ,          e e     e
e ffe t ils e cont nt de l "découpe r" e n tranch es de 6 caract re s (l derniè re t
                                                                è      a            ranch e pouv      oir
                                                                                                ant av une longue ur
infé rie ure ).

      'on           ait   e e                         ie     ,
Si l souh ait dét ct r ce ge nre d'anom al , il faudrait aprè s ch aq ue e xam e n d'un code , s'assure r q u'il e s t
        iv             i                                 ne
e ffe ct e m e nt suiv d'un e s pace ou d'une fin de ch aî .




                                            I
                                           I-4 Facturation par code

________________________________________________________________________________________


Enoncé

     iser                 abl
R é al un program m e é t issant une fact  ure pouv  ant port r sur pl
                                                             e                   icl                     icl      ure
                                                                      usieurs art e s . Pour ch aq ue art e à fact r,
 'ut isat                   a     it                               ir
l il e ur ne fournira q ue l quant é e t un num é ro de code à part duq ue ll program m e dev re t
                                                                              e                            e  a
                                                                                                ra rouv r à l fois l  e
 ibel é   e        aire
l l e t l prix unit .

 e               ra          e                 ant
L program m e dev re fus e r ls code s ine xist s. A l fin, il
                                                     a                               ul if       ie         ure
                                                              affich e ra un ré capit at te nant l u de fact .

  e
L s inform at           at e                 s   icl                         e
               ions re l iv s aux diffé re nt art e s s e ront définies dans l s ource m ê m e du program m e (e t non dans un
                          l
                          e         out        acé
fich ie r de données). El s e ront t e fois pl e s à un niv au gl , de m aniè re à pouv
                                                               e      obal                          e               ,      'obj
                                                                                               oir, l cas é ch é ant faire l e t
                             abl
d'un source s é paré , appe l e par #incl .ude

O n pré voira de ux fonctions :

                              e
   - une pour re ch e rch e r ls inform at        at e           icl        ir
                                          ions re l iv s à un art e , à part de s on num é ro de code ,
                         a     ure      ul iv
   - une pour affich e r l fact ré capit at e .



       e
Exe m pl

   combien d'articles à facturer ? 3
   code article ? 25
   quantité de Centrifugeuse au prix unitaire de                        370.00 ? 33
   code article ? 7
   ** article inexistant - redonnez le code : 16
128                        angage C
           Exe rcice s e n l
   quantité de Grille-pain au prix unitaire de   199.50 ? 12
   code article ? 26
   quantité de Four à raclette 6P au prix unitaire de   295.25 ? 6

                                           FACTURE

   ARTICLE                        NBRE        P-UNIT         MONTANT

   Centrifugeuse                      33      370.00        12210.00
   Grille-pain                        12      199.50         2394.00
   Four raclette 6P                    6      295.25         1771.50


               TOTAL                                        16375.50

________________________________________________________________________________________



ANALYSE


   'é                                e               icl                                               s               if
L noncé nous précise que ls codes d'art e s s ont num é riq ue s , m ais ilne dit pas q u'il sont cons é cut s. Dans ces
condit                                                es          e al             es                                    ons
      ions, ile s t né ce s s aire de m é m oris e r l diffé re nt s v e urs possibl de ce s code s . Com m e nous dev pouv     oir
                                  ibel é       ne
associe r à ch aq ue code un l l (ch aî ) e t un prix (ré e l nous pouv
                                                                    ),                          il        abl         ruct
                                                                                ons songe r à ut iser un t e au de s t ure s , dans
 e                  é              ie    e
lq ue lch aq ue é lm e nt cont nt ls inform at         ions re l iv s à un art e (code , l l, prix unit ). Ce t e au s e ra,
                                                               at e           icl          ibel é           aire        abl
                         'é                aré
com m e dem andé par l noncé , décl à un niv au gl       e           e    ial               arat
                                                               obal t init isé dans sa décl ion.

 e rav        a        ion
L t ailde l fonct de re ch e rch e (nous l nom m e rons re ch e rch e ) consist ra à v rifie r l pré s e nce du code d'art e
                                                  a                               e        é        a                        icl
      e abl           ruct                                       le       it      e
dans l t e au de s t ure ainsi défini. En cas de succè s, e l e n re s t ue ra l rang (ce q ui s e ra suffisant au program m e
                          e
principalpour affich e r ls inform at                      e        e
                                     ions corre s pondant s ). Dans l cas contraire , e l re s t ue ra l v e ur -1. Not z q ue l
                                                                                        le      it     a al            e       e
          icl       e
code d'art e s e ra l s e ul                  t
                            argum e nt de ce t e fonction.

Nous v                     à        ,                                             'ut isat            e
         oyons donc dé j com m e nt pour ch aq ue code (corre ct) fourni par l il e ur, affich e r ls inform ations
                e    ant                a     it
corre s pondant s av d'en dem ande r l q uant é . M ais, com pt t nu de ce q ue l ion de l fact doit ê t fait aprè s
                                                               e e              'édit      a    ure       re e
 e             at e      ous e  icl
ls s aisies re l iv s à t ls art e s , nous dev obl oire m e nt pour ch aq ue art e à fact r, cons e rv r :
                                               ons    igat         ,               icl      ure         e

     a       it
   - l q uant é ,
   - une inform at              t
                   ion pe rm e t ant d'en ret      e e ibel
                                              rouv r l l l e t l prix unit . Nous pourrions, ce rt s , arch iv r ce s
                                                               é     e              aire                            e         e
   inform at               abl                   ,    a
            ions dans un t e au. M ais, e n fait ce l n'e s t pas néce s s aire puis q u'ile s t possibl de ls re t
                                                                                                       e    e          e        ir
                                                                                                                   rouv r à part du
             'art e          a ruct        e           icl
   rang de l icl dans l st ure (l code art e conv ndrait é galm e nt m ais ilnous faudrait al e xpl r à
                                                                  ie             e       ,                            ors     ore
        e       re abl           ruct     ors      'édit
   nouv au not t e au de s t ure s l de l ion de l fact ).      a    ure
Ces deux inform at                         ées           abl
                    ions s e ront cons e rv dans deux t e aux (nom m é s q t e t rangart com port aut d'élm e nt q ue
                                                                            e           )        ant ant é      s
     icl        ure
d'art e s à fact r (on e n pré v                           ).
                                   oira un nom bre m axim al
                                                                                              il ion      ruct
                                                                                        II. Ut isat de s t ure s      129
 a       ion     ion     a    ure
L fonct d'édit de l fact (nom m é e f ure ) s e cont nt ra al d'expl r s é q ue nt l m e nt ces deux t e aux
                                                 act              e e    ors        ore              e
                                                                                                  ie l           abl
pour re t    e out e
         rouv r t e s ls inform at                         l
                                   ions néce s s aire s . El re ce v e n argum e nt ls adresses des deux t e aux (q t e t
                                                            e       ra,            , e                       abl     e
        ),         e              icl         ure
rangart ainsi que l nom bre d'art e s à fact r.



Program m e

   #include <stdio.h>

   /* ------ structure contenant les informations relatives aux               */
   /*                     différents articles                  -------------- */
   #define NBART 6                         /* nombre total d'articles */
   typedef struct { int code ;             /* code article */
                     char * lib ;          /* libellé */
                     float pu ;            /* prix unitaire */
                   } t_article ;
   t_article article [NBART] =
        { 11, "Gaufrier",           268.0,
          14, "Cafetière 12 T",     235.0,
          16, "Grille-pain",        199.50,
          19, "Balance de ménage", 278.0,
          25, "Centrifugeuse",      370.0,
          26, "Four raclette 6P", 295.25
        } ;
   /* ----------------------------------------------------------------------*/

   #define NAFMAX 10                           /* nombre maxi d'articles à facturer */

   main()
   {
      int recherche(int) ;                           /*   proto fonction de recherche d'un article */
      void facture(int[], int[], int) ;              /*   proto fonction d'affichage de la facture */
      int naf,                                       /*   nombre d'articles à facturer */
          rang,                                      /*   rang courant d'un article */
          codart,                                    /*   code courant d'un article */
          i ;
      int rangart [NAFMAX],                          /* rang des articles à facturer */
          qte [NAFMAX] ;                             /* quantité de chaque article à facturer */

              /* entrée du nombre d'articles à facturer */
       printf ("combien d'articles à facturer ? ") ;
       scanf ("%d", &naf) ;
130                     angage C
        Exe rcice s e n l
              /* boucle de traitement de chaque article à facturer */
      for (i=0 ; i<naf ; i++)
        {
           printf ("code article ? ") ;
           do
              { scanf ("%d", &codart) ;
                rang = recherche (codart) ;
                if (rang == -1)
                      printf (" ** article inexistant - redonnez le code : ") ;
              }
           while (rang == -1) ;
           rangart[i] = rang ;
           printf ("quantité de %s au prix unitaire de %8.2f ?    ",
                 article[rang].lib, article[rang].pu) ;
           scanf ("%d", &qte[i]) ;
        }

             /* affichage facture */
      facture (rangart, qte, naf) ;
  }

        /***********************************************************/
        /*        fonction de recherche d'un code article           */
        /***********************************************************/
  int recherche (int codart)
  {
     int rang ;                     /* rang courant d'un article */
     rang = 0 ;
     while (article[rang].code != codart && rang++ < NBART-1) {} ;
     if (rang <NBART) return (rang) ;
                 else return (-1) ;
  }

        /***********************************************************/
        /*         fonction d'affichage de la facture              */
        /***********************************************************/
  void facture(int rangart[], int qte[], int naf)
                    /* rangart : tableau des rangs des codes articles */
                    /* qte :tableau des prix unitaires */
                    /* naf :nombre d'articles à facturer */
  {
     float somme,                  /* total facture */
           montant ;               /* montant relatif à un article */
     int i ;
                                                                                                    il ion      ruct
                                                                                              II. Ut isat de s t ure s              131

        printf ("\n\n %32s\n\n", "FACTURE") ;
        printf ("%-20s%5s%10s%12s\n\n",
                "ARTICLE", "NBRE", "P-UNIT", "MONTANT") ;
        somme = 0 ;
        for (i=0 ; i<naf ; i++)
           { montant = article[rangart[i]].pu * qte[i] ;
             printf ("%-20s%5d%10.2f%12.2f\n",
                      article[rangart[i]].lib, qte[i],
                      article[rangart[i]].pu, montant) ;
             somme += montant ;
           }
        printf ("\n\n%-35s%12.2f", "        TOTAL", somme) ;
   }




          aire
Com m e nt s


            ons                il    ype                    e    _art e a ruct                           icl ous
*Nous av ch oisi ici d'ut ise r t de f pour dé finir sous l nom t icl l st ure corre s pondant à un art e . V
      at         e ibel  é          t
const e z q ue l l l y apparaî sous l form e d'un point ur sur une ch aî e t non d'une ch aî ou d'un t e au de
                                          a                  e          ne                    ne          abl
        è
caract re s . Dans ces condit       e abl       icl
                              ions, l t e au art e , décl de ce t , n'occupe ra q ue 6 e m pl m e nt de pet e t l
                                                        aré      ype                        ace     s      it aile
          e                e s)
(gé né ralm e nt 6 ou 8 oct t


   à                    e      ruct                 ue a                            icl     e abl       icl oye
*L e ncore , une s e ul inst ion pe rm e t d'effe ct r l re ch e rch e d'un code art e dans l t e au art e . V z, à ce
        e                    es     e     riè
propos, ls re m arq ue s fait dans l q uat m e com m e nt          'e
                                                         aire de l xe rcice II-1.


  e                      il                        a      ion act                                 ne
*L code form at %-20s, ut isé à deux reprises dans l fonct f ure , pe rm e t de "cadre r" une ch aî à gauch e .



DI      O
  SCUSSI N


       re                               é       re                            es      a          'ut isat
*Not program m e n'e s t pas prot gé cont des ré pons e s incorre ct de l part de l il e ur. En part ie r, une          icul
                                     raî              e                          e                           ,
ré pons e non num é riq ue pe ut e nt ne r un com port m e nt as s e z désagré abl. Dans un program m e ré e l ils e rait né ce s s aire
         e     e      e
de ré glr conv nablm e nt ce t    ype de problm e , par e xe m pl e n ut isant f t (..., st
                                              è                  e       il      ge s      din) e t sscanf.


                                         ,               re udicie ux de dem ande r à l il e ur de confirm e r q ue l produit
*D e m ê m e , dans un program m e ré e l ilpourrait ê t j                            'ut isat                      e
                        ui         ie      ui          e
ch e rch é e s t bien cel dont on v nt de l affich e r ls inform ations.
132                        angage C
           Exe rcice s e n l

  a                  e    e ype f oat (6 ch iffre s s ignificat pe ut s e ré v lr insuffisant .
*L pré cision offe rt par l t    l                             ifs)           é e            e
                                                  I
                                                 II : H ASARD ET
                                                            O
                                                  RECREA TI NS




          re ous            ain                                  a     isat                            ifs,
Ce ch apit v propose un cert nom bre d'exercices correspondant à l ré al ion de program m e s ré cré at bas é s
    'ut isat
sur l il ion du h asard.

 es                                             ie l
                                                   e          iné
L deux pre m ie rs e xe rcice s s ont e s s e nt l m e nt dest s à v         re                                       é oire
                                                                    ous m ont r com m e nt gé né re r de s nom bre s alat s e n
angage C.
l




                                               I-1       é
                                              II Tirage alatoire

________________________________________________________________________________________


Enoncé

Ecrire une fonct                               ie iré              re     us)        al          us
                ion fournissant un nom bre e nt r t au h asard e nt 0 (incl e t une v e ur n (incl e ) fournie e n
argum e nt.

     iser                              il         t        ion
R é al un program m e principalut isant ce t e fonct pour e xam ine r l "dista     ribut           al              e
                                                                                        ion" de s v e urs ainsi obt nues dans
 'int al  e            e
l e rv l [0, 10]. L nom bre de t        irage s à ré al sera l e n donné e e t l program m e affich e ra l nom bre de fois où
                                                      iser     u               e                         e
                  al             é   e
ch acune de ce s v e urs aura é t obt nue .



       e
Exe m pl

   combien de tirages : 1100
   nombre de tirages obtenus
      0 :    106
      1 :     95
134                        angage C
           Exe rcice s e n l
       2   :     115
       3   :      95
       4   :      91
       5   :     103
       6   :     103
       7   :     101
       8   :      92
       9   :      94
      10   :     105

       ion  e                                  à a     ion      a     iot
Indicat : il s t né ce s s aire de faire appe l l fonct rand de l "bibl h è q ue s tandard".

________________________________________________________________________________________



ANALYSE


                     a       ion          le
Ilfaut faire appe là l fonct rand. Ce l -ci fournit un nom bre e nt r, t de faç "ps e udo-alat " dans l e rv l
                                                                        ie iré           on            é oire        'int al e
                                                e al  e                    a                  it    re iré     e        a al
[0, R A ND_M A X] , ch aq ue nom bre de ce t int rv l ayant q uasim e nt l m ê m e probabil é d'ê t t . Not z q ue l v e ur
                                   dl
de RAND_M AX e s t définie dans st ib.h ;              a           l
                                             d'aprè s l norm e , e l n'e s t j ais infé rie ure à l capacit m inim al d'un int
                                                                    e         am                  a        é        e         ,
       -à
c'e s t -dire 32767.

              ir         t oul
                          at
Pour about au ré s ul v u, une dém arch e consist à t    e                      e                                   e
                                                              ransform e r un t lnom bre e n un nom bre ré e lappart nant à
 'int al    e                     e       tipl
l e rv l [0,1[. Ilsuffit e nsuit de m ul ie r ce ré e lpar n+1 e t d'en prendre l part e nt re pour obt nir l ré s ul
                                                                                      a    ie  iè            e    e     tat
          é             ors    re      e al                                              e
e s com pt . O n pe ut al m ont r q ue ls v e urs 0, 1, ... n-1, n sont q uasi équiprobabls .

          e         e            é oire
Pour obt nir un t lnom bre alat , nous pouv div   ons           e                              a al
                                                           iser l nom bre fourni par rand par l v e ur RAND_M AX+ 1 (il
        it
faut é v e r de div                              a al                      ors     re    e
                      iser par RAND_M AX, car l v e ur 1 ris q ue rait al d'ê t obt nue - e n m oye nne une fois sur
                  à                 ,                   le        re        a oi            it
RAND_M AX!). L e ncore , on pe ut de m aniè re form e l , m ont r q ue s i l l de probabil é e s t uniform e s ur [0,1[, ile n
 a                    le                              'int al   e      ie
v de m ê m e de ce l du nom bre ainsi fabriq ué dans l e rv l d'ent rs [0,n].



Program m e


   #include <stdio.h>
   #include <stdlib.h>                    /* pour la fonction rand */

   #define N 10                           /* les tirages se feront entre 0 et N */

   main()
   {
                                                                                           III. H asard e t ré cré ations    135
       int aleat (int) ;                   /* prototype fonction de tirage aléatoire */
       int ntir,                           /* nombre de tirages requis */
           t[N+1],                         /* tableau comptage tirages de chaque valeur */
           i ;

       printf ("combien de tirages : ") ;
       scanf ("%d", &ntir) ;
       for (i=0 ; i<=N ; i++)
          t[i] = 0 ;
       for (i=1 ; i<=ntir ; i++)
          t[aleat(N)]++ ;
       printf ("nombre de tirages obtenus\n") ;
       for (i=0 ; i<=N ; i++)
          { printf ("%4d : ", i) ;
            printf ("%6d\n", t[i]) ;
          }
   }

            /********************************************************/
            /* fonction de tirage aléatoire d'un nombre dans [0, n] */
            /********************************************************/
   int aleat (int n)
   {
      int i ;
      i = rand() / (RAND_MAX + 1.) * (n+1) ;
      return (i) ;
   }




          aire
Com m e nt s


          a     ion e , a
*D ans l fonct alat l div          ision par RAND_M AX+ 1 doit bien sûr s'effe ct r sur des v e urs ré e l s . M ais, de pl il
                                                                                  ue           al            e
                                                                                                             l                us,
                                       e
faut pre ndre garde à ne pas é crire l div             a                                   ,
                                            iseur sous l form e RAND_M AX + 1. En e ffe t ce l                    al         e ype
                                                                                                ui-ci s e rait é v ué dans l t
       ,      e                      a al                             e
int e t dans l cas (fré q ue nt) où l v e ur de RAND_M AX e s t e xact m e nt l v e ur m axim al du t
                                                                              a al              e      ype int l         ion
                                                                                                                 , 'addit de 1 à
                               a al             e                        é      ant am        e é
RAND_M AX conduirait à l v e ur ... -1 (l dépas s e m e nt de capacit n'é t j ais dét ct e n cas d'opérat             ions sur de s
    ie
e nt rs).



DI      O
  SCUSSI N
136                        angage C
           Exe rcice s e n l
            , a       ion            ouj      a
En gé né ral l fonct rand fournit t ours l m ê m e s uit de v e urs, d'une e xé cut à une aut . L xe rcice s uiv
                                                        e    al                    ion       re 'e              ant
 ous       re               it
v m ont com m e nt é v e r ce ph é nom è ne .




                                         I-2       é
                                        II Tirage alatoire v     e
                                                            ariabl

________________________________________________________________________________________


Enonce

                    ion                        ie iré                re               al                        . a
Ecrire une fonct fournissant un nom bre e nt r t au h asard e nt 0 e t une v e ur n fournie e n argum e nt L suit des   e
 al           it              t       ion ors
v e urs re s t ué e s par ce t e fonct (l q u'on l
                                                 'appe l à div rs e s re pris e s ) dev ê t diffé re nt d'une exécut à une
                                                        l
                                                        e     e                        ra re           e            ion
   re                                   conq        ion
aut e t ne pas dépendre d'une quel ue inform at fournie par l il e ur.'ut isat

                'e                     ,
Com m e dans l xe rcice pré cédent on ré al                                      il          t
                                               isera un program m e principal ut isant ce t e fonct ion pour e xam ine r la
"distribut           al              e
          ion" de s v e urs ainsi obt nues dans l e rv l [0,10]. Pour ce faire , on l e n donné e s l nom bre de t
                                                 'int al e                             ira           e            irage s à
    iser    e                         e                               al             é     e
ré al et l program m e affich e ra l nom bre de fois où ch acune des v e urs aura é t obt nue .


         ion               ial         e      e      e
Suggest : ilfaut "init iser" conv nablm e nt l "gé né rat ur de nom bre s alat ", e n ut isant l fonct srand. L
                                                             e                é oire     il    a      ion         a
     ne                         re
"graî " né ce s s aire pe ut ê t fabriq ué e à l         a
                                                'aide de l fonction t e , de faç à av un caract re s uffisam m e nt
                                                                     im         on   oir          è
im pré v     e
        isibl.



       e
Exe m pls

(il       à           tat
   s'agit l des ré s ul s corre s pondant à deux exécut                es
                                                       ions diffé re nt du m ê m e program m e )


   combien de tirages : 1100
   nombre de tirages obtenus
      0 :    124
      1 :    104
      2 :     97
      3 :     97
      4 :     89
      5 :     93
      6 :    105
                                                                                                   III. H asard e t ré cré ations        137
        7   :      109
        8   :      110
        9   :       89
       10   :       83
                                ___________________

   combien de tirages : 1100
   nombre de tirages obtenus
      0 :    104
      1 :     98
      2 :     98
      3 :    106
      4 :     98
      5 :     97
      6 :     99
      7 :    109
      8 :     99
      9 :     96
     10 :     96

________________________________________________________________________________________



ANALYSE


En l               a      ion
      angage C, l fonct srand pe rm e t d'init iser l gé né rat ur de nom bre s alat s . Ilfaut ce pe ndant l fournir une
                                                  ial     e         e                  é oire                        ui
       ne       -à                        ie
"graî ", c'e s t -dire un nom bre e nt r (de t    ype unsigne d int q ui dé t rm ine ra l pre m ie r nom bre t par rand. Ce t e
                                                                     )       e           e                    iré              t
     h                            e          e      e
m é t ode pe rm e t ainsi, si on l s ouh ait , d'obt nir à v ont une m ê m e s uit de nom bre s alat s ; faut d'ail urs
                                                             ol é                   e                 é oire      il        e
                                                                                                                            l
    e
not r q ue , par dé faut t                                       ait     é                  'e
                          , out s e pas s e com m e s i srand é t appe l, e n début de l xé cut                               e
                                                                                                     ion d'un program m e , av c
l'argum e nt 1.

             re
Ici, par cont , nous souh ait       e             e
                             ons obt nir une s uit diffé re nt d'une exécut à une aut . Une s ol ion à ce problm e
                                                                e              ion            re            ut               è
        e                  ne    é oire                                  ion
consist à ch oisir une "graî " alat . Bie n sûr, iln'e s t pas q ue s t de faire appe là rand dans ce cas. Par cont , l    re a
      ion im                e                                l
fonct t e fournit une dat , e xprim é e e n s e conde s . Ce l -ci possè de un caract re s uffisam m e nt im pré v
                                                              e                      è                                e
                                                                                                                  isibl pour ê tre
  il                ne
ut isée com m e graî .

    t      ial ion              e
Ce t e init isat du gé né rat ur de nom bre s alat     é oires doit t e fois n'ê t ré al qu'une seul fois pour une e xé cut
                                                                       out          re    isée              e                             ion
                  e
donné e . Dans l cas cont                            ,
                             raire , on ris q ue rait e n e ffe t d'obt nir pl
                                                                 ,      e                           e e
                                                                                usieurs fois de suit ls m ê m e s nom bre s . Si l       'on
         e               è                               a
souh ait q ue ce problm e s oit pris e n ch arge par l fonct de t  ion                          l
                                                                                                e                                           t
                                                                          irage d'un nom bre e l -m ê m e , ile s t né ce s s aire q ue ce t e
                       e     e        ors                                                             -l
derniè re s oit capabl de l faire l de son prem ie r appe l(e t uniq ue m e nt à ce m om e nt à ). Ce m é canism e pas s e par
 'e     oi
l m pl d'une v             e   as      at
                   ariabl de cl s e st iq u e .
138                     angage C
        Exe rcice s e n l
Program m e

  #include <stdio.h>
  #include <stdlib.h>              /* pour la fonction rand */
  #include <time.h>                /* pour la fonction time */

  #define N 10                     /* les tirages se feront entre 0 et N */

  main()
  {
     int aleat (int) ;             /* prototype fonction de tirage aléatoire */
     int ntir,                     /* nombre de tirages requis */
         t[N+1],                   /* tableau comptage tirages de chaque valeur */
         i ;

      printf ("combien de tirages : ") ;
      scanf ("%d", &ntir) ;
      for (i=0 ; i<=N ; i++)
         t[i] = 0 ;
      for (i=1 ; i<=ntir ; i++)
         t[aleat(N)]++ ;
      printf ("nombre de tirages obtenus\n") ;
      for (i=0 ; i<=N ; i++)
         { printf ("%4d : ", i) ;
           printf ("%6d\n", t[i]) ;
         }
  }

           /********************************************************/
           /* fonction de tirage aléatoire d'un nombre dans [0, n] */
           /********************************************************/
  int aleat (int n)
  {
     int i ;
     static int prem = 1 ; /* drapeau premier appel */
     time_t date ;          /* pour l'argument de time */
                            /* time_t est un type entier défini dans time.h */

             /* initialisation générateur au premier appel */
      if (prem)
          { srand (time(&date)) ;
            prem = 0 ;
          }
                                                                                             III. H asard e t ré cré ations     139

               /* génération nombre */
        i = rand() / (RAND_MAX + 1.) * (n+1) ;
        return (i) ;
   }




          aire
Com m e nt s


    e                     rait          icul
*L m é canism e du t e m e nt part ie r à e ffe ct r au pre m ie r appe le s t ré al grâ ce à l v
                                                       ue                           isé                    e               aré
                                                                                                 a ariabl pre m , décl e d e
  as      at           t ariabl e s t init isée à un, l de l com pil ion. D è s l pre m ie r appe l e l e s t m ise à zé ro e t e l
cl s e s t iq ue . Ce t e v     e         ial          ors    a    at             e               , l  e                          le
                 e     t al        us       a
garde ra e nsuit ce t e v e ur j q u'à l fin de l xé cut du program m e . Ainsi, l fonct srand n'e s t e ffe ct e m e nt
                                                    'e      ion                         a       ion                       iv
      é                e       ors                  de     re   ion e .
appe le q u'une s e ul fois, l du prem ie r appe l not fonct alat


    a        ion im
*L fonct t e fournit e n re t             e e                                         é
                                     our l t m ps (e xprim é e n s e conde s ) é coul depuis une cert    aine "origine " dépendant de
 'im é          at
l plm e nt ion. L t                  t al                 ui
                       e ype de ce t e v e ur dé pe nd, l aussi, de l plm e nt ion ;out fois, l norm e pré v q u'ile xist ,
                                                                         'im é       at      t e         a             oit          e
        im                   e im                       ype )
dans t e .h , un sym bol t e _t (défini par t de f pré cisant l t                             iv             oyé          ors
                                                                                e ype e ffe ct e m e nt e m pl . Ici, l q ue nous
t          t       t al
 ransm e t ons ce t e v e ur à srand, ile s t possibl q u'apparais s e une conv rsion du t
                                                      e                            e                im           e ype unsigne d int ;
                                                                                               ype t e _t dans l t
        a
ici, ce l n'a guè re d'im port              a                              t
                               ance , dans l m e s ure où, m ê m e s i ce t e conv rsion est "dégradant ", l v e ur obt nue re s t ra
                                                                                  e                      e    a al         e      e
im pré v      e       'ut isat
         isibl pour l il e ur.

        re       , a      ion im
D 'aut part l fonct t e ne s e cont nt pas de fournir une "h e ure " e n re t ; l range é galm e nt ce t e m ê m e
                                               e e                                     our e l  e          e        t
inform at à l                        ui              igat                        c'e
              ion 'adre s s e q u'on l fournit (obl oire m e nt) e n argum e nt ; s t ce q ui j ifie l xist nce de l v
                                                                                               ust   'e    e       a ariable
     e                  il            le
dat (q ui n'e s t pas ut isée par ail urs) e t q ui doit ici, absol e nt ê t décl dans l "bon t ", sous peine de risquer
                                                        ,         um        re   arée       e      ype
           ir                      e     if                    e
d'about à un é cras e m e nt int m pe s t de données (dans l cas où on aurait décl dat d'un t
                                                                                     aré    e             us    it     e ype
                                                                                                   ype "pl pet " q ue l t
e ffe ctif).




                                                   I-3 é         e
                                                  II A la d'é toils

________________________________________________________________________________________
140                        angage C
           Exe rcice s e n l
Enoncé

Affich e r au h asard un ce rt                  oil         è      ")
                                ain nom bre d'ét e s (caract re "* à l é rie ur d'un re ct
                                                                           'int                        e e           oil
                                                                                                 angl. L nom bre d'ét e s
        é                e            igne
souh ait e s , ainsi que l nom bre de l s e t de colonnes du rect    e
                                                                 angl s e ront fournis e n donné e s .

  e                 é            a                                     oir e          oil                   it          usieurs
L program m e v rifie ra q ue l zone e s t as s e z grande pour re ce v l nom bre d'ét e s re q uis. O n é v e ra q ue pl
   oil
é t e s ne s oie nt superposées.



       e
Exe m pl

   combien de lignes : 10
   combien de colonnes : 45
   combien de points : 200
   ** *     ****    ** *** * ** *** *           *** **
    *      * * ** * ** * * ****** * **         **
   * *       ** * * * *****       *** **    * *** * *
      * *** * *            * * *     **    * *    **
   * * ** ** ** **** ** ** ** ** * *              * *
         * * **        *** *    * * ** * * * * **
        *** ** **          * **      * *     * * **
         *       * * *          * ***** **    ** * *
            * * *****        **    *** * ** * *****
   ****       * *    ***     *     ** ****    * *****

________________________________________________________________________________________



ANALYSE


         il           abl                è                            e               é                   e
Nous ut iserons un t e au de caract re s à deux dim e nsions, dans lq ue lch aq ue é lm e nt re pré s e nt ra une case de not   re
re ct    e             ie
     angl. Nous conv ndrons q ue l pre m ie r indice re pré s e nt l rang de l l
                                       e                          e e                            e                            e e
                                                                               a igne e t q ue l s e cond indice re pré s e nt l
           a    onne             'ut isat
rang de l col . Com m e l il e ur doit pouv ch oisir l dim e nsions du rect
                                                      oir          es                          e
                                                                                        angl conce rné , nous prév    oirons de
               re abl          ail  e       e
donne r à not t e au une t l s uffisant pour couv t       rir ous ls cas possibls (nous av
                                                                    e           e                                  ignes de 80
                                                                                              ons ch oisi, ici, 25 l
       è       ce a
caract re s ) ; l signifie q ue , l pl
                                   a upart du t m ps, l program m e n'ut isera qu'une part de ce t e au.
                                               e       e                il                  ie        abl

            ,         ial
Au départ nous init iserons t           e    é
                                   ous ls é lm e nt de l "part ut e " de ce t e au av c l caract re e s pace . Nous
                                                    s      a      ie il             abl      e e         è
                  e            e    é     s      e
ch oisirons ensuit au h asard ls é lm e nt dans ls q ue l nous dev
                                                        s                ace            è    ".
                                                                   rons pl r un caract re "* Pour ce faire , ilnous suffira
     ire
de t r au h asard un num é ro de l    igne e t un num é ro de col                         'e    ace
                                                                   onne jusqu'à ce q ue l m pl m e nt corre s pondant soit
          e         è             'al h
disponibl (caract re e s pace ). L gorit m e de t  irage au h asard d'un nom bre e nt r appart nant à un int rv l donné a
                                                                                     ie       e             e ale
   é
é t e xposé dans l     yse     'e
                  'anal de l xe rcice III-1.
                                                                                   III. H asard e t ré cré ations    141
                e    us                              e e a         ion
Ilne nous re s t ra pl q u'à affich e r, par e xe m pl av c l fonct put ar, l diffé re nt é lm e nt de not t e au, e n
                                                                       ch   es           s é       s          re abl
pré v                            igne                s
     oyant un "ch ange m e nt de l " aux m om e nt opport   uns.



Program m e

   #include <stdio.h>
   #include <stdlib.h>
   #include <string.h>                         /* pour memset */
   #include <time.h>
   #define NY 25                               /* nombre total de lignes de l'écran */
   #define NX 80                               /* nombre total de colonnes de l'écran */
   main()
   {
      int aleat (int) ;                        /*   prototype fonction tirage aléatoire */
      int ny,                                  /*   nombre de lignes du rect. considéré */
          nx,                                  /*   nombre de col. du rect. considéré */
          ix,                                  /*   colonne courante */
          iy,                                  /*   ligne courante */
          nb_points,                           /*   nombre de points à tirer */
          i, j ;
      char ecran [NX] [NY] ;                   /* image de l'écran */
      const char blanc = ' ',                  /* caractère de remplissage */
                 point = '*' ;                 /* représentation d'un point */

                       /* entrée des dimensions du rectangle considéré ...
                                      ... et du nombre de points souhaités */
       do
          { printf ("combien de lignes : ") ;
            scanf ("%d", &ny) ;
          }
       while (ny<=0 || ny>=NY) ;
       do
          { printf ("combien de colonnes : ") ;
            scanf ("%d", &nx) ;
          }
       while (nx<=0 || nx>=NX) ;
       do
          { printf ("combien de points : ") ;
            scanf ("%d", &nb_points) ;
          }
       while (nb_points > nx*ny || nb_points < 1 ) ;
142                     angage C
        Exe rcice s e n l
            /* remplissage aléatoire du tableau image d'écran */
      memset (ecran, blanc, NX*NY) ;
      for (i=1 ; i<=nb_points ; i++)
         { do
              { ix = aleat (nx-1) ;
                iy = aleat (ny-1) ;
              }
           while ( ecran [ix] [iy] != blanc) ;
           ecran [ix] [iy] = point ;
         }

                 /* affichage du tableau image d'écran */
      for (j=0 ; j<ny ; j++)
         { for (i=0 ; i<nx ; i++)
              putchar ( ecran [i] [j] ) ;
           printf ("\n") ;
         }
  }

           /*******************************************************/
           /* fonction de tirage aléatoire d'un nombre dans [0,n] */
           /*******************************************************/
  int aleat (int n)
  {
     int i ;
     static int prem = 1 ;            /* drapeau premier appel */
     time_t date ;                    /* pour l'argument de time */

             /* initialisation générateur au premier appel */
      if (prem)
         { srand (time(&date) ) ;
           prem = 0 ;
         }

             /* génération nombre aléatoire */
      i = rand() / (RAND_MAX + 1.) * (n+1) ;
      return (i) ;
  }




          aire
Com m e nt s
                                                                               III. H asard e t ré cré ations                143
  'init isat  a     ie il     abl     e e        è
*L ial ion de l part ut e du t e au av c l caract re e s pace aurait pu s e program m e r ainsi :

       for (i=0 ; i<nx ; i++)
          for (j=0 ; j<ny ; j++)
             ecran [i][j] = ' ' ;

Ici, nous av                                 a
             ons préfé ré faire appe là l fonct                       ,
                                                       ion m e m s e t d'e xé cution pl rapide . Tout fois, ce l -ci re m pl d'un
                                                                                      us             e         le          it
      è                    e      e s            ifs ce
caract re donné une suit d'oct t cons é cut ; ci e xcl donc de l it r l ial ion à l part ut e du t e au. Ilne
                                                                ut            im e 'init isat      a     ie il       abl
             ie             ,         l
                                      e
faut pas oubl r, e n e ffe t q ue ce l -ci n'e s t pas form é e d e nx* oct t cons é cut (q uoiq ue , e n t e rigue ur, e n t nant
                                                                        ny     e s       ifs               out               e
        e   a                                                   es
com pt de l m aniè re dont sont rangé s e n m é m oire l diffé re nt é lm e nt d'un t e au, ilsoit possibl de l it r
                                                                              s é      s      abl                    e      im e
 'init isat          NY é
l ial ion à nx* élm e nt cons é cuts            ifs).


*Nous av               a      ion e      'e                 .
           ons re pris l fonct alat de l xe rcice pré cédent Ce l -ci t une v e ur e nt re au h asard e nt 0 e t une
                                                                le     ire     al      iè                 re
 im e         ui                      de us, ors
l it q u'on l fournit e n argum e nt ; pl l de son prem ie r appe l e l e ffe ct une init isat du gé né rat ur de
                                                                      , l  e    ue        ial ion            e
            é oire
nom bre s alat s .




                                                I-4
                                               II Es tim ation de pi

________________________________________________________________________________________



Enoncé

  cul        al                            a      h         ant
Cal e r une v e ur approch é e d e pi, par l m é t ode s uiv e :

         ire      ain              s
   - on t un ce rt nom bre de point au h asard dans un carré donné.
            e       e             re e                    s
   - on dé t rm ine l rapport e nt l nom bre de ce s point appart nant au ce rcl inscrit dans l carré e t l nom bre t al
                                                                 e             e              e           e          ot
            s iré                             im ion    a al
   de point t s . Ce rapport fournit une e s t at de l v e ur de pi/4.
 e         ot de    s ire
L nom bre t al point à t r s e ra fourni e n donné e .



       e
Exe m pl

   combien de points ? 10000
   estimation de pi avec 10000 points : 3.164800e+000
144                        angage C
           Exe rcice s e n l
________________________________________________________________________________________



ANALYSE


                                é    é           ie
Nous ch oisirons un carré de côt unit . Nous conv ndrons de prendre son coin bas gauch e com m e origine d'un repè re
    é
cart s ie n.

         ire       ors           e
Nous t rons al au h asard l nom bre de point v us, à l é rie ur de ce carré . Pl précisém e nt pour ch aq ue point
                                                   s oul          'int                      us             ,                 ,
           e
nous dét rm ine rons au h asard ses deux coordonné e s , e n t                          s       e       'int ale
                                                              irant deux nom bre s ré e l appart nant à l e rv l [0,1]. A ce t
       ,                   à a     h                  'anal de l xe rcice III-1.
e ffe t nous fe rons appe l l m é t ode e xposée dans l      yse     'e

                   ,          cul
Pour ch aq ue point nous cal e rons sa dist                    re
                                              ance au ce nt du carré (de coordonné e s : 0.5, 0.5) e t nous considérerons qu'il
       ie           e              t
appart nt au ce rcl inscrit si ce t e distance e s t infé rie ure à 0.5 (not z q ue , par souci de s im pl é , nous t ail rons e n
                                                                            e                            icit        rav l
                                                                                                                         e
       e e               t
fait av c l carré de ce t e distance ).


Program m e

   #include <stdio.h>
   #include <stdlib.h>

   main()
   {
      float caleat(void) ;              /*   prototype fonction de tirage valeur aléatoire */
      float x, y,                       /*   coordonnées d'un point courant */
            d2,                         /*   distance (au carré) d'un point courant au centre */
            pi ;                        /*   valeur approchée de pi */
      int np,                           /*   nombre de points à tirer */
          nc,                           /*   nombre de points à l'intérieur du cercle */
          i ;

       printf ("combien de points ? ") ;
       scanf ("%d", &np) ;

       for (nc=0, i=1 ; i<=np ; i++)
          { x = caleat() ;
            y = caleat() ;
            d2 = (x-0.5) * (x-0.5) + (y-0.5) * (y-0.5) ;
            if (d2 <= 0.25) nc++ ;
          }

       pi = (4.0 * nc) / np ;
                                                                                     III. H asard e t ré cré ations   145
       printf ("estimation de pi avec %d points : %e", np, pi) ;
   }

   float caleat (void)       /* fonction fournissant une valeur aléatoire */
                      /* appartenant à l'intervalle [0-1] */
   {
      return ( (float) rand() / (RAND_MAX + 1.0) ) ;
   }




DI      O
  SCUSSI N

    re
Not fonct   ion de tirage alat
                             é oire d'un ent r fournit t ours l m ê m e s uit de v e urs. Ce q ui signifie q ue , pour un
                                            ie          ouj   a              e    al
                        s,           ie        ouj
nom bre donné de point nous obt ndrons t ours l m ê m e e s t at
                                                      a         im ion de pi. V            e     it
                                                                                  ous pouv z é v e r ce ph é nom è ne e n
  il     a      ion     isée       'e
ut isant l fonct ré al dans l xe rcice III-2.




                                               I-5
                                              II Je u du de vin

________________________________________________________________________________________


Enoncé

                                                   ie                re                               'ut isat
Ecrire un program m e q ui ch oisit un nom bre e nt r au h asard e nt 0 e t 1000 e t q ui de m ande à l il e ur de l   e
     ine                     ion     e     e oue      e
"dev r". A ch aq ue proposit fait par l j ur, l program m e ré pondra e n sit           e
                                                                                 uant l nom bre propos é par rapport à
   ui     ine    us           us    it
ce l à dev r (pl grand, pl pet ou gagné ).

 ors     e oue
L q ue l j ur aura de v             e                      ors                                           é            e
                               iné l nom bre ch oisi, ou l q u'un nom bre m axim alde coups (10) aura é t dépas s é , l
                        a         ul ion             e
program m e affich e ra l ré capit at des diffé re nt s propositions.



       e
Exe m pl

   Devinez le nombre que j'ai choisi (entre 1 et 1000)
   votre proposition : 500
   ----------- trop grand
146                         angage C
            Exe rcice s e n l
   votre proposition : 250
   ----------- trop grand
   votre proposition : 125
   ----------- trop grand
   votre proposition : 64
   ----------- trop grand
   votre proposition : 32
   ----------- trop grand
   votre proposition : 16
   ----------- trop grand
   votre proposition : 8
   ----------- trop petit
   votre proposition : 12
   ----------- trop grand
   votre proposition : 10

   ++++ vous avez gagné en 9 coups

      ---- Récapitulation des coups joués ----

      500   trop grand
      250   trop grand
      125   trop grand
       64   trop grand
       32   trop grand
       16   trop grand
        8   trop petit
       12   trop grand
       10   exact

________________________________________________________________________________________



ANALYSE

 e                                ire               ie
L program m e com m e nce ra par t r un nom bre e nt r au h asard, suiv    a                          'anal de
                                                                       ant l dém arch e e xposée dans l   yse
'e
l xe rcice III-1.

  dev        e       e 'act
Il ra e nsuit ré pé t r l ion :

            f            e
             aire joue r l joue ur
                e oue                     ait        e                  de
jusqu'à ce q ue l j ur ait gagné ou q u'il dépas s é l nom bre m axim al coups perm is.

 'act             ion     e      e
L ion e n q ue s t consist s im plm e nt à :
                                                                                          III. H asard e t ré cré ations   147
                     oue
  - D e m ande r au j ur de propos e r un nom bre .
             e                      abl                   oir abl a            ul ion      e    e             e e
  - Cons e rv r ce nom bre dans un t e au (pour pouv é t ir l ré capit at final). Not z q ue , com pt t nu de ce
                                   e                                    e                  d'él     s      re abl
  q u'un nom bre de coups m axim al s t im pos é , ce dernie r fournira l nom bre m axim al é m e nt de not t e au.
               e                  e a al                   e                            e
  - Com pare r l nom bre fourni av c l v e ur ch oisie par l program m e e t affich e r l m e s s age corre s pondant.



Program m e


  #include <stdio.h>
  #include <stdlib.h>

  #define NCOUPS 15                /* nombre maximal de coups autorisés */
  #define NMAX 1000                /* valeur maximale du nombre à deviner */

  main()
  {
     int aleat(int) ;               /*   prototype fonction de tirage d'un nombre au hasard */
     int nc,                        /*   compteur du nombre de coups joués */
         ndevin,                    /*   nombre à deviner */
         n,                         /*   nombre courant proposé par le joueur */
         prop[NMAX],                /*   tableau récapitulatif des nombres proposés */
         i ;

                /* initialisations et tirage du nombre secret */
      nc = 0 ;
      printf ("Devinez le nombre que j'ai choisi (entre 1 et %d)\n", NMAX) ;
      ndevin = aleat(NMAX) ;




                    /* déroulement du jeu */
      do
         { printf ("votre proposition : ") ;
           scanf ("%d",&n) ;
           prop [nc++] = n ;
           if (n < ndevin)      printf ("----------- trop petit\n") ;
           else if (n > ndevin) printf ("----------- trop grand\n") ;
         }
      while (n != ndevin && nc < NCOUPS) ;

                      /* affichage résultats */
148                       angage C
          Exe rcice s e n l
       if (n == ndevin) printf ("\n\n++++ vous avez gagné en %d coups\n", nc) ;
                 else { printf ("\n\n---- vous n'avez pas trouvé\n") ;
                        printf ("le nombre choisi était %d\n", ndevin) ;
                      }

                  /* affichage récapitulation */
       printf ("\n ---- Récapitulation des coups joués ----\n\n") ;
       for (i=0 ; i<nc ; i++)
          { printf ("%4d ", prop[i]) ;
            if (prop[i] > ndevin)
                   printf ("trop grand \n") ;
            else if (prop[i] < ndevin)
                   printf ("trop petit\n") ;
            else   printf ("exact\n") ;
          }
   }

            /*******************************************************/
            /* fonction de tirage aléatoire d'un nombre dans [0,n] */
            /*******************************************************/
   int aleat(int n)
   {
      int i = rand() / (RAND_MAX + 1.) * (n+1) ;
      return i ;
   }



DI      O
  SCUSSI N

    re      ion
Not fonct de t      irage alat
                           é oire d'un nom bre e nt r fournit t ours l m ê m e v e ur, ce q ui gâ ch e q ue lue pe u l é rê t
                                                        ie         ouj       a        al                    q        'int
    e           a     iq                                     ace a       ion e                              l
                                                                                                            e
du j u. D ans l prat ue , ils e rait né ce s s aire de re m pl r l fonct alat de ce program m e par ce l proposée dans
 'e               aq l   e              e                                         ion       re
l xe rcice III-2, l ue l pe rm e t d'obt nir un nom bre diffé re nt d'une e xé cut à une aut .




                                                 I-6
                                                II M as te rm ind

________________________________________________________________________________________
                                                                                        III. H asard e t ré cré ations   149
Enoncé

     iser                                                                                     re
R é al un program m e q ui ch oisit au h asard une com binaison de 5 ch iffre s (com pris e nt 1 e t 8) e t q ui de m ande à
 'ut isat    a    ine
l il e ur de l dev r. A ch aq ue proposit        e
                                            ion, l program m e pré cis e ra :

     e                            s             a        ace,
   - l nom bre de ch iffre s exact propos é s à l bonne pl
     e                            s                 a
   - l nom bre de ch iffre s exact m ais proposés à l m auv      ace.
                                                           aise pl
 es          e
L diffé re nt s proposit         oue                          a                                  ifs                   e
                        ions du j ur s e ront fournie s s ous l form e de 5 ch iffre s cons é cut (sans aucun s é parat ur),
 al
v idés par re turn.

 e               ra rait          e     e
L program m e dev t e r conv nablm e nt l cas des ré pons e s incorre ct s : lt re à l pl d'un ch iffre , ré pons e t
                                                e                       e    e t     a ace                           rop
     e    rop ongue , ch iffre incorre ct (nul supérieur à 8).
court ou t l                                  ou

O n pré v                im e                 à          e                   e                             l ait a
                                                                                                            e
         oira un nom bre l it d'essais, au-de l duq ue l l program m e s 'int rrom pra e n indiq uant q ue l é t l
                  ine
com binaison à dev r.


       e
Exe m pl

   proposition ? : 12345
                                   2 P 0 C
   proposition ? : 23456
                                   0 P 1 C
   proposition ? :         34567
                                   0 P 1 C
   proposition ? :         45678
                                   0 P 0 C
   proposition ? :         56789
   ** incorrect **
   proposition ? :         1133é
   ** incorrect **
   proposition ? :         11332
                                   3 P 1 C
   proposition ? :         11333
                                   4 P 0 C
   proposition ? :         11313
                         5 P 0 C
   vous avez trouvé en 7 coups

________________________________________________________________________________________
150                       angage C
          Exe rcice s e n l
ANALYSE


          t         ure      il       abl
Ilparaî as s e z nat ld'ut iser un t e au à 5 é lm e nt pour y range r l com binaison t e au h asard. Not z q ue nous
                                                    é       s              a                iré              e
                 e      ire                                                       ,     out     on,
pourrions é galm e nt t r au h asard un nom bre de 5 ch iffre s , m ais ilfaudrait de t e faç e n e xt  raire ch acun de s
            de us, a       h                e                 isabl                conq
ch iffre s ; pl l m é t ode s e rait difficilm e nt gé né ral e à un nom bre q ue l ue de posit   ions.

  a         e       té
L principal difficul ré s ide dans l
                                   'anal de l proposit
                                         yse      a                 oue        a                          abl
                                                           ion du j ur. D ans l com paraison des deux t e aux
               iré     e                                           e oue              e          e
(com binaison t e par l program m e e t com binaison proposé e par l j ur), ilfaudra t nir com pt des re m arq ue s
    ant
suiv e s :

                       é       ace                 oir re   e             é               ,          pl
   - Un ch iffre com pt "à sa pl " ne doit pas pouv ê t é galm e nt com pt com m e "e xact m ais m al acé ".
      ors
   - L q u'un t                e usieurs ch iffre s ident ue s , ilne faut pas q u'un m ê m e ch iffre de l proposit
                 irage com port pl                       iq                                               a         ion du
    oue             re      é usieurs fois com m e e xact
   j ur puis s e ê t com pt pl                           .
      ors
   - L q u'une proposit     ion com port ple                            iq                     e
                                                usieurs ch iffre s ident ue s , il ne faut pas ls considérer tous com m e
   corre s pondant à un m ê m e ch iffre du tirage .
      ous        a      h         ant
Nous v proposons l m é t ode s uiv e :

                             out         e                s acé
   1 - Nous re ch e rch ons t d'abord ls ch iffre s e xact pl s e n bonne position. A ch aq ue fois q u'une coïncide nce e s t
      e é                        e           a             a
   re lv e , nous supprim ons l ch iffre , à l fois dans l proposit du j ur e t dans l t
                                                                   ion    oue                            e       aç ,
                                                                                          e irage (e n l re m pl ant par
           e       a al
   e xe m pl, par l v e ur 0).
                                 e
   2 - Nous re pre nons e nsuit , un à un, ch acun de s ch iffres du t                          é                   -à
                                                                      irage q ui n'ont pas é t s upprim é s (c'e s t -dire q ui sont
              s                e                                           a
   diffé re nt de 0). Nous ls com parons à ch acun de s ch iffres de l proposit               à
                                                                                       ion. L e ncore , si une coïncide nce e s t
      e é                          e                       s, a               a          ion
   re lv e , nous supprim ons ls ch iffre s corre s pondant à l fois dans l proposit e t dans l t                      e
                                                                                                         e irage . Not z bie n q u'il
                um       it                  e
   faut absol e nt é v e r de considérer ls ch iffres déj supprim és du t
                                                             à                            s                      re rouv s é gaux à
                                                                                irage : il ris q ue raie nt d'ê t t      é
         re                          a
   d'aut s ch iffre s s upprim és de l proposition.
    t       h
Ce t e m é t ode q ui dé truit l t
                               e irage nous obl né ce s s aire m e nt à e n faire une copie av d'ent e r l
                                              ige                                             ant   am       yse  a
                                                                                                         'anal de l
proposit ion.

       ons            iser rois fonct
Nous av ch oisi de réal t            ions :

   -tirage : t                    a                abl            ie        ine
              irage au h asard de l com binaison (t e au de 5 e nt rs) à dev r.
          re      ré     a         ion
   - e nt e : e nt e d e l proposit du j ur. Ilparaî l ue q ue ce t e fonct fournis s e ce t e proposit dans un
                                          oue          t ogiq          t        ion                 t          ion
    abl          ie        e             rait
   t e au d'e nt rs. Tout fois, afin de t e r conv nablm e nt ls cas de ré pons e s incorre ct s , l proposit du j ur
                                                   e    e     e                               e a            ion     oue
           out        ue               ne 'aide de l fonct cge t (son m é canism e e s t décrit dans l xe rcice II-4).
   s e ra t d'abord l dans une ch aî à l            a     ion    s                                    'e
        y          yse  a         ion  oue      ant 'al h
   - anal s e : anal de l proposit du j ur, suiv l gorit m e décrit pré cédem m e nt.



Program m e
                                                                III. H asard e t ré cré ations   151
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define NPOS 5           /* nombre de positions */
#define NCHIF 8          /* nombre de chiffres (ici, de 1 a 8) */
#define NCMAX 12         /* nombre maximal de coups */

main()
{
   void tirage (int []) ;                           /*****************************/
   int entree (int []) ;                            /*     prototypes fonctions */
   void analyse(int [], int[], int[], int []) ;     /*****************************/

    int tir[NPOS],       /*   combinaison tirée par le programme */
        prop[NPOS],      /*   proposition du joueur */
        ncoup,           /*   compteur de coups joués */
        bpos,            /*   nombre de chiffres bien placés */
        bchif ;          /*   nombre de chiffres exacts mais mal placés */

              /* initialisations */
    tirage (tir) ;
    ncoup = 0 ;

              /* déroulement du jeu */
    do
       { while (printf ("proposition ? : "), entree(&prop) )
                 printf ("\n** incorrect **\n") ;
         analyse (prop, tir, &bpos, &bchif) ;
         printf ("\n %22d P %d C\n", bpos, bchif) ;
         ncoup++ ;
       }
    while (bpos < NPOS && ncoup < NCMAX) ;

                /* affichage résultats */
    if (bpos == NPOS) printf ("vous avez trouvé en %d coups", ncoup) ;
         else { int i ;
                 printf ("vous n'avez pas trouvé en %d coups\n", NCMAX) ;
                 printf ("la bonne combinaison était : ") ;
                 for (i=0 ; i<NPOS ; i++) printf ("%d",tir[i]) ;
                 printf ("\n") ;
              }
}
152                     angage C
        Exe rcice s e n l
          /*************************************************/
          /* fonction de tirage de la combinaison secrète */
          /*************************************************/
  void tirage (int tir [])
  {
     int i ;
     for (i=0 ; i<NPOS ; i++)
        tir[i] = rand() / (RAND_MAX + 1.) * NCHIF + 1 ;
  }


          /*************************************************/
          /* fonction de lecture de la proposition du joueur */
          /*****************************************************/
  int entree (int prop [])
  {
     char ch[NPOS+3] ;      /* chaîne où sera lue la proposition du joueur */
     int i ;

                /* lecture proposition joueur dans chaîne ch */
      ch[0] = NPOS+1 ;       /* préparation longueur maxi chaîne lue */
      cgets (ch) ;

                /* contrôles */
      if (strlen (&ch[2]) != NPOS) return(-1) ;
      for (i=2 ; i<NPOS+2 ; i++)
         if (ch[i] < '1' || ch[i] > '1'+NCHIF-1) return(-1) ;

                 /* extraction des chiffres choisis */
      for (i=0 ; i<NPOS ; i++)
         prop[i] = ch[2+i] -'0' ;
      return (0) ;
  }

          /**************************************************/
          /* fonction d'analyse de la proposition du joueur */
          /**************************************************/
  void analyse (int prop [], int tir [], int bpos [] , int bchif [])
  {
     int tirbis[NPOS],           /* double de la combinaison secrète */
         i, j ;

                  /* recopie de la combinaison secrète */
      for (i=0 ; i<NPOS ; i++) tirbis[i] = tir[i] ;
                                                                                                 III. H asard e t ré cré ations      153

                    /* comptage bonnes positions */
        *bpos = 0 ;
        for (i=0 ; i<NPOS ; i++)
           if (prop[i] == tirbis[i])
              { (*bpos)++ ;
                tirbis[i] = prop[i] = 0 ;
              }

                     /* comptage bons chiffres mal placés */
        *bchif = 0 ;
        for (i=0 ; i<NPOS ; i++)
           for (j=0 ; j<NPOS ; j++)
              if (prop[i] !=0 && prop[i] == tirbis[j])
                 { (*bchif)++ ;
                   prop[i] = tirbis[j] = 0 ;
                 }
   }


          aire
Com m e nt s


   e
*L nom bre de posit                  e                                       é                 ine                it
                    ions (NPO S) e t l nom bre de ch iffre s (NCH IF) ont é t définis par #de f , ce q ui e n facil e
'é e ue l
        e
l v nt l m odification.


    a
*L fonct t                           'al h
           ion irage fait appe là l gorit m e de t                           ie e              'av                'e
                                                   irage au h asard d'un e nt r, t lq ue nous l ons e xposé dans l xe rcice
           e           e           iré
III-1. Tout fois, ici, l nom bre t doit appart nir à l e rv l [1,NCH IF] e t non à l e rv l [0,NCH IF]. C'e s t ce q ui
                                               e       'int al   e                       'int al  e
     iq       e               t         'int al
e xpl ue q ue l nom bre ré e l iré dans l e rv l [0,1[ soit m ul ié par NCH IF e t q ue l aj e 1 au ré s ul .
                                                 e               t ipl                      'on out           tat


     a        ion     re it              u, a           ion
*L fonct e nt e l , com m e pré v l proposit du j ur sous form e d'une ch aî . El e n e ffe ct ls cont e s
                                                                 oue                           ne    le          ue e       rôl
                   it    a al       ors    a
re q uis e n re s t uant l v e ur 0 l q ue l ré pons e e s t v ide et l ré pons e -1 dans l cas cont
                                                              al      a                    e                   e       a
                                                                                                    raire . Not z q ue l décision
                                            e l
                                              e             ion    oue                    e
de dem ande r, e n cas d'erreur, une nouv l proposit au j ur e s t prise dans l program m e principale t non dans l             a
       ion l   e
fonct e l -m ê m e .


     e            s    a         ion
*L s argum e nt de l fonct anal s e sont t
                                         y                       e                         e     al               re
                                                   ransm is par lur adre s s e , afin q ue lur v e ur puis s e ê t m odifié e . C'e s t ce
        ust    e         arat
q ui j ifie lur dé cl ion sous form e de point urs sur de s e nt rs. N'oubl z pas q ue ls nom s de t e aux
                                                           e                     ie           ie                e               abl
                    e               c'e          ust
corre s ponde nt à lur adre s s e ; s t ce q ui j ifie q ue dans l        de
                                                                   'appe l anal s e , on t
                                                                                    y             e       iv         es          e
                                                                                             rouv e ffe ct e m e nt l sym bols prop
     ir, ors              l
                          e
e t t al q ue , par ail urs, on y t          e
                                        rouv & bpos e t & bch if.


       a     e      ant                        )
*D ans l boucl s uiv e (du program m e principal :
154                         angage C
            Exe rcice s e n l
       while (printf ("proposition ? : "), entree(&prop) )
               printf ("\n** incorrect **\n") ;

 'e                                e il              e
l xpre s s ion figurant dans w h il ut ise un "opérat ur s é q ue nt l ce q ui pe rm e t ainsi de sim pl r q ue lue pe u l crit .
                                                                    ie ",                               ifie    q        'é    ure
    it
A t re indicat v                      ruct          al e
                 if, oici de ux const ions é q uiv e nt s , l    'une parfait m e nt st uré e , l re bas é e s ur l il ion de
                                                                             e         ruct        'aut             'ut isat
        e al                     e   R                 ant          iv
bre ak (ls v e urs des sym bols V A I e t FAUX ét re s pe ct e m e nt 1 e t 0) :

       ok = FAUX ;
       while (!ok)
          { printf ("proposition ? : ") ;
            if (entree(&prop)) ok = VRAI ;
               else printf ("\n** incorrect **\n") ;
          }


       do
          { printf ("proposition ? : ") ;
            if (entree(&prop)) break ;
               else printf ("\n** incorrect **\n) ;
       while(1) ;



DI      O
  SCUSSI N


      a           a         ion      oue
*Ici, l saisie de l proposit du j ur e s t parfait m e nt sat
                                                       e                e                                    ".       icul
                                                               isfaisant , m ê m e pour un program m e "ré e l En part ie r,
  l oris e
   e
e l aut e ls corre ct                            'ut isat            e
                       ions, m ê m e aprè s q ue l il e ur a frappé l dernie r ch iffre .


              re e q         e                                  ouj     a                                 è e       q    é
*Par cont , t l u'il s t propos é ici, ce program m e ch oisit t ours l m ê m e com binaison, ce q ui e nlv q ue lue int rê t
    a      iq           iè       e                    it a                                                        t acune , il
à l prat ue ré gul re du j u (m ais q ui pe ut facil e r l m ise au point du program m e ). Pour ré m édier à ce t e l
 suffit d'int                  a     ion irage , une init isat du gé né rat ur de nom bre s alat s , l de son prem ie r
               roduire , dans l fonct t                  ial ion           e                  é oire      ors
       ,                   'av           'e
 appe l com m e nous l ons fait dans l xe rcice III-2.


    e                          e
*L program m e s upport , sans aucune m odificat                      al          conq                   al
                                                          ion, de s v e urs q ue l ues de NPO S e t des v e urs de NCH IF
                       e         e   le
infé rie ure s à 10. Il s t facil d'al r au-de l, e n m odifiant sim plm e nt l fonct e nt e .
                                               à                       e      a      ion  re
                                              V     S,     O
                                             I : TRI FUSI NS
                                          ET RECH ERCH E EN TA BLE




Nous vous proposons ici de s e xe rcices de program m at       gorit      assiques ayant t
                                                        ion d'al h m e s cl                         ris
                                                                                          rait aux t e t fusions de
 abl                a                    abl
t e aux, ainsi qu'à l re ch e rch e e n t e .




                                         V                             e
                                        I -1 Tri par e xtraction s im pl

________________________________________________________________________________________


Enoncé

     iser                    ri       al          es
R é al un program m e de t par v e urs décroissant d'un t e au d'e nt rs, e n ut isant l gorit m e dit "par e xt ion
                                                         abl         ie         il     'al h                    ract
      e                    a                ant
sim pl" q ui se définit de l m aniè re s uiv e :

                       e us                é      s    abl
   - O n re ch e rch e l pl grand de s n é lm e nt du t e au.
                          é         e e               é           abl
   - O n é ch ange ce t é lm e nt av c l pre m ie r é lm e nt du t e au.
        e us     it é
   - L pl pet é lm e nt s e t       e ors
                               rouv al e n pre m iè re posit   ion. O n pe ut al appl ue r l deux opé rat
                                                                               ors     iq    es               ions précédent s e
               é    s      ant                          a us                        e us               é        e
   aux n-1 é lm e nt re s t s, puis aux n-2, ... e t ce l j q u'à ce q u'ilne re s t pl q u'un s e ulé lm e nt (l dernie r - q ui
          ors e us
   e s t al l pl pet  it).
 e
L program m e affich e ra t    e         t
                           ous ls "ré s ul s int rm édiaire s ", c'e s t -dire ls v e urs du t e au, aprè s ch aq ue é ch ange de
                                          at    e                       -à     e al           abl
      é
deux élm e nts.


       e
Exe m pl

   combien de valeurs à trier : 8
   donnez vos valeurs à trier
156                         angage C
            Exe rcice s e n l
   3 9 2 7 11 6 2 8

       ---- valeurs à trier ----
        3    9    2    7   11    6                       2    8

       11         9             2    7       3    6      2    8
       11         9             2    7       3    6      2    8
       11         9             8    7       3    6      2    2
       11         9             8    7       3    6      2    2
       11         9             8    7       6    3      2    2
       11         9             8    7       6    3      2    2
       11         9             8    7       6    3      2    2

       ---- valeurs triées ----
       11    9    8    7    6                     3      2    2

________________________________________________________________________________________



ANALYSE


 'al h                   'é                      iser           ,     e           e        e ions d'indice s propre s au
L gorit m e propos é par l noncé pe ut s e form al com m e s uit e n t nant com pt des conv nt
angage C :
l

           e
   R é pé t r, pour i variant de 0 à n-2 :
      - re ch e rch e r k        e q    (k      e us             (k          lant
                                t l ue t ) soit l pl grand de s t ), pour k al de i à n-1,
                            m            m

                    e al           (k
      - é ch ange r ls v e urs de t ) e t de t(i).
                                             m




Program m e

   #include <stdio.h>
   #define NMAX 100                              /* nombre maximal de valeurs à trier */

   main()
   {
      int t [NMAX],                              /*   tableau contenant les valeurs à trier */
          nval,                                  /*   nombre de valeurs à trier */
          kmax,                                  /*   position du maximum temporaire */
          tempo,                                 /*   valeur temporaire pour échange valeurs */
                                                                     IV. Tris, f                              abl
                                                                                usions e t re ch e rch e e n t e    157

            i, j, k ;

               /* lecture des valeurs à trier */
       printf ("combien de valeurs à trier : ") ;
       scanf ("%d", &nval) ;
       if (nval > NMAX) nval = NMAX ;
       printf ("donnez vos valeurs à trier\n") ;
       for (k=0 ; k<nval ; k++)
          scanf ("%d", &t[k]) ;
       printf ("\n   ---- valeurs à trier ----\n") ;
       for (k=0 ; k<nval ; k++)
          printf ("%5d", t[k]) ;
       printf ("\n\n") ;

               /* tri des valeurs */
       for (i=0 ; i<nval-1 ; i++)     /* recherche maxi partiel pour chaque i                        */
          { kmax = i ;                         /* init recherche maxi partiel                        */
            for (j=i+1 ; j<nval ; j++)              /* recherche maxi partiel                        */
              if (t[j] > t[kmax]) kmax = j ;
            tempo = t[kmax] ;                   /* mise en place maxi partiel                        */
            t[kmax] = t[i] ;
            t[i] = tempo ;
            for (k=0 ; k<nval ; k++)               /* affichage intermédiaire                        */
               printf ("%5d", t[k]) ;
            printf ("\n") ;
          }

               /* affichage valeurs triées */
       printf ("\n   ---- valeurs triées ----\n") ;
       for (k=0 ; k<nval ; k++)
          printf ("%5d", t[k]) ;
       printf ("\n") ;
   }



          aire
Com m e nt s


Ce program m e fonct            out e al                        icul
                    ionne pour t e s ls v e urs de NMAX, en part ie r :

                                     à     ne
   - pour NM A X infé rie ur ou é gal 0, il fait rie n,
                        l        al
   - pour NM A X = 1, il it une v e ur q u'il          e l
                                                         e     le
                                             affich e t l q ue l .
158                          angage C
             Exe rcice s e n l




                                         V                               e
                                        I -2 Tri par pe rm utation s im pl

________________________________________________________________________________________


Enoncé

Ecrire une fonct          isant l t par v e urs croissant d'un t e au d'e nt rs, e n ut isant l gorit m e de t par
                  ion ré al     e ri        al               es           abl       ie        il      'al h     ri
        at         e          a   l
pe rm ut ion sim pl (dit de "l bul "), q ui se définit ainsi (n re pré s e nt l nom bre d'élm e nt du t e au) :
                                   e                                         ant e         é      s    abl

                  'e      e      abl                        us
   O n parcourt l ns e m bl du t e au, de puis sa fin j q u'à son début e n com parant deux élm e nt cons é cut e n ls
                                                                           ,                      é    s       ifs, e
      e         s           cl
   inv rsant s'il sont m al as s é s . O n s e re trouv ainsi av c l pl pet é lm e nt pl e n t t du t e au.
                                                       e        e e us     it é        acé    ê e    abl
              e l e      e le       ion e
   O n re nouv l une t l opé rat (dit "pas s e ") av c ls n-1 é lm e nt re s t s, puis av c ls n-2 é lm e nt re s t s, e t
                                                    e e         é      s      ant        e e         é      s      ant
                e     us
   ainsi de suit ... j q u'à ce q ue :
              'av -dernier élm e nt ait é t cl s é (l dernie r é t al obl oire m e nt à sa pl ),
       - soit l ant         é              é as     e             ant ors igat              ace
                                 at             ie           a                                 e ors    'e        e     abl
       - soit q u'aucune pe rm ut ion n'ait e u l u pe ndant l derniè re pas s e (ce q ui prouv al q ue l ns e m bl du t e au
                 e    e
       e s t conv nablm e nt ordonné ).
O n pré v                   s
         oira e n argum e nt :

    'adresse du t e au à t r,
   -l            abl      rie
                    é
   - son nom bre d'élm e nts,
               e                 'on       e
   - un indicat ur pré cisant si l souh ait q ue l fonct affich e ls v e urs du t e au aprè s ch aq ue pe rm ut ion (0
                                                 a      ion       e al           abl                           at
   pour non, 1 pour oui).



       e
Exe m pl

   combien de valeurs à trier : 6
   donnez vos valeurs à trier
   2 8 4 7 0 8

        ---- valeurs à trier ----
         2    8    4    7    0    8

         2       8      4        0      7   8
         2       8      0        4      7   8
                                                                           IV. Tris, f                              abl
                                                                                      usions e t re ch e rch e e n t e    159

        2      0      8      4      7      8
        0      2      8      4      7      8
        0      2      4      8      7      8
        0      2      4      7      8      8

       ---- valeurs triées ----
        0    2    4    7    8              8

________________________________________________________________________________________



ANALYSE


  'al h                               'é               il
L gorit m e nous e s t indiq ué par l noncé . Nous ut iserons cependant une ré pé t ion de t
                                                                                   it             ant         ruct      e
                                                                                             ype t q u e (inst ion w h il)
                              e    e                e e       'on
q ui pe rm e t de prendre conv nablm e nt e n com pt l cas où l appe l l fonct de t e n l fournissant e n argum e nt
                                                                      l a
                                                                       e          ion     ri     ui
                   al                     à
un nom bre de v e urs infé rie ur ou é gal 1.

          a              re          gorit                                      ie            e            ir
D ans l m ise en oeuv de ce t al h m e , nous fe rons appe là un e nt r i spécifiant l rang à part duq ue ll t e au   e abl
                     rié     ial      ,                  oir                é                         ace
n'e s t pas e ncore t . Init e m e nt ilfaudra pré v q u'aucun é lm e nt n'e s t e ncore à sa pl , ce q ui conduira à
 'init isat
l ial ion art             le
                   ificie l de i à -1 (puis q ue e n C, l pre m ie r é lm e nt d'un t e au port l num é ro 0). D'aut part un
                                                        e              é             abl       e e                  re    ,
          e   ogiq                               ira                                     at        ie                a
indicat ur l ue nom m é pe rm ut nous s e rv à pré cis e r si au m oins une perm ut ion a e u l u au cours de l derniè re
pas s e .

           ons al e          al           re abl   'al h           ri      ors
Si nous not nv l nom bre de v e urs de not t e au, l gorit m e de t pe ut al s'é nonce r com m e s uit :

                                  e            é         abl             -à            al                          R
   Tant q ue i ne désigne pas l dernie r é lm e nt du t e au (c'e s t -dire i < nv -1) e t q ue pe rm ut e s t V A I, nous
   e ffe ct                     t                 e                                               é     s
           uons une passe. Cet e derniè re consist e n une s ucce s s ion de com paraisons des élm e nt de rang j e t j  +1, j
   décriv t         e    é      s
            ant ous ls é lm e nt depuis l ant
                                         'av -dernier j q u'à ce l de rang i+1 (aut m e nt dit j décroissant de nv -2 à
                                                        us          ui                  re          ,                   al
                            at                             a al
   i+1). A ch aq ue pe rm ut ion, nous donnons à pe rm ut l v e ur V A I ;R                                             ial
                                                                                nous aurons, bie n sûr, pris soin d'init iser
   pe rm ut à FAUX au début de ch aq ue pas s e .
    e       'ut isat             it
Not z q ue l il ion d'une ré pé t ion de t       ant
                                            ype t q u e (dans l ue l l condit de poursuit fait int rv nir l
                                                                 aq l a  e      ion       e       e e             e
                                                                                                          'indicat ur
        )        ige    ial
pe rm ut nous obl à init iser art ificie l m e nt pe rm ut à V A I, e n t début de t ail
                                         le                   R          out        rav .


Program m e

   #include <stdio.h>
   #define VRAI 1                        /* pour "simuler" des ... */
   #define FAUX 0                        /* ... valeurs logiques */
   #define NMAX 100                      /* nombre maximal de valeurs à trier */
   main()
   {
160                     angage C
        Exe rcice s e n l
      void bulle(int [], int, int ) ;   /* prototype fonction de tri */
      int t [NMAX],                     /* tableau contenant les valeurs à trier */
          nval,                         /* nombre de valeurs à trier */
          k ;

              /* lecture des valeurs à trier */
      printf ("combien de valeurs à trier : ") ;
      scanf ("%d", &nval) ;
      if (nval > NMAX) nval = NMAX ;
      printf ("donnez vos valeurs à trier\n") ;
      for (k=0 ; k<nval ; k++)
         scanf ("%d", &t[k]) ;
      printf ("\n   ---- valeurs à trier ----\n") ;
      for (k=0 ; k<nval ; k++)
         printf ("%5d", t[k]) ;
      printf ("\n\n") ;

              /* tri des valeurs */
      bulle (t, nval, 1) ;

              /* affichage valeurs triées */
      printf ("\n   ---- valeurs triées ----\n") ;
      for (k=0 ; k<nval ; k++)
         printf ("%5d", t[k]) ;
      printf ("\n") ;
  }

             /**************************************************/
             /*   fonction de tri par la méthode de la bulle   */
             /**************************************************/
  void bulle (int t[], int nval, int affich)
                /* t : tableau à trier                            */
                /* nval : nombre de valeurs à trier               */
                /* affich : indicateur affichages intermédiaires */
  {
     int i,            /* rang à partir duquel le tableau n'est pas trié */
         j,            /* indice courant */
         tempo,        /* pour l'échange de 2 valeurs */
         k ;
     int permut ;      /* indicateur logique précisant si au moins une */
                       /* permutation a eu lieu lors de la précédente passe */
     i = -1 ;
     permut = VRAI ;
     while (i < nval-1 && permut)
                                                                               IV. Tris, f                              abl
                                                                                          usions e t re ch e rch e e n t e     161

             { permut = FAUX ;
               for (j=nval-2 ; j>i ; j--)
                  { if ( t[j] > t[j+1] )
                     { permut = VRAI ;
                        tempo = t[j] ;
                        t[j] = t[j+1] ;
                        t[j+1] = tempo ;
                        if (affich)
                           { for (k=0 ; k<nval ; k++)
                                printf ("%5d", t[k]) ;
                             printf ("\n") ;
                           }
                     }
                  }
                  i++ ;
             }
    }




          aire
Com m e nt s

      a      ion le a    arat
D ans l fonct bull, l décl ion :

            int * t ;

             al e
e s t é q uiv e nt à :

            int t[] ;



DI      O
  SCUSSI N


 es          gorit                          'e
L deux al h m e s proposés dans l xe rcice pré cédent e t dans ce l                                            'on
                                                                            ui-ci corre s ponde nt à ce q ue l appe l des    l e
      h           e                              e                gorit           e                                          e
"m é t odes direct s ". D 'une m aniè re gé né ral, ce s ont des al h m e s s im pls à program m e r, m ais q ui né ce s s it nt un
                                           2
                            'ordre de n (not z q u'il xist une t
nom bre de com paraisons de l               e        e    e                     h          e e ri
                                                                roisiè m e m é t ode direct dit "t par ins e rtion").

        ,        e          h          e     ol
En fait ile xist des m é t odes dit s "é v ué e s " q ui conduis e nt à un nom bre de com paraisons de l     'ordre de n *l n. og
    le                                          us       e        e
Ce l s -ci débouch e nt sur des program m e s pl com plxe s e t ls opé rat ions q u'e l s font int rv nir sont e l s -m ê m e s pl
                                                                                      le          e e              l
                                                                                                                   e              us
                   e             l
                                 es         h
gourm ande s e n t m ps q ue ce l des m é t odes direct s . Aussi, ls m é t ode s é v ué e s ne pre nne nt v rit e m e nt d'int rê t
                                                        e            e     h         ol                     é abl               é
                al        e é
q ue pour de s v e urs é lv e s d e n.
162                          angage C
             Exe rcice s e n l
     it          if,
A t re indicat nous v                            'al h
                             ous fournissons ici l gorit m e re l if à l m é t ode é v ué e l pl perform ant , nom m é e "Tri
                                                                 at      a    h       ol    a us            e
                             e é                                 gorit          icat                            'opé ion de
rapide " (Quick sort), inv nt e par C. A. R . H oare . Ce t al h m e , dél à program m e r, e s t bas é s ur l rat
            at             abl      ce l
                                       e          e
"s e gm e nt ion" d'un t e au ; l -ci consist à part r un t e au e n de ux part s , nom m é e s s e gm e nt t l s q ue t
                                                           age      abl                 ie                  s, e le       out
  é
é lm e nt de l  'une s oit infé rie ur ou é gal à t       é
                                                    out é lm e nt de l re . Une t l s e gm e nt ion pe ut ê t ré al
                                                                       'aut            e
                                                                                     e l        at           re     isée par
 'al h
l gorit m e s uiv :  ant

                   é                                     'é é            ie               al
   - Pre ndre un é lm e nt au h asard (on pe ut pre ndre l lm e nt du m il u). Soit m sa v e ur.
                               e           abl    e              é        (i) q
   - R e ch e rch e r, de puis l début du t e au, l pre m ie r é lm e nt t te l ue t(i)> m .
                               a         abl    e              é        (j) q
   - R e ch e rch e r, de puis l fin du t e au, l pre m ie r é lm e nt t te l ue t(j)< m .
             e (i) (j).
   - Pe rm ut r t e t t
             re                 abl us                                    re .
   - Poursuiv ce "parcours" du t e au j q u'à ce q ue i e t j s e re ncont nt
   e ri                         ue        iq                e     'opé ion               at
L t propre m e nt dit s'e ffe ct e n appl uant à nouv au l rat de s e gm e nt ion à ch aq ue s e gm e nt obt nu, puis aux e
           s   e                 at
s e gm e nt obt nus par segm e nt ion de ce s s e gm e nt                       e us                                         ie    us
                                                         s,... e t ainsi de suit j q u'à ce q ue ch aq ue s e gm e nt ne cont nne pl
             é é
q u'un s e ul lm e nt.

   e           e l
                 e
Not z q u'une t l m é t ode s e prê t part iè re m e nt bien à une program m at ré cursiv .
                       h             e    icul                                 ion       e




                                       V               e          ne
                                      I -3 Tri d'un tablau de ch aî s

________________________________________________________________________________________


Enoncé

                 ion il       a   h         ri
Ecrire une fonct ut isant l m é t ode de t par e xt ion sim pl (décrit dans l xe rcice IV-1) pour t r un t e au de
                                                    ract        e         e       'e               rie    abl
    ne               ph    iq
ch aî s , par ordre al abét ue (sans dist ion e nt m aj
                                         inct     re         e              e
                                                         usculs e t m inusculs ).

    t       ion     ra,
Ce t e fonct re ce v e n argum e nt :

    'adresse d'un t e au de point urs sur ls ch aî s conce rné e s ,
   -l              abl           e        e      ne
     e                ne     rie
   - l nom bre de ch aî s à t r.
 e ri                     e            e al
L t propre m e nt dit port ra, non sur ls v e urs des ch aî s e l s -m ê m e s , m ais uniq ue m e nt sur l t e au de point urs.
                                                          ne    le                                        e abl            e

     e e         t       ion 'aide d'un program m e principalcré ant un sim pl t e au de ch aî s (ayant donc ch acune une
O n t s t ra ce t e fonct à l                                                e abl           ne
l                     e
 ongue ur m axim al donnée).
                                                                               IV. Tris, f                              abl
                                                                                          usions e t re ch e rch e e n t e     163



       e
Exe m pl

   combien de chaînes à trier ? 7
   donnez vos 7 chaînes (validez chacune par 'return')
   C
   Turbo C
   Basic
   Pascal
   Turbo Pascal
   Fortran
   ADA


   voici vos chaînes triées
   ADA
   Basic
   C
   Fortran
   Pascal
   Turbo C
   Turbo Pascal

________________________________________________________________________________________



ANALYSE


  a    h        ri    é
L m é t ode de t a é t décrit dans l xe rcice IV-1. Il e s t ce pe ndant né ce s s aire de procéder à
                             e     'e                                                                                usieurs sort s
                                                                                                                    pl           e
       at
d'adapt ions :

   - ilfaut e n faire une fonction,
      a at                              ri      e us
   - l re l ion d'ordre q ui s e rt au t ne port pl sur de s e nt rs, m ais sur de s ch aî de caract re s ; l im pl ue de
                                                                 ie                      nes           è    ce a     iq
               a      ion ricm p (e t non st p, puis q ue l souh ait ne pas dist
   re courir à l fonct st                    rcm          'on          e                     e
                                                                                     ingue r ls m aj     es             e
                                                                                                    uscul des m inusculs ),
     e    é      s          e                    e             us       ie
   - ls é lm e nt à pe rm ut r s e ront des point urs e t non pl des ent rs.
164                     angage C
        Exe rcice s e n l
Program m e

  #include <stdio.h>
  #include <string.h>

  #define NCHMAX 100          /* nombre maximal de chaînes à traiter */
  #define LGMAX 25           /* longueur maximale d'une chaîne (sans \0) */
  main()
  {
     void trichaines (char * *, int ) ; /* prototype fonction de tri */
     char chaines [NCHMAX] [LGMAX+1] ;   /* tableau des chaînes */
     char * adr [NCHMAX] ;               /* tableau pointeurs sur les chaînes */
     int nch,                            /* nombre de chaîne à trier */
         i ;

             /* lecture des chaînes et préparation du tableau de pointeurs */
      printf ("combien de chaînes à trier ? ") ;
      scanf ("%d", &nch) ;
      if (nch > NCHMAX) nch = NCHMAX ;
      getchar() ;               /* pour forcer la lecture de fin de ligne */

      printf ("donnez vos %d chaînes (validez chacune par 'return')\n", nch) ;
      for (i=0 ; i<nch ; i++)
         { fgets (chaines[i], LGMAX+1, stdin) ; /* lit au maximum LGMAX caractères */
           adr[i] = chaines[i] ;
         }

             /* tri des pointeurs sur les chaînes */
      trichaines (adr, nch) ;

             /* affichage des chaînes après tri */
             /* attention aux chaînes de longueur maximum !! */
      printf ("\n\nvoici vos chaînes triées\n") ;
      for (i=0 ; i<nch ; i++)
         printf ("%s", adr[i]) ;
  }

  void trichaines (char * * adr, int nch)
                /* adr : adresse tableau de pointeurs sur chaînes à trier */
                /* nch : nombre de chaînes                                */
  {
     char * tempo ;    /* pointeur temporaire pour l'échange de 2 pointeurs */
     int kmax,
                                                                                 IV. Tris, f                              abl
                                                                                            usions e t re ch e rch e e n t e       165

              i, j ;

        for (i=0 ; i<nch-1 ; i++)
           { kmax = i ;
             for (j=i+1 ; j<nch ; j++)
                if ( stricmp (adr[kmax], adr[j]) > 0 ) kmax = j ;
             tempo = adr[kmax] ;
             adr[kmax] = adr[i] ;
             adr[i] = tempo ;
           }
   }



          aire
Com m e nt s


        e      ne    rie
*Ici, ls ch aî s à t r ont é t pl e s (par l program m e principal dans un t e au de caract re s (nom m é ch aine s ) à
                                é acé             e                       )          abl              è
                       e                                   e         e       'ordre des dim e nsions ; e s t e n e ffe t né ce s s aire
deux dim e nsions. Not z bie n q u'ilne s e rait pas possibl d'en inv rs e r l                        il
      ous e        è                       ne
q ue t ls caract res d'une m ê m e ch aî s oie nt cons é cut  ifs.


               a              é      icit
*Bie n q ue ce l n'ait pas é t e xpl e m e nt dem andé par l noncé , nous av
                                                              'é                      u       rôl      a ongue ur de s
                                                                              ons prév un cont e s ur l l
     ne                av
ch aî s fournie s au cl ie r ;  pour ce faire , nous avons fait appe là l fonct f t e n l
                                                                        a      ion ge s,       iq
                                                                                           'appl uant au fich ie r stdin.
L      ruct
  'inst ion :

        fgets (chaines[i], LGMAX+1, stdin) ;

 it               GM              è        din      e
l au m axim um L AX caract re s s ur st e t ls range à l                                           é ant e out
                                                                 'adre s s e ch aine [i], e n com plt l t par un zé ro de fin de
    ne               it e                                                        e
ch aî . Ainsi, on é v e ls ris q ues de déborde m e nt m é m oire q ue pré s e nt ge t s.

     e        é            é            t
Tout fois un lge r inonv nie nt apparaî En e ffe t t q ue l nom bre de caract re s m axim al(L AX) n'e s t pas at e int
                                         .          , ant  e                     è                  GM                 t ,
 e      è                    i   im e a
l caract re \n q ui a s e rv à dél it r l ch aî l e s t rangé e n m é m oire , au m ê m e t re q ue ls aut s . En re v
                                                 ne ue                                     it        e    re          anch e ,
 ors      e                          è        é t , ors                                  è               é         ré
l q ue l nom bre m axim alde caract re s a é t at e int al précisém e nt q ue ce caract re \n n'a pas é t re ncont , on ne
t     e us           è                 e
 rouv pl ce caract re e n m é m oire (l caract re nul fin de ch aî , q uant à l e s t bien t ours présent).
                                               è        de        ne             ui,           ouj

               é             out         e ors      'on                e
Ce t inconv nie nt e s t surt s e nsibl l q ue l affich e à nouv au ls ch aî s par print aprè s lur t : ls ch aî de
                                                                            e       ne         f        e    ri e       nes
l                    e                     ies                      igne
 ongue ur m axim al ne s e ront pas suiv d'un ch ange m e nt de l . Not z bie n q u'e n e m pl
                                                                               e                           s       ie      ,
                                                                                                  oyant put on obt ndrait e n
re v                    è
    anch e , 1 caract re de ch ange m e nt de l             e
                                                 igne pour ls ch aî de l
                                                                   nes                        e ransm is par l fonct
                                                                             ongue ur m axim al (t             a      ion put s
                      è                         igne pour ls aut s ch aî s (ce l figurant dans l ch aî e t ce l t
m ê m e ) e t 2 caract res de ch ange m e nt de l         e     re       ne      ui              a     ne       ui ransm is par
put s).

D ans un "program m e opé rat      ", faudrait gé re r conv nablm e nt ce t e s it ion, ce q ue nous n'av pas fait ici.
                             ionne l il                    e   e           t uat                         ons
166                        angage C
           Exe rcice s e n l
         ons                a e ure                              ne      rait
*R appe l q ue , aprè s l lct par scanf du nom bre de ch aî s à t e r, l point ur re s t (com m e à l
                                                                                 e     e       e                    um
                                                                                                             'accout é e )
posit             e                è               il
     ionné s ur l dernie r caract re non e ncore ut isé ; dans l m e il ur de s cas, ils'agit de \n (m ais ilpe ut y av
                                                               e      le                                               oir
     re         è        ant    'ut isat     é
d'aut s caract re s av si l il e ur a é t dist    rait). Dans ces condit        a e ure ul rie ure d'une ch aî par ge t
                                                                          ions, l lct      té                  ne        s
            ire
conduira à l ... une ch aî v ne ide.

            it          è          ons acé
Pour é v e r ce problm e , nous av pl une inst ion ge t ar q ui absorbe ce caract re \n. En t e rigue ur, si l
                                                     ruct       ch                         è              out          'on
           ait rait          e    e
souh ait t e r corre ct m e nt l cas où l il e ur a fourni t
                                             'ut isat                rop d'inform at         e                 ,
                                                                                    ion pour l scanf pré cédent il s e rait
                            e ure         ne         s
né ce s s aire d'opérer une lct d'une ch aî par ge t (il                oir        ace
                                                          faudrait pré v un e m pl m e nt à ce t e ffe t!).


       a      ion rich    e                                é   aré
*D ans l fonct t aine s , l pre m ie r argum e nt adr a é t décl par :

            char * * adr

Il                 e       e abl            e
  s'agit d'un point ur sur l t e au de point urs sur l diffé re nt s ch aî s . Nous aurions pu é galm e nt l décl r par :
                                                     es           e      ne                        e       e    are

            char * adr[]

   e      le                ons il e
Not z d'ail urs q ue nous av ut isé l "form al e " t e au au s e in de l fonct e l -m ê m e . Ainsi :
                                             ism    abl                a          e
                                                                              ion l

            adr[i] = adr[j]

                    e
aurait pu s e form ulr :

            * (adr+i) = * (adr+j)



*Nous v             ons      a
         ous rappe l q ue l fonct st  ion ricm p com pare l deux ch aî dont on l fournit ls adre s s e s e t e l fournit
                                                          es         nes       ui        e                     le
     al        iè                     ant
une v e ur e nt re définie com m e é t :

          iv      a                 ne    e
   - posit e s i l pre m iè re ch aî arriv aprè s l s e conde , au s e ns de l
                                                   a                                           e                è            e
                                                                             'ordre défini par l code des caract re s (sans t nir
         e      a                 re
   com pt de l diffé re nce e nt m aj  usculs e t m inusculs pour ls 26 lt res de l ph abet),
                                            e              e           e     e t       'al
       l es
        e               ne            e
   - nul s i l deux ch aî s s ont é gals ,
           iv     a                 ne     e ant a
   - né gat e s i l pre m iè re ch aî arriv av l s e conde .



DI      O
  SCUSSI N


                         e                                   e      ne     rie      ,                 ant
D 'une m aniè re gé né ral, iln'e s t pas néce s s aire q ue ls ch aî s à t r soient com m e ici, im pl é e s e n m é m oire de
                    iv
m aniè re cons é cut e .

              a      ion rich                       out                            nes    e       ace     s
D e m ê m e , l fonct t aine s propos é e pourrait t aussi bien opérer sur des ch aî dont ls e m pl m e nt auraie nt
   é l oué                    " e      re   ous             le
é t al s "dynam iq ue m e nt (l ch apit V v propose d'ail urs un exercice dans ce sens).
                                                                            IV. Tris, f                              abl
                                                                                       usions e t re ch e rch e e n t e    167




                                  V                       e
                                 I -4 Fus ion de de ux tablaux ordonné s

 a              e             e
L fusion consist à ras s e m blr e n un s e ul ablau ordonné ls é lm e nt de deux t e aux, e ux-m ê m e s ordonné s .
                                              t e            e    é      s         abl

________________________________________________________________________________________


Enoncé

     iser       ion                  abl          ie                 al              e
R é al une fonct q ui fusionne deux t e aux d'e nt rs ordonné s par v e urs croissant s .

O n pré v                   s
         oira e n argum e nt :

     e
   - ls adresses des t      abl
                      rois t e aux conce rné s ,
     e             al                          abl
   - l nom bre de v e urs de ch acun des deux t e aux à fusionne r.
       e e       t
Pour t s t r ce t e fonction, on é crira un program m e principalq ui l au cl ie r de ux e ns e m bl de v e urs q ue l t ra
                                                                      it    av                     es    al          'on rie
         abl 'aide de l fonct bule ré al dans l xe rcice IV-2.
au pré al e à l            a       ion    l     isée       'e



       e
Exe m pl

   combien de      valeurs pour le premier tableau ? 5
   donnez vos      valeurs
   3 9 2 8 11
   combien de      valeurs pour le second tableau ?               7
   donnez vos      valeurs
   12 4 6 3 1      9 6

   premier tableau à fusionner
       2    3    8    9   11
   second tableau à fusionner
       1    3    4    6    6                9      12

    résultat de la fusion des deux tableaux
       1    2    3    3    4    6    6    8    9    9   11   12
________________________________________________________________________________________
168                        angage C
           Exe rcice s e n l
ANALYSE


  a                            e                le
L dém arch e , as s e z sim pl, s'inspire de ce l q ue l adopt rait pour ré s oudre "à l m ain" un t lproblm e . Ilsuffit e n
                                                        'on   e                         a           e     è              ,
       ,
e ffe t d'av                 le
                             è
            ance r e n paral l dans ch acun des deux t e aux à fusionne r (t e t t e n pré lv , à ch aq ue fois, l pl
                                                          abl                  1     2),       e ant                  e us
    it             é      s        'int
pe t des deux élm e nt e t e n l roduisant dans l t e au ré s ul t Pl précisém e nt nous som m e s am e né s à ut iser
                                                       e abl      tant . us                 ,                          il
trois indice s :

                       é           1                           e
   - i1 : pre m ie r é lm e nt de t non e ncore pris e n com pt ,
                       é           2,                          e
   - i2 : pre m ie r é lm e nt de t non e ncore pris e n com pt ,
              ace                     é
   - i : e m pl m e nt du proch ain é lm e nt à introduire dans t.
         ial
Nous init isons ces t                             e e            e ions du C). Nous ré pé t al l t e m e nt suiv :
                     rois indice s à zé ro (com pt t nu de s conv nt                       ons ors e rait       ant

              e us       it       é
   Ch oisir l pl pet des élm e nt t     s 1(i1) e t t2(i2) e t l pl r e n t
                                                                e ace                       e       a al        'indice
                                                                           (i). Incré m e nt r de 1 l v e ur de l
                     'é é          rait                       le
   corre s pondant à l lm e nt e xt (i1 ou i2), ainsi que cel de i.
Nous poursuiv           us             'un         abl                               e us ors                a
             ons ainsi j q u'à ce q ue l des deux t e aux soit é puis é . Ilne re s t pl al q u'à re copie r l fin de
'aut abl
l re t e au.



Program m e

   #include <stdio.h>
   #define NMAX1 100              /* nombre maximal de valeurs du premier tableau */
   #define NMAX2 100              /* nombre maximal de valeurs du second tableau */

   main()
   {
      void fusion(int [], int [], int [], int, int ) ;    /* proto fonction de fusion */
      void bulle(int [], int) ;   /* proto fonction servant à assurer l'ordre des tableaux
   */

       int t1 [NMAX1],                     /*   premier tableau à    fusionner */
           t2 [NMAX2],                     /*   second tablleau à    fusionner */
           t [NMAX1+NMAX2] ;               /*   tableau résultant    de la fusion */
       int nval1,                          /*   nombre de valeurs    à prélever dans t1 */
           nval2,                          /*   nombre de valeurs    à prélever dans t2 */
           k ;

            /* lecture des valeurs des deux ensembles à fusionner */
       printf ("combien de valeurs pour le premier tableau ? ") ;
       scanf ("%d", &nval1) ;
                                                     IV. Tris, f                              abl
                                                                usions e t re ch e rch e e n t e    169

    if (nval1 > NMAX1) nval1 = NMAX1 ;
    printf ("donnez vos valeurs\n") ;
    for (k=0 ; k<nval1 ; k++)
       scanf ("%d", &t1[k]) ;

    printf ("combien de valeurs pour le second tableau ?    ") ;
    scanf ("%d", &nval2) ;
    if (nval2 > NMAX2) nval2 = NMAX2 ;
    printf ("donnez vos valeurs\n") ;
    for (k=0 ; k<nval2 ; k++)
       scanf ("%d", &t2[k]) ;

         /* tri préalable et affichage des valeurs à fusionner */
    bulle (t1, nval1) ;
    bulle (t2, nval2) ;
    printf ("\npremier tableau à fusionner\n") ;
    for (k=0 ; k<nval1 ; k++)
       printf ("%5d", t1[k]) ;
    printf ("\nsecond tableau à fusionner\n") ;
    for (k=0 ; k<nval2 ; k++)
       printf ("%5d", t2[k]) ;

         /* fusion et affichage résultats */
    fusion (t, t1, t2, nval1, nval2) ;
    printf ("\n\n résultat de la fusion des deux tableaux\n") ;
    for (k=0 ; k<nval1+nval2 ; k++)
       printf ("%5d", t[k]) ;
}


    /********************************************************/
    /*       fonction de fusion de deux tableaux            */
    /********************************************************/

void fusion (int t[], int t1[], int t2[], int nval1, int nval2)
               /* t1 et t2 : tableaux à fusionner                 */
               /* t :tableau résultant                            */
               /* nval1 : nombre de valeurs du premier tableau t1 */
               /* nval2 : nombre de valeurs du second tableau t2 */
{
   int i1, i2,         /* indices courants dans les tableaux à fusionner */
       i,              /* indice courant dans le tableau résultant */
       k ;
170                       angage C
          Exe rcice s e n l

       i = 0 ; i1 = 0 ; i2 = 0 ;
       while (i1 < nval1 && i2 < nval2)
          { if ( t1[i1] < t2[i2] ) t[i++] = t1[i1++] ;
                     else t[i++] = t2[i2++] ;
          }
       if (i1 == nval1)
                for (k=i2 ; k<nval2 ; k++) t[i++] = t2[k] ;
          else for (k=i1 ; k<nval1 ; k++) t[i++] = t1[k] ;
   }


        /*******************************************************/
        /* fonction de tri d'un tableau (méthode de la bulle) */
        /*******************************************************/

   void bulle (int t[], int nval)
   {
      int i, j, tempo, k, permut ;

       i = -1 ; permut = 1 ;
       while (i < nval-1 && permut)
          { permut = 0 ;
            for (j=nval-2 ; j>i ; j--)
                if ( t[j] > t[j+1])
                  { permut = 1 ;
                    tempo = t[j] ; t[j] = t[j+1] ; t[j+1] = tempo ;
                  }
            i++ ;
          }
   }




          aire
Com m e nt s

               ue e ri    abl            abl
*Pour e ffe ct r l t pré al e des deux t e aux fournis e n donné e , nous avons re pris l fonct bule ré al dans
                                                                                          a      ion     l     isée
 'e
l xe rcice IV-2. Nous en av     out               e      ruct           t                                 e
                           ons t e fois supprim é ls inst ions perm e t ant d'affich e r, sur dem ande , ls im pre s s ions
    e
int rm édiaire s .
                                                                                IV. Tris, f                              abl
                                                                                           usions e t re ch e rch e e n t e      171

                                         V
                                        I -5 Re ch e rch e dich otom iq ue

 'e                     urat                    e e          gorit              ie                     abl
L xe rcice II-4 de fact ion par code faisait int rv nir un al h m e s é q ue nt lde re ch e rch e e n t e . Nous vous
                    iser     gorit   us                                       om
proposons ici de réal un al h m e pl perform ant de re ch e rch e par "dich ot ie ".

________________________________________________________________________________________


Enoncé

                                                 ir              icl                 'inform at q ui l e s t associé e , à sav
Ecrire un program m e q ui re ch e rch e , à part d'un code d'art e (num é riq ue ), l         ion   ui                       oir
    ibelé      ne
un l l (ch aî ) e t un prix unit               ).
                                    aire (ré e l

               'e                   e                 il        abl
Com m e dans l xe rcice II-4, l program m e ut isera un t e au de s t ure s , décl à un niv au gl , pour cons e rv r
                                                                                ruct            aré         e      obal              e
e
ls inform at                        t                re
            ions re q uis e s . Ce t e fois, par cont , ces derniè re s s e ront rangé e s par ordre croissant du num é ro de code .

 a ocal ion                                                                om          le           e        e     'ordre
L l isat d'un num é ro de code donné se fe ra par une re ch e rch e dich ot iq ue . Ce l -ci consist à profit r de l
    abl             é     a
du t e au pour accé lre r l re ch e rch e e n procédant com m e s uit :

                      'é é                       ie      abl           e                   ui       , a                  e
   - O n considè re l lm e nt figurant au "m il u" du t e au. Si l code ch e rch é l e s t é gal l re ch e rch e e s t t rm iné e .
         ui                             ut     e
   S'ill e s t infé rie ur, on e n concl q ue l code re ch e rch é ne pe ut s e trouv r q ue dans l pre m iè re m oit du t e au ;
                                                                                      e           a                  ié    abl
          e
   dans l cas cont                      ut      s rouv dans l s e conde m oit .
                     raire , on e n concl q u'il e t   e          a                ié
                          ors 'opé ion        a       ié
   - O n re com m e nce al l rat sur l "m oit " conce rné e , puis sur l m oit de ce t e m oit , e t ainsi de suit ...
                                                                       a      ié      t       ié                  e
    us
   j q u'à ce q ue l 'une des condit         ant
                                    ions suiv e s s oit sat      e
                                                           isfait :
       *on a t    é 'é é
              rouv l lm e nt ch e rch é ,
                           ne               e abl
       *on e s t sûr q u'il figure pas dans l t e au.



       e
Exe m pls

   code article recherché : 24
   le code 24 n'existe pas

               ________________

   code article recherché : 19
   article de code 19
   libellé : Balance de ménage
   prix :     278.00

________________________________________________________________________________________
172                       angage C
          Exe rcice s e n l


ANALYSE


 'al h                    'é                      il
L gorit m e propos é par l noncé s uggè re d'ut iser trois variabls pe rm e t ant de spécifie r, à un inst donné , l part
                                                                 e           t                            ant      a     ie
    abl        aq l  e           ue a
du t e au dans l ue l s 'e ffe ct l re ch e rch e :

                      a     ie     ant    ore
   gauch e : début de l part re s t à e xpl r,
        e         a     ie     ant    ore
   droit : fin de l part re s t à e xpl r,
      ie         ion            e
   m il u : posit ch oisie pour l "m il u" de ce t e part re s t à e xpl r.
                                      ie          t      ie     ant    ore
   e     à         t     ion        ie
Not z déj q ue ce t e not de m il u e s t q ue lue pe u am biguë. Nous conv ndrons q u'e l corre s pond à l part e nt re
                                                q                          ie            le               a     ie   iè
   a                                         e
de l m oye nne des indice s gauch e e t droit .

 'al h                                  om         ors                              e abl       e
L gorit m e de re ch e rch e par dich ot ie pe ut al s'é nonce r ainsi (t désignant l t e au, n l nom bre de code s e t x
'é é
l lm e nt ch e rch é ) :

         ial                    e      on    s           'e        e     abl
   - Init iser gauch e e t droit de faç q u'il désignent l ns e m bl du t e au.
             e e rait            ant
   - R é pé t r l t e m e nt suiv :
             e         e    ie     a     ie     ore
       *D é t rm ine r l m il u de l part à e xpl r :
                 ie                    e
              m il u = (gauch e + droit ) / 2
                   'é é                     e (m ie
       *Com pare r l lm e nt ch e rch é x av c t il u) :
               s              'é é                       ocal          ion ie
          + S'il sont é gaux, l lm e nt ch e rch é e s t l isé en posit m il u,
                                    (m ie   'é é                                  ue           a     ie    e        ise
          + Si x e s t supérieur à t il u), l lm e nt ch e rch é ne pe ut s e s it r q ue dans l part droit ;on ré al
           'affe at
          l ct ion :
                         ie
              debut = m il u + 1
                 e
          + dans l cas cont        'é é
                           raire , l lm e nt ch e rch é ne pe ut s e s it r q ue dans l part gauch e ; ré al l ct ion :
                                                                         ue           a     ie        on   ise 'affe at
                       ie
              fin = m il u - 1
             e             a
Ilnous re s t à spécifie r l condition d'arrê t (ou de poursuit ) de ce t e ré pé t ion. O n pe ut déj not r q ue , à ch aq ue
                                                               e         t         it                 à   e
               a     e       a al                       e         le          e
parcours de l boucl, soit l v e ur de gauch e augm e nt , soit ce l de droit dim inue . Ainsi, on e s t sûr q u'au bout d'un
nom bre fini de t             ira 'une des sit ions suiv e s :
                 ours on about à l              uat       ant

     'é é           é ocal
   - l lm e nt a é t l isé.
     a al                                      le        e
   - l v e ur de gauch e e s t supérieure à ce l de droit .
 le
El s nous fournis s e nt donc t nat l m e nt l condit de fin de not boucl.
                               out ure l
                                       e     a       ion           re   e
                                                                          IV. Tris, f                              abl
                                                                                     usions e t re ch e rch e e n t e    173

   e                             e      a al
Not z q ue , dans un pre m ie r t m ps, l v e ur de gauch e dev nt é gal à ce l de droit ; ais, dans ce cas, nous ne
                                                                  ie      e      e
                                                                                 l         e m
sav                     e          é         ant
   ons pas encore si l s e ulé lm e nt re s t à e xam ine r e s t ou non é galà x ;         -il
                                                                                   aussi est né ce s s aire de faire un tour
     é
supplm e nt aire pour s'e n assure r.


Program m e

   #include <stdio.h>
   /* ------ structure contenant les informations relatives aux                                           */
   /*                     différents articles                 --------------                              */
   #define NBART 6                        /* nombre total d'articles */
   typedef struct { int code ;            /* code article */
                     char * lib ;         /* libellé */
                     float pu ;           /* prix unitaire */
                   } t_article ;

   t_article article [NBART] =
        { 11, "Gaufrier",          268.0,
          14, "Cafetière 12 T",    235.0,
          16, "Grille-pain",       199.50,
          19, "Balance de ménage", 278.0,
          25, "Centrifugeuse",     370.0,
          26, "Four raclette 6P", 295.25
        } ;
   /* ----------------------------------------------------------------------*/

   #define VRAI 1                                  /* pour "simuler" des ..... */
   #define FAUX 0                                  /* ..... valeurs logiques   */

   main()
   { int coderec,                                   /*   code article recherché */
          codecour,                                 /*   code courant */
          gauche,                                   /*   limite gauche de la recherche */
          droite,                                   /*   limite droite de la recherche */
          milieu,                                   /*   nouvelle limite (droite ou gauche */
          trouve ;                                  /*   indicateur code trouvé/non trouvé */

       printf ("code article recherché : ") ;
       scanf ("%d", &coderec) ;

       gauche = 0 ;
       droite = NBART-1 ;
       trouve = FAUX ;
174                       angage C
          Exe rcice s e n l
       while (gauche <= droite && !trouve)
          { milieu = (gauche+droite) / 2 ;
            codecour = article[milieu].code ;
            if ( codecour == coderec ) trouve = VRAI ;
            else if ( codecour < coderec)
                    gauche = milieu + 1 ;
               else droite = milieu - 1 ;
          }


       if (trouve) printf ("article de code %d\nlibellé : %s\nprix : %10.2f",
                           coderec, article[milieu].lib, article[milieu].pu) ;
              else printf ("le code %d n'existe pas", coderec) ;
   }

          aire
Com m e nt s


    e        a       ion         a     e
*Not z bie n l condit ré gissant l boucl while :

              gauche <= droite && !trouve

                ,                 'av
   - D 'une part com m e nous l ons dit dans not anal    re     yse, nous poursuiv           re    orat
                                                                                   ons not e xpl ion, m ê m e q uand ls   e
     al                        e         e
   v e urs de gauch e e t droit sont é gals , de m aniè re à sav si l s e ul lm e nt re s t à e xam ine r conv nt ou non.
                                                                oir   e     é é            ant                ie
           re    ,                     e e
   - D 'aut part nous y faisons int rv nir un indicat ur l ue (t
                                                          e    ogiq       e
                                                                      rouv ). Nous aurions pu nous e n pas s e r, à condition
         ace                      a       e     e
   de pl r un bre ak dans l boucl. Tout fois, dans ce cas, il aurait fal pré v    lu                               e
                                                                                         oir, e n fin de boucl, un t s t   e
         é
   supplm e nt              t          oir  a                ait é     ue
              aire pe rm e t ant de sav si l re ch e rch e av é t fruct us e ou non.



DI      O
  SCUSSI N

                             e      e          'al h                          e e                           e l
                                                                                                              e         a
Ilfaut pre ndre garde , dans l déroulm e nt de l gorit m e , à ne pas s e cont nt r de pre ndre com m e nouv l borne de l
    ie     abl           ore a al           ie         ant
part de t e au à e xpl r l v e ur de m il u, e n é criv :

                     ie
          debut = m il u
ou :

                   ie
          fin = m il u
          ,                          us      e      a
En e ffe t dans ce cas, on ne pe ut pl prouv r q ue l boucl s 'ach è v e n un nom bre fini de t
                                                          e           e                                   aine   uat
                                                                                               ours. Ce rt s s it ions
                 le               e
conduis e nt d'ail urs à une boucl infinie .
                                                  O
                                         V : GESTI N D Y NA M IQUE




   es
L données d'un program m e s e ré part    issent e n t          é          at            om iq                         es
                                                      rois cat gorie s : st iq ue s , aut at ue s e t dynam iq ue s . L données
   at                          a       at
st iq ue s s ont définies dè s l com pil ion ; a ge s t
                                               l                             om iq
                                                       ion des données aut at ue s re s t t                e
                                                                                              e ranspare nt au program m e ur e t
      e es                             é abl                         e as)              iat e
s e uls l données dynam iq ue s s ont v rit e m e nt cré é e s (dans l t sur son init iv .

                         e 'ut isat                                         ut               è       e s
D 'une m aniè re gé né ral, l il ion de données dynam iq ue s fournit des sol ions à des problm e s t l q ue :

           ion              'am e                     ors  a     isat
   - ge s t de données dont l plur n'e s t pas connue l de l ré al ion du program m e ,
                  re    ruct     es
   - m ise en oeuv de st ures dit dynam iq ue s , t l s q ue ls l e s ch aî e s ou ls arbres binaire s .
                                                   e l
                                                     e       e ist        né       e
          re ous               q             e
Ce ch apit v e n propos e q ue lue s e xe m pls .




                                              -1   e
                                             V Cribl dynam iq ue

________________________________________________________________________________________


Enoncé

     iser                      e       e                                        a      h           e       ost
R é al un program m e q ui dé t rm ine ls pre m ie rs nom bre s pre m ie rs par l m é t ode du cribl d'Erat h è ne , e xpos é e
       'e
dans l xe rcice I-2.

    t                 re e                ie                                    e
Ce t e fois, par cont , l nom bre d'ent rs à considérer ne sera pas fixé par l program m e , m ais fourni e n donné e . Le
                loue                      'e    ace                                   e          'al h
program m e al ra dynam iq ue m e nt l m pl m e nt m é m oire né ce s s aire au dé roulm e nt de l gorit m e . En cas de
                      e
m é m oire insuffisant , il              'ut isat           e                             ant
                           dem ande ra à l il e ur de form ulr une dem ande m oins im port e .

         re             il    a      ion l
O n s'ast indra ici à ut iser l fonct m aloc.


       e
Exe m pl

   combien d'entiers voulez-vous examiner : 200
176                        angage C
           Exe rcice s e n l
   entre 1 et 200 les nombres premiers sont :
         2      3      5      7     11     13                 17      19       23       29
        31     37     41     43     47     53                 59      61       67       71
        73     79     83     89     97    101                103     107      109      113
       127    131    137    139    149    151                157     163      167      173
       179    181    191    193    197    199

________________________________________________________________________________________



ANALYSE


  'al h        ui-m          à    é
L gorit m e l ê m e a déj é t e xposé dans l xe rcice I-2. L nouv aut ré s ide ici dans l l ion dynam iq ue de
                                                'e               a     e é                'alocat
 'e             i    abl           ie
l s pace im part au t e au d'e nt rs. Pour ce faire , l dém arch e l pl cl
                                                      a                                e                a
                                                                   a us assique consist à faire appe là l fonction
    l                 e             'é
m aloc, com m e nous l pré conis e l noncé .


Program m e

   #include <stdio.h>
   #include <stdlib.h>
   #define VRAI 1                      /* pour simuler des ...*/
   #define FAUX 0                      /* ... valeurs "logiques" */

   main()
   {
      unsigned n,                       /* nombre d'entiers à considérer */
               * raye,                  /* pointeur sur tableau servant de crible */
               prem,                    /* dernier nombre premier considéré */
               i ;
      int na ;                          /* compteur de nombres premiers affichés */

               /* lecture du nombre d'entiers à considérer et
                  allocation dynamique du tableau correspondant */
      do
         { printf ("combien d'entiers voulez-vous examiner : ") ;
           scanf ("%u", &n) ;
           raye = (unsigned *) malloc ( (n+1)*sizeof(unsigned) ) ;
           if (raye == NULL)
              printf ("** mémoire insuffisante ") ;
         }
      while (raye == NULL) ;
                                                                                                .Ge ion
                                                                                               V s t dynam iq u e            177


              /* initialisations du crible */
        for (i=1 ; i<=n ; i++)                                       /* mise à "zéro" du crible */
           raye[i] = FAUX ;
        raye[1] = VRAI ;                                                   /* on raye le nombre 1 */

               /* passage au crible */
        prem = 1 ;
        while (prem*prem <= n)
           { while (raye[++prem] && prem<n ) {}
                                         /* recherche premier nb prem non rayé */
              for (i=2*prem ; i<=n ; i+=prem)    /* on raye tous ses multiples */
                 raye[i] = VRAI ;
            }

               /* affichage résultats */
        printf ("entre 1 et %u les nombres premiers sont :\n", n) ;
        na = 0 ;
        for (i=1 ; i<=n ; i++)
           if ( !raye[i] )
             { printf ("%7u", i) ;
                if (++na%10 == 0) printf ("\n") ; /* 10 nombres par ligne */
             }
   }



          aire
Com m e nt s


  'alocat   'e                                     abl         ie            isée  'inst ion
*L l ion de l s pace m é m oire né ce s s aire au t e au d'e nt rs e s t ré al par l ruct :

        raye = (unsigned *) malloc ( (n+1)*sizeof(unsigned) ) ;

     aq l  e                   e              ie
dans l ue l raye e s t un point ur sur des ent rs non signé s .

     e     ot          l
O r, l prot ype de m aloc e s t pré cis é m e nt :

   void * malloc (size_t) ;

  e      tat               l
L ré s ul fourni par m aloc e s t un "point ur gé né riq ue " q ui pe ut ê t conv rt im pl e m e nt e n un point ur de n'im port
                                           e                                re   e i     icit                   e               e
       ype            'opé e           "
q ue lt . Aussi, l rat ur de "cast (unsigne d *) n'e s t pas indispensabl ici. Not inst ion d'al ion m é m oire
                                                                                  e        re     ruct         ocat
                                                                                                               l
aurait pu s'é crire :

        raye = malloc ( (n+1) * sizeof(unsigned) ) ;
178                        angage C
           Exe rcice s e n l

En ce q ui conce rne l                    l
                       'argum e nt de m aloc, ce lui-ci e s t a priori d'un t                         ype )        dl       e ype
                                                                             ype size _t défini (par t de f dans st ib.h . L t
                                    'im é       at                      ouj                             ,
e xact corre s pondant dépend de l plm e nt ion (m ais ile s t t ours non signé - e n gé né ral ils'agit de unsigne d int       ).
    e        e      tat
Not z q ue l ré s ul fourni par size of e s t du m ê m e type size _t .

       ons        l                     tat
R appe l q ue m aloc fournit e n ré s ul un point ur sur l début de l zone conce rné e l q ue l l ion a ré ussi et un
                                                 e       e          a                   ors   'alocat
     e
point ur nul     e
            dans l cas contraire (not z q ue l sym bol NUL e s t défini dans st ib.h ).
                                       e     e        e     L                  dl


                          'al h
*En ce q ui conce rne l gorit m e de passage au cribl, v  e ous re m arq ue z q ue nous av            oyé    e      e
                                                                                           ons e m pl e xact m e nt ls m ê m e s
      ruct                 e                'e                   ant                     e          e
inst ions q ue dans l program m e de l xe rcice I-2. Pourt , dans ce dernie r, l sym bol raye désignait un t e au      abl
        ie
d'ent rs, t  andis q u'ici il                e
                             désigne un point ur sur des ent rs. Ce l e s t possibl parce q u'e n l
                                                            ie      a             e                                    abl
                                                                                                  angage C, un nom de t e au
              e
e s t un point ur (const ant).


DI      O
  SCUSSI N

   e
*L ch oix du t                                  q
                ype unsigne d pour n e s t q ue lue pe u arbitraire ; e s t guidé par l fait q ue m aloc adm e t gé né ralm e nt un
                                                                      il              e               l                  e
                  ype                       e e e                  at       ors 'e
argum e nt de ce t . En supposant q ue t l s t l cas, on const e q u'al l xpre s s ion :

            (n+1) * sizeof (unsigned)

               al                         a al          size (int) dépas s e l capacit du t
conduit à des v e urs e rronées dè s q ue l v e ur de n* of                  a        é                      ie
                                                                                             ype int (n'oubl z pas q u'iln'y a
           e ion de dépas s e m e nt de capacit pour ls opé rat
pas de dét ct                                  é       e         ions port sur des ent rs). L ré s ul pe ut al ê t
                                                                            ant             ie      e       tat       ors re
   ast             e                 e s               l
cat roph iq ue car l nom bre d'oct t dem andé s à m aloc s e t rouv ê t infé rie ur à ce l ré e l m e nt ut isé.
                                                                    e re                 ui     le         il

 e        è              iq                       'on ie
L problm e s e com pl ue e ncore un pe u si l t nt com pt de ce q ue , dans ce rt s im plm e nt ions, l t
                                                         e                       aine   é      at     e ype size _t
                         re
pe u corre s pondre à aut ch os e q ue unsigne d int.

      out                                              e            al                 'ut isat                iv
En t e rigue ur, ilfaudrait donc s'assure r q ue l nom bre de v e urs dem andé e s par l il e ur e s t e ffe ct e m e nt
infé rie ur à une ce rt     im e                   ion   'im é   at
                       aine l it à fixe r e n fonct de l plm e nt ion conce rné e .




                                   -2                            ne
                                  V Cré ation dynam iq ue de ch aî s

 ors                           rait
L q u'un program m e doit t e r un grand nom bre de ch aî de l nes       ongue ur v     e
                                                                                   ariabl e t q ue ce nom bre n'e s t pas connu a
                     é       é                     loue                        e                 'e
priori, ilpe ut s'av re r int re s s ant de faire al r dynam iq ue m e nt (par l program m e ) l s pace m é m oire né ce s s aire au
  ock               ne                      ous                                 re                         abl
st age des ch aî s . C'e s t ce q ue v propose cet e xe rcice q ui pe ut ê t considéré com m e pré al e à un t e m e nt  rait
  té                   ne
ul rie ur de ce s ch aî s (par e xe m pl un t com m e v l propos e ra l xe rcice V
                                          e     ri      ous e               'e         -3).
                                                                                              .Ge ion
                                                                                             V s t dynam iq u e           179

________________________________________________________________________________________


Enoncé

                                it                   conq               ne       av            e
Ecrire un program m e q ui l un nom bre q ue l ue de ch aî s au cl ie r e t q ui ls range e n m é m oire dans des
      ace
e m pl m e nt al s l                                                                e                              ne
                      oués dynam iq ue m e nt au fur e t à m e s ure des besoins. L s adresses de ch acune des ch aî s s e ront
          ées            abl             e                              é
cons e rv dans un t e au de point urs. Ce dernie r s e ra ré s e rv dans l program m e (e n cl s e aut at ue ) e t sa t l
                                                                               e                 as      om iq            ail e
                              al               e                     ne      s               e    rait
(fixe ) im pos e ra donc une v e ur m axim al au nom bre de ch aî s q u'il e ra ainsi possibl de t e r.

 'ut isat      e         a                        ne    a             re         ne ide".
L il e ur signalra q u'il fourni sa derniè re ch aî e n l faisant suiv d'une ch aî "v

 e                               e e     ne ue        it          e     rôl
L program m e affich e ra e nsuit ls ch aî s l s , à t re de sim pl cont e .

                   il     a      ion
R e m arque : on ut isera l fonct m aloc e t on supposera q ue ls l s l s au cl ie r ne pe uv nt j ais dépas s e r 127
                                      l                        e igne ue      av             e    am
       è
caract re s .



       e
Exe m pl

   ----- chaîne      numéro 1 (return pour finir)
   C
   ----- chaîne      numéro 2 (return pour finir)
   Turbo C
   ----- chaîne      numéro 3 (return pour finir)
   Basic
   ----- chaîne      numéro 4 (return pour finir)
   Pascal
   ----- chaîne      numéro 5 (return pour finir)
   Turbo Pascal
   ----- chaîne      numéro 6 (return pour finir)


   fin création


   liste des chaînes créées

   ------- chaîne numéro 1
   C
   ------- chaîne numéro 2
   Turbo C
   ------- chaîne numéro 3
180                        angage C
           Exe rcice s e n l
   Basic
   ------- chaîne numéro 4
   Pascal
   ------- chaîne numéro 5
   Turbo Pascal

________________________________________________________________________________________



ANALYSE

  'é                                                                 abl           e        iné    e    e
L noncé nous im pose donc de définir, au s e in du program m e , un t e au de point urs dest à cont nir ls adresses des
     ne
ch aî s à cré e r.

                ne             ue                e                                   ui loue        e                     ,
Ch aq ue ch aî s e ra d'abord l dans une zone int rm édiaire (non dynam iq ue ). O n l al ra e nsuit , dynam iq ue m e nt à
l            a       ion    l          ace
 'aide de l fonct m aloc, un e m pl m e nt dont l t l corre s pond e xact m e nt à sa l
                                                    a aile                   e                     l                    e
                                                                                         ongue ur ;'adre s s e ainsi obt nue
                         e abl            e
s e ra m é m orisée dans l t e au de point urs.

 e rait                e
L t e m e nt s e ra int rrom pu :

                 e abl            e           e
   - soit q uand l t e au de point urs e s t plin,
                 'ut isat                  ne ide.
   - soit q uand l il e ur fournit une ch aî v
     us,               l
                       ocat         isée
D e pl à ch aq ue al ion ré al par m aloc, on s'assure ra q ue l s pace m é m oire né ce s s aire a pu ê t obt nu. D ans l
                                               l               'e                                         re  e          e
cas contraire , on pré v          e         e
                        oira d'int rrom pre l program m e .


Program m e

   #include <stdio.h>
   #include <stdlib.h>                          /* pour la fonction exit */
   #include <string.h>
   #define NCHMAX 1000                          /* nombre maximal de chaînes */
   #define LGLIGNE 127                          /* longueur maximale d'une ligne d'écran */

   main()
   {
      char ligne [LGLIGNE+1],                   /*   chaîne servant à lire une ligne écran */
           * adr [NCHMAX],                      /*   tableau de pointeurs sur les chaînes */
           * ptr ;                              /*   pointeur courant sur une chaîne */
      int nch,                                  /*   compteur du nombre de chaînes */
           i ;

                        /* mise à zéro du tableau de pointeurs */
                                                                                      .Ge ion
                                                                                     V s t dynam iq u e         181

       for (i=0 ; i<NCHMAX ; i++)
          adr[i] = NULL ;

                   /* boucle de création dynamique des chaînes */
          nch=0 ;
          while (nch < NCHMAX)        /* tant que nb max chaînes non atteint */
             { printf ("----- chaîne numéro %d (return pour finir)\n", nch+1) ;
               gets (ligne) ;

                 if ( strlen(ligne) )
                      { if ( (ptr = malloc (strlen(ligne)+1)) != NULL)
                             strcpy (adr[nch++]=ptr, ligne) ;
                          else
                           { printf ("\n\n*** erreur allocation dynamique") ;
                             exit(-1) ;         /* arrêt si erreur alloc dynam */
                           }
                      }
                    else break ;              /* sortie boucle si réponse vide */
             }
          printf ("\nfin création\n") ;

                   /* liste des chaînes ainsi créées */
       printf ("\n\nliste des chaînes crées\n\n") ;
       i = 0 ;
       for (i=0 ; i<nch ; i++)
           printf ("------- chaîne numéro %d\n%s\n", i+1, adr[i]) ;
   }



          aire
Com m e nt s


                e e                         'é
*Ici, com pt t nu de ce q ue nous précisait l noncé , nous av               ire       nes        abl
                                                             ons ch oisi de l nos ch aî dans un t e au de 128
      è
caract re s , à l         a      ion
                 'aide de l fonct ge ts.


             ons                    e abl          e              ne         à              ion   ue
*Nous av re m is à "zé ro" l t e au de point urs sur nos ch aî s . Ils'agit l d'une opé rat superfl m ais q ui pe ut
     é        il             a                                         e 'usage du sym bol NUL ;
s'av re r ut e pe ndant l ph ase de m ise au point du program m e . Not z l               e     L prédéfini dans l e
            dl
fich ie r st ib.h , il                a     ant     e     le
                      corre s pond à l const e point ur nul .


   a       ion     ne            isée          e ant
*L cré at de s ch aî s e s t ré al par une boucl t q u e (inst ion w h il), dans l ue l nous av
                                                              ruct      e        aq l  e               u
                                                                                               ons prév de ux
   re      ie
aut s s ort s :
182                        angage C
           Exe rcice s e n l
              ie                  e       'ut isat                   ne ide,
   - une s ort par bre ak , dans l cas où l il e ur a fourni une ch aî v
   - un arrê t e xce pt                               ,     e         'alocat                               t        ion
                       ionne ldu program m e par e xit dans l cas où l l ion dynam iq ue a é ch oué . Ce t e fonct (dont
    e      ot                      dl
   l prot ype figure dans st ib.h ) re q uie rt un argum e nt ;sa v e ur e s t t
                                                                         al                            è          le
                                                                                      ransm ise au syst m e e t e l pourrait
       e ue le          re                    re
   é v nt l m e nt ê t ré cupé ré e par d'aut s program m e s . Not z q ue , e n l e nce de l ruct #incl re l iv à
                                                                    e            'abs          'inst ion       ude     at e
      dl       e         at
   st ib.h , l com pil e ur acce pt un appe lde e xit sans argum e nt (ile s t incapabl de dét ct r l rre ur - l ue l n'a
                                     e                                                   e        e e 'e          aq l   e
         l
         e                             'e    ion                 ui-m
   d'ail urs aucune incide nce s ur l xé cut du program m e l ê m e ).
   ure l
       e    ,              re       at                       e
Nat l m e nt beaucoup d'aut s form ul ions s e raie nt possibls .



DI      O
  SCUSSI N


     e              e e abl            e                   as     om iq                   im e                    ne
*L fait de ré s e rv r l t e au dans l program m e (e n cl s e aut at ue ) im pos e une l it au nom bre de ch aî s q u'il
                  e     rait        t im e                    e
e s t ainsi possibl de t e r ;ce t e l it e s t indé pe ndant de l m é m oire ré e l m e nt disponibl. O n pe ut am é l r
                                                                   a               le               e                 iore
       q        a uat                    e
q ue lue pe u l sit ion e n faisant é galm e nt al
                                                 louer dynam iquem ent l                           abl
                                                                        'espace nécessaire à ce t eau de point     eurs. Il
         out            t a ail
                         re       e
faut t e fois e n connaî l t l (ou du m oins une v e ur m axim al) l de l xé cut du program m e . Ce l pe ut faire
                                                        al           e ors     'e       ion                    a
 'obj                              'ut isat                  'e
l e t d'une donnée fournie par l il e ur com m e dans l xe rcice s uiv .ant




                                       -3                      ne
                                      V Tri dynam iq ue de ch aî s

________________________________________________________________________________________


Enoncé

                                  t       rie            ph   iq
Ecrire un program m e pe rm e t ant de t r par ordre al abét ue des           ne                                        'e
                                                                          ch aî s fournie s e n donné e . Com m e dans l xe rcice
          ,         loue                             ace
pré cédent on al ra dynam iq ue m e nt des em pl m e nt m é m oire
                                                            s                        ne                           e    e ure
                                                                          aux ch aî s , au fur e t à m e s ure de lur lct , e t
 e
lurs adre s s e s s e ront cons e rv              abl
                                    ées dans un t e au de point urs.
                                                                 e                   re                      e     ui
                                                                          Par cont , ici, ce dernie r v rra, l aussi, son
      ace
e m pl m e nt al    oué
                  l dynam iq ue m e nt e n début de program m e ;  pour                                'ut isat
                                                                          ce faire , on de m ande ra à l il e ur de fournir une
  al              e                     ne      s
v e ur m axim al du nom bre de ch aî s q u'il e ra am e né à fournir.

      il     'al h            ri       ract
O n ut isera l gorit m e de "t par e xt ion sim pl" e xposé dans l xe rcice V e t on fe ra appe l l fonct m aloc.
                                                 e               'e          -1                  à a     ion  l


       e
Exe m pl
                                                                                              .Ge ion
                                                                                             V s t dynam iq u e     183

   nombre maximal       de chaînes ? 100
   ------- chaîne       numéro 1 (return pour finir)
   C
   ------- chaîne       numéro 2 (return pour finir)
   Turbo C
   ------- chaîne       numéro 3 (return pour finir)
   Basic
   ------- chaîne       numéro 4 (return pour finir)
   Pascal
   ------- chaîne       numéro 5 (return pour finir)
   Turbo Pascal
   ------- chaîne       numéro 6 (return pour finir)
   Fortran
   ------- chaîne       numéro 7 (return pour finir)
   ADA
   ------- chaîne       numéro 8 (return pour finir)


   fin création


   liste triée des chaînes crées

   ADA
   Basic
   C
   Fortran
   Pascal
   Turbo C
   Turbo Pascal

________________________________________________________________________________________



ANALYSE


Il                            e e                 'e                   ,    ui
  nous suffit e n fait d'adapt r l program m e de l xe rcice pré cédent e n l adjoignant :

     a          at                   abl           e
   - l ré s e rv ion dynam iq ue du t e au de point urs,
      e ri     abl           ne
   - l t du t e au de ch aî s ainsi cré é , par ré organisat de s point urs. Nous ut iserons pour cel l gorit m e de t
                                                            ion        e            il              a 'al h           ri
           ract        e
   par e xt ion sim pl Ce l              é             'é
                              ui-ci a é t e xposé dans l noncé de l xe rcice V e t son adapt ion au t de ch aî s a é t
                                                                   'e         -1             at      ri       ne       é
        iq
   e xpl uée dans l      yse     'e
                   'anal de l xe rcice V     -2.
184                     angage C
        Exe rcice s e n l


Program m e

  #include <stdio.h>
  #include <stdlib.h>
  #include <string.h>
  #define LGLIGNE 127              /* longueur maximale d'une ligne d'écran */
  main()
  {
     char ligne [LGLIGNE+1],       /*   chaîne servant à lire une ligne écran */
          * * adr,                 /*   adresse tableau pointeurs sur les chaînes */
          * ptr,                   /*   pointeur courant sur une chaîne */
          * tempo ;                /*   pointeur temporaire pour éch. 2 pointeurs */
     unsigned nchmax,              /*   nombre maximal de chaînes */
              nch,                 /*   compteur du nombre de chaînes */
              i, j, kmax ;

                  /* création et mise à zéro du tableau de pointeurs */
      printf ("nombre maximum de chaînes ? ") ;
      scanf ("%d", &nchmax) ;
      getchar() ;                               /* pour sauter la validation */
      if ( (adr = malloc (nchmax*sizeof(char*)) ) == NULL)
         { printf ("\n\n*** erreur allocation dynamique") ;
           exit(-1) ;                        /* arrêt si erreur alloc dynam */
         }
      for (i=0 ; i<nchmax ; i++)
         adr[i] = NULL ;

                   /* boucle de création dynamique des chaînes */
      nch = 0 ;
      while (nch < nchmax)           /* tant que nb max de chaînes non atteint    */
         { printf ("------- chaîne numéro %d (return pour finir)\n", nch+1)       ;
           gets (ligne) ;
           if ( strlen(ligne) )
                { if ( ( ptr = malloc (strlen(ligne)+1)) != NULL)
                         strcpy (adr[nch++]=ptr, ligne) ;
                     else
                       { printf ("\n\n*** erreur allocation dynamique") ;
                          exit(-1) ;            /* arrêt si erreur alloc dynam    */
                       }
                }
             else break ;                     /* sortie boucle si réponse vide    */
         }
                                                                                             .Ge ion
                                                                                            V s t dynam iq u e           185

         printf ("\nfin création\n") ;

                     /* tri des chaînes par réarrangement des pointeurs */
         for (i=0 ; i<nch-1 ; i++)
            { kmax = i ;
              for (j=i+1 ; j<nch ; j++)
                 if ( stricmp (adr[kmax], adr[j]) > 0 ) kmax = j ;
              tempo = adr[kmax] ;
              adr[kmax] = adr[i] ;
              adr[i] = tempo ;
            }

                     /* liste triées des chaînes ainsi créées */
         printf ("\n\nliste triée des chaînes crées\n\n") ;
         for (i=0 ; i<nch ; i++)
               puts ( adr[i] ) ;
    }



          aire
Com m e nt s


       e                'e          -2, e       e                  abl             e                       e
*D ans l program m e de l xe rcice V l sym bol adr désignait un t e au de point urs. Ici, ce m ê m e sym bol désigne
        e           abl             e
un point ur sur un t e au de point urs. O r, m al ce t e diffé re nce appare nt , v
                                                  gré t                                   at
                                                                               e ous const e z q ue nous e m ployons
 ouj      a   at
t ours l not ion :

             adr[i]
  e a                    ion   es
av c l m ê m e significat dans l deux cas.

       ,     e                                 ait         ant
En fait dans l pré cédent program m e , adr é t une const e point     eur dont l v e ur é t ce l de l
                                                                               a al        ait le     'adresse de début du
 abl           e             e
t e au de point urs. Dans l pré s e nt program m e , adr e s t une variabl point
                                                                         e                  a al            e          le
                                                                                eur dont l v e ur e s t é galm e nt ce l de
          abl           e                   es
début du t e au de point urs. Ainsi, dans l deux cas :

             adr[i]
             al
e s t é q uiv e nt à :

             *(adr + i)
    e                   'é     al        re es                                 ot e        ,      e
Not z ce pe ndant q ue l q uiv e nce e nt l deux program m e s n'e s t pas t al. En e ffe t dans l pre m ie r cas, adr n'e s t
         v ue              ais
pas une lal (m ot angl dont une t         raduct approch é e pourrait ê t : v e ur à gauch e ) ; e xe m pl, l xpre s s ion
                                                ion                         re   al             par          e 'e
                         e        e                      re                     v ue
adr++ s e rait incorre ct . Dans l s e cond cas, par cont , adr e s t bien une lal .
186          Exe rcice s e n l angage C
               ons                          ion     icul                             e e ure
*Nous n'av pris aucune pré caut part iè re e n ce q ui conce rne ls lct s au cl ie r q ui sont ré al     av                 isées ici par
    s           .                                  ie
ge t e t scanf Indé pe ndam m e nt des anom al s h abit l s e ncourue s e n cas de données incorrect s (ch aî t
                                                             ue l    e                                           e       ne rop l    ongue
          s,                                         ),            è
pour ge t donné e non num é riq ue pour scanf un problm e s upplm e nt        é                  t ié
                                                                                                  ,                            e ure
                                                                                   aire apparaî l au fait q u'aprè s une lct par
      , e         e        e
scanf l point ur re s t posit      ionné s ur l dernie r caract re non e ncore ut isé, à sav ici l \n (du m oins si l il e ur a
                                               e                 è                 il           oir      e                  'ut isat
  al              e     ,
v idé norm alm e nt sans fournir d'inform at                       é
                                                      ions supplm e nt s ). Si l lct s uiv e e s t à son t
                                                                         aire       a e ure          ant     ,                     ué
                                                                                                                      our, e ffe ct e par
      ,              è           icul                   e
scanf aucun problm e part ie r ne s e pos e , l caract re \n é t sim plm e nt ignoré . Iln'e n v pl de m ê m e l q ue l
                                                               è          ant      e                           a us              ors     a
 e ure        ant               ué
lct s uiv e e s t e ffe ct e par ge t ;      s dans ce cas, e n e ffe t ce caract re e s t int rpré t com m e un caract re de "fin" e t
                                                                       ,         è            e       é                  è
    s         ...
ge t fournit une ch aî v     ne ide. C'est pour é v e r ce ph é nom è ne q ue nous av dû int
                                                     it                                ons                          ruct        ch
                                                                                                    roduire une inst ion ge t ar pour
            e
absorber l \n.



DI      O
  SCUSSI N


              oir l  oue       e      e
Pour pouv al r conv nablm e nt l m pl m e nt du t e au de point urs, not program m e a besoin q ue l il e ur
                                               'e   ace          abl              e          re                               'ut isat
  ui                   al               e                    ne
l fournis s e une v e ur m axim al du nom bre de ch aî s . Si nous souh ait                                re     ,
                                                                                    ions q u'ile n soit aut m e nt ils e rait né ce s s aire
           oir l
de pouv al r prov  oue      isoire m e nt un e m pl m e nt à ce t e au, q uit e à l t ndre e nsuit au fur e t à m e s ure des besoins
                                                  ace            abl         t       'é e            e
à l             a       ion      l           e le
     'aide de l fonct re aloc. Une t l e xt nsion pourrait ê t ré al
                                                    e                re                                   e l e     ne     ré
                                                                             isée, soit à ch aq ue nouv l ch aî e nt e , soit par
   ocs       ail e                   e out e
 bl de t l fixe (par e xe m pl t e s ls 100 ch aî s ).    ne




                                         -4               is       né
                                        V Cré ation d'une l te ch aî e

          l ist
          e          né       ist ié       e
O n appe l l e ch aî e ou l e l e une s uit ordonnée d'é lm e nt dans l ue l ch aq ue é lm e nt sauf l dernie r,
                                                         é      s     aq l  e           é      ,     e
        e        e       'é é          ant
com port un point ur sur l lm e nt suiv .


________________________________________________________________________________________


Enoncé

                                     ist     née   é      s        ant
Ecrire un program m e q ui cré e une l e ch aî d'é lm e nt com port ch acun :

                 ne                          è
   - un nom (ch aî ) d'au m axim um 10 caract re s ,
   - un â ge .
 e
L s inform at                      e           ue
               ions corre s pondant s s e ront l s au cl ie r e t l il e ur frappe ra un nom "v
                                                       av         'ut isat                                 es          at e
                                                                                               ide" aprè s l données rel iv s
               é
au de rnie r é lm e nt.
                                                                                                 .Ge ion
                                                                                                V s t dynam iq u e            187

  e                                e e
L program m e affich e ra e nsuit ls inform ations cont nues dans l l e ainsi cré é e , dans l
                                                       e          a ist                                e          ui
                                                                                             'ordre inv rse de ce l dans
e      e l
         e            é
lq ue l l s auront é t fournie s .

O n pré voira de ux fonct       'une pour l cré at
                         ions : l         a       ion, l re pour l l e . El s posséderont com m e uniq ue argum e nt
                                                           'aut    a ist  le
l                      a ist       e      e              é
 'adresse de début de l l e (point ur sur l pre m ie r é lm e nt).


       e
Exe m pl

   om : Laurence
   age : 19
   nom : Yvette
   age : 35
   nom : Catherine
   age : 20
   nom : Sebastien
   age : 21
   nom :


                  NOM     AGE

            Sebastien       21
            Catherine       20
               Yvette       35
             Laurence       19

________________________________________________________________________________________



ANALYSE


           é             re ist                   é           ruct
Ch aq ue é lm e nt de not l e s e ra re pré s e nt par une s t ure . Nous v    oyons q ue ce l -ci doit cont nir un point ur sur un
                                                                                             le             e            e
  é                   ype       a        e e
é lm e nt de m ê m e t . Ce l fait int rv nir une ce rt      aine "ré cursiv é " dans l décl ion corre s pondant , ce q ui e s t
                                                                            it          a       arat                  e
       é
acce pt e n C.

                     'al h                ion a ist               it
En ce q ui conce rne l gorit m e de cré at de l l e , deux possibil é s s 'offre nt à nous :

        out               e é          a         a ist
   - Aj e r ch aq ue nouv lé lm e nt à l fin de l l e . L parcours ul rie ur de l l e s e fe ra al dans l m ê m e ordre
                                                           e            té      a ist            ors    e
           ui      e     l                          e         é roduit s .
   q ue ce l dans lq ue l es données corre s pondant s ont é t int    e
       out                e é                      ist    e
   - Aj e r ch aq ue nouv lé lm e nt e n début de l e . L parcours ul rie ur de l l e s e fe ra al dans l
                                                                      té        a ist            ors              e
                                                                                                        'ordre inv rs e
         ui       e    l                          e         é roduit s .
   de ce l dans lq ue l es données corre s pondant s ont é t int    e
188                         angage C
            Exe rcice s e n l
        e e                 'é                            a ist   'e e
Com pt t nu de ce q ue l noncé nous dem ande d'affich e r l l e à l nv rs, aprè s sa cré at           t us      un
                                                                                           ion, ilparaîpl apport de
         a                h
ch oisir l s e conde m é t ode .

                   a       ion   a ist
Com m e dem andé , l cré at de l l e s e ra ré al par une fonct
                                                isée                  e                               e e              e
                                                                ion. L program m e principals e cont nt ra de ré s e rv r
         e                  )   iné              e
un point ur (nom m é de but dest à désigner l pre m ie r é lm e nt de l l e . Sa v e ur e ffe ct e s e ra fournie par l
                                                           é           a ist      al            iv                       a
     ion
fonct de cré at ion.

  'al h
L gorit m e de cré at              ui,
                     ion, q uant à l consist ra à ré pé t r l t e m e nt d'insert d'un nouv lé lm e nt e n début de l e ,
                                            e            e e rait                ion       e é                      ist
     oir
à sav :

                                        ace                  e é é                    e
   - cré e r dynam iq ue m e nt un e m pl m e nt pour un nouv l lm e nt e t y range r ls inform at                   av
                                                                                                  ions fournie s au cl ie r,
            e          e       e               e é é      'ancie nne v e ur de de but
   - affe ct r au point ur cont nu dans ce nouv l lm e nt l           al             ,
            e           'adresse de ce nouv l lm e nt
   - affe ct r à de but l                  e é é     .
           ie         us,        e
Nous conv ndrons, de pl q ue l dernie r é lm e nt de l l e possè de un point ur nul ce q ui nous facil e ra
                                                 é           a ist                 e      ,          it
'init isat    'al h       e         , l
l ial ion de l gorit m e ; n e ffe t ce l -ci s e ram è ne al à l ct ion à de but d'une v e ur nul .
                                         e                  ors 'affe at                 al      le



Program m e

   #include <stdio.h>
   #include <stdlib.h>
   #include <string.h>

   #define LGNOM 20                                 /* longueur maximale d'un nom */

   typedef struct element             /* définition du type élément */
         { char nom [LGNOM+1] ;               /* nom */
           int age ;                          /* age */
           struct element * suivant ;         /* pointeur element suivant */
         } t_element ;


   main()
   {
      void creation (t_element * *) ;                               /* fonction de création de la liste */
      void liste (t_element *) ;                                    /* fonction de liste de la liste */

       t_element * debut ;                          /* pointeur sur le début de la liste */

       creation (&debut) ;
       liste (debut) ;
   }
                                                                   .Ge ion
                                                                  V s t dynam iq u e   189



         /****************************************************/
         /*     fonction de création d'une liste chaînée     */
         /****************************************************/
void creation (t_element * * adeb)
{
   char nomlu [LGNOM+1] ;      /* pour lire un nom au clavier */
   t_element * courant ;       /* pour l'échange de valeurs de pointeurs */

    * adeb = NULL ;                               /* liste vide au départ */

    while (1)                /* boucle de création apparemment infinie ... */
       {                     /* ... mais, en fait, interrompue sur "nom vide" */
          printf ("nom : ") ;
          gets (nomlu) ;
          if (strlen(nomlu))
              { courant = (t_element *) malloc (sizeof(t_element)) ;
                strcpy (courant->nom, nomlu) ;
                printf ("age : ") ;
                scanf ("%d", &courant->age) ;
                getchar() ;                           /* pour sauter le \n */
                courant->suivant = * adeb ;
                * adeb = courant ;
              }
            else break ;                      /* sortie boucle si nom vide */
       }
}




          /******************************************************/
          /*      fonction de liste d'une liste chaînée         */
          /******************************************************/
void liste (t_element * debut)
{
   printf ("\n\n          NOM    AGE\n\n") ;
   while (debut)
      { printf ("%15s %3d\n", debut->nom, debut->age) ;
        debut = debut->suivant ;
      }
}
19 0                       angage C
           Exe rcice s e n l


          aire
Com m e nt s


            ons                 are     re ruct
*Nous av ici ch oisi de décl r not s t ure à un niv au gl       e                                ype .        t   arat
                                                                      obale t de faire appe là t de f Ce t e décl ion à un
    e
niv au gl         it        oir         a
           obalé v e de dev dé crire l m ê m e s t ure e n diffé re nt e ndroit ce q ui s e rait non s e ulm e nt l
                                                     ruct                s         s,                 ,         e    aborie ux
                 t,                            re e
m ais, de surcroî source d'erreurs. Par cont , l re cours à t de f n'apport q u'une s im pl
                                                                  ype            e                        ion     arat
                                                                                                   ificat des décl ions des
  é      s
é lm e nt de ce t          e
                 ype (dans l cas contraire , il                    ace _e e
                                               suffirait de re m pl r t l m e nt par st        e
                                                                                        ruct e l m e nt).

   e                 re       n'e            e
Not z bie n, par cont , q u'il s t pas possibl de re m pl r, au s e in de l définit de not s t ure , l crit :
                                                        ace               a        ion    re ruct    'é    ure

             struct element * suivant

par :

             t_element * suivant



   a       ion       ion     oit
*L fonct de cré at re ç e n argum e nt l       'adresse du point ur de but car e l doit pouv l at ribue r une v e ur.
                                                                  e        ,       le       oir ui t            al
 a
L fonct          ist              l
         ion de l e , q uant à e l , s e cont nt de l v eur de ce m ê m e point ur. Ce t e diffé re nce s e ré pe rcut
                                   e          e e        a al                           e    t                        e
   ure l
       e          a              il
nat l m e nt sur l m aniè re d'ut iser cet argum e nt dans ch acune des deux fonctions.

    e       l
            e                     ons                 t
Not z d'ail urs q ue nous av pu nous pe rm e t re , dans l fonct de l e , de m odifie r l v e ur ainsi reç (l point ur
                                                                a       ion ist         a al              ue e     e
                            e       es           s é       s   a ist
de but y décrit succe s s iv m e nt l diffé re nt é lm e nt de l l e ).


     à          e e ure             av
*L e ncore , ls lct s au cl ie r ont é t ré al  é                           s,             e ions part iè re s . Com m e nous
                                                    isées par scanf e t ge t donc sans prot ct          icul
 'av         à       é         e
l ons déj signal dans l pré cédent e xe rcice , l il ion conj e de ces deux fonct
                                                      'ut isat        oint                                     è     ié
                                                                                              ions pose un problm e l au fait
                    e ure par scanf l point ur re s t posit
q ue , aprè s une lct                    , e      e       e     ionné s ur l dernie r caract re non e ncore ut isé, à sav
                                                                               e            è                    il         oir
         e                             ust   'int      ion
(gé né ralm e nt) \n. C'e s t ce q ui j ifie l roduct d'une inst ion ge t ar pour absorber ce caract re int m pe s t
                                                                    ruct         ch                         è      e    if.
                                                  I         VTE
                                                 V : RECURSI I




 a         it              ion icat             'av age                e                             e
L ré cursiv é e s t une not dé l e m ais q ui a l ant de conduire s ouv nt à des program m e s s im pls .

  e rois prem ie rs e xe rcices de ce ch apit s ont pl ôt des "e xe rcices d'écol" dest s à v
Ls t                                         re      ut                         e      iné                 ore            e
                                                                                             ous faire e xpl r diffé re nt s
   uat        ous       ant                     ion      e à               iq                           e
sit ions e n v forç à é crire une fonct ré cursiv , l où, e n prat ue , on ne s e rait pas am e né à l faire .




                                             I e                 e
                                            V-1 lcture ré curs iv (1)

________________________________________________________________________________________


Enoncé

                 ion       e       e ure          al         iè  av
Ecrire une fonct ré cursiv de lct d'une v e ur e nt re au cl ie r. L fonct de v s'appe lr e l -m ê m e dans l
                                                                    a     ion  ra      e    le              e
cas où l          ion                      e
        'inform at fournie e s t incorre ct (non num é riq ue ).

O n pré v              ion              'adresse de l v
         oira une fonct à un argum ent (l           a ariabl pour l ue l on v ut l une v e ur) e t sans v eur de
                                                           e      aq l  e    e ire      al               al
retour.

                       à     s                    e e       e   e       e                        e
O n pourra faire appe l fge t e t sscanf pour dé t ct r conv nablm e nt ls ré pons e s incorre ct s .



Re m arq ue

Nous v              l
                    ons                                   ant
       ous cons e il de com pare r ce t e xe rcice au suiv dans lq ue ll m ê m e problm e e s t ré s ol par l m pl d'une
                                                                e      e             è                u     'e   oi
     ion          e                    e al
fonct ré cursiv s ans argum e nt e t av c v e ur de re tour.


       e
Exe m pl
19 2                      angage C
          Exe rcice s e n l
   donnez un nombre entier : un
   ** réponse incorrecte - redonnez-la : 'à
   ** réponse incorrecte - redonnez-la : 40
   -- merci pour 40

________________________________________________________________________________________



ANALYSE


           a      ion                       e ure
Au sein de l fonct (q ue nous nom m e rons lct ), nous l    irons l v e ur at e ndue à l
                                                                    a al       t                 ge s
                                                                                       'aide de f t (..., stdin), associé à
      ,              'av     à
sscanf com m e nous l ons déj fait dans ce rtains des exe rcice s pré cédents.

                       a               'ut isat                  e ors    e
Nous considé re rons l ré ponse de l il e ur com m e corre ct l q ue l code de re t                                   e
                                                                                   our de sscanf s e ra é galà 1. Si t l
            e                         e         à a             ion e ure
n'e s t pas l cas, nous fe rons à nouv au appe l l m ê m e fonct lct .


Program m e

   #include <stdio.h>

   #define LG_LIG 20                            /* longueur maxi information lue au clavier */
   main()
   {
      void lecture (int *) ;                    /* prototype fonction (récursive) de lecture */
      int n ;                                   /* entier à lire */

       printf ("donnez un nombre entier : ") ;
       lecture (&n) ;
       printf ("-- merci pour %d", n) ;
   }

   void lecture (int *p)
   {
      int compte ;                          /* compteur du nb de valeurs OK */
      char ligne[LG_LIG+1] ;                /* pour lire une ligne au clavier par fgets */
                                            /*     +1 pour tenir compte du \0 de fin    */

       fgets (ligne, LG_LIG, stdin) ;
       compte = sscanf (ligne, "%d", p) ;
       if (!compte)
            { printf ("** réponse incorrecte - redonnez la : ") ;
              lecture (p) ;
                                                                                                     I.         it
                                                                                                    V R é cursiv é         19 3

              }
   }



          aire
Com m e nt s


       e                          a      ion e ure
*Not z bie n q u'au s e in de l fonct lct , au niv au de le       'appe lde sscanf nous v
                                                                                  ,                  tre
                                                                                         oyons apparaî p e t non & p,
                         à        e       a ariabl dont on v ut l l v e ur.
puis q ue ici p e s t déj un point ur sur l v    e          e ire a al

*Si nous av        il        e           s              'e
            ions ut isé sim plm e nt ge t (com m e dans l xe rcice V de l pre m iè re part ) au l u de f t (..., st
                                                                     I.5     a            ie    ie      ge s       din),
                     e                é             ais                 'ut isat                                   ail
nous aurions pu égalm e nt nous prot ge r de m auv e s ré ponses de l il e ur, m ais nous aurions dû définir une t l   e
         e       a      ne ue        av                            e                                          e
m axim al pour l ch aî l au cl ie r ;nous aurions couru l ris q ue de "débordem e nt m é m oire ", dans l cas où
 'ut isat                               rop ongue .
l il e ur aurait fourni une ré pons e t l



DI      O
  SCUSSI N


             e appe l lct e nt ne l l ion aut at ue , sur l pil, d'e m pl m e nt pour :
Ch aq ue nouv l      de e ure raî 'alocat    om iq        a e           ace     s

    'argum e nt p,
   -l
     e     e s ocaux : com pt e t l .
   - ls obj t l              e    igne
             ,                                e al
O r, e n fait ne s ont né ce s s aire s q ue ls v e urs corre s pondant au de rnie r appe lde lct           ui  a e ure s 'e s t
                                                                                                 e ure (ce l où l lct
     e     e              é
conv nablm e nt déroule ) ;       dans ce s condit      'e
                                                  ions, l m pilm e nt des diffé re nt e m pl m e nt al s au t e au l
                                                                e                    s       ace   s l  oué    abl    igne e s t
        u.     'on            e             q                                              e
superfl Si l souh ait faire q ue lue s é conom ies d'espace m é m oire à ce niv au, on pe ut s'arrange r pour q ue ce t
     ace                        é              e
e m pl m e nt ne s oit ré s e rv q u'une s e ul fois :

               e                   ant       e
   - soit dans l program m e appe l (ici l program m e principal ; ) dans ce cas, ilfaudra e n t         t 'adre s s e e n
                                                                                                ransm e t re l
             ,            raî 'e    e
   argum e nt ce q ui e nt ne l m pilm e nt d'une v     e      é      aire
                                                   ariabl s upplm e nt .
               as     obal dans ce cas, on pe ut é galm e nt t e r de l sort com pt e t p (c'e s t -dire , e n fait n), ce q ui
   - soit e n cl s e gl e ;                           e         rait        a    e   e            -à               ,
                              ous e          s      e     e s ocaux de lct . Not z q u'ilre s t ra q uand m ê m e , à ch aq ue
   supprim e du m ê m e coup t ls argum e nt e t ls obj t l                   e ure e            e
         ,        locat     om iq
   appe l une al ion aut at ue d'espace pour l        'adre s s e d e re tour.
               as       at        at                a
   - soit e n cl s e s t iq ue (st ic) au s e in de l fonction. L e ncore , nous pouv t e r de l m ê m e m aniè re l v
                                                                 à                   ons rait  a                   a ariabl
                                                                                                                          e
          e a ariabl p, q uant à e l , re s t soum ise aux e m pilm e nt
   com pt , l v          e              e
                                        l        ant                  e       s.
19 4                       angage C
           Exe rcice s e n l
                                           I   e                e
                                          V-2 L cture ré curs iv (2)

________________________________________________________________________________________


Enoncé

                 ion       e       e ure          al         iè  av
Ecrire une fonct ré cursiv de lct d'une v e ur e nt re au cl ie r. L fonct de v s'appe lr e l -m ê m e dans l
                                                                    a     ion  ra      e    le              e
cas où l          ion                      e
        'inform at fournie e s t incorre ct (non num é riq ue ).

O n pré v         t                ion
         oira ce t e fois une fonct dans l ue l l v e ur de re t e s t l v e ur l (il aura donc pas d'argum e nt
                                         aq l a al
                                               e                our    a al ue       n'y                        s).

 à                                à ge s
L e ncore , on pourra faire appe l f t (..., stdin) e t sscanf pour dé t ct r conv nablm e nt ls ré pons e s incorre ct s .
                                                                        e e       e   e       e                        e



Re m arq ue

                          out  iné    re                          e
Ce t e xe rcice e s t surt dest à ê t com paré au pré cédent dans lq ue ll m ê m e problm e e s t ré s ol par l m pl d'une
                                                                         e             è                u     'e   oi
      ion e                        al
fonct av c argum e nt e t sans v e ur de re tour.



       e
Exe m pl

   donnez un nombre entier : un
   ** réponse incorrecte - redonnez la : 'à
   ** réponse incorrecte - redonnez la : 40
   -- merci pour 40

________________________________________________________________________________________



ANALYSE


                          ,                 re
Com m e pré cédem m e nt au s e in de not fonct                     e ure
                                                    ion (nom m é e lct ), nous l irons l v e ur at e ndue à l
                                                                                        a al      t                    ge s
                                                                                                             'aide de f t
                .                        a              'ut isat                  e ors     e
associé à sscanf Nous considé re rons l ré ponse de l il e ur com m e corre ct l q ue l code de re t     our de sscanf s e ra
     à         a             e                           e         à a            ion e ure
é gal 1. Si ce l n'e s t pas l cas, nous fe rons de nouv au appe l l m ê m e fonct lct .
                                                                                                      I.         it
                                                                                                     V R é cursiv é          19 5

Program m e


   #include <stdio.h>

   #define LG_LIG 20                          /* longueur maxi information lue au clavier */
   main()
   {
      int lecture (void) ;                    /* fonction (récursive) de lecture */
      int n ;                                 /* entier à lire */

        printf ("donnez un nombre entier : ") ;
        n = lecture() ;
        printf ("-- merci pour %d", n) ;
   }

   int lecture (void)
   {
      int compte,                             /* compteur du nb de valeurs OK */
          p ;                                 /* entier à lire */
      char ligne[LG_LIG+1] ;                  /* pour lire une ligne au clavier par fgets */

        fgets (ligne, LG_LIG, stdin) ;
        compte = sscanf (ligne, "%d", &p) ;
        if (!compte)
             { printf ("** réponse incorrecte - redonnez-la : ") ;
               p = lecture() ;
             }
        return(p) ;
   }



          aire
Com m e nt s


       t              e
*Ce t e fois, on not ra q ue p dé s igne une v          e ocal
                                                   ariabl l e de t   ype int dont l m pl m e nt e s t al
                                                                             ,        'e     ace          oué     om iq
                                                                                                          l aut at ue m e nt à
                    a       ion e ure          a                           e
ch aq ue appe lde l fonct lct , de l m ê m e m aniè re q ue pour ls aut s obj t l  re                      e    igne       le
                                                                                           e s ocaux com pt e t l . Par ail urs,
                ace
si aucun e m pl m e nt n'e s t al   oué
                                    l ici pour un q ue l ue argum e nt ilfaut e n pré v un pour l v e ur de re t
                                                          conq              ,                   oir        a al          our. O n
                le                t al
re m arq ue d'ail urs q u'ici ce t e v e ur s e trouv "propagé e " de proch e e n proch e , l du "dépilm e nt des appe l
                                                      e                                      ors        e     "         s.


*Pre ne z garde à ne pas é crire :
19 6                       angage C
           Exe rcice s e n l
         if (!compte)
               { printf ("** réponse incorrecte - redonnez-la : ") ;
                 p = lecture() ;
               }
             else return (p) ;

     a      ion        e           al          ors    a e ure
car l fonct ne re nv rrait une v e ur q ue l q ue l lct s e s e rait déroule conv nablm e nt Not z d'ail urs q ue
                                                                               é      e      e      .     e e
                                                                                                            l
                                  at       ous     ie                          e issem e nt ("w arning").
dans ce cas, bon nom bre de com pil e urs v prév ndrait par un m e s s age d'av rt

        re   s        out                          al
Par cont , il e rait t à fait corre ct (e t é q uiv e nt) d'écrire :

         if (!compte)
             { printf ("** réponse incorrecte - redonnez la : ") ;
                return (lecture()) ;
              }
            else return (p) ;



DI      O
  SCUSSI N


  e                   es    e
L s re m arq ue s fait dans l pré cédent e xe rcice à        propos des em pilm e nt de l
                                                                             e      s                e ue l
                                                                                                          e             e
                                                                                        igne (e t é v nt l m e nt com pt )
     iq
s'appl ue nt e ncore ici.




                                             I   e                e
                                            V-3 L cture ré curs iv (3)

________________________________________________________________________________________


Enoncé

                ion          e       e ure ie    av
Ecrire une fonct ré cursiv de lct d'un ent r au cl ie r. L fonct
                                                          a             ra      e    le              e
                                                                ion de v s'appe lr e l -m ê m e dans l cas où
'inform at fournie e s t incorre ct .
l         ion                      e

    t        a      ion                    s
Ce t e fois, l fonct possédera 3 argum e nt :

     e                   le
   - l m e s s age q u'e l doit im prim e r avant de l une v e ur (l m e s s age "donne z un nom bre e nt r :" ne s e ra donc
                                                     ire    al     e                                     ie
     us                e
   pl affich é par l program m e principal     ),
    'adresse de l v
   -l                  e      aq l  e        ire    al
                a ariabl dans l ue l on doit l une v e ur,
     e
   - l nom bre m axim al            oris
                        d'essais aut é s .
                                                                                                    I.         it
                                                                                                   V R é cursiv é         19 7

  l
  e                         our         a e ure
El fournira un code de re t é galà 0 si l lct a fini par about e t à -1 l q ue l lct n'a pas pu about dans l
                                                              ir        ors    a e ure               ir    e
nom bre d'essais im partis.

             es               s                              à ge s
Com m e dans l deux pré cédent e xe rcice s , on fe ra appe l f t associé e à sscanf.



       e
Exe m pls

   donnez un nombre entier : huit
   ** réponse incorrecte - redonnez-la : 8
   -- merci pour 8

                    ____________________

   donnez un nombre entier : un
   ** réponse incorrecte - redonnez-la                :   deux
   ** réponse incorrecte - redonnez-la                :   trois
   ** réponse incorrecte - redonnez-la                :   quatre
   ** réponse incorrecte - redonnez-la                :   cinq
   -- nombre d'essais dépassé

________________________________________________________________________________________



ANALYSE


 e
L m e s s age à im prim e r s e ra t                        'adresse d'une ch aî . L fonct affich e ra ce m e s s age dè s son
                                    ransm is sous form e de l                  ne a       ion
     .           e        ra
appe l Son cont nu de v donc ê t :    re

                                 ie
          donne z un nom bre e nt r :
     'appe l ial l fonct (ré al dans l program m e principal e t :
dans l      init de a   ion   isé    e                     ),

           *                    e
          * ré pons e incorre ct - re donne z -a :
     'appe l l fonct par e l -m ê m e e n cas de ré pons e incorre ct .
dans l      de a    ion    le                                        e

                       e                       s,   e ransm e t ra par v e ur e t on s'arrange ra pour faire décroî s a
En ce q ui conce rne l nom bre m axim ald'appe l on l t        t        al                                        tre
 al                         .
v e ur de 1 à ch aq ue appe l

 a         it          s             ors
L ré cursiv é des appe l ce s s e ra l q ue l
                                            'une des deux condit         ant
                                                                ions suiv e s s e ra sat      e
                                                                                        isfait :

      al ue           e               ors          al
   - v e ur l corre ct - on fournira al 0 com m e v e ur de re tour,
19 8                       angage C
           Exe rcice s e n l
    - nom bre m axim al         s                          ors           al
                         d'appe l dépas s é - on fournira al -1 com m e v e ur de re tour.



Program m e

   #include <stdio.h>
   #define LG_LIG 20                /* longueur maxi information lue au clavier */
   main()
   {
      int lecture (char *, int *, int) ; /* proto fonction (récursive) de lecture */
      int n ;                             /* entier à lire */
      const nessais = 5 ;                 /* nombre d'essais autorisés */

       if ( lecture ("donnez un nombre entier : ", &n, nessais) != -1)
              printf ("-- merci pour %d", n) ;
         else printf ("-- nombre d'essais dépassés") ;
   }

   int lecture (char * mes, int * p, int nmax)
                     /* mes : adresse message à afficher avant lecture */
                     /* p : adresse de la valeur à lire                */
                     /* nmax : nombre d'essais autorisés               */
   {
      int compte ;              /* compteur du nb de valeurs OK */
      char ligne [LG_LIG] ;     /* pour lire une ligne au clavier par fgets */

       printf ("%s", mes) ;
       fgets (ligne, LG_LIG, stdin) ;
       compte = sscanf (ligne, "%d", p) ;
       if (!compte)
            if (--nmax)
                return (lecture ("** réponse incorrecte - redonnez la : ",
                                  p, nmax) ) ;
              else return (-1) ;
         else return (0) ;
   }



          aire
Com m e nt s

        ons                              e
*Nous av ch oisi ici de faire affich e r l m e s s age :

          nom bre d'e s s ais dépassé
                                                                                                   I.         it
                                                                                                  V R é cursiv é         19 9

     e                     . s'agit l d'un ch oix arbit
dans l program m e principal Il     à                                                out            e
                                                       raire puis q ue nous aurions t aussi bien pu l faire affich e r par
 a     ion l e
l fonct e l -m ê m e .




                                                   I
                                                  V-4 Puis s ance e ntiè re

________________________________________________________________________________________

Enoncé
                                                                    k
                 ion          e        t
Ecrire une fonct ré cursiv pe rm e t ant de cal e r l v e ur de x pour x ré e lq ue l ue e t k e nt r re l if q ue l ue .
                                              cul a al                              conq           ie    at        conq
        oit    e           é       ant
O n e xpl e ra ls proprié t s s uiv e s :
        0
       x = 1,
        k
       x =x        pour k = 1,
        -k             k
       x = 1 /x             pour k positif,
        k       k -1
       x = (x      )x                    if
                             pour k posit im pair,
        k       k /2
       x = (x      )x                    if
                             pour k posit pair.
      e e        t       ion 'aide d'un program m e principalpe rm e t ant à l il e ur de fournir e n donné e s ls v e urs de
O n t s t ra ce t e fonct à l                                         t      'ut isat                           e al
x e t de k .



       e
Exe m pls

   donnez une valeur réelle : 4
   donnez une puissance entière : -2
   4.000000e+000 à la puissance -2 = 6.250000e-002

                           _______________________


   donnez une valeur réelle : 5.2
200                       angage C
          Exe rcice s e n l
   donnez une puissance entière : 3
   5.200000e+000 à la puissance 3 = 1.406080e+002

________________________________________________________________________________________



ANALYSE


 'é             e
L noncé fournit ls "définit              e           oye
                           ions ré cursiv s " à e m pl r.



Program m e


   #include <stdio.h>

   main()
   {
      double puissance(double, int) ;              /* proto fonction d'élévation à la puissance */
      double x ;                                   /* valeur dont on cherche la puissance neme */
      int n ;                                      /* puissance à laquelle on veut élever x */

       printf ("donnez une valeur réelle : ") ;
       scanf ("%le", &x) ;
       printf ("donnez une puissance entière : ") ;
       scanf ("%d", &n) ;
       printf ("%le à la puissance %d = %le", x, n, puissance (x, n) ) ;
   }

   double puissance (double x, int n)
   {
      double z ;

       if (n < 0) return (puissance (1.0/x, -n) ) ;             /* puissance négative */
       else if (n == 0) return (1) ;                            /* x puissance 0 égale 1 */
       else if (n == 1) return (x) ;                            /* x puissance 1 égale x */
       else if (n%2 == 0)
          { z = puissance (x, n/2) ;                            /* puissance paire */
            return (z*z) ;
          }
       else return (x * puissance (x, n-1) ) ;                  /* puissance impaire */
                                                                                                   I.         it
                                                                                                  V R é cursiv é         201

   }



          aire
Com m e nt s

  e              e
Il s t pré fé rabl d'écrire :

   z = puissance (x, n/2) ;
   return (z*z) ;

 ut
pl ôt q ue :

   return (puissance (x,n/2) * puissance (x,n/2) ) ;

                           us       s    a      ion
q ui produirait deux fois pl d'appe l de l fonct puissance .




                                        I
                                       V-5 Fonction d'A ck e rm ann

________________________________________________________________________________________


Enoncé

                ion       e  cul a al          a
Ecrire une fonct ré cursiv cal ant l v e ur de l fonct                                               ie       ifs
                                                      ion d'Ack e rm ann, dé finie pour m e t n, e nt rs posit ou
   s,
nul par :

       A(m ,n) = A(m -1, A(m ,n-1) ) pour m > 0 e t n> 0,
       A(0,n) = n+ 1 pour n> 0,
       A(m ,0) = A(m -1,1) pour m > 0.
    t       ion                       e al                                           t a al
                                                                                      at                            e
Ce t e fonct possédera e n argum e nt ls v e urs de m e t de n et fournira e n ré s ul l v e ur de A corre s pondant .

On v  isual      'e
           isera l m pilm e nt des appe l e t lur dé pilm e nt e n affich ant un m e s s age accom pagné de l v e ur des deux
                        e               s      e       e                                                    a al
          s ors                 rée
argum e nt l de ch aq ue e nt dans l fonct a                       ust
                                                  ion ainsi que j e av                    ie
                                                                            ant sa sort (dans ce dernie r cas, on affich e ra
    e        a al         a      ion          e
é galm e nt l v e ur q ue l fonct s'apprê t à re t  ourne r).

     e e         t       ion 'aide d'un program m e principal ue l fournira e n donné e s ls v e urs de m e t de n.
O n t s t ra ce t e fonct à l                                auq  on                      e al
202                     angage C
        Exe rcice s e n l
       e
Exe m pl

  valeurs de m et     n ?   : 1 1
  ** entrée Acker     (1,   1)
  ** entrée Acker     (1,   0)
  ** entrée Acker     (0,   1)
  -- sortie Acker     (0,   1) = 2
  -- sortie Acker     (1,   0) = 2
  ** entrée Acker     (0,   2)
  -- sortie Acker     (0,   2) = 3
  -- sortie Acker     (1,   1) = 3


  Acker (1, 1) = 3

________________________________________________________________________________________



Program m e

  #include <stdio.h>

  main()
  {
     int m, n, a ;
     int acker (int, int) ;          /* prototype fonction de calcul fonction d'Ackermann */

      printf ("valeurs de m et n ? : ") ;
      scanf ("%d %d", &m, &n) ;
      a = acker (m, n) ;
      printf ("\n\nAcker (%d, %d) = %d", m, n, a) ;
  }

              /***********************************************************/
              /* fonction récursive de calcul de la fonction d'Ackermann */
              /***********************************************************/

  int acker (int m, int n)
  {
     int a ;           /* valeur de la fonction */

      printf ("** entrée Acker (%d, %d)\n", m, n) ;
                                                                                                    I.         it
                                                                                                   V R é cursiv é         203

       if (m<0 || n<0)
            a = -1      ;                         /* cas arguments incorrects */
       else if (m == 0)
            a = n+1 ;
       else if (n == 0)
            a = acker (m-1, 1) ;
       else
            a = acker (m-1, acker(m, n-1) ) ;
       printf ("-- sortie Acker (%d, %d) = %d\n", m, n, a) ;
       return (a) ;
   }




                                               I
                                              V-6 Tours d e H anoi

________________________________________________________________________________________


Enoncé

     iser       ion       e
R é al une fonct ré cursiv proposant une s ol ion au problm e dit des t
                                            ut           è                             e      s'é
                                                                       ours de H anoi, lq ue l nonce ainsi :

   O n dispose de t               s,           é                              ailes         e             ,
                    rois piq ue t num é rot s 1, 2 e t 3 e t de n disques de t l diffé re nt s . Au départ ces disques sont
          é      ail e
   e m pils par t l décroissant s ur l piq ue t num é ro 1. L but du j u e s t de dépl r ce s n disq ues du piq ue t num é ro 1
                                     e       e                   e       e           ace
        e                                   ant e
   sur l piq ue t num é ro 3, e n re s pe ct ls cont     e       ant
                                                    raint s s uiv e s :
                  ace
       - on ne dépl q u'un s e ul         a                             re
                                 disque à l fois (d'un piq ue t à un aut ),
                             am      re acé                         us   it    ui.
       - un disq ue ne doit j ais ê t pl au-de s s us d'un disq ue pl pet q ue l
     e e         t       ion e                                  t                               e          ot
O n t s t ra ce t e fonct av c un program m e principalpe rm e t ant de ch oisir, e n donné e , l nom bre t alde disques à
    ace
dépl r (n).

Si v         e           iaris      e
    ous n'ê t s pas fam il é av c ce t     ype de problm e , nous v
                                                         è                     l de t nt r t
                                                                   ous cons e ilons                     e
                                                                                     e e out d'abord de l ré s oudre
       le         ant                              a       ion
m anue l m e nt av de ch e rch e r à program m e r l fonct de m andé e .



       e
Exe m pl

   combien de disques ? 4
   déplacer un disque de 1 en 2
204                        angage C
           Exe rcice s e n l
   déplacer     un   disque    de   1   en   3
   déplacer     un   disque    de   2   en   3
   déplacer     un   disque    de   1   en   2
   déplacer     un   disque    de   3   en   1
   déplacer     un   disque    de   3   en   2
   déplacer     un   disque    de   1   en   2
   déplacer     un   disque    de   1   en   3
   déplacer     un   disque    de   2   en   3
   déplacer     un   disque    de   2   en   1
   déplacer     un   disque    de   3   en   1
   déplacer     un   disque    de   2   en   3
   déplacer     un   disque    de   1   en   2
   déplacer     un   disque    de   1   en   3
   déplacer     un   disque    de   2   en   3

________________________________________________________________________________________



ANALYSE


          a ut
Pour n=1, l sol ion e s t é v     e il            ace 'uniq ue disque du piquet num é ro 1 au piq ue t num é ro 3.
                             ident ; suffit de dépl r l

                                                                                  il   e                                  ock
D è s q ue n e s t supérieur à 1, on re m arq ue q u'il e s t né ce s s aire d'ut iser l piq ue t num é ro 2 pour de s s t age s
    e                                         e     è             e           ace                                  e
int rm édiaire s . O n pe ut considérer que l problm e consist à dépl r n disques du piquet num é ro 1 v rs l piq u e t  e
                     il      e                                            e                          re         t
num é ro 3, e n ut isant l piq u e t num é ro 2 com m e piq u e t int rm é diaire . O n pe ut m ont r q ue ce t e opé rat  ion s e
décom pos e e n t rois opérat       us      e
                              ions pl sim pls :

         ace e                                                     e   e                      pe         t
   - dépl r ls n-1 disq ue s s upé rie urs du piq ue t num é ro 1 v rs l piq ue t num é ro 2 ; ndant ce t e ph as e , on pe ut
     il    e                                         e
   ut iser l piq ue t num é ro 3 com m e piq ue t int rm édiaire ,
        ace e                                       e e                         l                     il    e
   - dépl r ls n-1 disq ues du piq ue t num é ro 2 v rs l piq ue t num é ro 3 ;à e ncore , on pe ut ut iser l piq ue t num é ro 1
                       e            e            ial
   com m e piq ue t int rm édiaire (l disque init e m e nt pré s e nt sur ce piq ue t é t     us
                                                                                         ant pl grand q ue t       es
                                                                                                             ous l disques à
       ace
   dépl r).
   a                a     isat             ion       e                            s
Ce l nous conduit à l ré al ion d'une fonct ré cursiv possédant com m e argum e nt :

     e                         ace
   - l nom bre de disques à dépl r,
     e
   - l num é ro du piq ue t "de départ",
     e                              é
   - l num é ro du piq ue t "d'arriv e ",
     e                          e
   - l num é ro du piq ue t "int rm édiaire ".
                                                                         I.         it
                                                                        V R é cursiv é   205

Program m e

  #include <stdio.h>

  main()
  {
     void hanoi (int, int, int, int) ;
     int nd       ;            /* nombre total de disques */

      printf ("combien de disques ? ") ;
      scanf ("%d", &nd) ;
      hanoi (nd, 1, 3, 2) ;
  }

            /***********************************************/
            /* fonction résolvant le pb des tours de hanoi */
            /***********************************************/
  void hanoi (int n, int depart, int but, int inter)
                       /* n      : nombre de disques à déplacer */
                       /* depart : tour d'où l'on part */
                       /* but    : tour où l'on arrive */
                       /* inter : tour intermédiaire */
  {
     if (n>0)
         { hanoi (n-1, depart, inter, but) ;
           printf ("déplacer un disque de %d en %d\n", depart, but) ;
           hanoi (n-1, inter, but, depart) ;
         }
  }
                                              I
                                             VI : TRA ITEM ENT D E
                                                    I ERS
                                                   F CH I




 e                           re ous                       e   assiques de t e m e nt de fich ie rs corre s pondant à diffé re nt
L s e xe rcices de ce ch apit v fournis s e nt des exe m pls cl            rait                                                 s
       s
aspect :

      rait                 ie ,
   - t e m e nt s é q ue nt l
   - accè s direct,
   - fich ie rs de t     e e
                    ype t xt .




                                   I-1                       le
                                  VI Cré ation s é q ue ntie l de fich ie r

________________________________________________________________________________________


Enoncé

Ecrire un program m e de créat                  iele                    ant
                                   ion séquent l d'un fich ie r com port , pour un ce rt                             e
                                                                                        ain nom bre de pe rsonne s , ls
inform at         ant                  av
         ions suiv e s , fournie s au cl ie r :

                                è
   - nom (au m axim um 20 caract re s ),
   - â ge ,
   - nom bre d'enfants,
                                    s       s on                                       re        'â
   - â ge de ch acun des diffé re nt e nfant ; ne dem ande ra (e t donc on n'e nre gist ra) q ue l ge des 15 pre m ie rs e nfants
           e                          e                          re
   (m ais l nom bre figurant dans l ch am p pré cédent pourra ê t s upé rie ur à 15).
 'ut isat
L il e ur fournira un nom "v               e        n'a us                        re
                            ide" pour signalr q u'il pl de personne s à e nre gist r.
208                        angage C
           Exe rcice s e n l
O n ne pré v                 rôl    icul      e      a
            oira aucun cont e part ie r au niv au de l saisie des données


       e
Exe m pl

   donnez le nom du fichier à créer : person
   ----- pour terminer la saisie, donnez un nom 'vide' ---
   nom             : dubois
   age             : 32
   nombre enfants : 1
   age enfant no 1 : 7

   nom                    : dunoyer
   age                    : 29
   nombre enfants         : 0

   nom                    :   dutronc
   age                    :   45
   nombre enfants         :   3
   age enfant no 1        :   21
   age enfant no 2        :   18
   age enfant no 3        :   17

   nom                    :

     -------- FIN CREATION FICHIER ----------

________________________________________________________________________________________



ANALYSE


  a ruct                           re                          e      'é                   ,                        a
L st ure de ch aq ue e nre gist m e nt du fich ie r dé coul de l noncé . Ce pe ndant e n ce q ui conce rne l m aniè re de
             e e                               ons               a                  'abs                è
re pré s e nt r l nom des personne s , nous dev décide r de l pré s e nce ou de l e nce du caract re de fin de ch aî (\0).ne
                ons              it
Ici, nous av ch oisi, par facil é , d'int   roduire ce caract re , ce q ui im pl ue q ue l zone corre s pondant s oit de l
                                                             è                 iq        a                     e         ongue ur
21.

                re                 il       e
Pour cré e r not fich ie r, nous ut iserons ls fonct           e
                                                    ions de niv au 2, c'e s t -dire ici f n e t f rit . R appe l q ue ce l s -
                                                                             -à          ope     w e           ons       le
    rav l  e      e           e
ci t ail nt av c un point ur sur une s t ure de t
                                           ruct               E
                                                      ype FIL (prédéfini dans st              a al                e
                                                                                    dio.h ). L v e ur de ce point ur nous e s t
              ope   ce t        ion     it         e        e
fournie par f n ; t e fonct re s t ue un point ur nul n cas d'erreur d'ouv rt .    e ure

 a      ion                  e      e                e e
L cré at du fich ie r consist s im plm e nt à ré pé t r ls actions :
                                                                               II.   e           ich
                                                                              V Trait m e nt de f ie rs   209

     e ure
   - lct d'inform at         av
                    ions au cl ie r,
           ure
   - é crit de ce s inform at          e
                             ions dans l fich ie r.
    t         it           re e            a         re
Ce t e ré pé t ion doit ê t int rrom pue à l re ncont d'un nom vide.


Program m e

   #include <stdio.h>
   #include <string.h>
   #include <stdlib.h>
   #define LGNOM 20                                   /* longueur maxi d'un nom */
   #define NBENFMAX 15                                /* nombre maxi d'enfants */
   #define LNOMFICH 20                                /* longueur maxi nom de fichier */

   main()
   { char nomfich [LNOMFICH+1] ;                      /* nom du fichier à créer */
      FILE * sortie ;                                 /* descripteur fichier (niveau 2) */
      struct { char nom [LGNOM+1] ;
                int age ;                             /* description d'un enregistrement */
                int nbenf ;                                   /* du fichier */
                int agenf [NBENFMAX] ;
              } bloc ;
      int i ;

                 /* ouverture fichier à créer */
                 /* attention : mode d'ouverture w au lieu de wb dans certains cas */
       printf ("donnez le nom du fichier à créer : ") ;
       gets (nomfich) ;
       if ( (sortie = fopen (nomfich, "w")) == NULL )
          { printf ("***** erreur ouverture - abandon programme") ;
            exit(-1) ;
          }

                 /* création du fichier à partir d'informations */
                         /* fournies au clavier */
       printf ("----- pour terminer la saisie, donnez un nom 'vide' ---\n") ;
       do
          { printf ("nom              : ") ;                   /* saisie nom */
            gets (bloc.nom) ;
            if ( strlen(bloc.nom) == 0) break ; /* sortie boucle si nom vide */
            printf ("age              : ") ;
            scanf ("%d", &bloc.age) ;                          /* saisie age */
210                        angage C
           Exe rcice s e n l
                 printf ("nombre enfants : ") ;
                 scanf ("%d", &bloc.nbenf) ;                 /* saisie nb enfants                                */
                 for (i=0 ; i < bloc.nbenf && i < NBENFMAX ; i++)
                    { printf ("age enfant no %d : ", i+1) ;     /* saisie age des                                */
                      scanf ("%d", &bloc.agenf[i]) ;        /* différents enfants                                */
                    }
                 getchar() ;                                  /* pour éliminer \n                                */
                 printf ("\n") ;
                 fwrite (&bloc, sizeof(bloc), 1, sortie) ;    /* écriture fichier                                */
           }
        while (1) ;

                  /* fin création */
        fclose(sortie) ;
        printf ("\n -------- FIN CREATION FICHIER ----------") ;
   }




          aire
Com m e nt s


    e e              e ure
*Not z l "m ode d'ouv rt " w b :

          e ure         ure si e               e       e                e    e                  e
   w : ouv rt e n é crit ; l fich ie r n'e xist pas, il s t cré é . S'il xist , son ancie n cont nu e s t pe rdu.
   b : m ode dit "binaire " ou "non t    at
                                     ransl é ".
En fait l            ion        ust             e       é
          , 'indicat b ne s e j ifie q ue dans ls im plm e nt ions q ui dist
                                                                at                       e                e e          re
                                                                               ingue nt ls fich ie rs de t xt des aut s . Une t l       e
                                                                                                                                      e l
    inct               iv      e          e
dist ion e s t m ot é e par l fait q ue l caract re de fin de l
                                                  è                igne (\n) possè de, sur cert           è                        at
                                                                                                ains syst m e s , une re pré s e nt ion
     icul          e        a                             è        a                    it e                e
part iè re obt nue par l succe s s ion de deux caract re s . L pré s e nce de b é v e l ris q ue q ue l fich ie r conce rné s oit
considéré com m e un fich ie r de t      e e                               e      at                  é             es
                                    ype t xt , ce q ui am è ne rait une int rpré t ion non souh ait e d e s coupl de caract re s    è
             ant          igne
re pré s e nt une fin de l .


*Ici, nous av                 a       ion               ot                   dl              e          e
             ons fait appe là l fonct e xit (son prot ype figure dans st ib.h ) pour int rrom pre l program m e e n cas
              e ure
d'erreur d'ouv rt du fich ie r. Il        à
                                  s'agit l d'un ch oix arbit                                      'ut isat
                                                            raire . Nous aurions pu de m ande r à l il e ur de propos e r un
   re
aut nom de fich ie r.


                      a     e
*En ce q ui conce rne l boucl de cré ation du fich ie r, nous av               a                                     e
                                                                ons ch oisi de l program m e r sous form e d'une boucl
infinie :

            do
                   .......
                   .......
                                                                                            II.   e           ich
                                                                                           V Trait m e nt de f ie rs         211

            while (1) ;

             e                             un                                e
q ue nous int rrom pons au m om e nt opport par bre ak . Nous aurions pu é galm e nt ch oisir d'int        e
                                                                                                   roduire ls pre m iè re s
    ruct        a      e
inst ions de l boucl dans l xpre s s ion condit
                              'e                               ruct      e         t
                                               ionnant une inst ion w h il, de ce t e m aniè re :

   while (printf("nom                      : "), gets(bloc.nom), strlen(bloc.mot) )

                 u       'é                rôl    icul                ué     es                       ue
*Com m e pré v par l noncé , aucun cont e part ie r n'e s t e ffe ct s ur l données qui sont donc l s par scanf e t
    s. à                      e  è
ge t L e ncore s e pos e l problm e d'ignore r l \n q ui subsist aprè s une lct par scanf ce q ui im pose d'int
                                                e               e           e ure        ,                      roduire
art       le                ruct    ch
   ificie l m e nt une inst ion ge t ar (pour pl de dét s sur ce problm e , v z ls com m e nt
                                               us       ail              è     oye e                   'e
                                                                                             aires de l xe rcice V -3).


        ons    a      ion      ure   e             w e                         s
*R appe l q ue l fonct d'é crit dans l fich ie r (f rit ) possè de 4 argum e nt :

   -L                                   e     ocs             e
       'adresse de début d'un e ns e m bl de bl à é crire (not z bie n l not ion & bl e t non sim plm e nt bl dans l
                                                                        a       at        oc                e       oc,  a
                e              ruct               al                                      a       e              abl
   m e s ure où l nom d'une s t ure désigne sa v e ur e t non son adre s s e , com m e ce l e s t l cas pour un t e au).
      a aile     oc.  e
   - L t l d'un bl Not z q u'ici nous av ut isé l fonct size of ce q ui assure l port it du program m e .
                                        ons il a       ion     ,               a     abil é
      e            ocs      t aile
   - L nom bre de bl de ce t e t l à é crire (ici, 1).
   -L            a ruct         ant e           le     é             ope
     'adresse de l st ure décriv l fich ie r (e l a é t fournie par f n).



DI      O
  SCUSSI N


                                      e
*Ce program m e n'e xam ine pas l code de re t               w e e                    e
                                                    our de f rit , lq ue lpré cis e l nom bre de bl ré e l m e nt é crit dans l
                                                                                                    ocs    le           s       e
                         ant                              é                        ure
fich ie r (ce nom bre é t infé rie ur au nom bre s ouh ait e n cas d'erreur d'écrit ). Il       out        e
                                                                                          faut t e fois not r, à ce propos, q ue ,
          e     ,
gé né ralm e nt un ce rt                                                     e      è                  ors ui-m
                          ain nom bre d'erreurs sont "ré cupé ré e s " par l syst m e q ui affich e al l ê m e s on propre
m e s s age .


         e
*Com m e l pré v       'é                                        é        e ue le             e
                oyait l noncé , ce program m e n'e s t pas prot gé d'év nt l s e rre urs dans ls ré pons e s fournie s par
'ut isat      it          if, oici q ue lue s s it ions q ue l pe ut re ncont r :
l il e ur. A t re indicat v             q         uat        'on             re

          'ut isat                                     us           è
   - Si l il e ur fournit un nom de fich ie r de pl de 20 caract re s , ily aura é cras e m e nt d'inform ations e n m é m oire .
                     out                  e                       è          t                    e NO
   Ici, ils e rait t e fois as s e z facil de re m édier à ce problm e e n at ribuant au sym bol L M FICH une v e ur       al
                                        è         'on                    av        'im é       at
   supérieure au nom bre de caract re s q ue l pe ut frappe r au cl ie r dans l plm e nt ion conce rné e . O n pourrait
        e        ire                        è
   é galm e nt l un nom bre de caract re s l it s e n ut isant au l u de ge t (nom f ), l ruct :
                                               im é        il ,       ie        s     ich 'inst ion
         fgets (nomfich, LNOMFICH, stdin) ;

      e out                            e        è          é
   Not z t e fois q ue , dans ce cas, ls caract re s s upplm e nt s frappé s é v nt l m e nt par l il e ur sur l m ê m e
                                                                 aire           e ue l e         'ut isat      a
    igne                           e                       ruct       e ure      'e ré
   "l " s e raie nt pris e n com pt par une proch aine inst ion de lct s ur l nt e s t   andard.
212                          angage C
             Exe rcice s e n l
               aine          é     at         am                      and                              e      e
   D ans ce rt s im plm e nt ions (not m e nt Turbo/Borl C e t C/Quick C M icrosoft), ile s t possibl de ré glr
           è e         e       è         il      'inst ion
   com plt m e nt l problm e e n ut isant l ruct cge t q ui a l m é rit de l it r, non s e ulm e nt l nom bre de
                                                                     s         e        e     im e e e
         è                       e          e                    iv                       av
   caract re s pris e n com pt , m ais é galm e nt ce ux e ffe ct e m e nt frappé s au cl ie r.
         'ut isat             us           è
   - Si l il e ur fournit pl de caract re s q ue n'e n at e nd scanf ce ux-ci s e ront ut isés (av c pl ou m oins de
                                                          t         ,                    il       e   us
                        e ure s uiv e . L e ncore , l problm e ne pe ut ê t conv nablm e nt ré gl q ue d'une faç
   bonh e ur) par une lct          ant   à          e       è              re       e     e         é             on
                     'im é      at                e   e
   dépendant de l plm e nt ion, par e xe m pl av c l fonct a               s                  t               )   é
                                                                  ion cge t (associé e , ce t e fois, à sscanf cit e
   pré cédem m e nt.
          'ut isat                       è                      à
   - Si l il e ur fournit des caract re s non num é riq ue s l où scanf at e nd des ch iffre s , l ré s ul de l lct s e ra
                                                                            t                     e       tat     a e ure
   arbit         l                               ra               ne e e    e            our                         e
         raire ;e program m e ne s 'e n ape rce v pas puisq u'il t s t pas l code de re t de scanf (q ui fournit l nom bre
        al            iv         ue          us, à
   de v e urs e ffe ct e m e nt l s ). De pl l e ncore , ls caract re s non t é s s e ront re pris par une lct ul rie ure .
                                                           e          è        rait                           e ure t  é
     e                       , à             re     u
   L pre m ie r point pe ut l e ncore , ê t ré s ol par l m pl de sscanf associé à f t (..., st
                                                           'e      oi        ,            ge s                  à
                                                                                                         din). L e ncore , dans
        aine       é     at
   ce rt s im plm e nt ions, cge t (associé e à sscanf pe rm e t de ré glr t alm e nt l problm e .
                                      s                 )                e ot e        e        è



                                    I-2 is               le
                                   VI L te s é q ue ntie l d'un fich ie r

________________________________________________________________________________________


Enoncé

       iser                       t                          e                              re     s                  ogue à ce ux
R é al un program m e pe rm e t ant d'affich e r succe s s iv m e nt ch acun de s e nre gist m e nt d'un fich ie r anal
              e                     . e                        e                     re          a
cré é s par l program m e pré cédent L program m e pré s e nt ra un s e ule nre gist m e nt à l fois, accom pagné d'un num é ro
                             e              t          e                                     re       il t              'ut isat
pré cisant son rang dans l fich ie r (on at ribue ra l num é ro 1 au pre m ie r e nre gist m e nt) ; at e ndra q ue l il e ur
frappe l t               urn ant            'e        re           ant
            a ouch e re t av de pas s e r à l nre gist m e nt suiv .

L 'affich age des inform at                   isé
                              ions s e ra ré al par une fonction à l ue l on t
                                                                     aq l e                 t                 'e        re
                                                                                  ransm e t ra e n argum e nt l nre gist m e nt à
                              e         e         a ruct                  e                   ui,              e
affich e r e t son num é ro. L m odè l m ê m e de l st ure corre s pondant s e ra, q uant à l dé fini à un niv au gl .obal

 e               ra             'e    e                   ist
L program m e dev s'assure r de l xist nce du fich ie r à l e r.



       e
Exe m pl

   donnez le nom du fichier à lister : person

   enregistrement numéro : 1

   NOM                        : dubois
   AGE                        : 32
   NOMBRE D'ENFANTS           : 1
                                                                II.   e           ich
                                                               V Trait m e nt de f ie rs   213

  AGE ENFANT   1        :    7


  enregistrement numéro : 2

  NOM                   : dunoyer
  AGE                   : 29
  NOMBRE D'ENFANTS      : 0


  enregistrement numéro : 3

  NOM                   :   dutronc
  AGE                   :   45
  NOMBRE D'ENFANTS      :   3
  AGE ENFANT 1          :   21
  AGE ENFANT 2          :   18
  AGE ENFANT 3          :   17


   -------- FIN LISTE FICHIER ----------

________________________________________________________________________________________




Program m e


  #include <stdio.h>
  #include <string.h>

  #define LGNOM 20                    /* longueur maxi d'un nom */
  #define NBENFMAX 15                 /* nombre maxi d'enfants */
  #define LNOMFICH 20                 /* longueur maxi nom de fichier */

  struct enreg { char nom [LGNOM+1] ;
                 int age ;
                 int nbenf ;
                 int agenf [NBENFMAX] ;
               } ;
214                        angage C
           Exe rcice s e n l
  main()
  {
     void affiche (struct enreg *, int) ;         /*   fonction d'affichage */
     char nomfich [LNOMFICH+1] ;                  /*   nom du fichier à lister */
     FILE * entree ;                              /*   descripteur fichier (niveau 2) */
     struct enreg bloc ;                          /*   enregistrement fichier */
     int num ;                                    /*   numéro d'enregistrement */




                     /* ouverture fichier à lister */
                     /* attention : mode d'ouverture : r au lieu de rb dans certains cas */
      do
         { printf ("donnez le nom du fichier à lister : ") ;
           gets (nomfich) ;
           if ( (entree = fopen (nomfich, "rb")) == 0 )
                 printf ("fichier non trouvé\n") ;
         }
      while (!entree) ;

                /* liste du fichier */
      num = 1 ;
      while (fread(&bloc, sizeof(bloc), 1, entree), ! feof(entree) )
         { affiche (&bloc, num++) ;
           getchar() ;                 /* attente frappe "return" */
         }

                /* fin liste */
      fclose(entree) ;
      printf ("\n\n -------- FIN LISTE FICHIER ----------") ;
  }

              /*************************************************/
              /*   fonction d'affichage d'un enregistrement    */
              /*************************************************/

  void affiche (struct enreg * bloc, int num)
  {
     int i ;
     printf ("\n\nenregistrement numéro : %d\n\n", num) ;
     printf ("NOM                : %s\n", bloc->nom) ;
     printf ("AGE                : %d\n", bloc->age) ;
     printf ("NOMBRE D'ENFANTS   : %d\n", bloc->nbenf) ;
     for (i=0 ; i < bloc->nbenf && i < NBENFMAX ; i++)
                                                                                       II.   e           ich
                                                                                      V Trait m e nt de f ie rs        215

            printf ("AGE ENFANT %2d                 : %2d\n", i+1, bloc->agenf[i]) ;
   }




          aire
Com m e nt s


    e e             e ure
*Not z l m ode d'ouv rt rb :

          e ure   e ure    e                   e      ope                e     .
   r : ouv rt e n lct . Si l fich ie r n'e xist pas, f n fournit un point ur nul
           e ure e n m ode "binaire " ou "non t
   b : ouv rt                                         at            us
                                                 ransl é " (pour pl d'inform at         a                  re e
                                                                               ions sur l diffé re nce e nt ls m ode s
   t    at
    ransl é e t non t    at oye e
                     ransl é , v z ls com m e nt          'e
                                                aires de l xe rcice VII-1).


        ons    a      ion e ure re                      s,        e              w e
*R appe l q ue l fonct de lct f ad possè de 4 argum e nt com parabls à ce ux de f rit :

    'adresse de début d'un e ns e m bl de bl à l ,
   -l                                e     ocs ire
     a aile      oc        e s),
   - l t l d'un bl (e n oct t
     e             ocs      t aile ire
   - l nom bre de bl de ce t e t l à l ,
    'adresse de l st ure décriv l fich ie r (e l a é t fournie par f n).
   -l           a ruct         ant e           le     é             ope


    a       ion e           a al      rai       ors
*L fonct f of pre nd l v e ur v (1) l q ue l fin de fich ie r a é t e ffe ct e m e nt re ncont e . Aut m e nt dit ilne
                                                         a                é         iv              ré     re        ,
                      e e a                          oir     e     u                    e il ,         us,
suffit pas, pour dé t ct r l fin d'un fich ie r, d'av sim plm e nt l son dernier oct t ; e s t de pl né ce s s aire d'avoir
 e é      ire       à
t nt de l au-de l. C'e s t ce q ui j ifie q ue ce t e condit soit e xam iné e aprè s f ad e t non av .
                                    ust             t       ion                       re            ant


     oye a       on             ons               a
*V z l faç dont nous av program m é l boucl de lct des diffé re nt e nre gist m e nt du fich ie r. Ce l nous
                                                          e    e ure s       re     s                 a
   it          ie                 e
é v e une s ort e n cours de boucl par bre ak , com m e dans :


       do
         { fread (&bloc, sizeof(bloc), 1, entree) ;
           if (feof(entree)) break ;
           affiche (&bloc, num++) ;
           getchar() ;
         }
       while (1) ;


       e        é
ou un t s t supplm e nt          a     e
                       aire dans l boucl com m e dans :
216                         angage C
            Exe rcice s e n l

       do
          { fread (&bloc, sizeof(bloc), 1, entree) ;
            if (!feof(entree))
               { affiche (&bloc, num++) ;
                 getchar ;
               }
          }
       while (!feof(entree)) ;



DI      O
  SCUSSI N


                                e             our  re
*Ce program m e n'e xam ine pas l code de re t de f ad (ce l
                                                           ui-ci pré cis e l nom bre de bl ré e l m e nt l
                                                                           e             ocs    le       us).


    re                           é       re a      ure  'ut isat                            us            è
*Not program m e n'e s t pas prot gé cont l fournit par l il e ur d'un nom de fich ie r de pl de 20 caract re s .
 oye a                'e
V z l discussion de l xe rcice pré cédent .


    e            'e       re           ant
*L passage à l nre gist m e nt suiv e s t déclnch é par l frappe de re t
                                                    e           a                              'ut isat                usieurs
                                                                                 urn. M ais si l il e ur frappe un ou pl
       è      al
caract re s (v idés par re t         e
                            urn), ilv rra dé filr pl
                                               e                      re      s         e a ut                 è
                                                      usieurs enregist m e nt de suit . L sol ion à ce problm e dépe nd, ici
             'im é       at                 e
e ncore , de l plm e nt ion. Par e xe m pl, dans un env                               e             and
                                                              ironne m e nt D O S, av c Turbo/Borl C/C+ + ou Quick C/C
M icrosoft, ilsuffira de "v      e am             è
                           ider l t pon du syst m e " par :

            while (kbhit()) getch ;

  ant         t e
av ch aq ue at e nt .




                                          I-3
                                         VI Corre ction de fich ie r

________________________________________________________________________________________


Enoncé

     iser                      t             ue
R é al un program m e pe rm e t ant d'effe ct r de s corre ct                         ogue à ce ux cré é s par l program m e de
                                                             ions sur un fich ie r anal                        e
 'e
l xe rcice VII-1.
                                                                                            II.   e           ich
                                                                                           V Trait m e nt de f ie rs          217

  'ut isat                               re                                       e             e
L il e ur dé s igne ra un e nre gist m e nt par son num é ro d'ordre dans l fich ie r. L program m e s 'assure ra de s on
       e
e xist nce e t l                       e
                 'affich e ra d'abord t lq ue lav ant de dem ande r ls m odificat
                                                                     e                       ui          e
                                                                                     ions à l apport r. Ces derniè re s s e ront
         ué                                               e                                   e   a al
e ffe ct e s ch am p par ch am p. Pour ch aq ue ch am p, l program m e e n affich e ra à nouv au l v e ur, puis ildem ande ra à
 'ut isat            re
l il e ur d'e nt r une é v nt l v e ur de re m pl m e nt Si aucune m odificat
                                 e ue l al
                                        e                   ace   .                                             é
                                                                                            ion n'e s t souh ait e , ilsuffira à ce
                               e            a
dernie r de ré pondre direct m e nt par l frappe de re t urn.

O n pré voira de ux fonctions :

              'affich age d'un enregist m e nt (on pourra re pre ndre l fonct af ich e de l xe rcice pré cédent),
   - une pour l                        re                             a      ion f        'e
              a           ion             re
   - une pour l m odificat d'un e nre gist m e nt.


       e
Exe m pl

   donnez le nom du fichier à modifier : person

   numéro enregistrement à modifier (0 pour fin) : 14

   numéro enregistrement à modifier (0 pour fin) : 2


   enregistrement numéro : 2

   NOM                            : dunoyer
   AGE                            : 29
   NOMBRE D'ENFANTS               : 0


   entrez vos nouvelles infos (return si pas de modifs)
   NOM               : Dunoyer
   AGE               :
   NOMBRE D'ENFANTS : 1
   AGE ENFANT 1      : 15

   numéro enregistrement à modifier (0 pour fin) : 0


     -------- FIN MODIFICATIONS FICHIER ----------

________________________________________________________________________________________
218                        angage C
           Exe rcice s e n l
ANALYSE


       ir                'on       e
A part du m om e nt où l souh ait re t rouv r un e nre gist m e nt par son rang dans l fich ie r, ilparaîl ue de ré al
                                            e              re                         e                  t ogiq          iser
                 ".        ons
un "accè s direct R appe l q u'e n l angage C ce lui-ci s'obt nt e n agissant sur l v e ur d'un point ur dans l fich ie r à
                                                              ie                    a al                e          e
l          a       ion s       a e ure e t l crit , q uant à e l s , re s t nt t ours ré al
 'aide de l fonct f e e k . L lct          'é    ure             le        e    ouj                    e
                                                                                           isées par ls fonct         re
                                                                                                                ions f ad e t
 w e
f rit .

  'é                                       rôl
L noncé ne nous im pos e pas de cont e s ur l      'inform at ion l au cl ie r. Né anm oins, nous dev
                                                                   ue        av                                 re
                                                                                                         ons ê t e n m e s ure
            e                 tre        e l
d'acce pt r e t de re connaî com m e t l une "ré pons e v
                                            e               ide". D ans ce s condit                  ons           oye
                                                                                   ions, nous ne pouv pas em pl r scanf
                                        age    e       è
q ui ris q ue rait de conduire à un boucl s ur l caract re \n.

           ut            e        è
Une s ol ion à un t lproblm e consist à l t d'abord l ré ponse de l il e ur sous form e d'une ch aî , ce q ui
                                             e   ire out            a           'ut isat                            ne
                    e       e       e    e
pe rm e t de déce lr conv nablm e nt ls ré pons e s v ides. Si l souh ait une s ol ion dé pe ndant de l plm e nt ion, ce l
                                                               'on       e        ut               e     'im é      at        a
                        e      s,        'on
pe ut s e faire s oit av c ge t soit (si l souh ait l it r l nom bre de caract re s pris e n com pt ) av c f t (..., st
                                                    e im e e                  è                    e    e ge s         din).Ici,
           il           a                     it                                                     è
nous ut iserons l pre m iè re possibil é , e n faisant appe l à une zone de 128 caract re s (dans bon nom bre
         é      at                                   av        igne
d'im plm e nt ions, on ne pe ut pas frappe r au cl ie r de "l s " pl lus ongue s !).

  ors                 ion                t                        ors
L q u'une inform at num é riq ue e s t at e ndue , ilnous suffit al de "décode r" l cont nu de ce t e ch aî . Ce l pe ut s e
                                                                                   e    e          t      ne     a
               e a       ion           ie                              e a       ion andard at Par souci de div rsit ,
faire , soit av c l fonct sscanf assort (ici) d'un form at %d, soit av c l fonct st            oi.                  e é
          ons           a
nous av ch oisi ici l s e conde .



Program m e


   #include <stdio.h>
   #include <string.h>

   #define    VRAI 1                              /*   pour simuler .....       */
   #define    FAUX 0                              /*       ..... des booléens */
   #define    LGNOM 20                            /*   longueur maxi d'un nom */
   #define    NBENFMAX 15                         /*   nombre maxi d'enfants */
   #define    LNOMFICH 20                         /*   longueur maxi nom de fichier */

   struct enreg { char nom [LGNOM+1] ;
                  int age ;
                  int nbenf ;
                  int agenf [NBENFMAX] ;
                } ;

   main()
   {
                                                               II.   e           ich
                                                              V Trait m e nt de f ie rs   219

void affiche (struct enreg *, int) ;      /*   fonction d'affichage */
void modifie (struct enreg *) ;           /*   fonction de modif d'un enreg */
char nomfich [LNOMFICH+1] ;               /*   nom du fichier à lister */
FILE * fichier ;                          /*   descripteur fichier (niveau 2) */
struct enreg bloc ;                       /*   enregistrement fichier */
int num,                                  /*   numéro d'enregistrement */
    horsfich ;                            /*   indicateur "logique" */
long nb_enreg,                            /*   nbre d'enregistrements du fichier */
     pos ;                                /*   position courante (octets) dans fich */

     /* ouverture (en mise à jour) fichier à modifier et calcul de sa taille */
       /* attention, mode d'ouverture r+ au lieu de r+b dans certains cas */

do
   { printf ("donnez le nom du fichier à modifier : ") ;
     gets (nomfich) ;
     if ( (fichier = fopen (nomfich, "r+b")) == 0 )
           printf ("fichier non trouvé\n") ;
   }
while (! fichier) ;

fseek (fichier, 0, 2) ;
nb_enreg = ftell (fichier) / sizeof(bloc) ;

             /* boucle de corrections d'enregistrements */
                 /* jusqu'à demande d'arrêt */
do
      { do
           { printf ("\nnuméro enregistrement à modifier (0 pour fin) : ");
             scanf ("%d", &num) ;
             getchar() ;                   /* pour sauter le dernier \n" */
             horsfich = num < 0 || num > nb_enreg ;
           }
        while (horsfich) ;

        if (num == 0 ) break ;         /* sortie boucle si demande arrêt     */
        pos = (num-1) * sizeof(bloc) ;       /* calcul position courante     */
        fseek (fichier, pos, 0) ;              /* positionnement fichier     */
        fread (&bloc, sizeof(bloc), 1, fichier) ;       /* lecture enreg     */
        affiche (&bloc, num) ;                        /* affichage enreg     */
        modifie (&bloc) ;                                 /* modif enreg     */
        fseek (fichier, pos, 0) ;            /* repositionnement fichier     */
        fwrite (&bloc, sizeof(bloc), 1, fichier) ;   /* réécriture enreg     */
220                     angage C
        Exe rcice s e n l
         }
      while (1) ;


                /* fin modifications */
      fclose(fichier) ;
      printf ("\n\n -------- FIN MODIFICATIONS FICHIER ----------\n") ;
  }

           /*************************************************/
           /*   fonction d'affichage d'un enregistrement    */
           /*************************************************/

  void affiche (struct enreg * bloc, int num)
  {
     int i ;
     printf ("\n\nenregistrement numéro : %d\n\n", num) ;
     printf ("NOM                : %s\n", bloc->nom) ;
     printf ("AGE                : %d\n", bloc->age) ;
     printf ("NOMBRE D'ENFANTS   : %d\n", bloc->nbenf) ;
     for (i=0 ; i < bloc->nbenf && i < NBENFMAX ; i++)
         printf ("AGE ENFANT %2d      : %2d\n", i+1, bloc->agenf[i]) ;
  }

           /***************************************************/
           /*   fonction de modification d'un enregistrement */
           /***************************************************/

  void modifie (struct enreg * bloc)
  {
     char ligne[127] ;            /* chaîne de lecture d'une ligne d'écran */
     int i ;

      printf ("\n\n\entrez vos nouvelles infos (return si pas de modifs)\n") ;

      printf ("NOM               : ") ;
      gets (ligne) ;
      if (strlen(ligne)) strcpy (bloc->nom, ligne) ;

      printf ("AGE               : ") ;
      gets (ligne) ;
      if (strlen(ligne)) bloc->age = atoi(ligne) ;

      printf ("NOMBRE D'ENFANTS    : ") ;
                                                                                        II.   e           ich
                                                                                       V Trait m e nt de f ie rs        221

       gets (ligne) ;
       if (strlen(ligne)) bloc->nbenf = atoi(ligne) ;

       for (i=0 ; i < bloc->nbenf && i < NBENFMAX ; i++)
         { printf ("AGE ENFANT %2d     : ", i+1) ;
           gets (ligne) ;
           if (strlen(ligne)) bloc->agenf[i] = atoi(ligne) ;
         }
   }



          aire
Com m e nt s


              ons   e e                 e              e
*Nous av ouv rt l fich ie r dans l m ode r+ b, lq ue laut e l m ise à j
                                                                oris a                 e ure         ure            ace
                                                                                  our (lct e t é crit e n un e m pl m e nt
      conq                    e                 it                                       oq              e
q ue l ue du fich ie r). Not z q u'ilfaut é v e r d'é crire ici rb+ , ce q ui ne prov ue rait gé né ralm e nt pas d'erreur
       e ure                            out
d'ouv rt , m ais q ui e m pê ch e rait t e é crit          e                   re
                                                 ure dans l fich ie r (ici, not program m e ne s 'ape rce v                t
                                                                                                           rait pas de ce t e
         ie             e e         e
anom al puis q u'ilne t s t pas l code de re t   our de f rit ). En ce q ui conce rne l
                                                         w e                                    ion         ons         l
                                                                                        'indicat b, rappe l q ue ce l -cie
                     e             e       é     at
n'e s t indispensabl q ue dans ls im plm e nt ions q ui dist    ingue nt ls fich ie rs de t
                                                                           e                      e e          re       oye
                                                                                             ype t xt des aut s . R e v z
   e ue l   e     e
é v nt l m e nt ls com m e nt           'e
                             aires de l xe rcice V II.1.


         'ouv ure                         e         a aile
*Aprè s l e rt du fich ie r, nous e n dé t rm inons l t l (dans l v
                                                                a ariabl nb_e nre g) à l
                                                                       e               'aide des fonct      s
                                                                                                      ions f e e k e t
 t l us
f e l. Pl précisém e nt :

          fseek (fichier, 0, 2)

      ace      e     a
nous pl à 0 oct t de l fin (code 2) du fich ie r e t :

          ftell (fichier)

               a      ion        e          e
nous donne l posit courant du point ur associé au fich ie r (q ui point ici sur l fin). Ilnous e s t al facil de l
                                                                           e         a                ors   e    a
t                                      re     s,   a
 ransform e r e n un nom bre d'enregist m e nt e n l divisant par l t l d'un enregist m e nt
                                                                  a aile             re     .


         ie                oir u           re     ,
*N'oubl z pas q u'aprè s av l un e nre gist m e nt ile s t né ce s s aire , av de l ré é crire , de posit
                                                                              ant e                                    e   e
                                                                                                         ionne r à nouv au l
     e        e
point ur dans l fich ie r.



DI      O
  SCUSSI N
222                        angage C
           Exe rcice s e n l
                 e             s                         ons
*Com m e dans ls pré cédent program m e s , nous n'av pas int                  e ions part iè re s v -v des réponses
                                                                 roduit de prot ct        icul      is-à is
              'ut isat       oye es                           s                    e         a
fournie s par l il e ur (v z l discussions des précédent program m e s ). Tout fois, ici, l m aniè re m ê m e dont nous
av                    a
  ons program m é l saisie des corre ct                   e             e
                                         ions, iln'e xist pas, à ce niv au, de ris q ue de "pl                   if
                                                                                              angage " cons é cut à une
     ais                             ons               à
m auv e ré pons e puis q ue nous n'av pas fait appe l scanf  .




                      I-4            e
                     VI Com ptage de lttre s e t m ots d'un fich ie r te xte

________________________________________________________________________________________


Enoncé

                                  ir               e e      e
Ecrire un program m e q ui, à part d'un fich ie r t xt , dét rm ine :

     e                  è
   - l nom bre de caract re s q u'il    ie ,
                                    cont nt
     e                         e t       'al                              e          e
   - l nom bre de ch acune des lt res de l ph abet (on ne considérera que ls m inusculs ),
     e
   - l nom bre de m ots,
     e            igne
   - l nom bre de l s.
   e            igne
L s fins de l s ne dev                    re
                             ront pas ê t com pt isées dans ls caract re s . O n adm e t ra q ue deux m ot sont t ours
                                                    abil    e        è                  t                 s      ouj
                      usieurs des caract re s s uiv s :
s é paré s par un ou pl                 è          ant

            igne
   - fin de l
   - e s pace
          uat           ?
   - ponct ion : : . , ; !
            h
   - pare nt è s e s : ( )
        l s
         e
   - guil m e t : "
   - apostroph e : '
           t       e      ,
O n adm e t ra é galm e nt pour sim pl r, q u'aucun m ot ne pe ut ê t com m e ncé s ur une l
                                     ifie                            re                                         re    a
                                                                                           igne e t s e poursuiv s ur l
    ant
suiv e .

                 l é        iser
Ile s t cons e il de ré al une fonct pe rm e t ant de décide r si un caract re donné, t
                                            ion          t                        è                                      ,
                                                                                                 ransm is en argum e nt e s t un de s
         e
s é parat urs m e nt                        le      it
                     ionné s ci-de s s us. El re s t ue ra l v e ur 1 l q ue l caract re e s t un s é parat ur e t l v e ur 0 dans l
                                                           a al       ors    e       è                     e       a al            e
cas cont   raire .
                                                                                            II.   e           ich
                                                                                           V Trait m e nt de f ie rs           223

       e
Exe m pl

   donnez le nom du fichier à examiner : b:letfic.c
   votre fichier contient 87 lignes, 371 mots
   et 3186 caractères dont :
   69 fois la lettre a
   6 fois la lettre b
   74 fois la lettre c
   36 fois la lettre d
   163 fois la lettre e

            ........

   110 fois la lettre t
   63 fois la lettre u
   7 fois la lettre v
   3 fois la lettre w
   6 fois la lettre x
   0 fois la lettre y
   1 fois la lettre z

   et 1979 autres caractères

________________________________________________________________________________________



ANALYSE


                ons
Com m e nous av déj e u l à              e oir
                            'occasion de l v dans ls e xe rcice s I-5 e t I-6, ce t
                                                  e                                           è             re     u
                                                                                   ype de problm e pe ut ê t ré s ol d'au
m oins deux m aniè re s :

   - e n e ffe ct                it       rait                 è
                 uant une ré pé t ion du t e m e nt d'un caract re ,
   - e n e ffe ct                 it       rait
                  uant une ré pé t ion du t e m e nt d'une l , l ê m e const ué de l ré pé t ion du t e m e nt de ch acun
                                                           igne ui-m        it     a        it       rait
                è          le
   des caract re s q u'e l cont nt  ie .
       e                  ons                              e
Tout fois, ici, nous av à faire à un fich ie r dans lq ue ll l                       e
                                                                 a ongue ur m axim al d'une l igne n'e s t pas connue a priori, ce
           a                h           e
q ui re nd l s e conde m é t ode difficil à m e t re e n oe uv . Nous ch oisirons donc l pre m iè re ; aq ue caract re du fich ie r
                                                 t            re                       a              ch            è
            u       ge c.
s e ra donc l par f t

       ons             aine       é    at
R appe l q ue ce rt s im plm e nt ions dist      ingue nt ls fich ie rs de t
                                                              e                     e e         re
                                                                               ype t xt des aut s . Dans ce cas, une t l       e le
    inct                ié          e                             ,          ouj
dist ion n'e s t pas l e au cont nu m ê m e du fich ie r (e n fait on pe ut t ours considérer qu'un fich ie r, q ue lq ue s oit son
     e                          e     e s,            e        ,
cont nu, e s t form é d'une suit d'oct t donc, finalm e nt d'une s uit de caract re s ). El a sim plm e nt pour obj ct de
                                                                          e          è       e
                                                                                             l         e                  e if
224                         angage C
            Exe rcice s e n l
              e              e               e
faire e n sort q ue , pour l program m e , ls "fins de l " apparais s e nt t ours m at rial
                                                        igne                   ouj         é                       è
                                                                                               isées par un caract re uniq ue , à
    oir        ors                   ,     aine
sav \n (al q ue , pré cis é m e nt ce rt s im plm e nt ions, DOS not m e nt re pré s e nt nt une fin de l
                                                     é      at                  am      ,          e                 igne par un
                     è        ors      e l e
"coupe " de caract re s ). L q u'une t l dist ion e s t né ce s s aire , ile s t pré v d'int
                                                inct                                  u     roduire l        ion ,        e
                                                                                                     'indicat t au niv au du
             e ure
m ode d'ouv rt du fich ie r (de m ê m e q u'on y int           'indicat b pour signalr q u'ilne s 'agissait pas d'un fich ie r
                                                     roduisait l        ion                e
de t      e e
    ype t xt ).

          e
Bie n e nt ndu, ici, nous av      out é
                             ons t int rê t à profit r de ce t e possibil é , de m aniè re à nous facil e r l dét ct de s fins
                                                    e         t          it                            it a      e ion
de l        ,    out       e                       abl
    igne e t surt , à obt nir un program m e port e (à l xce pt
                                                           'e               e ue l e      ,
                                                                    ion, é v nt l m e nt de l          ion ).
                                                                                               'indicat t

   e        age          ue
L s com pt s à e ffe ct r au niv au de s caract re s (nom bre de caract re s , nom bre de ch acune des m inusculs ) pe uv nt
                                     e              è                  è                                       e          e
   re     isés       on     ure l
ê t ré al de faç nat l , à condit t e fois de ne pas com pt iser \n com m e un caract re (au cont
                                 e          ion out                   abil                           è           raire , à sa
         re
 re ncont , il                    e e        e        igne
               faudra incré m e nt r l com pt ur de l s ).

                     e
En ce q ui conce rne ls com pt            s,                             e                           'e
                              ages de m ot nous procéderons com m e dans l pre m ie r program m e de l xe rcice I-6 e n
     oyant :
e m pl

              ion       t        e e                è                     e
   - une fonct pe rm e t ant de t s t r si un caract re e s t un s é parat ur,
               e   ogiq       _e
   - un indicat ur l ue : m ot n_cours.



Program m e

   #include <stdio.h>
   #define LNOMFICH 20                           /* longueur maximale d'un nom de fichier */
   #define VRAI 1                                /* pour "simuler" des ..... */
   #define FAUX 0                                /* ..... valeurs logiques */

   main()
   {
      int sep (char) ;            /* fonction test "caractère séparateur?" */
      char nomfich [LNOMFICH+1] ; /* nom du fichier à examiner */

       FILE * entree ;                           /*   descripteur du fichier à examiner */
       char c ;                                  /*   caractère courant */
       int compte [26],                          /*   pour compter les différentes lettres */
            numl,                                /*   rang lettre courante dans l'alphabet */
            ntot,                                /*   compteur nombre total de caractères */
            nautres,                             /*   compteur carac autres que minuscules */
            nmots,                               /*   compteur du nombre de mots */
            nlignes,                             /*   compteur du nombre de lignes */
            mot_en_cours,                        /*   indicateur logique : mot trouvé */
            i ;
                                                             II.   e           ich
                                                            V Trait m e nt de f ie rs   225


         /* entrée du nom de fichier à examiner et ouverture */
         /* attention, mode r au lieu de rt, dans certains cas */
do
   { printf ("donnez le nom du fichier à examiner : ") ;
     gets (nomfich) ;
     if ( (entree = fopen (nomfich, "rt")) == NULL)
           printf ("***** fichier non trouvé\n") ;
   }
while (entree == NULL) ;


      /* initialisations */
for (i=0 ; i<26 ; i++)
    compte[i] = 0 ;
ntot = 0 ; nautres = 0 ;
nmots = 0 ;
nlignes = 0 ;
mot_en_cours = FAUX ;

      /* boucle d'examen de chacun des caractères du fichier */
while ( c = fgetc (entree), ! feof (entree) )
   {
      if (c == '\n') nlignes++ ;      /* comptages au niveau caractères */
          else
               { ntot++ ;
                  numl = c -'a' ;
                  if (numl >= 0 && numl < 26) compte[numl]++ ;
                                         else nautres++ ;
                }

         if (sep(c))                         /* comptages au niveau mots */
              { if (mot_en_cours)
                   { nmots++ ;
                     mot_en_cours = FAUX ;
                   }
              }
            else mot_en_cours = VRAI ;
     }

      /* affichage résultats */
 printf ("\nvotre fichier contient %d lignes, %d mots\n",
                                    nlignes, nmots) ;
226                        angage C
           Exe rcice s e n l
         printf ("et %d caractères dont :\n", ntot) ;
         for (i=0 ; i<26 ; i++)
            printf ("%d fois la lettre %c\n", compte[i], 'a'+i) ;
         printf ("\net %d autres caractères\n", nautres) ;
   }

            /*********************************************************/
            /*       fonction de test "caractère séparateur"         */
            /*********************************************************/

   int sep (char c)
   {
      char sep[12] = {'\n',                                              /*   fin de ligne */
                      ' ',                                               /*   espace */
                      ',', ';', ':', '.', '?', '!',                      /*   ponctuation */
                      '(', ')',                                          /*   parenthèses */
                      '"', '\'' } ;                                      /*   guillemets, apostr*/
      int nsep=12,                                                       /*   nbre séparateurs */
          i ;

        i = 0 ;
        while ( c!=sep[i] && i<nsep ) i++ ;
        if (i == nsep) return (0) ;
                  else return (1) ;
   }




          aire
Com m e nt s


 e               é   e
L fich ie r a é t ouv rt e n m ode rt :

          e ure   e ure    e                   e      ope                e     .
   r : ouv rt e n lct . Si l fich ie r n'e xist pas, f n fournit un point ur nul
          e ure
   t : ouv rt e n m ode t    at oye                e
                         ransl é (v z à ce propos, l pre m ie r com m e nt        'e
                                                                          aire de l xe rcice VII-1).
   e       e
Not z q ue l ch oix du m ode t          at
                                 ransl é n'e s t j ais absol e nt indispensabl. Tout fois, com m e nous l ons dit dans
                                                    am           um             e       e                  'av
'anal ilnous facil e l dét ct de fin de l
l    yse,             it a        e ion                igne e t de pl ilre nd l program m e t
                                                               ,    us,       e                      abl             e
                                                                                             ransport e (par e xe m pl s ous
UNIX, où une fin de l                        é
                     igne e s t re pré s e nt e par \n).
                                                                                        II.   e           ich
                                                                                       V Trait m e nt de f ie rs    227

DI      O
  SCUSSI N


          ons                icit             re            rait é abl             e e      re
Nous av suppos é (im pl e m e nt) q ue not program m e t ait un v rit e fich ie r t xt , aut m e nt dit q ue ce dernie r
     e                         igne     a      ait  e
s e t rm inait par une fin de l . Si ce l n'é t pas l cas :

     a           igne ne s e rait pas com pt isée,
   - l derniè re l                          abil
     e                                     abil                re    i                      e
   - l dernie r m ot ne s e rait pas com pt isé, à m oins d'ê t s uiv d'au m oins un séparat ur.
                                                      II
                                                     VI : ANALYSE
                                                      NUM ERIQUE




          re ous                q       icat
Ce ch apit v propose q ue lue s appl ions du l       angage C à l         yse
                                                                     'anal num é riq ue . Nous av   ons ch e rch é à y introduire
e e                            ion      e ie
ls t ch niq ues de program m at q ui int rv nne nt fré q ue m m e nt dans ce dom aine . Cit                 e
                                                                                           ons, par e xe m pl :

     a              at       e         at            rice
   - l re pré s e nt ion e t ls m anipul ions de m at s ,
     a              at                     e
   - l re pré s e nt ion de nom bre s com plxe s ,
      a    isat          e           ibl
   - l ré al ion de m oduls s usce pt es de t ail r av c une fonct q ue l ue ou av c des t e aux de dim e nsions
                                             rav l
                                                 e    e           ion   conq      e       abl
        conq
   q ue l ue s .




                                      II                             le
                                     VI-1 Produit de m atrice s ré e l s

________________________________________________________________________________________


Enoncé

                 ion     cul e                     rice l
                                                        e                       e                                abl
Ecrire une fonct cal ant l produit de deux m at s ré e l s . O n supposera q ue l pre m ie r indice de ch aq ue t e au
             ant
re pré s e nt une m at                        igne
                      rice corre s pond à une l .

O n pré v                   s
         oira e n argum e nt :

     e                        rice    tipl
   - ls adresses des deux m at s à m ul ie r e t ce l de l m at
                                                    le   a     rice produit,
     e            igne    e              onnes de l pre m iè re m at ,
   - l nom bre de l s e t l nom bre de col        a                 rice
     e
   - l nom bre de col            a
                        onnes de l s e conde m at                     igne
                                                 rice (son nom bre de l s é t      igat
                                                                             ant obl oire m e nt é galau nom bre de
   col          a
       onnes de l pre m iè re ).
                        pe     t       e e        t
Un program m e principal rm e t ra de t s t r ce t e fonction.
230                         angage C
            Exe rcice s e n l



       e
Exe m pl

      MATRICE A
        0   1   2           3
        1   2   3           4
        2   3   4           5
        3   4   5           6
        4   5   6           7

      MATRICE B
        0   1   2
        1   2   3
        2   3   4
        3   4   5

      PRODUIT A x B
       14 20 26
       20 30 40
       26 40 54
       32 50 68
       38 60 82



ANALYSE


       ons
R appe l q ue s i A est une m at             igne        onne
                                rice n, p (n l s e t p col s ) e t si B e s t une m at            a
                                                                                      rice p, q , l m atrice produit :

            C=A x B
e s t une m atrice n, q d é finie par :

            c =       a b
             ij        ik   kj




Program m e

    #define N 5
    #define P 4
    #define Q 3
                                                               III. y
                                                              V Anal s e num é riq u e   231


main()
{
   void prod_mat(double *, double *, double *, int, int, int) ;
   double a[N][P], b[P][Q], c[N][Q] ;
   int i, j ;
                     /* initialisation matrice a */
   for (i=0 ; i<N ; i++)
       for (j=0 ; j<P ; j++)
          a[i][j] = i+j ;
                     /* initialisation matrice b */
   for (i=0 ; i<P ; i++)
       for (j=0 ; j<Q ; j++)
          b[i][j] = i+ j ;

                    /* calcul produit a x b */
                    /* les "cast" (int *) sont facultatifs */
   prod_mat ( (double *) a, (double *) b, (double *) c, N, P, Q) ;

                    /* affichage matrice a */
   printf (" MATRICE A\n") ;
   for (i=0 ; i<N ; i++)
     { for (j=0 ; j<P ; j++)
          printf ("%4.0f", a[i][j]) ;
        printf ("\n") ;
     }
   printf ("\n") ;
                    /* affichage matrice b */
   printf (" MATRICE B\n") ;
   for (i=0 ; i<P ; i++)
     { for (j=0 ; j<Q ; j++)
          printf ("%4.0f", b[i][j]) ;
        printf ("\n") ;
     }
   printf ("\n") ;

                    /* affichage produit */
   printf (" PRODUIT A x B\n") ;
   for (i=0 ; i<N ; i++)
     { for (j=0 ; j<Q ; j++)
          printf ("%4.0f", c[i][j]) ;
        printf ("\n") ;
     }
232                        angage C
           Exe rcice s e n l

   }


   void prod_mat ( double * a, double * b, double * c,
                        int n, int p, int q)
   {
      int i, j, k ;
      double s ;
      double *aik, *bkj, *cij ;

       cij = c ;
       for (i=0 ; i<n ; i++)
          for (j=0 ; j<q ; j++)
             { aik = a + i*p ;
               bkj = b + j ;
               s = 0 ;
               for (k=0 ; k<p ; k++)
                  { s += *aik * *bkj ;
                    aik++ ;
                    bkj += q ;
                  }
               * (cij++) = s ;
             }
   }




          aire
Com m e nt s


           a       ion           ,          ons
*D ans l fonct prod_m at nous n'av pas pu ut iser l "form al e " des t e aux pour ls m at s a, b e t c car
                                                         il    e          ism        abl               e        rice
    le                                               ors
ce l s -ci possè dent deux dim e nsions non connue s l de l com pil ion du program m e . R appe l q u'un t lproblm e ne
                                                            a        at                              ons             e     è
               ors                  abl              e                           at
s e pos e pas l q u'ils'agit de t e aux à une s e ul dim e nsion (car une not ion t l q ue t a t ours un sens, quel
                                                                                      e l  e     [i] ouj                        le
            a ail e          ors                 abl
q ue s oit l t l de t) ou l q u'ils'agit d'un t e au à pl                                    e a
                                                            usieurs dim e nsions dont s e ul l pre m iè re e s t inconnue (com pte
 e         a               e      é    s      abl
t nu de l m aniè re dont ls é lm e nt d'un t e au sont rangé s e n m é m oire ).

D ans ce s condit                           igé                          ism            e                      é         conq
                    ions, nous som m e s obl de faire appe lau form al e des point urs pour re pé re r un é lm e nt q ue l ue
              rice
de nos m at s . Pour ce faire , nous t              t
                                           ransm e t ons à l fonct prodm at l
                                                            a      ion          'adresse de début des t          rice
                                                                                                       rois m at s conce rné e s .
    e            out                                a                       e                              e e
Not z q u'e n t e rigue ur (du m oins d'aprè s l norm e ANSI), dans l program m e m ain, un sym bol t lq ue a e s t du t     ype
        e                   -à                    e            e
(doubl [P]) * (c'e s t -dire q u'ilre pré s e nt un point ur sur des bl de P é lm e nt de t
                                                                              ocs           é   s                  e
                                                                                                      ype doubl), e t non pas
      e
sim plm e nt du t                e .             re
                     ype doubl* Ildoit donc ê t conv rt dans l t
                                                           e i                    e ,     t     e
                                                                     e ype doubl * ce t e conv rsion ne m odifiant pas, e n fait ,
l                              e     oye    e ue l e
 'adre s s e corre s pondant (re v z é v nt l m e nt ls com m e nt
                                                            e                      'e          .5     a               ie
                                                                        aires de l xe rcice V de l pre m iè re part de ce t
ouv              t        e           q          iv
    rage ). Ce t e conv rsion q ue lue pe u fict e pe ut soit ê t m ise en pl aut at ue m e nt par l com pil e ur, au v du
                                                                 re           ace     om iq              e         at       u
                                                                                              III. y
                                                                                             V Anal s e num é riq u e         233

    ot              re     icit
prot ype , soit ê t e xpl é e à l                      e
                                     'aide d'un opé rat ur de "cast ; t e derniè re faç de faire a souv nt l m é rit d'év e r
                                                                   " ce t              on              e   e        e    it
                     e issem e nt int m pe s t ("w arnings").
des m e s s ages d'av rt             e        ifs


          e            a      ion     a       ion
*Not z q ue , dans l définit de l fonct prodm at nous av dû t nir com pt de l m aniè re dont l l
                                                         ,          ons     e            e    a             e angage C range
                e    é     s       abl
e n m é m oire ls é lm e nt d'un t e au à deux dim e nsions (suiv ce q u'on nom m e abusiv m e nt ls "l s " du t e au,
                                                                    ant                         e        e  igne     abl
       -à          ant 'ordre obt nu e n faisant v r e n pre m ie r l dernie r indice ). Pl précisém e nt :
c'e s t -dire s uiv l            e                arie              e                      us

      e      e                  e        e
   - L sym bol aik re pré s e nt un point ur courant sur ls é lm e nt a . Pour ch aq ue v e ur de i, aik e s t init isé à
                                                         e    é      s                   al                        ial
                                                                              ik
   l                         é          a igne i de l m at
    'adresse du pre m ie r é lm e nt de l l         a     rice a (a+i*p) e t il s t incré m e nt d'une col
                                                                               e                é        onne , e n m ê m e t m ps
                                                                                                                             e
        'indice k (d'où l pré s e nce de aik ++ dans l boucl e n k ).
   q ue l                  a                          a       e
                                     e        e               e
   - D e m ê m e , bk j re pré s e nt un point ur courant sur ls é lm e nt b . Pour ch aq ue v e ur de j bk j e s t init isé à
                                                                   é      s                   al        ,               ial
                                                                             kj
   l                         é          a
    'adresse du pre m ie r é lm e nt de l col
                                            onne j de l m at
                                                      a                                          é      igne e n m ê m e t m ps
                                                            rice b (b+j) e t ile s t incré m e nt d'une l                 e
        'indice k (d'où l pré s e nce de bkj=bkj+q dans l boucl e n k ).
   q ue l                 a                                a       e
                             e        e               e    é
   - Enfin, cij re pré s e nt un point ur courant sur ls é lm e nt c . Ile s t init isé à l
                                                                  s                ial                             é          a
                                                                                          'adresse du pre m ie r é lm e nt de l
                                                                      ij
   m atrice c. Il                           our a     e a us e                 e                            é
                 progresse de 1 à ch aq ue t de l boucl l pl int rne e n j (not z q u'iln'e n aurait pas é t ainsi si nous
   av         e    es             e
     ions inv rs é l deux boucls e n i e t j).


DI      O
  SCUSSI N

            e      e                            ion
*O n a souv nt t ndance à dire q u'une fonct com m e prod_m at t ail s ur de s m at
                                                                      rav l e             rices de dim e nsions v         e
                                                                                                                     ariabls . En
    , e e                q                                re       e e
fait l t rm e e s t q ue lue pe u am bigu. Ainsi, dans not e xe m pl, ls m atrices dont on t          'adre s s e e n argum e nt à
                                                                                            ransm e t l
                      ail e        e              e                    . n'e        e
prod_m at ont une t l bien dét rm inée dans l program m e principal Il n re s t pas m oins q ue :

               , a             ion
   - d'une part l m ê m e fonct pe ut t ail r sur des m at
                                       rav l
                                           e                        ailes         e
                                                          rices de t l diffé re nt s ,
           re     ,                                                           , e
   - d'aut part rie n n'e m pê ch e rait q u'au s e in du program m e principal ls m at s a, b e t c v nt lur t l définie
                                                                                          rice        oie e    aile
                  ors  'e       ion
   uniq ue m e nt l de l xé cut e t lurs e m pl m e nt al
                                         e            ace    s l oués dynam iq ue m e nt.


                       ion                     ,               e
*Au sein d'une fonct com m e prod_m at ile s t possibl d'em pl r l form al e des t e aux à l pl de ce l de s
                                                                         oye e           ism      abl          a ace        ui
      e
point urs e n faisant appe là un artifice . Ce lui-ci consist à cré e r, pour ch aq ue m at , un t e au de point urs cont nant
                                                             e                             rice     abl             e        e
l                               igne                        e
 'adresse de début de ch aq ue l . Ainsi, par e xe m pl, pour l m at   a                                 e      abl
                                                                            rice a, on pourrait ré s e rv r un t e au nom m é ada
par :

         double * * ada ;

  s             i    a                ant
Il e rait re m pl de l m aniè re s uiv e :

          for (i=1 ; i<n ; i++)
                 ada[i] = a + i*p ;
234                         angage C
            Exe rcice s e n l


D ans ce s condit                 , a   at                                       e e      'associat it de gauch e à droit de
                 ions, e n e ffe t l not ion ada [i] [j] corre s pondrait (com pt t nu de l        iv é                  e
'opé e
l rat ur []) à :

           (ada [i]) [j]

       -à
c'e s t -dire à :

           * (ada [i] + j)

   re         , t        at                                e
Aut m e nt dit ce t e not ion ada [i] [j] désignerait sim plm e nt l v eur de l lm e nt sit à l e rs e ct de l l
                                                                   a al       'é é         ué 'int       ion a igne i e t
   a onne j de l m at
de l col            a     rice a.

        e
O n not ra q ue pour q ue ce t art              il e                        ion                  ,          rav l e
                                  ifice s oit ut isabl au s e in d'une fonct com m e prod_m at ce ns é e t ail r sur des
m at          ail e   conq        e                     e
    rices de t l q ue l ue , il s t né ce s s aire q ue ls e m pl m e nt des t e aux de point urs t l q ue ada soient al s
                                                                ace     s     abl            e     e s                 loué
dynam iq ue m e nt.




                                        II                         e
                                       VI-2 A rith m é tiq ue com plxe

________________________________________________________________________________________


Enoncé

Ecrire deux fonct       cul a               e                                 e                                          é
                 ions cal ant l som m e e t l produit de deux nom bre s com plxe s . Ces dernie rs s e ront re pré s e nt s par
       ruct          ant      é     s
une s t ure com port deux élm e nt de t   ype doubl, corre s pondant à l part ré e l e t à l part im aginaire .
                                                    e                   a    ie     le     a      ie

Ch acune de ce s fonct             e
                      ions com port ra t               s
                                        rois argum e nt :

    'adresse des deux nom bre s com plxe s (st ure s ) conce rné s ,
   -l                                e        ruct
    'adresse du ré s ul (st ure ).
   -l                 tat ruct
                        pe     t       e e
Un program m e principal rm e t ra de t s t r ces deux fonct       e e al             e
                                                            ions av c ls v e urs com plxe s :

   0,5 + i
   1+ i
                                                                  III. y
                                                                 V Anal s e num é riq u e   235

       e
Exe m pl

    0.500000 + 1.000000 i   et   1.000000 + 1.000000 i
    ont pour somme   1.500000 + 2.000000 i
    et pour produit -0.500000 + 1.500000 i

________________________________________________________________________________________



ANALYSE


                         e
Soit deux nom bre s com plxe s :

    x = a + ib
    y = c + id
O n sait q ue :

    x + y = (a+ c) + i (b+ d)
e t q ue :

    x y = (ac - bd) + i (ad + bc)



Program m e

    typedef struct
             { double reel ;
               double imag ;
             } complexe ;
    main()
    {
       void somme (complexe *, complexe *, complexe *) ;
       void produit (complexe *, complexe *, complexe *) ;
       complexe z1, z2, s, p ;
       z1.reel = 0.5 ; z1.imag = 1.0 ;
       z2.reel = 1.0 ; z2.imag = 1.0 ;
       somme    (&z1, &z2, &s) ;
       produit (&z1 ,&z2, &p) ;
       printf ("%lf + %lf i    et  %lf + %lf i \n",
236                        angage C
           Exe rcice s e n l

                z1.reel, z1.imag, z2.reel, z2.imag) ;
        printf ("ont pour somme   %lf + %lf i \n", s.reel, s.imag) ;
        printf ("et pour produit %lf + %lf i \n", p.reel, p.imag) ;
   }

   void somme (complexe * x, complexe * y, complexe * som)
   {
      som->reel = x->reel + y->reel ;
      som->imag = x->imag + y->imag ;
   }

   void produit (complexe * x, complexe * y, complexe * prod)
   {
      prod->reel = x->reel * y->reel - x->imag * y->imag ;
      prod->imag = x->reel * y->imag + x->imag * y->reel ;
   }



          aire
Com m e nt s


        ons              e    obal         e      ruct              e
*Nous av défini, à un niv au gl , un m odè l de st ure nom m é com plxe .


       e                       e
*Not z bie n q ue , dans l program m e principal l                      ruct                 'opé e
                                                     , 'accè s à une s t ure s e fait par l rat ur "." (com m e dans z1.re e l  )
                         a al               ruct  par     re
car z1 désigne ici l v eur d'une s t ure ; cont , dans ls fonct      e                            'opé e
                                                                             ions, ils e fait par l rat ur -> (com m e dans x-
      )
>re e l car x dé s igne al l                       ruct                out       it 'e        oi            e
                             ors 'adresse d'une s t ure . O n pe ut t e fois é v e r l m pl de ce t opé rat ur, e n re m arq uant
                            al
q ue x-> re e le s t é q uiv e nt à (*        .
                                      x).re e l


        out                       a
*En t e rigue ur, d'aprè s l norm e ANSI, ile s t possibl de t  e             t
                                                                     ransm e t re , e n argum e nt d'une fonct      a al
                                                                                                              ion, l v e ur d'une
  ruct                                      oir                            oiv
st ure . Aussi, aurions-nous pu pré v q ue som m e e t produit re ç e nt ls v e urs des com plxe s s ur ls q ue l port
                                                                                     e al                  e         e     s      e
 'opé ion. En re v
l rat                           e       tat
                       anch e , l ré s ul dev   rait t ours ê t t
                                                      ouj                          al                 e            a
                                                               re ransm is par v e ur puis q ue dét rm iné par l fonct         le
                                                                                                                         ion e l -
                      e a           ion
m ê m e . Par e xe m pl, l définit de som m e aurait pu ê t :re

   void somme (complexe x, complexe y, complexe * som)
   {
      prod->reel = x.reel + y.reel ;
      prod->imag = x.imag + y.imag ;
   }
                                                                                                     III. y
                                                                                                    V Anal s e num é riq u e           237

DI      O
  SCUSSI N


         a        iq
D ans l prat ue , ls foncte        ions som m e e t produit s e raie nt com pile s s é paré m e nt des fonct
                                                                               é                                  e   il .
                                                                                                            ions ls ut isant Pour ce faire ,
                               l
                               es               a          ion
ile s t né ce s s aire q u'e l disposent de l descript de l st ure com plxe . O n v q u'on ris q ue al d'ê t am e né à
                                                                      a ruct              e           oit               ors     re
                              ruct                e                    e        a                               e        a
décrire une m ê m e s t ure à diffé re nt s re pris e s . Ce rt s , ici l ch os e n'e s t pas bien grav , dans l m e s ure où ce t e     t
         ion               e                           e out
définit e s t sim pl. D'une m aniè re gé né ral, t e fois, on a t int rê t à ré glr ce t
                                                                             out é               e                  è         aç
                                                                                                        ype de problm e e n pl ant une fois
        out             e l e        ion
pour t e s une t l définit dans un fich ie r (d'e xt nsion h , par e xe m pl) q u'on incorpore par #incl dans t
                                                                   e                        e                             ude            e
                                                                                                                                    ous ls
program m e s e n ayant besoin.



                                     II                             e
                                    VI-3 Produit de m atrice s com plxe s

________________________________________________________________________________________


Enoncé

                  ion    cul e                             rice        e
Ecrire une fonct cal ant l produit de deux m at s com plxe s . Ch aq ue m at                                               abl
                                                                                          rice s e ra dé finie com m e un t e au à
                         e                é                     ruct              ant                     e     ce t ruct
deux dim e nsions dans lq ue lch aq ue é lm e nt s e ra une s t ure re pré s e nt un nom bre com plxe ; t e s t ure s e ra
     it                é      s
const uée de deux é lm e nt de t              e
                                    ype doubl corre s pondant à l part ré e l e t à l part im aginaire du nom bre . O n
                                                                     a     ie       e
                                                                                    l       a       ie
                e                      abl                ant
supposera q ue l pre m ie r indice du t e au re pré s e nt une m at                           igne
                                                                     rice corre s pond à une l .

O n pré v                   s
         oira e n argum e nt :

     e                        rice    tipl
   - ls adresses des deux m at s à m ul ie r,
    'adresse de l m at
   -l           a     rice produit,
     e            igne         onnes de l pre m iè re m at ,
   - l nom bre de l s e t de col        a                 rice
     e
   - l nom bre de col            a
                       onnes de l deuxiè m e m at                     igne   ant igat
                                                 rice (son nom bre de l s é t obl oire m e nt é galau nom bre de
   col          a
       onnes de l pre m iè re ).
           isera un program m e principal rm e t ant de t s t r ce t e fonct
   O n ré al                             pe     t        e e        t       ion.
                 e ue l e
   O n pourra é v nt l m e nt faire appe laux fonct                             isées dans l xe rcice V
                                                   ions som m e e t produit ré al          'e                       cul a
                                                                                                       III-2 pour cal e r l
               e                                e
   som m e e t l produit de deux nom bre s com plxe s .


       e
Exe m pl

     MATRICE A
       0+   0i              1+      2i          2+      4i          3+      6i
238                          angage C
             Exe rcice s e n l

        1+      1i         2+     3i      3+     5i        4+    7i
        2+      2i         3+     4i      4+     6i        5+    8i
        3+      3i         4+     5i      5+     7i        6+    9i
        4+      4i         5+     6i      6+     8i        7+   10i

      MATRICE B
        0+   0i            1+     2i      2+     4i
        1+   1i            2+     3i      3+     5i
        2+   2i            3+     4i      4+     6i
        3+   3i            4+     5i      5+     7i

      PRODUIT A x B
      -14+ 42i      -32+ 66i            -50+    90i
      -14+ 54i      -36+ 90i            -58+   126i
      -14+ 66i      -40+ 114i           -66+   162i
      -14+ 78i      -44+ 138i           -74+   198i
      -14+ 90i      -48+ 162i           -82+   234i

________________________________________________________________________________________




ANALYSE


 e         es          ion                  rice        e
L s form ul de définit du produit de m at s com plxe s re s t nt ce l s proposées dans l
                                                                  e      le                      yse   'e
                                                                                            'anal de l xe rcice V  III-1
      e      rice    l il
                     e
pour ls m at s ré e l s ; suffit d'y re m pl r ls opé rat
                                            ace e                           ant           s      e
                                                           ions + e t x port sur des réel par ls opé rat ions som m e e t
                     e      e      es
produit de deux com plxe s (ls rè gl de ces deux opé rations ont é t e xposées dans l
                                                                    é                   yse     'e
                                                                                    'anal de l xe rcice V  III-2).



Program m e


   #define N 5
   #define P 4
   #define Q 3

   typedef struct
           { double reel ;
             double imag ;
           } complexe ;
                                                               III. y
                                                              V Anal s e num é riq u e   239

main()
{
   void prod_mat (complexe *, complexe *, complexe *, int, int, int) ;
   complexe a[N][P], b[P][Q], c[N][Q] ;
   int i, j ;




                       /* initialisation matrice a */
   for (i=0 ; i<N ; i++)
      for (j=0 ; j<P ; j++)
         { a[i][j].reel = i+j ;
           a[i][j].imag = i+2*j ;
         }
                       /* initialisation matrice b */
   for (i=0 ; i<P ; i++)
      for (j=0 ; j<Q ; j++)
         { b[i][j].reel = i+j ;
             b[i][j].imag = i+2*j ;
           }

                     /* calcul produit a x b */
                     /* les "cast" (complexe *) sont facultatifs */
   prod_mat ((complexe *) &a, (complexe *) &b, (complexe *) &c, N, P, Q) ;

                     /* affichage matrice a */
   printf (" MATRICE A\n") ;
   for (i=0 ; i<N ; i++)
     { for (j=0 ; j<P ; j++)
          printf ("%4.0lf+%4.0lfi   ", a[i][j].reel, a[i][j].imag) ;
        printf ("\n") ;
     }
   printf ("\n") ;

                     /* affichage matrice b */
   printf (" MATRICE B\n") ;
   for (i=0 ; i<P ; i++)
     { for (j=0 ; j<Q ; j++)
          printf ("%4.0lf+%4.0lfi   ", b[i][j].reel, b[i][j].imag) ;
        printf ("\n") ;
     }
   printf ("\n") ;
240                     angage C
        Exe rcice s e n l

                        /* affichage produit */
      printf (" PRODUIT A x B\n") ;
      for (i=0 ; i<N ; i++)
        { for (j=0 ; j<Q ; j++)
             printf ("%4.0lf+%4.0lfi   ", c[i][j].reel, c[i][j].imag) ;
           printf ("\n") ;
        }
  }
            /*********************************************************/
            /* fonction de calcul de produit de 2 matrices complexes */
            /*********************************************************/

  void prod_mat ( complexe * a, complexe * b, complexe * c,
                   int n, int p, int q)
  {
     void produit() ;
     int i, j, k ;
     complexe s, pr ;
     complexe *aik, *bkj, *cij ;

      cij = c ;
      for (i=0 ; i<n ; i++)
         for (j=0 ; j<q ; j++)
            { aik = a + i*p ;
              bkj = b + j ;
              s.reel = 0 ; s.imag = 0 ;
              for (k=0 ; k<p ; k++)
                 { produit (aik, bkj, &pr) ;
                   s.reel += pr.reel ; s.imag += pr.imag ;
                   aik++ ;
                   bkj += q ;
                 }
              * (cij++) = s ;
            }
  }

  void produit (x, y, prod)
  complexe *x, *y, *prod ;
  {
     prod->reel = x->reel * y->reel - x->imag * y->imag ;
     prod->imag = x->reel * y->imag + x->imag * y->reel ;
  }
                                                                                              III. y
                                                                                             V Anal s e num é riq u e        241



          aire
Com m e nt s


  a           ion                 re                              at
L fonct prod_m at pe ut ê t considérée com m e une adapt ion de l fonct prod_m at de l xe rcice V
                                                                             a      ion                  'e                     t
                                                                                                                     III-1. Ce t e
         es           e                        ,
fois, l sym bols aik , bk j e t cij désignent non pl des point urs sur de s ré e l m ais des point urs sur une s t ure
                                                        us           e                s,                  e                ruct
               ant                e     a      esse
re pré s e nt un nom bre com plxe . L soupl du l         angage C e n m at re d'opérat
                                                                          iè                    h     iq         e       e
                                                                                       ions arit m é t ue s s ur ls point urs fait
       e         ruct                at                it
q ue ls inst ions d'incré m e nt ion de ce s q uant é s re s t nt ls m ê m e s (l é é t ici l st ure com plxe - soit 2
                                                               e   e            'unit ant         a ruct             e
  é         s
é lm e nt de t     ype doubl, au l u d'une v e ur de t
                           e     ie         al                  e
                                                      ype doubl).



DI      O
  SCUSSI N


 e                    es    'e
L s re m arq ue s fait dans l xe rcice V                   a
                                        III-2, à propos de l description de l st ure com plxe re s t nt nat l m e nt
                                                                            a ruct        e         e      ure l
                                                                                                               e
 al e
v abls ici.




                   II
                  VI-4 Re ch e rch e de zé ro d'une fonction par dich otom ie

________________________________________________________________________________________


Enoncé

Ecrire une fonct            e        ,           om    e
                    ion dé t rm inant par dich ot ie , l zé ro d'une fonction q ue l ue (ré e l d'une v
                                                                                   conq       le              e     le
                                                                                                       ariabl ré e l e t
cont                                    e al  e
     inue ). O n supposera connu un int rv l [a,b] sur lq ue ll fonct ch ange de signe, c'est -dire t lq ue f(a).f(b) soit
                                                         e      a     ion                      -à    e
né gatif.

O n pré v                   s
         oira e n argum e nt :

     e al
   - ls v e urs des bornes a e t b (de t        e     'int ale
                                        ype doubl) de l e rv l de départ,
   -l'adresse d'une fonct              t
                          ion pe rm e t ant de cal e r l v e ur de f pour une v e ur q ue l ue de l v
                                                 cul a al                      al         conq           e
                                                                                                  a ariabl. O n
                  'e ê e         t        ion      a
   supposera q ue l n-t t de ce t e fonct e s t de l form e :
           double fct (x)
           double x ;
242                        angage C
           Exe rcice s e n l

    'adresse d'une v
   -l                    e
                    ariabl de type doubl dest e à re cue il l v e ur approch ée du zé ro de f,
                                       e     iné          l a al
                                                           ir
     a al        a                 ue          é
   - l v e ur de l pré cision (absol ) souh ait e (de t        e
                                                       ype doubl).
 e            our a      ion
L code de re t de l fonct s e ra de -1 l q ue l e rv l fourni e n argum e nt ne conv nt pas, c'e s t -dire :
                                       ors    'int ale                              ie              -à

          ors    a       ion
   - soit l q ue l condit a<b n'est pas sat      e
                                           isfait ,
          ors    a       ion
   - soit l q ue l condit f(a).f(b)< 0 n'e s t pas sat      e
                                                      isfait .
      e
D ans l cas cont        e             our          à
                raire , l code de re t s e ra é gal 0.

                        pe     t       e e        t
Un program m e principal rm e t ra de t s t r ce t e fonction.



       e
Exe m pl

   zéro de la fonction sin entre -1 et 1 à 1e-2 près = 0.000000e+000
   zéro de la fonction sin entre -1 et 2 à 1e-2 près = 1.953125e-003
   zéro de la fonction sin entre -1 et 2 à 1e-12 près = -2.273737e-013

________________________________________________________________________________________



ANALYSE


  a                 e               oir é         'int al
L dém arch e consist donc, aprè s av v rifié q ue l e rv l re ç e n argum e nt é t conv nabl, à ré pé t r l t e m e nt
                                                         e     u                  ait  e   e           e e rait
    ant
suiv :

              e    ie
   - pre ndre l m il u m de [a,b] : m = (a+ b)/2
       cul
   - cal e r f(m ),
                   e
   - si f(m ) = 0, l zé ro e s t e n m ,
                         e    e                     on     ace    'int ale
   - si f(a).f(m )< 0, il xist un zé ro sur [a,m ] ; re m pl donc l e rv l [a,b] par [a,m ] e n faisant :
            b=m
                         e    e                     on     ace    'int ale
   - si f(a).f(m )> 0, il xist un zé ro sur [b,m ] ; re m pl donc l e rv l [a,b] par [b,m ], e n faisant :
            a=m
  e rait                 e                ors     'int al
L t e m e nt e s t int rrom pu soit l q ue l e rv l [a,b] aura é t s uffisam m e nt réduit c'e s t -dire l q ue |b-a| est
                                                           e             é                      , -à     ors
              a                    é          ors    e           é ocal      e
infé rie ur à l pré cision souh ait e , soit l q ue l zé ro a é t l isé exact m e nt (f(m )=0).
                                                                     III. y
                                                                    V Anal s e num é riq u e   243

Program m e

  #include <stdio.h>
  #include <math.h>     /* pour la fonction sin */
  main()
  {                      /* fonction de recherche d'un zéro par dichotomie */
     int dichoto ( double (*(double)(), double, double, double *, double) ;
     double z,           /* zéro recherché */
            a, b,        /* bornes de l'intervalle de recherche */
            eps ;        /* précision souhaitée */

      dichoto (sin, -1.0, 1.0, &z, 1.0e-2) ;
      printf ("zéro de la fonction sin entre -1 et 1 à 1e-2 près = %le\n",z);

      dichoto (sin, -1.0, 2.0, &z, 1.0e-2) ;
      printf ("zéro de la fonction sin entre -1 et 2 à 1e-2 près = %le\n",z);

      dichoto (sin, -1.0, 2.0, &z, 1.0e-12) ;
      printf ("zéro de la fonction sin entre -1 et 2 à 1e-12 près = %le\n",z);
  }
              /*************************************************************/
              /* fonction de recherhce dichotomique du zéro d'une fonction */
              /*************************************************************/

  int dichoto ( double (* f)(double), double a, double b, double * zero, double eps)

                      /*   f : fonction dont on cherche le zéro */
                      /*   a, b : bornes de l'intervalle de recherche */
                      /*   zero : zéro estimé */
                      /*   eps : précision souhaitée) */
  {
      double m,                     /* milieu de l'intervalle courant */
             fm,                    /* valeur de f(m) */
             fa, fb ;               /* valeurs de f(a) et de f(b) */

      fa = (*f)(a) ;
      fb = (*f)(b) ;
      if (fa*fb >= 0 || a >= b) return (-1) ;          /* intervalle incorrect */


      while (b-a > eps)
         { m = (b+a) / 2.0 ;
244                       angage C
          Exe rcice s e n l

              fm = (*f)(m) ;
              if (fm == 0) break ;                                                /* zéro atteint */
              if (fa*fm < 0) { b           = m ;
                                fb         = fm ;
                              }
              else            { a          = m ;
                                fa         = fm ;
                              }
          }
       * zero = m ;
       return (0) ;
   }




          aire
Com m e nt s


    e        a      ion     o
*Not z, dans l fonct dich ot :

     a    arat     'argum e nt corre s pondant à l
   - l décl ion de l                                         a      ion                 e
                                                 'adresse de l fonct dont on ch e rch e l zé ro :
              e f)(doubl)
          doubl (*     e
      le         e      e
   Ce l -ci s'int rprè t com m e s uit :
         f)              ion     ant
       (* e s t une fonct re ce v un argum e nt de type doubl e t fournissant un ré s ul de t
                                                            e                          tat           e
                                                                                             ype doubl,
        f                    ion     ant
       * e s t donc une fonct re ce v un argum e nt de type doubl e t fournissant un ré s ul de t
                                                                e                          tat           e
                                                                                                 ype doubl,
                            e                ion     ant
       f e s t donc un point ur sur une fonct re ce v un argum e nt de type doubl e t fournissant un ré s ul de t
                                                                                e                          tat   ype
       doubl.  e
     'ut isat             e
   - l il ion du sym bol f ;ainsi (*f)(a) re pré s e nt l v e ur de l fonct (* (fonct d'adre s s e f), à l ue l on
                                                       e a al       a      ion f)    ion                 aq l  e
           'argum e nt a.
   fournit l
 e                e           iq             ot         ant   are
L s m ê m e s ré flxions s'appl ue nt au prot ype s e rv à décl r dich oto.


    a        ion      o       ant               e al                      s
*L fonct dich ot re ce v e n argum e nt ls v eurs des argum e nt a e t b (et non de s adresses), nous pouv nous      ons
         t        e                        a
pe rm e t re de ls m odifie r au s e in de l fonct                  a                       e al               iv
                                                  ion, sans q ue ce l ait d'incide nce s ur ls v e urs e ffe ct es des borne s
                 e
définies dans l program m e principal    .


   oye           ,      e                     ,
*V z com m e nt dans l program m e principal un sym bol com m e sin e s t int rpré t par l com pil e ur com m e
                                                               e                  e    é      e      at
'adresse d'une fonct prédéfinie ; e s t t e fois néce s s aire d'av incorporé s on prot ype (sit dans m at .h ) ; n
l                   ion          il      out                       oir                 ot       ué        h      e
                                                                                               III. y
                                                                                              V Anal s e num é riq u e         245

 'abs            'inst ion ude
l e nce de l ruct #incl corre s pondant , l com pil e ur dé t ct rait un e rre ur puis q ue al l sym bol sin ne
                                       e e        at         e e                             ors e     e
s e rait pas défini.



DI      O
  SCUSSI N


     h          a     h
En t é orie , l m é t ode de dich ot ie conduit t ours à une s ol ion, av c une pré cision aussi grande q u'on l désire , à
                                    om             ouj            ut      e                                     e
     ir                     a    ion                iv
part du m om e nt où l fonct ch ange e ffe ct e m e nt de signe sur l e rv l de départ En prat ue , t e fois, ls
                                                                        'int al  e            .       iq      out        e
                        ouj            liq            e e      a im at       a                  cul
ch os e s ne s ont pas t ours aussi idyl ue s , com pt t nu de l l it ion de l pré cision des cal s.

                                             rop  e               a               'ordinat ur, on pe ut about à ce q ue :
Tout d'abord, si on im pos e une pré cision t faibl par rapport à l pré cision de l       e                  ir

         m = (a+b)/2

          à 'une                       e     ors
soit é gal l des deux bornes a ou b. Il s t al facil de m ont r q ue l gorit m e pe ut bouclr indé finim e nt
                                                   e         re      'al h                 e                 .

       re    , e al                                                      al                                       e              e
D 'aut part ls v e urs de f(a) e t de f(b) sont né ce s s aire m e nt é v ué e s d e m aniè re approch é e . Dans l cas de form uls
     q             e                 rè
q ue lue pe u com plxe s , on pe ut t s bien about à une s it ion dans l ue l f(a).f(b) e s t posit
                                                  ir          uat            aq l    e                     if.

  a               uat                     e
L pre m iè re s it ion e s t as s e z facil à é v e r : ilsuffit de ch oisir une pré cision re l iv (at e nt
                                                 it                                            at e                   re
                                                                                                       t ion, ici, not fonct  ion
 rav l e e                             ue
t ail av c une pré cision absol ) infé rie ure à ce l de l  l
                                                            e               e             a                    a
                                                                   'ordinat ur. Iln'e n v pas de m ê m e pour l s e conde dans la
               n'e       ouj                e        tris a                    cul        al
m e s ure où il s t pas t ours possibl de m aî e r l pré cision des cal s des v e urs de f.

								
To top