?_‹8ÿÿÿÿ¨P{8r8lpn!Û„ˆªpŽ !"&" WMFC„îŒ øø7X …5Ê ™o!Ü EMFø7~ŒR   …DÊ   ‰Iì ‰p  ‰p c;  L&  ƒ€ ÿ‚&% % ‚€+‘pd«  ÿ‚   ‰p ‰Iì  …DÊ  …6#       ‰p ‰Iì  …DÊ      ‰p ‰Iì  …DÊ   ‰p    ‰p       ‰p ‰Iì  …DÊ      ‰p ‰Iì  …DÊ   ‰p  ‰½Î% ‚€R…L¾ÿ( ‚™1Courier New @‡€€XB‚c ‡@ðA‚AƒA‚AŠ €?Ý#‰€@ðŒ ?Ý̈# €€…@c ‡@ðAƒA‚AŠ €?Ý#‹@€@ð‡ ?Ý ƒ% TT ‘Ç'ª@ª@E«LP…f€(TT ‘Ç'ª@ª@m«LPi(TT %‘Ç'ª@ª@•«LPc(TT& -‘Ç'ª@ª@½«LP…1(TT. 5‘Ç'ª@ª@å«LP….€(TT6 =‘Ç'ª@ª@ «LPc(      ‰p ‰Iì  …DÊ …6#    ‰\p c; y L&  ƒ€ ÿ‚% % ‚€+‘\p¿«  ÿ‚   ‰p ‰Iì  …DÊ  …6#       ‰p ‰Iì  …DÊ      ‰p ‰Iì  …DÊ   ‰p       ‰p ‰Iì  …DÊ      ‰p ‰Iì  …DÊ   ‰p  ‰Î% ‚€% TT‡ Ž‘Ç'ª@ª@ «LPf(TT –‘Ç'ª@ª@È«LPi(TT— ž‘Ç'ª@ª@ð«LPc(TTŸ ¦‘Ç'ª@ª@«LP2(TT§ ®‘Ç'ª@ª@@«LP.(TT¯ ¶‘Ç'ª@ª@h«LPc(      ‰p ‰Iì  …DÊ …6#    ‰þ c; P L&  ƒ€ ÿ‚% % ‚€+‘þd9   ÿ‚   ‰p ‰Iì  …DÊ  …6#       ‰p ‰Iì  …DÊ      ‰p ‰Iì  …DÊ   ‰p       ‰p ‰Iì  …DÊ      ‰p ‰Iì  …DÊ   ‰p  ‰½\ % ‚€% TT\k‘Ç'ª@ª@E9 LP…fð(TT\k‘Ç'ª@ª@m9 LP…i(TT\%k‘Ç'ª@ª@•9 LP…cð(TT&\-k‘Ç'ª@ª@½9 LP…1 (TT.\5k‘Ç'ª@ª@å9 LP….ð(TT6\=k‘Ç'ª@ª@ 9 LP…o(      ‰p ‰Iì  …DÊ …6#    ‰\þ c; yP L&  ƒ€ ÿ‚% % ‚€+‘\þ¿9   ÿ‚   ‰p ‰Iì  …DÊ  …6#       ‰p ‰Iì  …DÊ      ‰p ‰Iì  …DÊ   ‰p       ‰p ‰Iì  …DÊ      ‰p ‰Iì  …DÊ   ‰p  ‰\ % ‚€% TT‡\Žk‘Ç'ª@ª@ 9 LP…fð(TT\–k‘Ç'ª@ª@È9 LP…i (TT—\žk‘Ç'ª@ª@ð9 LP…cð(TTŸ\¦k‘Ç'ª@ª@9 LP…2(TT§\®k‘Ç'ª@ª@@9 LP….ð(TT¯\¶k‘Ç'ª@ª@h9 LP…o (      ‰p ‰Iì  …DÊ …6#    ‰/  c; =¤ T&  ƒ€ ÿ‚% % ‚€+‘/  ’Û   ÿ‚   ‰p ‰Iì  …DÊ  …6#       ‰p ‰Iì  …DÊ      ‰p ‰Iì  …DÊ   ‰p       ‰p ‰Iì  …DÊ      ‰p ‰Iì  …DÊ   ‰p  ‰ÿþ % ‚€% TTJ°Q¿‘Ç'ª@ª@rÜ LPf(TTR°Y¿‘Ç'ª@ª@šÜ L &WMFC‚ø…ø7P…i(TTZ°a¿‘Ç'ª@ª@ÂÜ LPc(TTb°i¿‘Ç'ª@ª@êÜ LP….(TTk°r¿‘Ç'ª@ª@Ü LPe(TTs°z¿‘Ç'ª@ª@:Ü LP…x(TT{°‚¿‘Ç'ª@ª@bÜ LPe(      ‰p ‰Iì  …DÊ …6#    ƒ€ …6#% % ‚€W(%&&P»,»þ¼þ&% % …€V0!G*P•ÑÑ»þ¥Ñ»èÑÑ% (   ÿ‚   ƒ€ …6#% % ‚€W(Ÿ&ŸP,þþ&% % …€V0šG£P•,ÑþÑè,Ñ% (   ÿ‚   ƒ€ …6#% % ‚€W(%vf¤»º ý  þ  &% % …€V0\›f¤•åt ý  ̘ ë“ åt % (   ÿ‚   ƒ€ …6#% % ‚€W(fvŸ¤º ý  þ  &% % …€V0f›p¤•.• ý  r ’ .• % (   ÿ‚   …6#       ‰p ‰Iì  …DÊ      ‰p ‰Iì  …DÊ   ‰p    ‰p       ‰p ‰Iì  …DÊ      ‰p ‰Iì  …DÊ   ‰p  ‰§n% ‚€R…L¾ÿ ‚"Tahoma˜ €?Ý#XB€@ðŒ ?Ý̉ €€XB‚c ‡@ðA‚AƒA‚AŠ €?Ý#‰€@ðŒ ?Ý̈# €€@ ‡@ðA‚AƒA‚AŠ €?Ý#@ ƒ % TTð3öB‘Ç'ª@ª@§nLPC#TT÷3ûB‘Ç'ª@ª@ÊnLP…oTTü3…B‘Ç'ª@ª@ãnLPm(TT…3… B‘Ç'ª@ª@ nLP…p@TT… 3… B‘Ç'ª@ª@)nLPi TT… 3… B‘Ç'ª@ª@3nLP…l TT…3…B‘Ç'ª@ª@=nLPaTT…3…B‘Ç'ª@ª@VnLP…t@TT…3…B‘Ç'ª@ª@enLPi TT…3…B‘Ç'ª@ª@onLP…oTT…3…"B‘Ç'ª@ª@ˆnLPn      ‰p ‰Iì  …DÊ …6#    …6#       ‰p ‰Iì  …DÊ      ‰p ‰Iì  …DÊ   ‰p       ‰p ‰Iì  …DÊ      ‰p ‰Iì  …DÊ   ‰p  ‰§ % TTð‡õ–‘Ç'ª@ª@§ LPETTö‡û–‘Ç'ª@ª@Å LPdTTü‡ý–‘Ç'ª@ª@ã LPi TTþ‡„–‘Ç'ª@ª@í LPtTT…‡…–‘Ç'ª@ª@ü LPi TT…‡…–‘Ç'ª@ª@ LPoTT…‡… –‘Ç'ª@ª@ LPnTT…‡…–‘Ç'ª@ª@= LP TT…‡…–‘Ç'ª@ª@L LPdTT…‡…–‘Ç'ª@ª@j LPeTT…‡…–‘Ç'ª@ª@ƒ LPsTT… ‡…"–‘Ç'ª@ª@— LP TT…#‡…$–‘Ç'ª@ª@¦ LP…l@; TT…%‡…&–‘Ç'ª@ª@° LP…i TT…'‡…+–‘Ç'ª@ª@º LP…e±TT…,‡…1–‘Ç'ª@ª@Ó LP…nY-TT…2‡…5–‘Ç'ª@ª@ñ LP…s%      ‰p ‰Iì  …DÊ …6#  % … €( % … €( % …€( …‚ ‡ ËD…‡€‚ ÿ‚‚ú …-„üÿ…-…'M…‚ÿ‚‚ …‡ 6#‚ ‡&…-…û ‚š1Courier New @?ˆB? …- ‡2 …f ‡2 …i ‡2 …c ‡2 &…1 ‡2 .…. ‡2 6…c‡ 6#…‚ …‡€‚ ÿ‚…-…-…'ƃy…‚ÿ‚‚ …‡ 6#‚ ‡Ÿ…-…- ‡2 ‡…f ‡2 …i ‡2 —…c ‡2 Ÿ…2 ‡2 §…. ‡2 ¯…c‡ 6#…‚ …‡€‚ ÿ‚…-…-‡wMP…‚ÿ‚‚ …‡ 6#‚ ‡c&…-…- ‡2 \…f ‡2 \…i ‡2 \…c ‡2 \&…1 ‡2 \.…. ‡2 \6…o‡ 6#…‚ …‡€‚ ÿ‚…-…-‹wÆPy…‚ÿ‚‚ …‡ 6#‚ ‡cŸ…-…- ‡2 \‡…f ‡2 \…i ‡2 \—…c ‡2 \Ÿ…2 ‡2 \§…. ‡2 \¯…o‡ 6#…‚ …‡€‚ ÿ‚…-…-‹Ë’¤=…‚ÿ‚‚ …‡ 6#‚ ‡·g…-…- ‡2 °J…f ‡2 °R…i ‡2 °Z…c ‡2 °b…. ‡2 °k…e ‡2 °s…x ‡2 °{…e‡ 6#…‚ …‡€‡ 6#…-…- ‘%%&%P&P‚ú …-‚ü…-™$*G%P!G%L*G…-…ð…‚ÿ‚‚ …‡€‡ 6#…-…- ‘%Ÿ&ŸPŸP‚ú …-…-™$£GŸPšGŸL£G…-…ð…‚ÿ‚‚ …‡€‡ 6#…-…- ‘%%vf¤g¤‚ú …-…-™$a›f¤\£c¢a›…-…ð…‚ÿ‚‚ …‡€‡ 6#…-…- ‘%Ÿvf¤g¤‚ú …-…-™$p¢f¤k›j¡p¢…-…ð…‚ÿ‚‚ …‡ 6#‚ ‡3ð…-…û ‚Ž"Tahoma ?ˆ?B??ð‰ ??`Ì…- ‡2 3ð…C ‡2 3÷…o ‡2 3ü…m ‡2 3…p ‡2 3 …i ‡2 3 …l ‡2 3…a ‡2 3…t ‡2 3…i ‡2 3…o ‡2 3…n‡ 6#…‚ …‡ 6#‚ ‡‡ð…- ‡2 ‡ð…E ‡2 ‡ö…d ‡2 ‡ü…i ‡2 ‡þ…t „2 ‡…i ‡2 ‡…o ‡2 ‡…n ‡2 ‡…  ‡2 ‡…d ‡2 ‡…e ‡2 ‡…s ‡2 ‡ …  ‡2 ‡#…l ‡2 ‡%…i ‡2 ‡'…e ‡2 ‡,…n ‡2 ‡2…s‡ 6#…‚ …û‚¼Œ"System“¾ÿžS``€'…-…ð…-…ð‚ú …-…ð/&;)z4ÿÿOÿÿÿÿ|CONTEXT8|CTXOMAP–"|FONT. |KWBTREE½#|KWDATA¡"|KWMAP¦#|PetraJ@|SYSTEM2²|TOPICw´|TTLBTREEì/|TopicIdyH|bm0|bm1º<|bm27Z|bm3g}tlpÒw´G®:Ž íºº&jWMFC„D‚H…HX ï© ™Òw EMFH[ŒR   ð©   ‰±M ‰ë  ‰Þ0 ‰y —Q Y  ƒ€ ÿ‚&% % ‚€+‘Þ0Ü   ÿ‚   ‰ë ‰±M  ð©  …†       ‰ë ‰±M  ð©      ‰ë ‰±M  ð©   ‰ë    ‰ë       ‰ë ‰±M  ð©      ‰ë ‰±M  ð©   ‰ë  ‰½ €% ‚€R…L¾ÿ ‚"Tahoma<‚"Tahoma¿°Ö†M^†oƒ°Õ‡>LwQnìЉ •ZÁ À‹#,,B‚ŠP'©ƒÓ“, ȯȯ‚Bˆÿh þ2 ƒ% TT¥Y§h‘úÛ¨@©@% XLPiTT¨Y®h‘úÛ¨@©@4 XLP…nƒ#TT¯Y´h‘úÛ¨@©@W XLPsTTµY¸h‘úÛ¨@©@u XLP…t*TT¹Y½h‘úÛ¨@©@‰ XLP…rlTT¾YÄh‘úÛ¨@©@¢ XLP…ur#TTÅYÊh‘úÛ¨@©@Å XLP…c*TTËYÎh‘úÛ¨@©@ã XLP…tyTTÏYÑh‘úÛ¨@©@÷ XLP…iETTÒYØh‘úÛ¨@©@ XLP…o\#TTÙYßh‘úÛ¨@©@) XLP…n #      ‰ë ‰±M  ð© …†    ‰ë- ‰ƒƒ  j(  ƒ€ ÿ‚% % …€W0jE•¬-ëð®°n î¬-  ÿ‚   ‰ë ‰±M  ð©  …†       ‰ë ‰±M  ð©      ‰ë ‰±M  ð©   ‰ë       ‰ë ‰±M  ð©      ‰ë ‰±M  ð©   ‰ë  ‰ó‘% ‚€% TT)8‘úÛ¨@©@niLP…c}TT )&8‘úÛ¨@©@ŒiLP…o\#TT')-8‘úÛ¨@©@¯iLP…nG#TT.)48‘úÛ¨@©@ÒiLP…dÙ#TT5)78‘úÛ¨@©@õiLPiTT8);8‘úÛ¨@©@iLP…tàTT<)>8‘úÛ¨@©@iLP…i TT?)E8‘úÛ¨@©@'iLP…o,#TTF)L8‘úÛ¨@©@JiLP…nÛ#      ‰ë ‰±M  ð© …†    ƒ€ …†% % ‚€W,j1ÄQ‘ü‘½ ‘½ 0¾ 0  ÿ‚   ƒ€ …†% % ‚€W05EÄŒ•ôõôZ½ Z½ Ͼ Ï  ÿ‚   ƒ€ …†% % ‚€W(55ó-óô  ÿ‚   ƒ€ …†% % ‚€W(5Œ5©ôZôêõê  ÿ‚   …†       ‰ë ‰±M  ð©      ‰ë ‰±M  ð©   ‰ë       ‰ë ‰±M  ð©      ‰ë ‰±M  ð©   ‰ë  ‰å!% TTel)‘úÛ¨@©@å!LP…V'(TTmt)‘úÛ¨@©@ !LPR(TTu|)‘úÛ¨@©@5!LP…AE(TT}€)‘úÛ¨@©@]!LP…ID      ‰ë ‰±M  ð© …†    …†       ‰ë ‰±M  ð©      ‰ë ‰±M  ð©   ‰ë       ‰ë ‰±M  ð©      ‰ë ‰±M  ð©   ‰ë  ‰:% TTGV‘úÛ¨@©@:LP…F}#TTGV‘úÛ¨@©@]LP…AE(TTG&V‘úÛ¨@©@…LP…Ub(TT'G.V‘úÛ¨@©@­LP…Xr(      ‰ë ‰±M  ð© …†  % … €( % …€( …‚ ‡ ªñ…‡€‚ ÿ‚‚ú …-„üÿ…-‹pðQ—…‚ÿ‚‚ …‡ †‚ ‡aÃ…-…û ‚Š"Tahoma…- ‡2 Y¥…ià ‡2 Y¨…nà ‡2 Y¯…sà ‡2 Yµ…tà ‡2 Y¹…rà ‡2 Y¾…uà ‡2 YÅ…cà ‡2 YË…tà ‡2 YÏ…ià ‡2 YÒ…oà ‡2 YÙ…nà‡ †…‚ …‡€‚ ÿ‚…-ƒü…-‡%515Ej15…‚ÿ‚‚ …‡ †‚ ‡15…-…- ‡2 )…cà ‡2 ) …oà ‡2 )'…nà ‡2 ).…dà ‡2 )5…ià ‡2 )8…tà ‡2 )<…ià ‡2 )?…oà ‡2 )F…nà‡ †…‚ …‡€‡ †…-…- •%j1Ã1ÃQÄQ…‚ÿ‚‚ …‡€‡ †…-…-™%5E5ŒÃŒÃpÄp…‚ÿ‚‚ …‡€‡ †…-…- ‰%555…‚ÿ‚‚ …‡€‡ †…-…- ‘%5Œ5©5©…‚ÿ‚‚ …‡ †‚ ‡e…- ‡2 e…Và ‡2 m…Rà ‡2 u…Aà ‡2 }…Ià‡ †…‚ …‡ †‚ ‡G…- ‡2 G…Fà ‡2 G…Aà ‡2 G…Uà ‡2 G'…Xà‡ †…‚ …û‚¼Œ"System“¾ÿ.M``€'…-…ð‚ú …-…ð0'''lp¥40^NŽ Œ&" WMFC„ñ¾Œ ll&X ÷° ™¦5 EMFl&½ŒR   ø°   ‰Ùq ‰ë  ‰Þ… ‰y —a a   ƒ€ ÿ‚&% % ‚€+‘Þ…Ý ò  ÿ‚   ‰ë ‰Ùq  ø°  …ê"       ‰ë ‰Ùq  ø°      ‰ë ‰Ùq  ø°   ‰ë    ‰ë       ‰ë ‰Ùq  ø°      ‰ë ‰Ùq  ø°   ‰ë  ‰Ñ Õ% ‚€R…L¾ÿ ‚"Tahoma…- ‡2 Y¥ ‡2 Y¨…nà ‡2 Y¯…sà ‡2 Yµ…tà ‡2 Y¹…rà ‡2 Y¾…uà ‡2 YÅ…cà ‡2 Y˃tà‡2 YÏ…ià ‡2 YÒ…oà ‡2 YÙ…nà„ † ƒ€% TT¥i§x‘#ݨ@äΨ@' ­LP…i TT¨i®x‘#ݨ@äΨ@6 ­LPn#TT¯i´x‘#ݨ@äΨ@Y ­LPsTTµi¸x‘#ݨ@äΨ@w ­LPtTT¹i½x‘#ݨ@äΨ@‹ ­LPrTT¾iÄx‘#ݨ@äΨ@¤ ­LPu#TTÅiÊx‘#ݨ@äΨ@Ç ­LPcTTËiÎx‘#ݨ@äΨ@å ­LPtTTÏiÑx‘#ݨ@äΨ@ù ­LPiTTÒiØx‘#ݨ@äΨ@ ­LPo#TTÙißx‘#ݨ@äΨ@+ ­LPn#TTàiæx‘#ݨ@äΨ@N ­LP1#      ‰ë ‰Ùq  ø° …ê"    ‰ë- ‰ƒƒ  j(  ƒ€ ÿ‚% % …€W0jE•¬-ëð®°n î¬-  ÿ‚   ‰ë ‰Ùq  ø°  …ê"       ‰ë ‰Ùq  ø°      ‰ë ‰Ùq  ø°   ‰ë       ‰ë ‰Ùq  ø°      ‰ë ‰Ùq  ø°   ‰ë  ‰ó‘% ‚€% TT)8‘#ݨ@äΨ@niLPcTT )&8‘#ݨ@äΨ@ŒiLPo#TT')-8‘#ݨ@äΨ@¯iLPn#TT.)48‘#ݨ@äΨ@ÒiLPd#TT5)78‘#ݨ@äΨ@õiLPiTT8);8‘#ݨ@äΨ@iLPtTT<)>8‘#ݨ@äΨ@iLPiTT?)E8‘#ݨ@äΨ@'iLPo#TTF)L8‘#ݨ@äΨ@JiLPn#      ‰ë ‰Ùq  ø° …ê"    ƒ€ …ê"% % ‚€W,j1Èa‘ü‘Ñ ‘Ñ …Ò …  ÿ‚   ƒ€ …ê"% % ‚€W(55ó-óô  ÿ‚   …ê"       ‰ë ‰Ùq  ø°      ‰ë ‰Ùq  ø°   ‰ë       ‰ë ‰Ùq  ø°      ‰ë ‰Ùq  ø°   ‰ë  ‰ù0% TTip,‘#ݨ@äΨ@ù0LPV(TTqx,‘#ݨ@äΨ@!0LPR(TTy€,‘#ݨ@äΨ@I0LPA(TT„,‘#ݨ@äΨ@q0LPI      ‰ë ‰Ùq  ø° …ê"    …ê"       ‰ë ‰Ùq  ø°      ‰ë ‰Ùq  ø°   ‰ë       ‰ë ‰Ùq  ø°      ‰ë ‰Ùq  ø°   ‰ë  ‰!ò% TT DS‘#ݨ@äΨ@!òLPF#TTDS‘#ݨ@äΨ@DòLPA(TTD!S‘#ݨ@äΨ@lòLPU(TT"D)S‘#ݨ@äΨ@”òLPX(      ‰ë ‰Ùq  ø° …ê"    ‰… ‰y a b   ƒ€ ÿ‚% % ‚€+†…ˆ ò  ÿ‚   ‰ë ‰Ùq  ø°  …ê"       ‰ë ‰Ùq  ø°      ‰ë ‰Ùq  ø°   ‰ë       ‰ë ‰Ùq  ø°      ‰ë ‰Ùq  ø°   ‰ë  ‰ôÕ% ‚€% TL&ŽWMFC‚l…l&Tix‘#ݨ@äΨ@J­LPiTTix‘#ݨ@äΨ@Y­LPn#TTi"x‘#ݨ@äΨ@|­LPsTT#i&x‘#ݨ@äΨ@š­LPtTT'i+x‘#ݨ@äΨ@®­LPrTT,i2x‘#ݨ@äΨ@Ç­LPu#TT3i8x‘#ݨ@äΨ@ê­LPcTT9i<x‘#ݨ@äΨ@­LPtTT=i?x‘#ݨ@äΨ@­LPiTT@iFx‘#ݨ@äΨ@+­LPo#TTGiMx‘#ݨ@äΨ@N­LPn#TTNiTx‘#ݨ@äΨ@q­LP2#      ‰ë ‰Ùq  ø° …ê"    ƒ€ …ê"% % ‚€W(5E5aôõô…õ…  ÿ‚   ƒ€ …ê"% % ‚€W05Èœ•ô$ô¨Ñ ¨Ñ $Ò $  ÿ‚   ƒ€ …ê"% % ‚€W(5œ5°ô¨ôõ  ÿ‚ % … €( % …€( …‚ ‡ ±ù…‡€‚ ÿ‚‚ú …-„üÿ…-‹øa—…‚ÿ‚‚ …‡ ê"‚ ‡qÇ…-…û ‚Š"Tahomai ?Y¥…- ‡2 j¦…i£ ‡2 j©…n£ ‡2 j¯…s£ ‡2 jµ…t£ ‡2 j¹…r£ ‡2 j¾…u£ ‡2 jÅ…c£ ‡2 jË…t£ ‡2 jÏ…i£ ‡2 jÒ…o£ ‡2 jÙ…n£ ‡2 jà…1£‡ ê"…‚ …‡€‚ ÿ‚…-ƒü…-‡%515Ej15…‚ÿ‚‚ …‡ ê"‚ ‡15…-…- ‡2 )…c£ ‡2 ) …o£ ‡2 )'…n£ ‡2 ).…d£ ‡2 )5…i£ ‡2 )8…t£ ‡2 )<…i£ ‡2 )?…o£ ‡2 )F…n£‡ ê"…‚ …‡€‡ ê"…-…- •%j1Ç1ÇbÈb…‚ÿ‚‚ …‡€‡ ê"…-…- ‰%555…‚ÿ‚‚ …‡ ê"‚ ‡i…- ‡2 i…V£ ‡2 q…R£ ‡2 y…A£ ‡2 …I£‡ ê"…‚ …‡ ê"‚ ‡D …- ‡2 D …F£ ‡2 D…A£ ‡2 D…U£ ‡2 D"…X£‡ ê"…‚ …‡€‚ ÿ‚…-…-‹fa…‚ÿ‚‚ …‡ ê"‚ ‡q5…-…- ‡2 j…i£ ‡2 j…n£ ‡2 j…s£ ‡2 j#…t£ ‡2 j'…r£ ‡2 j,…u£ ‡2 j3…c£ ‡2 j9…t£ ‡2 j=…i£ ‡2 j@…o£ ‡2 jG…n£ ‡2 jN…2£‡ ê"…‚ …‡€‡ ê"…-…- ‘%5E5b5b…‚ÿ‚‚ …‡€‡ ê"…-…-™%55œÇœÇÈ…‚ÿ‚‚ …‡€‡ ê"…-…- ‘%5œ5°5°…‚ÿ‚‚ …û‚¼Œ"System“¾ÿ.M``€'…-…ð‚ú …-…ðË0Â0lpDjìqJaŽ {&" WMFC„œŒ -X …“P ™Di EMF -™ŒR   …“Q   ‰ß — …úî  …ˆî …¥ P p  ƒ€ ÿ‚&% % …€+…ˆî‰…  ÿ‚   …úî ‰ß —  …“Q  …       …úî ‰ß —  …“Q      …úî ‰ß —  …“Q   …úî    …úî       …úî ‰ß —  …“Q      …úî ‰ß —  …“Q   …úî  ‰¢5% ‚€R…L¾ÿ ‚"TahomaŠ(&‰&ðdO <<‚Œ,,ÿ †6@ˆÒy, ‚¨"TahomaConsole˜ù†{·÷¿÷A÷¿”ÿ Š(&‰&ð  c‚‹} ,ˆDÞ‰ ‚Œ"Gothic82 ƒ% TT{©@g+¨@_ LPJTT€†©@g+¨@x LPe#TT‡©@g+¨@› LPa#TTŽ”©@g+¨@¾ LPn#      …úî ‰ß —  …“Q …    …¼î …¥ À *  ƒ€ ÿ‚% % …€+…¼î‰²  ÿ‚   …úî ‰ß —  …“Q  …       …úî ‰ß —  …“Q      …úî ‰ß —  …“Q   …úî       …úî ‰ß —  …“Q      …úî ‰ß —  …“Q   …úî  ‰#5% ‚€% TTÎÔ©@g+¨@þ LP1#TTÕÛ©@g+¨@! LP0#      …úî ‰ß —  …“Q …    …Šî …¥ ê   ƒ€ ÿ‚% % …€+…Šî‰z  ÿ‚   …úî ‰ß —  …“Q  ‰xø …¥ …5 q  ƒ€ ÿ‚% % …€+‘xøu —  ÿ‚   …úî ‰ß —  …“Q  …       …úî ‰ß —  …“Q      …úî ‰ß —  …“Q   …úî       …úî ‰ß —  …“Q      …úî ‰ß —  …“Q   …úî  ‰’?% ‚€% TT…D;…HJ©@g+¨@OLPJTT…I;…OJ©@g+¨@hLPe#TT…P;…VJ©@g+¨@‹LPa#TT…W;…]J©@g+¨@®LPn#      …úî ‰ß —  …“Q …    ‰¬ ø …¥ …Š5 )  ƒ€ ÿ‚% % …€+‘¬ ø¡ —  ÿ‚   …úî ‰ß —  …“Q  …       …úî ‰ß —  …“Q      …úî ‰ß —  …“Q   …úî       …úî ‰ß —  …“Q      …úî ‰ß —  …“Q   …úî  ‰ ?% ‚€% TT…—;…J©@g+¨@î LP…1ÿ#TT…ž;…¤J©@g+¨@ LP…0 #      …úî ‰ß —  …“Q …    ‰z ø …¥ …³5   ƒ€ ÿ‚% % …€+‘z øj —  ÿ‚   …úî ‰ß —  …“Q  ‰J 6 …¥ …Ý q  ƒ€ ÿ‚% % …€+‘J 6G Õ  ÿ‚   …úî ‰ß —  …“Q  …       …úî ‰ß —  …“Q      …úî ‰ß —  …“Q   …úî       …úî ‰ß —  …“Q      …úî ‰ß —  …“Q   …úî  ‰d }% ‚€% TT…… #©@g+¨@! ULP…JÿÿTT… …#©@g+¨@: ULP…eÿÿ#TT……#©@g+¨@] ULP…aÿÿ#TT……!#©@g+¨@€ ULP…nÿÿ#      …úî ‰ß —  …“Q …    ‰~ 6 …¥ …N )  ƒ€ ÿ‚% %œ&. WMFC‚ … - …€+‘~ 6sÕ  ÿ‚   …úî ‰ß —  …“Q  …       …úî ‰ß —  …“Q      …úî ‰ß —  …“Q   …úî       …úî ‰ß —  …“Q      …úî ‰ß —  …“Q   …úî  ‰å }% ‚€% TT…[…a#©@g+¨@À ULP…1ÿÿ#TT…b…h#©@g+¨@ã ULP0#      …úî ‰ß —  …“Q …    ‰L6 …¥ …w   ƒ€ ÿ‚% % …€+‘L6<Õ  ÿ‚   …úî ‰ß —  …“Q  ƒ€ …% % ‚€W(…………9’{’ “ &% % …€*‘‰q˜€% (   ÿ‚   ƒ€ …% % ‚€W(…À…ÜD¼ CG }H }&% % …€*‘° :Ä I% ( &% % …€V,…Ø…Ü!‘2 ‰G }C •2 ‰% (   ÿ‚   ƒ€ …% % ‚€W(N4>ñ9‚9&% % …€*‘6éEø% ( &% % …€V,IN‘i;9sMi;% (   ÿ‚   ‰ú¨ ¬¬ %   ƒ€ ÿ‚% % …€+‘ú¨ N  ÿ‚   …úî ‰ß —  …“Q  ƒ€ …% % ‚€W(…w9…“9N Ö ×   ÿ‚   ƒ€ …% % ‚€W(…}=…=l#¸#¹#  ÿ‚   ƒ€ …% % ‚€W(ø…DÔ;qErE&% % …€*‘È/ÜC% ( &% % …€V,…?…D‘n-qE]7n-% (   ÿ‚ % … €( % …€( …‚ ‡ R”…‡€‚ ÿ‚‚ú …-ƒü…-…ÀƒP…‚ÿ‚‚ …‡ ‚ ‡ˆ„üÿ…-…û ‚‹"Tahoma?ƒ&?…dO‡<<?…- ‡2 {…Jß ‡2 €…eä ‡2 ‡…aß ‡2 Ž…nä‡ …‚ …‡€‚ ÿ‚…-…-…êƒÀ…‚ÿ‚‚ …‡ ‚ ‡Õ…-…- ‡2 Î…1ß ‡2 Õ…0ä‡ …‚ …‡€‚ ÿ‚…-…-‹ê…‚ÿ‚‚ …‡€‚ ÿ‚…-…-‹QŠ5…‚ÿ‚‚ …‡ ‚ ‡CR…-…- ‡2 ;D…Jß ‡2 ;I…eä ‡2 ;P…aß ‡2 ;W…nä‡ …‚ …‡€‚ ÿ‚…-…-‹Q³5Š…‚ÿ‚‚ …‡ ‚ ‡CŸ…-…- ‡2 ;—…1ß ‡2 ;ž…0ä‡ …‚ …‡€‚ ÿ‚…-…-‹QÏ5³…‚ÿ‚‚ …‡€‚ ÿ‚…-…-‹*NÝ…‚ÿ‚‚ …‡ ‚ ‡…-…- ‡2 …Jß ‡2  …eä ‡2 …aß ‡2 …nä‡ …‚ …‡€‚ ÿ‚…-…-‹*wN…‚ÿ‚‚ …‡ ‚ ‡b…-…- ‡2 […1ß ‡2 b…0ä‡ …‚ …‡€‚ ÿ‚…-…-‹*“w…‚ÿ‚‚ …‡€‡ …-…- ‘%……9…9‚ú …-‚ü…-‹‡ƒ…-…ð…‚ÿ‚‚ …‡€‡ …-…- ‘%ÀDÜÜ‚ú …-…-‹FÃB¾…-…ð‚ú …-…- •$ØÜÛ!Ø…-…ð…‚ÿ‚‚ …‡€‡ …-…- ‘%4NN‚ú …-…-‹62 …-…ð‚ú …-…- •$INKI…-…ð…‚ÿ‚‚ …‡€‚ ÿ‚…-…-‡A%…‚ÿ‚‚ …‡€‡ …-…- ‘%w9’9“9…‚ÿ‚‚ …‡€‡ …-…- ‘%}>Œ>>…‚ÿ‚‚ …‡€‡ …-…- ‘%øDD‚ú …-…-‹û ö…-…ð‚ú …-…- •$@DA@…-…ð…‚ÿ‚‚ …û‚¼Ž"System Ý„ñ†Äø¿ Þ …-…ð‚ú …-…ðE<l!˜i@ Cours C++Ici votre nom0Ici votre nom -> With ArchiDoc (Help Generator)BrowseButtons()[AI("mnu_help","mnu_about2","A propos de ce document","JI(`Cours C++.HLP',`AD_Copyright')")_AI("MNU_FLOATING","FloatItem1","A propos de ce document","JI(`Cours C++.HLP',`AD_Copyright')")ZAI("mnu_file","mnu_Suite","A propos de ce document","JI(`Cours C++.HLP',`AD_Copyright')")%CB("quitter_btn","Quitter","Exit()")ZmainCours C++  ·k®kÿÿÿÿ 1ÿÿÿÿ=1Vÿÿÿÿÿÿÿÿÿÿÿÿ=b% b" €€€ÿ = =Ÿ1½ ÿÿÿÿÿÿÿÿŸ ¬ Introduction'bÆ$ €€f€‚ÿZŸ <#H€<À.€€f€‚€€‚€‚ÿÿÿIntroduction W-Æw* $€Z€€‚€€‚ÿFichier d'aide créé par Jérémy Beuchot.= ´' €,€€‚€‚ÿCours de C et C++,wà' € €€‚€‚ÿ@´ + &€*€>‚~‚ø¼H€ ‚ÿTable des matières5àU' €€’‚‚ø€ ‚ÿGénéralitésa, ¶5 :€X€‚‚†ñ€ã3€ ‰‚ã2‰‚ÿStructure d'un programme CHistorique9Uï' €$€’‚‚ø€ ‚ÿEntrées/Sorties«h¶šC V€Ð€‚‚†ñ€ã^€ ‰‚ã^‰‚ã^‰‚ã^‰‚ÿIntroductionE/S de caractères isolésE/S de données mises en formeE/S de chaînes caractèresH!ïâ' €B€’‚‚ø€ ‚ÿTypes, Opérateurs, ExpressionsWðš9g œ€á€‚‚†ñ€ã^€ ‰‚ã^‰‚ã^‰‚ã^‰‚ãE^‰‚ã<^‰‚ã=^‰‚ã>^‰‚ã?^‰‚ÿNoms de variablesTypes de données et taillesConstantesDéclarationOpérateurs arithmétiquesOpérateurs unairesOpérateurs de comparaison et opérateurs logiquesOpérateurs de traitement de bitsOpérateurs d'affectation@ây' €2€’‚‚ø€ ‚ÿStructures de contrôleÆ`9?f œ€À€‚‚†ñ€ãA^€ ‰‚ãB^‰‚ãC^‰‚ãD^‰‚ãp^‰‚ãg^‰‚ãh^‰‚ãi^‰‚ãj^‰‚ÿInstructions et blocsif-elseswitchwhiledo-whileforbreakContinuegotoO(yŽ' €P€’‚‚ø€ ‚ÿFonctions et structures de programmesçœ?uK d€9€‚‚†ñ€ãl^€ ‰‚ãm^‰‚ãn^‰‚ã•^‰‚ã˜^‰‚ÿPrincipes fondamentauxVariables, classes de mémorisationProgramme mono-fichierProgramme multi-fichierCompléments sur les fonctions externes?Ž´' €0€’‚‚ø€ ‚ÿPointeurs et Tableaux~u2 g œ€/€‚‚†ñ€ã¾^€ ‰‚ã¿^‰‚ãÀ^‰‚ãÁ^‰‚ãÂ^‰‚ãÃ^‰‚ãÄ^‰‚ãÅ^‰‚ãñ^‰‚ÿIntroductionPassage de paramètres par adresseTableau mono-dimentionnelOpérations sur les pointeursPassage de tableau en paramètresTableaux de pointeurs - pointeurs de pointeursTableaux multidimensionnelsGestion de la mémoirePointeur vers une fonctionJ#´| ' €F€’‚‚ø€ ‚ÿStructures, unions, énumérationsŒI2  C V€’€‚‚†ñ€ãè^€ ‰‚ãé^‰‚ãê^‰‚ãë^‰‚ÿStructuresTypes de données personnaliséesUnionsEnumérations=| E ' €,€’‚‚ø€ ‚ÿFichiers de données˜\ Ý < H€¸€‚‚†ñ€ãì^€ ‰‚ã_‰‚ãG_‰‚ÿOuverture et fermetureFonctions de positionnementCréation d'un fichier de données@E  ' €2€’‚‚ø€ ‚ÿAutres fonctionnalitésj.Ý ‡ < H€\€‚‚†ñ€ã_€ ‰‚ã_‰‚ã_‰‚ÿMacrosPré-processeur CFonction main% ¬ " €€€ ÿ < ‡ è 1ìÿÿÿÿÿÿÿÿÿÿÿÿè ˜ Généralités)¬  % €€f€ ‚‚ÿa,è r 5 :€X€’‚‚ñ€ã3€ ‰‚ã2‰‚ÿStructure d'un programme CHistorique& ˜ # €€f€ ÿ ; r Ó 1BÿÿÿÿÎÓ R cHistorique'˜ ú $ €€f€ ‚ÿXÓ R <#H€8À.€€f€‚€€‚€ ‚ÿÿÿHistorique &ú x # €€€ ‚ÿÀšR 8& €5€@¸€‚‚ÿCréé en 1970 dans les laboratoire de Bell telephon par D.Ritchie et B.W.Verningham, il est utilisé en interne jusqu'en 1978, date à laquelle les premières spécifications sont publiées. En 1981, apparaît le C++, un langage dérivé du C dans lequel est ajouté la notion de programmation orientée objet (POO). Toutes les fonctions du C standard sont comprise dans le C++.Le langage C est un langage procédural.+x c& € €€‚€ ÿ K8®1 ÿÿÿÿ®I@2NStructure d'un programme C'cÕ$ €€f€ ‚ÿh,®I@<#H€XÀ.€€f€ÕI@c‚€€‚€ ‚ÿÿÿStructure d'un programme C &Õo@# €€€ ‚ÿÑI@B? L€¥€@¸€‚‚‚€€‚‚€†"€€‚ÿUn programme C est composé :d'un ou de plusieurs fichiersd'une ou de plusieurs modulesd'une fonction principale main(), les autres fonctions étant appelée par celle ci directement ou indirectement.Le langage C ne connaît que les fonctions, la notion de procédure n'existe pas mais on peut créer des fonctions qui agissent comme des procédures. Si les fonctions sont reparties dans plusieurs fichiers, elles sont reliées au moment de l'édition de liens.ŠCo@ EG \€‡€@¸€‚€€€€€€€€€€€‚ÿUne fonction est un sous-programme auquel on transmet une liste d'arguments (éventuellement vide) et qui retourne un valeur après avoir effectué une certaine tache. Contrairement au langage Ada, les arguments peuvent être en mode in, out ou in/out. De plus, la valeur retournée peut ne pas exister. Toute fonction doit comprendre :une entête de la forme : type nom_de_fonction(type_arg1 arg1, type_arg2 arg2,...) ou type est le type de la fonction (void si la fonction ne retourne rien). Les parenthèses sont obligatoire même si la fonction n'a pas de paramètres.°iB¹GG \€Ó€@¸€‚‚€€‚€€€€€€‚€€‚ÿliste des déclaration des paramètre (nécessaire si on n'a pas spécifier le type des paramètre au moment de leur passage dans l'entête de la fonction)une instruction composée (c'est à dire un bloc d'instructions)Un bloc d'instruction est noté entre accolades ({...}) et est composé d'instructions simples ou elles-même composées.On note les commentaire entre les symboles /* et */ ou après un //.Attention !!! il peut y avoir des problèmes avec l'utilisation des commentaire. Par exemple, si on a la partie de programme suivant qui contient des commentaire et que l'on voudrait mettre en commentaire :;è EôJS t€Ñ€@¸€‚‚‚€‚€‚‚‚‚‚€‚€‚‚‚‚‚€€€‚€‚‚‚€‚ÿ... bloc d'instructions /* commentaire */...on ferait ceci :/*... bloc d'instructions /* commentaire */...*/mais en fait, il n'y aurait que cette partie qui serait mise en commentaire :/*... bloc d'instructions /* commentaire */...*/Il aurait en fait mieux valu mettre les commentaires d'origine derrière un // comme ceci :... bloc d'instructions // commentaire...Une variable en C est visible depuis sa déclaration jusqu'à la fin du bloc où elle a été déclarée. L'appel d'une fonction en C constitue un instruction. On n'est pas obligé de tenir compte de la valeur retournée par une fonction. On se sert alors que des effets produits par la fonction (affectation de variables globales, affichages, saisies…).'¹GK$ €€@¸€‚ÿJ ôJeKA#R€ÑØ€€€‚ÿ€ €‚ÿÿÿAdaCe$KÊKA#R€HÑØ€€€‚ÿ€ €‚ÿÿÿwith fichier;#include HeKMB#R€ ÑØ€€€‚ÿ€$‚ÿÿÿprocedure main is déclaration des variables globales spécification des fonctions définition des fonctions begin corps de main end main;déclaration des variables globales spécification des fonctions main() { corps de main } définition des fonctionsõÉÊKN, &€“€@¸€‚€€‚ÿLa définition des fonctions en fin de fichier permet d'avoir une meilleur vue d'ensemble d'un fichier dès son ouverture. On voit directement la liste des fonctions du fichier et le corps de main.+M2N& € €€‚€ ÿ @NrN1:ÿÿÿÿÿÿÿÿÿÿÿÿrNlOEntrées/Sorties)2N›N% €€f€ ‚‚ÿ«hrNFOC V€Ð€’‚‚ñ€ã^€ ‰‚ã^‰‚ã^‰‚ã^‰‚ÿIntroductionE/S de caractères isolésE/S de données mises en formeE/S de chaînes caractères&›NlO# €€f€ ÿ OFO»O1õÿÿÿÿÿÿÿÿÿÿÿÿ»O‰Types, Opérateurs, Expressions)lO €% €€f€ ‚‚ÿ»O €lOWð»Ocg œ€á€’‚‚ñ€ã^€ ‰‚ã^‰‚ã^‰‚ã^‰‚ãE^‰‚ã<^‰‚ã=^‰‚ã>^‰‚ã?^‰‚ÿNoms de variablesTypes de données et taillesConstantesDéclarationOpérateurs arithmétiquesOpérateurs unairesOpérateurs de comparaison et opérateurs logiquesOpérateurs de traitement de bitsOpérateurs d'affectation& €‰# €€f€ ÿ GcÐ1\ÿÿÿÿÿÿÿÿÿÿÿÿÐå‚Structures de contrôle)‰ù% €€f€ ‚‚ÿÆ`п‚f œ€À€’‚‚ñ€ãA^€ ‰‚ãB^‰‚ãC^‰‚ãD^‰‚ãp^‰‚ãg^‰‚ãh^‰‚ãi^‰‚ãj^‰‚ÿInstructions et blocsif-elseswitchwhiledo-whileforbreakContinuegoto&ùå‚# €€f€ ÿ = ¿‚"ƒ1»ÿÿÿÿ"ƒ£ƒ-‡Introduction'å‚Iƒ$ €€f€ ‚ÿZ"ƒ£ƒ<#H€<À.€€f€‚€€‚€ ‚ÿÿÿIntroduction &IƒÉƒ# €€€ ‚ÿ‡b£ƒP…% €Å€@¸€‚ÿLes fonctions d'entrées/sorties (E/S) permettent l'échange d'informations entre l'ordinateur et les périphériques standard (clavier, écran). Comme toute fonction, il faut préciser lors de l'appel, le nom de la fonction suivi d'une liste d'arguments entre parenthèses. Les parenthèses sont obligatoires même si aucun argument n'est passé à la fonction.Ý¡Ƀ-‡< F€C€€€€€€€€€‚€ ÿLes compilateurs C incluent un ensemble de fichiers entête fournissant l'information nécessaire à l'emploi des bibliothèques. Le fichier entête correspondant aux entrées/sorties doit être inclus dans tout fichier source les utilisant par la directive #include . L'extension .h signifie que le fichier contient des entêtes (header), les entêtes de fonction étant leur déclaration ou spécification. IP…v‡1sZo v‡ˆEŠE/S de caractères isolés'-‡‡$ €€f€ ‚ÿf*v‡ˆ<#H€TÀ.€€f€‚€€‚€ ‚ÿÿÿE/S de caractères isolés &‡)ˆ# €€€ ‚ÿñ¹ˆŠ8 >€s€@¸€€‚€€‚‚‚€‚‚‚‚ÿgetchar() : attend la saisie d'un caractère sur le périphérique d'entre standard (généralement le clavier)putchar() : affiche un caractère sur le périphérique de sortie standard (généralement l'écran)Exemple d'utilisation :...char MonCar; //déclaration d'une variable de type caractèreMonCar=getchar(); //saisie d'un caractère stocké dans la variable MonCarputcar(MonCar); //affichage du contenu de la variable MonCar+)ˆEŠ& € €€‚€ ÿ NŠ“Š1×Ù‡ “Š%‹×ËE/S de données mises en forme'EŠºŠ$ €€f€ ‚ÿk/“Š%‹<#H€^À.€€f€‚€€‚€ ‚ÿÿÿE/S de données mises en forme &ºŠK‹# €€€ ‚ÿ“>%‹ÞU x€}€@¸€€‚€€‚‚€€€€€€€€€€€€‚ÿprintf("Chaine de formatage", Arg1, Arg2, ...) : permet l'affichage de données de type caractère isolé, valeur numérique, chaîne de caractères.scanf("Chaine de formatage", Arg1, Arg2, ...) : permet la saisie de données de type caractère isolé, valeur numérique, chaîne de caractères.Les ArgI représentent les données à saisir ou à afficher. Pour scanf(...), ArgI est l'adresse mémoire de la variable dans laquelle la donnée saisie sera stockée. Pour stocker la saisie dans une variable Var, il faut donc passer &Var en argument à la fonction scanf(...).ÀhK‹ªÀX ~€Ñ€@¸€€€‚€€€€‚€€€€‚€€€€€€‚ÿLa chaîne de formatage contient des groupes de caractères distincts, associés à chacun des ArgI.La forme globale d'un ArgI est la suivante : %[[-]taille] [.précision [l]] conversion avec :taille : taille minimum du champ d'impression, exprimée en caractères. Si le "-" est présent, l'argument sera cadré à gauche dans son champ d'impression.précision : si l'argument est une chaîne, cette valeur indique le nombre maximum de caractères à imprÞªÀEŠimer. Si c'est un flottant, elle donne le nombre de chiffres à indiquer après le point. Si le "l" est présent, l'argument sera interprété comme un long.^6ÞÁ( €l€@¸€€‚‚ÿconversion : peut prendre les valeurs suivantes :j'ªÀrÁC#V€NÂt"àyf€€€‚ÿ€€‚ÿÿÿdL'argument sera écrit en base dixg$ÁÙÁC#V€HÂt"àyf€€€‚ÿ€€‚ÿÿÿoL'argument sera écrit en octalm*rÁFÂC#V€TÂt"àyf€€€‚ÿ€€‚ÿÿÿxL'argument sera écrit en hexadecimalt1ÙÁºÂC#V€bÂt"àyf€€€‚ÿ€€‚ÿÿÿuL'argument sera écrit en base dix non signév3FÂ0ÃC#V€fÂt"àyf€€€‚ÿ€€‚ÿÿÿcL'argument sera interprété comme un caractèrežUºÂÎÃI#b€ªÂt"àyf€€€‚ÿ€€€€‚ÿÿÿsL'argument sera interprété comme l'adresse d'une chaîne se terminant par "\0"¡X0ÃoÄI#b€°Ât"àyf€€€‚ÿ€€€€‚ÿÿÿeL'argument sera interprété comme un flottant et écrit sous la forme [-]m.n E[-]e›RÎà ÅI#b€¤Ât"àyf€€€‚ÿ€€€€‚ÿÿÿfL'argument sera interprété comme un flottant et écrit sous la forme [-]m.n¬ioĶÅC#V€ÒÂt"àyf€€€‚ÿ€€‚ÿÿÿgL'argument sera interprété comme un flottant et écrit sous la forme la plus courte des précédentes.I ÅÿÈA P€€@¸€‚‚€‚‚‚‚‚‚‚‚‚‚‚‚‚€‚€€‚ÿExemple d'utilisation :#include main{ int MonEntier; float MonReel; char MonCar; char MaChaine[10]; printf("Saisir un entier, un réel, un caractère et une chaine"); scanf("%d %f %c %s", &MonEntier, &MonReel, &MonCar, MaChaine); printf("L'entier vaut %d\n Le réel vaut %f\n", MonEntier, MonReel); printf("Le caractère vaut %d\n La chaine vaut %f\n", MonCar, MaChaine);}Une chaîne de caractère est un tableau de caractères. Dans notre exemple, le nombre d'élément du tableau est de 10, on pourra donc stocker une chaîne de caractères d'au plus 9 caractères. En effet, une chaîne de caractères se termine toujours par le caractère '\0', il faut donc un tableau pouvant stocker un caractère de plus que le nombre de caractères de la chaîne.­U¶Å¬ËX ~€«€@¸€€€‚‚€€€€‚€€€€€€€€€€‚ÿUne variable de type tableau est en fait une variable de type pointeur vers un tableau. Elle contient l'adresse du premier élément du tableau. Puisque c'est déjà une adresse, on peut la passer directement en argument à la fonction scanf().Attention : l'utilisation de la fonction scanf() pour la saisie d'une chaîne de caractères arrête la saisie après un espace ou un retour-chariot.Si l'utilisateur saisit "Mon nom est Paul" à la commande scanf("%s", MaChaine), la variable MaChaine contiendra "Mon". Il vaut mieux utiliser gets() pour la saisie d'une chaîne de caractères.+ÿÈ×Ë& € €€‚€ ÿ J¬Ë!Ì1ëoÿÿÿÿ !̯Ì|E/S de chaînes caractères'×ËHÌ$ €€f€ ‚ÿg+!̯Ì<#H€VÀ.€€f€‚€€‚€ ‚ÿÿÿE/S de chaînes caractères &HÌÕÌ# €€€ ‚ÿX¯Ì-ÏD V€)€@¸€€‚€€‚‚‚€‚‚‚‚‚€‚€€‚ÿgets() : attend la saisie d'une chaîne de caractères sur le périphérique d'entre standardputs() : affiche une chaîne de caractères sur le périphérique de sortie standardExemple d'utilisation :...char MaChaine[20]; //déclaration d'une variable de type chaine de caractèresgets(MaChaine); //saisie d'un caractère stocké dans la variable MaChaineputs(MaChaine); //affichage du contenu de la variable MaChaine...Contrairement à la fonction scanf(), la saisie ne s'arrête que pour la frappe d'un retour-chariot.ÎÕÌQJ b€€@¸€‚€€€€€€€€€€€€‚ÿAttention : la saisie d'un entier avec scanf() doit être validée par un retour-chariot. Le caractère retour chariot sera donc prése-ÏQ×Ënt dans le buffer clavier. Une saisie de caractère ultérieure ira chercher le contenu du buffer clavier qui contient le retour-chariot et l'utilisateur n'aura pas pu entrer de caractère. Pour éviter ce problème, il convient de vider le buffer clavier avant une saisie de caractère grâce à la commande ffluch(sdtin).+-Ï|& € €€‚€ ÿ BQ¾1MÿÿÿÿÙ ¾D`Noms de variables'|å$ €€f€ ‚ÿ_#¾D<#H€FÀ.€€f€‚€€‚€ ‚ÿÿÿNoms de variables &åj# €€€ ‚ÿ˦D5% €M€@¸€‚ÿUn nom de variable peut être composé de caractères alphabétiques majuscules et minuscules, du symbole '_' et de chiffres mais ne peut pas commencer par un chiffre.+j`& € €€‚€ ÿ L5¬1‡µ ¬<’Types de données et tailles'`Ó$ €€f€ ‚ÿi-¬<<#H€ZÀ.€€f€‚€€‚€ ‚ÿÿÿTypes de données et tailles &Ób# €€€ ‚ÿ¤<ga €I€@¸€‚€€‚€€‚€€‚€€‚€€‚‚‚‚‚€€€€‚‚‚€‚‚‚ÿSpécificateurs de types :void : aucun typechar : caractère (un octet)int : entier (deux ou quatre octets selon les machines)float : réel virgule flottante simple précisiondouble : réel virgule flottante double précisionQuantificateurs de types :short, long, unsigned : appliqués à intsigned, unsigned : appliqués à un charlong : appliqué à doubleExemple :...short int MonEntierCourt ;...+b’& € €€‚€ ÿ ; gÍ1VÙíÍLq Constantes'’ô$ €€f€ ‚ÿXÍL<#H€8À.€€f€‚€€‚€ ‚ÿÿÿConstantes &ôr# €€€ ‚ÿ%ÁL—d –€ƒ€@¸€‚€€€€€€‚€€€€€€€€‚€€€€€€‚ÿIl existe quatre types de constantes :entière (Ex : 20 (décimale), o37 (octale), 0x1F (hexadécimale))réelle (Ex : 1., 1.0, 0.2E6, 2e-3)caractères (Ex : 'a','\n', '\0')l2r : D€d€€€€€€€‚€‚€‚ÿchaîne de caractères (Ex : "abc", "a")I —L ) "€@€âÑPkR€‰‚ÿ VERSION NON - ENREGISTREE % q " €€€ ÿ < L ­ 1”µ°­ -  Déclaration'q Ô $ €€f€ ‚ÿY­ - <#H€:À.€€f€‚€€‚€ ‚ÿÿÿDéclaration &Ô S # €€€ ‚ÿƒ_- Ö $ €¾€@¸€‚ÿOn déclare une variable en donnant son type suivi de son nom et éventuellement d'une valeur.LS " . ,€<€€€‚€‚€‚ÿEx : int MonEntier=3 ;I Ö k ) "€@€âÑPkR€‰‚ÿ VERSION NON - ENREGISTREE %"  " €€€ ÿ Ik Ù 1%í Ù f ZOpérateurs arithmétiques'  $ €€f€ ‚ÿf*Ù f <#H€TÀ.€€f€‚€€‚€ ‚ÿÿÿOpérateurs arithmétiques & Œ # €€€ ‚ÿ.f º . *€€@¸€‚€€‚‚‚ÿIl y en a cinq : +, -, /,*, % (modulo)Les autres opérations mathématiques sont incluses dans la bibliothèque math.h.Dans une opération, si deux opérandes sont de types différents, le résultat est exprimé dans le type ayant la plus grande précision.2Œ ì + &€€€‚€‚€‚ÿI º 5) "€@€âÑPkR€‰‚ÿ VERSION NON - ENREGISTREE %ì Z" €€€ ÿ C51²°5$˜BOpérateurs unaires'ZÄ$ €€f€ ‚ÿ`$$<#H€HÀ.€€f€‚€€‚€ ‚ÿÿÿOpérateurs unaires &ÄJ# €€€ ‚ÿÐ$q@K d€¡€@¸€€‚€€€‚€€€€€€€€‚ÿLe moins unaire : -L'incrémentation : ++A++ est équivalent à A=A+1. La pré-incrémentation (++AJq@Z) est effectuée avant une affectation alors que la post-incrémentation (A++) est effectuée après.}:Jî@C#V€tÅn9!E퀀€‚ÿ€J€‚ÿÿÿ... int A,B; A=3; B=A++ B=++A; ...A B 3 4 5 3 5 Ñq@øA9 @€£€@¸€‚€‚€‚‚‚‚‚€‚€‚ÿLa décrémentation : --Idem…L'opérateur sizeof(type ou variable)Retourne la taille en octet d'un type ou d'une variable.L'opérateurs de conversion : (type)(int)A : converti la variable en entier.2î@*B+ &€€€‚€‚€‚ÿI øAsB) "€@€âÑPkR€‰‚ÿ VERSION NON - ENREGISTREE %*B˜B" €€€ ÿ a0sBùB1 dƒùBžCnHOpérateurs de comparaison et opérateurs logiques'˜B C$ €€f€ ‚ÿ~BùBžC<#H€„À.€€f€‚€€‚€ ‚ÿÿÿOpérateurs de comparaison et opérateurs logiques & CÄC# €€€ ‚ÿ¤|žChD( €ø€@¸€‚‚‚‚‚ÿIl y a :4 opérateurs relationnels : <, >, <=, >=2 opérateurs de comparaison : ==, !=3 opérateurs logiques : &&, ||, !_ ÄCÇDT#x€5P)'ð)ð)€€€‚ÿ€€‚ÿ€€‚ÿÿÿADACihD0ET#x€*5P)'ð)ð)€€€‚ÿ€€‚ÿ€"€‚ÿÿÿComparaison===iÇD™ET#x€*5P)'ð)ð)€€€‚ÿ€€‚ÿ€$€‚ÿÿÿAffectation:==b0EûET#x€5P)'ð)ð)€€€‚ÿ€ €‚ÿ€€‚ÿÿÿETAND&&a ™E\FT#x€5P)'ð)ð)€€€‚ÿ€ €‚ÿ€€‚ÿÿÿOUOR||bûE¾FT#x€5P)'ð)ð)€€€‚ÿ€ €‚ÿ€€‚ÿÿÿNONNOT!ã\FÎG- (€Ç€@¸€‚‚€€‚ÿCes opérateurs permettent de construire des expressions dont la valeur est vraie ou fausse. Le résultat est de int puisque le type booléen n'existe pas en C. Si l'entier vaut 0 le résultat est vrai et sinon, il est faux.2¾FH+ &€€€‚€‚€‚ÿI ÎGIH) "€@€âÑPkR€‰‚ÿ VERSION NON - ENREGISTREE %HnH" €€€ ÿ Q IH¿H1i5*¿HTI¬€Opérateurs de traitement de bits'nHæH$ €€f€ ‚ÿn2¿HTI<#H€dÀ.€€f€‚€€‚€ ‚ÿÿÿOpérateurs de traitement de bits &æHzI# €€€ ‚ÿßTIJ& €¿€@¸€‚‚ÿIl existe un certain nombre d'opérateurs permettant la manipulation individuelle de bits à l'intérieur d'un mot mémoire. Ils s'appliquent aux types objets de types fondamentaux c'est à dire les entier et les caractères.ÇQzIFKv#¼€¢èßÌß,ß ß€€€‚ÿ€€‚ÿ€,€‚ÿ€R€‚ÿ€x€‚ÿÿÿOpérateurFonctionValeur en base 10Valeur en binaireRésultat en binaire¥/JëKv#¼€^èßÌß,ß ß€€€‚ÿ€€‚ÿ€(€‚ÿ€.€‚ÿ€F€‚ÿÿÿ~Complément à 250...0001011...111010¦0FK‘Lv#¼€`èßÌß,ß ß€€€‚ÿ€€‚ÿ€ €‚ÿ€.€‚ÿ€P€‚ÿÿÿ&ET logique5 & 6...101 & ...110...100¦0ëK7Mv#¼€`èßÌß,ß ß€€€‚ÿ€€‚ÿ€ €‚ÿ€.€‚ÿ€P€‚ÿÿÿ|OU logique5 | 6...101 | ...110...111¯9‘LæMv#¼€rèßÌß,ß ß€€€‚ÿ€€‚ÿ€2€‚ÿ€@€‚ÿ€b€‚ÿÿÿ^OU exclusif logique5 ^ 6...101 ^ ...110...011µ?7M›Nv#¼€~èßÌß,ß ß€€€‚ÿ€ €‚ÿ€B€‚ÿ€R€‚ÿ€f€‚ÿÿÿ<<Décalage des bits à gauche5 << 2...00101...0010100²<æMMOv#¼€xèßÌß,ß ß€€€‚ÿ€ €‚ÿ€B€‚ÿ€R€‚ÿ€f€‚ÿÿÿ>>Décalage des bits à droite5 >> 1...00101...0010œo›N €- *€Þ€@¸€‚‚€‚‚‚‚‚ÿExemple :...int MonEntier=7, SaMoitie, SonDouble;SaMoitie=MonEntier >> 1 ;SonDouble=MonEntier << 1...MO €nH2MO>€+ &€€€‚€‚€‚ÿI €‡€) "€@€âÑPkR€‰‚ÿ VERSION NON - ENREGISTREE %>€¬€" €€€ ÿ I‡€õ€1Ødƒÿÿÿÿõ€‚)ƒOpérateurs d'affectation'¬€$ €€f€ ‚ÿf*õ€‚<#H€TÀ.€€f€‚€€‚€ ‚ÿÿÿOpérateurs d'affectation &¨# €€€ ‚ÿ᪂‰‚7 <€U€@¸€€€€€€€‚ÿIl y en a 6 : =, +=, -=, /=, *=, %=. Tous les opérateurs d'affectation associés à un opérateur arithmétique fonctionnent sur le principe suivant : A+=B; ó A=A+B;2¨»‚+ &€€€‚€‚€‚ÿI ‰‚ƒ) "€@€âÑPkR€‰‚ÿ VERSION NON - ENREGISTREE %»‚)ƒ" €€€ ÿ Fƒoƒ1\ÿÿÿÿÿoƒùƒ$…Instructions et blocs')ƒ–ƒ$ €€f€ ‚ÿc'oƒùƒ<#H€NÀ.€€f€‚€€‚€ ‚ÿÿÿInstructions et blocs ½„–ƒ¶„9 @€ €€ ‚€€€€‚€‚€‚ÿChaque instruction simple se termine par un ';'. Les instructions composées (ou blocs) sont délimités par les accolades.I ùƒÿ„) "€@€âÑPkR€‰‚ÿ VERSION NON - ENREGISTREE %¶„$…" €€€ ÿ 8ÿ„\…1i.—\…Ø…‰if-else'$…ƒ…$ €€f€ ‚ÿU\…Ø…<#H€2À.€€f€‚€€‚€ ‚ÿÿÿif-else &ƒ…þ…# €€€ ‚ÿ'Ø…%†$ €€@¸€‚ÿ-þ…¤†R#t€\Ú©=!è@耀€‚ÿ.€P€€†"€€‚ÿÿÿ... if (condition) instruction; .../ %†Ó†& €€@¸€‚‚‚ÿou :•C¤†h‡R#t€ˆÚë=!¥@耀€‚ÿ.€|€€†"€€‚ÿÿÿ... if (condition) instruction1; else instruction2; ...ÑÓ†pˆ7 <€£€@¸€€€€€€€‚ÿPlusieurs instructions peuvent être imbriquées. Dans ce cas, et par convention, la clause else est toujours associée à l'instruction if la plus proche pour laquelle il n'y a pas encore de clause else.2h‡¢ˆ+ &€€€‚€‚€‚ÿI pˆëˆ) "€@€âÑPkR€‰‚ÿ VERSION NON - ENREGISTREE %¢ˆ‰" €€€ ÿ 7ëˆG‰1‰ÿõG‰‰switch'‰n‰$ €€f€ ‚ÿTG‰‰<#H€0À.€€f€‚€€‚€ ‚ÿÿÿswitch &n‰è‰# €€€ ‚ÿ¶‰ï‹Q p€m€@¸€‚€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€‚‚€‚‚‚‚‚‚‚‚‚‚ÿSyntaxe :...switch(expression){ case choix1 : intruction1; instuction2; ... instructionN; break; ... case choixN : intruction1; instuction2; ... instructionN; break; default : intruction1; instuction2; ... instructionN;}...Exemple:...char Reponse;switch(Reponse=getchar()){ case 'r' : case 'R' : printf("rouge"); break; case 'v' : case 'V' :‹`è‰zŒ+ &€À€@¸€‚‚‚‚‚‚‚‚ÿ printf("vert"); break; case 'b' : case 'B' : printf("bleu"); break;}...2Œ+ &€€€‚€‚€‚ÿI zŒõŒ) "€@€âÑPkR€‰‚ÿ VERSION NON - ENREGISTREE %¬Œ" €€€ ÿ 6õŒP1ê—ìPʃwhile'w$ €€f€ ‚ÿSPÊ<#H€.À.€€f€‚€€‚€ ‚ÿÿÿwhile &wð# €€€ ‚ÿó°ÊãŽC T€a€@¸€‚€‚‚‚‚€‚€€€€€€‚ÿSyntaxe :...while(expression) instruction;...Effectue instruction tant que expression est vraie. Evidement, il faut faire évoluer expression dans la boucle...2ð+ &€€€‚€‚€‚ÿI ãŽ^) "€@€âÑPkR€‰‚ÿ VERSION NON - ENREGISTREE %ƒ" €€€ ÿ 9^¼1ªõ€¼bÀÛÁdo-while'ƒ À$ €€f€ ‚ÿ¼ ÀƒV¼bÀ<#H€4À.€€f€‚€€‚€ ‚ÿÿÿdo-while & ÀˆÀ# €€€ ‚ÿ³{bÀ;Á8 @€ö€@¸€‚€‚‚‚‚‚‚€‚€€‚ÿSyntaxe :...do{ instruction;}while(expression);...Dans ce cas, instruction est effectuée au moins une fois.2ˆÀmÁ+ &€€€‚€‚€‚ÿI ;Á¶Á) "€@€âÑPkR€‰‚ÿ VERSION NON - ENREGISTREE %mÁÛÁ" €€€ ÿ 4¶ÁÂ1…ì'ƒÂ‡ÂÛÅfor'ÛÁ6Â$ €€f€ ‚ÿQ‡Â<#H€*À.€€f€‚€€‚€ ‚ÿÿÿfor &6­Â# €€€ ‚ÿg‡ÂÅJ b€;€@¸€‚€‚‚‚‚€‚€€€€€€€€‚‚ÿSyntaxe :...for(expression1;expression2;expression3) instruction;...expression1 correspond à la partie initialisation de la boucle, expression2 à la partie test de continuité et expression3 à la partie incrémentation. Une expression peut être composée de plusieurs instructions qui sont alors séparées par des ','.L'indice de boucle est une variable comme les autres. Il faut la déclarer avant, sa portée n'est pas limitée à la boucle, on peut modifier sa valeur dans la boucle et on peut lire sa valeur après la boucle.'­Â;Å$ €€@¸€‚ÿ2ÅmÅ+ &€€€‚€‚€‚ÿI ;ŶÅ) "€@€âÑPkR€‰‚ÿ VERSION NON - ENREGISTREE %mÅÛÅ" €€€ ÿ 6¶ÅÆ1Œ€ǃÆ‹ÆæÇbreak'ÛÅ8Æ$ €€f€ ‚ÿSÆ‹Æ<#H€.À.€€f€‚€€‚€ ‚ÿÿÿbreak &8ƱÆ# €€€ ‚ÿ•Y‹ÆFÇ< H€²€@¸€€€€€€€€€‚ÿMet fin à une boucle (for, do...while, while) ou sort de l'instruction switch.2±ÆxÇ+ &€€€‚€‚€‚ÿI FÇÁÇ) "€@€âÑPkR€‰‚ÿ VERSION NON - ENREGISTREE %xÇæÇ" €€€ ÿ 9ÁÇÈ19'ƒ…ȜȤÊContinue'æÇFÈ$ €€f€ ‚ÿVÈœÈ<#H€4À.€€f€‚€€‚€ ‚ÿÿÿContinue &FÈÂÈ# €€€ ‚ÿB œÈÊ7 <€€@¸€€€€€€€‚ÿNe s'applique qu'aux boucles et permet de passer à l'itération suivante. Pour while et do...while, la condition d'arrêt est directement réévaluée. Pour for, la partie incrémentation est effectuée puis la partie test de continuation de répétition est évaluée.2ÂÈ6Ê+ &€€€‚€‚€‚ÿI ÊÊ) "€@€âÑPkR€‰‚ÿ VERSION NON - ENREGISTREE %6ʤÊ" €€€ ÿ 5ÊÙÊ1ÄǃÿÿÿÿÙÊRËåÌgoto'¤ÊË$ €€f€ ‚ÿRÙÊRË<#H€,À.€€f€‚€€‚€ ‚ÿÿÿgoto &ËxË# €€€ ‚ÿÍ•RËEÌ8 >€+€@¸€‚€‚‚‚‚‚€‚€€‚ÿSyntaxe :...goto Etiquette...Etiquette:...Même si l'instruction goto existe en C, l'utiliser est une très mauvaise façon de programmer.2xËwÌ+ &€€€‚€‚€‚ÿI EÌÀÌ) "€@€âÑPkR€‰‚ÿ VERSION NON - ENREGISTREE %wÌåÌ" €€€ ÿ V%ÀÌ;Í1•ÿÿÿÿÿÿÿÿÿÿÿÿ;ÍzÏFonctions et structures de programmes)åÌdÍ% €€f€ ‚‚ÿ•Y;ÍùÍ< H€²€’‚‚ñ€ãl^€ ‰‚ãm^‰‚ãn^‰‚ÿPrincipes fondamentauxVariables, classes de mémorisationProgramme mono-fichieri&dÍbÎC V€L€‚‚†iã›^€‰‚ã’^‰‚ã“^‰‚ã”^‰‚ÿautoexternstaticregisterJùͬÎ. ,€8€’‚‚ñ€ã•^€ ‰‚ÿProgramme multi-fichierObÎûÎ5 :€4€‚‚†iã–^€‰‚ã—^‰‚ÿfonctionsvariablesY+¬ÎTÏ. ,€V€’‚‚ñ€ã˜^€ ‰‚ÿCompléments sur les fonctions externes&ûÎzÏ# €€f€ ÿ GTÏÁÏ1ú ÿÿÿÿr ÁÏp3 Principes fondamentaux'zÏ $ €€f€ ‚ÿÁÏ zÏd(ÁÏp<#H€PÀ.€€f€‚€€‚€ ‚ÿÿÿPrincipes fondamentaux & –# €€€ ‚ÿ6ñpÌE X€ã€@¸€‚‚‚‚‚‚€‚€‚€€€€€€‚ÿUn problème peut se décomposer en sous-problèmes qui peuvent être traités dans des fonctions séparées. Les différentes fonctions peuvent être placées dans un même fichier ou dans des fichiers différents.Une fonction est composée de deux parties :sa déclaration (spécification)sa définition (corps)Déclaration :type nom_de_fonction(arg1, arg2, ..., argn);type : type de la valeur retournée par la fonction(int par défaut). On utilise le type void si la fonction ne retourne rien.6–KI `€m€@¸€‚‚‚€‚‚‚‚€‚‚€‚‚‚‚‚‚‚‚€‚€€‚ÿLa liste des arguments peut être vide mais les parenthèses sont alors quand même obligatoires.Définition :type nom_de_fonction(type arg1, type arg2, ..., type argn){ instructions;}La déclaration suivante existe mais il vaut mieux lui préférer la précédente qui est conseillée par la norme ANSI.type nom_de_fonction(arg1, arg2, ..., argn)type arg1 ;type arg2 ;...type argn ;{ instructions;}En C les paramètres sont toujours en mode IN. On effectue le passage des variables par valeur. L'équivalent du mode OUT de l'Ada n'existe pas. Lors de l'appel d'une fonction, le paramètre réel est copié dans le paramètre formel. La fonction s'exécute sur le paramètre formel (la copie du paramètre réel) et à la fin de l'exécution, la valeur du paramètre formel n'est pas recopiée dans le paramètre réel.²jÌýH ^€Õ€@¸€‚‚€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€‚‚‚ÿExemple :#include int Carre(int);void Afficher(int);main(){ int x, y ; printf("Saisir une valeur : "); scanf("%d", &x); y=Carre(x); Afficher(y);}int Carre(int Nb){ return Nb*Nb;}void Afficher(int Nb){ printf("L'entier vaut : %d\n", Nb) ;}Détail des allocations mémoires en pile lors de l'exécution du programme :ÇzKÄM#j€ôð"€€€€€‚ÿ€~€€€‚ÿÿÿ(1) Appel de main() : main x y (2) Saisie de x : main x y 2 ØŠýœ N#j€ð"€€€€€‚ÿ€”€€€‚ÿÿÿ(3) Appel de Carre(x) : Carre Nb 2 main x y 2 (4) Fin de Carre(x) : main x y 2 4 šSÄ6 G#^€¦ð"€€€€€‚ÿ€¢€‚ÿÿÿ(5) Appel de Afficher(y) : Afficher Nb 4 main x y 2 4 'œ ] $ €€@¸€‚ÿh96 Å / ,€s€€€‚€‚€‚ÿL'appel d'une fonction se fait en spécifiant son nom suivi de la liste des paramètres réels entre parenthèses et séparés par des virgules. L'appel d'une fonction peut constituer l'une des opérandes d'une expression plus complexe. Le nombre et le type de paramètre réels et formels doivent être identiques.I ]  ) "€@€âÑPkR€‰‚ÿ VERSION NON - ENREGISTREE %Å 3 " €€€ ÿ S" † 1QÞ†  †  =Variables, classes de mémorisation'3 ­ $ €€f€ ‚ÿp4†  <#H€hÀ.€€f€‚€€‚€ ‚ÿÿÿVariables, classes de mémorisation &­ C # €€€ ‚ÿZ1 ) €c€@¸€‚‚‚‚‚ÿEn C, il y a deux façons de caractériser une variable :par son typepar sa classe de mémorisationLa classe de mémorisation fait référence à la pérennité d'une donnée et à sa portée dans le programme, c'est à dire à la partie du programme dans laquelle la variable est reconnue et peut être utilisée.2C Ï+ &€€€‚€‚€‚ÿI ) "€@€âÑPkR€‰‚ÿ VERSION NON - ENREGISTREE %Ï=" €€€ ÿ G„1×r (!„@lBProgramme mono-fichier'=«$ €€f€ ‚ÿd(„@<#H€PÀ.€€f€‚€€‚€ ‚ÿÿÿProgramme mono-fichier«@= &«A@# €€€ ‚ÿœr@Ý@* $€ä€@¸€‚‚‚‚‚‚‚ÿIl y a 4 classes de mémorisation :autoexternstaticregisterSi on veut spécifier la classe d'une variable :@A@A* $€,€€€‚€‚ÿclasse type nom;L!Ý@iA+ &€B€>‚~‚ø¼H€‚ÿ... Table des matières (suite)i&AÒAC V€L€’‚‚ñ€ã›^€‰‚ã’^‰‚ã“^‰‚ã”^‰‚ÿautoexternstaticregister,iAþA' € €€‚€‚ÿI ÒAGB) "€@€âÑPkR€‰‚ÿ VERSION NON - ENREGISTREE %þAlB" €€€ ÿ 5GB¡B13ÿÿÿÿ‹‚"¡BCEauto'lBÈB$ €€f€ ‚ÿR¡BC<#H€,À.€€f€‚€€‚€ ‚ÿÿÿauto ”UÈB®D? L€«€€ ‚€€€€€€‚€‚€‚ÿCes variables sont déclarées au sein d'une fonction. Ce sont des variables locales. Leur portée va de l'endroit où elles ont été déclarées jusqu'à la fin du bloc où elle est déclarée. On peut initialiser une variable de classe auto en même temps qu'on la déclare. Les variables déclarées dans une fonction sont auto par défaut.I C÷D) "€@€âÑPkR€‰‚ÿ VERSION NON - ENREGISTREE %®DE" €€€ ÿ 7÷DSE1,ú€ø„#SEÎEÉHextern'EzE$ €€f€ ‚ÿTSEÎE<#H€0À.€€f€‚€€‚€ ‚ÿÿÿextern a*zE/H7 <€U€€ ‚€€€€€€‚ÿCes variables ont une portée qui s'étend du point où elle sont définies jusqu'à la fin du programme. Elle sont souvent appelées variables globales puisqu'elles sont visibles depuis plusieurs fonction. Leur emploi représente un moyen efficace d'échanger des informations entre fonctions sans utiliser le passage par paramètre. Une variable extern peut être initialisée dans sa déclaration mais uniquement par une valeur constante, pas par une expression. Si une variable est déclarée hors de toute fonction, elle est de classe extern par défaut.,ÎE[H' € €€‚€‚ÿI /H¤H) "€@€âÑPkR€‰‚ÿ VERSION NON - ENREGISTREE %[HÉH" €€€ ÿ 7¤HI1ì‹‚Ň$I{I6Mstatic'ÉH'I$ €€f€ ‚ÿTI{I<#H€0À.€€f€‚€€‚€ ‚ÿÿÿstatic &'I¡I# €€€ ‚ÿ Ñ{IªK8 >€£€@¸€€€‚‚‚€‚‚‚‚‚‚‚‚ÿDans un programme mono fichier, les variables de classe static sont définies dans les fonctions. Elles ont une portée locales mais conservent leur valeur tout au long du programme. Lorsqu'une fonction est appelée une deuxième fois après avoir été appelé puis quittée, ses variables statiques ont conservé leur valeurs. Une variable statique peut être initialisée lors de sa définition.Exemple :#include void Test();main(){ Test(); Test();ì´¡I–L8 >€i€@¸€‚‚‚‚‚‚‚‚‚‚€‚‚€‚‚ÿ}void Test(){ int j=0; static int i=0; i++; j++; printf("var auto %d - var static %d\n", j, i);}Execution :var auto 1 - var static 1var auto 1 - var static 22ªKÈL+ &€€€‚€‚€‚ÿI –LM) "€@€âÑPkR€‰‚ÿ VERSION NON - ENREGISTREE %ÈL6M" €€€ ÿ 9MoM1'ø„ÿÿÿÿ%oMìMé€register'6M–M$ €€f€ ‚ÿVoMìM<#H€4À.€€f€‚€€‚€ ‚ÿÿÿregister Wü–MO€[ „€ù€€ ‚€€€€€€€€€€€€€€€€€€‚ÿEn C, les valeurs des variables register sont rangées dans les registres du processeur. Les classes register et automatic sont étroitement liées. Leur portée est la même. La classe register ne peur etre choisie que pour une variable qui aurait été automatic. Seules quelques variables peuvent être de type register (2 ou 3) et en général, ces variables sont de type entier. S'il n'y a pas de registre libre lors de l'executionìMO€6M, les variables register sont alors des variables automatic.,ìM{€' € €€‚€‚ÿI O€Ä€) "€@€âÑPkR€‰‚ÿ VERSION NON - ENREGISTREE %{€é€" €€€ ÿ HÄ€11‡ ¤‚&1½„Programme multi-fichier'é€X$ €€f€ ‚ÿe)1½<#H€RÀ.€€f€‚€€‚€ ‚ÿÿÿProgramme multi-fichier &Xã# €€€ ‚ÿϪ½²‚% €U€@¸€‚ÿLes fonctions et les variables sont alors définies dans plusieurs fichiers. Il existe des classes de mémorisation aussi bien pour les variables que pour les fonctions.,ãÞ‚' € €€‚€‚ÿL!²‚*ƒ+ &€B€>‚~‚ø¼H€‚ÿ... Table des matières (suite)OÞ‚yƒ5 :€4€’‚‚ñ€ã–^€‰‚ã—^‰‚ÿfonctionsvariables,*ƒ¥ƒ' € €€‚€‚ÿI yƒîƒ) "€@€âÑPkR€‰‚ÿ VERSION NON - ENREGISTREE %¥ƒ„" €€€ ÿ : îƒM„1I ÿÿÿÿ,€'M„Ë„ïÀfonctions'„t„$ €€f€ ‚ÿWM„Ë„<#H€6À.€€f€‚€€‚€ ‚ÿÿÿfonctions &t„ñ„# €€€ ‚ÿ„>Ë„u‡F Z€}€@¸€€‚€€‚‚€€€€‚‚€‚€‚ÿextern : reconnue dans tous les fichiers du programmestatic : seulement reconnue dans le fichier ou elle est définiePar défaut, une fonction est extern. Lorsqu'une fonction est définie dans un fichier et utilisée dans un autre, ce dernier doit contenir une déclaration de fonction dont le rôle est de signifier la présence d'une fonction extern définie ailleurs.Exemple : La partie de CrappsBut du jeu : on lance à plusieurs reprises une paire de dés. Tant qu'on gagne on joue. Ce jeu peut etre simulé sur un ordinateur par un tirage de nombres aléatoires.Ëñ„‰‰I `€—€@¸€‚‚‚‚‚€€€€€€‚€€€€‚ÿsur 7 ou 11 au premier lancé : GAGNEsur 4, 5, 6, 8, 9, 10 au premier lancé :on ne sait pas. Il faut relancer le dé jusqu'à obtenir le même total sans jamais obtenir 7 pour gagner. Si on obtient 7 : PERDUsur 2, 3, 12 au premier lancé : PERDUOn repartira le programme dans deux fichiers :fic1.c : contient la fonction main() dans laquelle on appelle jouer()fic2.c : contient la fonction jouer() et quelques autres fonctions appelées par jouer@u‡ɉ0 0€ €€‚‚‚€€‚€‚ÿfic1.c^&‰‰'‹8 >€M€@¸€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ÿ#include #include #include #define RACINE 12345extern void Jouer();main(){ char Reponse; srand(RACINE); do { Jouer(); printf("voulez-vous rejouer ? (O/N)\n"); scanf("%c", &Reponse); }while(toupper(Reponse)=='O'); system("pause");Aɉh‹0 0€"€€‚‚‚€€‚€‚ÿ}fic2.cÕ'‹B R€«€@¸€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ÿ#include #include extern void Jouer();static int Lancer();extern void Jouer(){ char Rep; int Total1, Total2; printf("Appuyez sur une touche pour lancer les dés...\n"); scanf("%c", &Rep); Total1=Lancer(); printf("Vous avez tiré : %d\n", Total1); switch(Total1) { case 7 : case 11 : printf("Gagné !!!\n"); break; case 2 : case 3 : case 12 : printf("Perdu :-((\n"); break; Òh‹‰8 >€¥€@¸€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ÿ default : do { printf("Appuyez sur une touche pour relancer les dés...\n"); scanf("%c", &Rep); Total2=Lancer(); printf("Vous avez tiré : %d\n", Total2); }while((Total2 != Total1) && (Total2 != 7));if(Total2 == Total1) printf("Gagné !!!\n"); else printf("Perdu :-(\n"); break; }}static int Lancer()µ†JÀ/ ,€ €@¸€‚‚‚‚‚‚‚‚‚‚‚ÿ{ float x1,x2; int n1, n2; x1=rand()/32768.0; x2=rand()/32768.‰JÀ„0; n1=1+(int)(6*x1); n2=1+(int)(6*x2); return n1+n2;7 ‰À. ,€€€€‚€‚€‚ÿ}I JÀÊÀ) "€@€âÑPkR€ ‰‚ÿ VERSION NON - ENREGISTREE %ÀïÀ" €€€ ÿ : ÊÀ)Á1siÿÿÿÿ()Á§ÁéÄvariables'ïÀPÁ$ €€f€ ‚ÿW)Á§Á<#H€6À.€€f€‚€€‚€ ‚ÿÿÿvariables &PÁÍÁ# €€€ ‚ÿ|-§ÁIÄO l€[€@¸€€‚€€‚‚€€€€€€€€€€‚ÿextern : reconnue dans tous les fichiers du programmestatic : seulement reconnue dans le fichier ou elle est définieDans un programme multi-fichier, les variables extern peuvent être définies dans un fichier et utilisées dans un autre. Lors de la définition d'une variable extern, on peut l'initialiser mais ne peut pas initialiser une variable extern lors de sa (ses) déclaration(s). Le terme extern n'est pas obligatoire pour la définition. Par convention, on met le mot clé extern lors de la déclaration mais pas lors de la définition.2ÍÁ{Ä+ &€€€‚€‚€‚ÿI IÄÄÄ) "€@€âÑPkR€ ‰‚ÿ VERSION NON - ENREGISTREE %{ÄéÄ" €€€ ÿ W&ÄÄ@Å1W(ÿÿÿÿ)@ÅÛÅÉCompléments sur les fonctions externes'éÄgÅ$ €€f€ ‚ÿt8@ÅÛÅ<#H€pÀ.€€f€‚€€‚€ ‚ÿÿÿCompléments sur les fonctions externes &gÅÆ# €€€ ‚ÿ`5ÛÅaÈ+ $€k€@¸€€€‚ÿLe programme source doit contenir les déclaration des fonctions externes des bibliothèques au même titre que les fonctions externes que le programmeur aurait lui-même placer dans d'autres fichiers. Plutôt que d'écrire explicitement en début de fichier les déclarations des fonctions externes, on peut utiliser des fichiers entête. Un fichier entête contient l'ensemble des déclarations des fonctions d'un fichier source. Lorsqu'on utilise dans un autre fichier source plusieurs de ses fonctions, il suffit d'inclure le fichier entête par la directive #include.2Æ“È+ &€€€‚€‚€‚ÿI aÈÜÈ) "€@€âÑPkR€‰‚ÿ VERSION NON - ENREGISTREE %“ÈÉ" €€€ ÿ FÜÈGÉ1ÿÿÿÿÿÿÿÿ*ÿÿÿÿGÉËPointeurs et Tableaux)ÉpÉ% €€f€ ‚‚ÿ~GÉîÊg œ€/€’‚‚ñ€ã¾^€ ‰‚ã¿^‰‚ãÀ^‰‚ãÁ^‰‚ãÂ^‰‚ãÃ^‰‚ãÄ^‰‚ãÅ^‰‚ãñ^‰‚ÿIntroductionPassage de paramètres par adresseTableau mono-dimentionnelOpérations sur les pointeursPassage de tableau en paramètresTableaux de pointeurs - pointeurs de pointeursTableaux multidimensionnelsGestion de la mémoirePointeur vers une fonction&pÉË# €€f€ ÿ Q îÊeË1,ÿÿÿÿÿÿÿÿ+ÿÿÿÿeË@ÌStructures, unions, énumérations)ËŽË% €€f€ ‚‚ÿŒIeËÌC V€’€’‚‚ñ€ãè^€ ‰‚ãé^‰‚ãê^‰‚ãë^‰‚ÿStructuresTypes de données personnaliséesUnionsEnumérations&ŽË@Ì# €€f€ ÿ DÌ„Ì1Îÿÿÿÿÿÿÿÿ,ÿÿÿÿ„ÌÎFichiers de données)@Ì­Ì% €€f€ ‚‚ÿ˜\„ÌEÍ< H€¸€’‚‚ñ€ãì^€ ‰‚ã_‰‚ãG_‰‚ÿOuverture et fermetureFonctions de positionnementCréation d'un fichier de données£`­ÌèÍC V€À€‚‚†iã>_€‰‚ã?_‰‚ã@_‰‚ãA_‰‚ÿE/S de caractèresE/S formatéesE/S de chaînes de caractèresE/S binaires bufferisées&EÍÎ# €€f€ ÿ = èÍKÎ11ÿÿÿÿÀ-KÎÌÎIntroduction'ÎrÎ$ €€f€ ‚ÿZKÎÌÎ<#H€<À.€€f€‚€€‚€ ‚ÿÿÿIntroduction &rÎòÎ# €€€ ‚ÿÓÌÎ= H€§€@¸€€€€€€€€€‚ÿUn pointeur est une variable qui contient l'adresse et non la valeur d'une autre variable ou d'un élément de tableau. Dans un ordinateur, les cellules mémoires sont adjacentes. si un entier est stocké sur 4 oòÎÎctets, l'accès à la valeur entière peut se faire via l'adresse du premier des 4 octets. Cette adresse s'obtient grâce à l'opérateur unaire d'adressage &. On peut assigner l'adresse de l'entier Entier à la variable Ptr de type pointeur : Ptr=&EntierEúòÎSK d€õ€@¸‚H€€€‚‚‚€ƒ€‚€ƒ€€€€€‚ÿL'opérateur d'adressage agit obligatoirement sur des opérandes associés à une adresse unique tels que des variables ou des éléments de tableaux. L'opérateur d'indirection * ne peut s'appliquer qu'à des opérandes qui sont des pointeurs.Exemples :int *pi;pi est un pointeur vers un entier*pi;désigne la valeur pointée par pi. Puisque pi est un pointeur vers un entier, on lira les quatre octets consécutifs en commencent par celui désigné par le pointeur (un pointeur contient une adresse)Ëš1 0€5€@¸‚H€ƒ€€€‚ÿpi++;On incrémente pi de quatre octets (car l'entier est codé sur 4 octets) de façon à ce que le pointeur pointe sur le prochain entier en mémoire.(SF% €€‚H€‚ÿ(n% €€‚H€‚ÿ(F–% €€‚H€‚ÿK ná+ &€@€ ‚HâÑPkR€‰‚ÿ VERSION NON - ENREGISTREE %–" €€€ ÿ R!áX1qr‡Œ.Xî. Passage de paramètres par adresse'$ €€f€ ‚ÿo3Xî<#H€fÀ.€€f€‚€€‚€ ‚ÿÿÿPassage de paramètres par adresse &# €€€ ‚ÿÆî#I `€€@¸€€€€€€€‚‚‚€‚‚‚‚‚‚‚‚‚‚‚‚‚ÿCe mode de passage des paramètres correspond au modes de passage out ou in/out de l'ada alors que le mode de passage par valeur correspond au mode in de l'ada.Exemple :void Echanger(int x, int y);main(){ int A=5, B=3; printf("Valeur des variables avant l'echange :\n A : %d\n B : %d\n", A, B); Echange (A, B); printf("Valeur des variables après l'echange :\n A : %d\n B : %d\n", A, B);}void Echanger(int x, int y){ int temp;ê\ Ž ꀹ€@¸€‚‚‚‚€‚€€€€€€€€€€€€€€€€€€€€‚€€€€€€€€€€€€‚ÿ temp=x; x=y; y=temp;}La fonction échange n'échange rien du tout ! En effet, les variables sont passées par valeur. Lors de l'appel de la fonction Echanger, le programme crée deux variables x et y dans lesquelles il recopie la valeur de A et B. La fonction Echanger travaille avec les variables x et y et à la fin de Echanger, les valeurs de x et y sont perdues.Pour modifier la valeur de A et B par la fonction Echanger, il faut passer les adresses de ces variables à la fonction. La fonction Echanger travaillera alors directement avec les variables A et B.G#Ž : B€€@¸€‚‚€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ÿExemple :void Echanger(int *x, int *y);main(){ int A=5, B=3; printf("Valeur des variables avant l'echange :\n A : %d\n B : %d\n", A, B); Echange (&A, &B); printf("Valeur des variables après l'echange :\n A : %d\n B : %d\n", A, B);}void Echanger(int *x, int *y){ int temp; temp=*x; *x=*y; *y=temp;}2 À + &€€€‚€‚€‚ÿI Ž  ) "€@€âÑPkR€‰‚ÿ VERSION NON - ENREGISTREE %À . " €€€ ÿ J x 1ÁÀi‚/x DTableau mono-dimentionnel'. Ÿ $ €€f€ ‚ÿg+x <#H€VÀ.€€f€‚€€‚€ ‚ÿÿÿTableau mono-dimentionnel &Ÿ ,# €€€ ‚ÿ¡ Ù@– ú€€@¸€‚€‚€‚‚€‚‚€‚€€€€€€‚€€€€€€€€‚€€€€€€€€‚‚€€€€€€€€‚ÿOn déclare un tableau de la façon suivante :type Nom[taille];Exemples :char Chaine[10];int Tab[50];Les n éléments du tableau sont numérotés de 0 à n-1.Chaine[i] désigne l'élément en position i (le i+1ième élément) de Chaine.Tab[j] désigne l'élément en position j (le j+1ième élément) ,Ù@. de Tab.Une expression avec un tableau et un indice Tab[j] est équivalente à une autre expression écrite avec un pointeur et un déplacement *(Tab+j). De même, &Tab[j] est equivalent à (Tab+j).Œ?,eCM h€€@¸€‚€€‚‚‚‚€‚‚‚‚€‚€€€€€€‚ÿAttention : un pointeur est une variable alors qu'un tableau n'en est pas un !!! On ne peut qu'utiliser la valeur d'un tableau.Il est possible d'affecté un tableau lors de sa déclaration sans spécifier la taille.Exemples :char Chaine[]="toto";char Chaine[]={'t','o','t','o','\0'};int Tab[]={10,15,20};char *pChaine="toto";On peut modifier indépendamment chacun des caractères de la Chaine mais Chaine représente toujours le même espace mémoire. Le pointeur pChaine peut pointer ailleurs mais on ne peut pas modifier le contenu de la chaîne globalement.2Ù@—C+ &€€€‚€‚€‚ÿI eCàC) "€@€âÑPkR€‰‚ÿ VERSION NON - ENREGISTREE %—CD" €€€ ÿ MàCRD1ÖŒg„0RDãDˆGOpérations sur les pointeurs'DyD$ €€f€ ‚ÿj.RDãD<#H€\À.€€f€‚€€‚€ ‚ÿÿÿOpérations sur les pointeurs &yD E# €€€ ‚ÿß ãDèF? L€A€@¸€‚‚‚‚€€‚‚‚€€€€‚‚ÿAutorisées :affectation entre deux pointeurs de même typesaddition, soustraction d'un pointeur et d'un entieraddition, soustraction entre deux pointeurs de même typesaffectation et comparaison à 0 (NULL)Non-autorisées :décalage ou masques de bitsaddition, soustraction d'un pointeur et d'un float ou doubleaddition, soustraction entre deux pointeurs de types différents sans effectuer de transtypage2 EG+ &€€€‚€‚€‚ÿI èFcG) "€@€âÑPkR€‰‚ÿ VERSION NON - ENREGISTREE %GˆG" €€€ ÿ Q cGÙG1æi‚ 1ÙGnHøŒPassage de tableau en paramètres'ˆGH$ €€f€ ‚ÿn2ÙGnH<#H€dÀ.€€f€‚€€‚€ ‚ÿÿÿPassage de tableau en paramètres &H”H# €€€ ‚ÿÓnH¤J= H€§€@¸€‚‚€‚‚‚‚‚‚‚€‚‚‚€‚‚‚‚ÿQuand on passe un tableau en argument c'est l'adresse de son premier élément qu'on lui passe. Dans la fonction, cet argument (que l'on appelle paramètre formel) est une variable locale qui est vue comme un pointeur. Ainsi, un tableau passé en paramètre correspond à un passage par adresse.int StrlenBis (char *Chaine){ int n; for (n=0;*Chaine != '\0';Chaine++) n++; return n;}ouint StrlenBis (char Chaine[]){ int n; char * pChaine=Chaine;m#”HMJ b€G€@¸€‚‚‚‚€‚€€€€‚€‚‚‚€‚€€‚ÿ for (n=0;*pChaine != '\0';pChaine++) n++; return n;}Dans le premier cas, on peut incrémenter Chaine car c'est un pointeur. Par contre dans le deuxième cas, Chaine est un tableau donc l'adresse du premier élément. On ne peut donc pas le modifier.Pour un paramètre formel de type tableau, on peut donc avoir indifféremment :char Chaine[];char *Chaine;Avec la deuxième notation, Chaine est un pointeur et peut ainsi être manipulé en conséquence (plus souple donc meilleure). Cependant, lors de l'appel , on trouve toujoursS¤JdOQ p€€@¸€‚€‚‚‚‚‚‚‚€‚€€€€€€‚‚€‚‚‚‚‚‚‚ÿmain (){ char Chaine[20]; int Lg; scanf("%s",Chaine); Lg=StrlenBis(Chaine);}Remarque importante : Dans les fonctions StrlenBis(...), on ne connaît pas la taille allouée pour le tableau. Ici, tout va bien car on manipule une chaîne de caractères et donc le caractère '\0' est automatiquement placé en fin de chaîne lors de la saisie.#include int Somme(int*);main (){ int Tab[10]; int Val, i; for (i=0;i<10;i++) // on saisit les 10 éléments du tableauÂMsA P€…€@¸€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€‚€€‚‚ÿ { // de 0 à 9 printf("\nEntier d'indice %d : ",dOsˆG i); scanf("%d", &Tab[i]); // ou scanf("%d", Tab+i); } Val = Somme(Tab);...}int Somme (int *Tab){ int Res=0, i; for(i=0;i#define TAILLE 10 // attention, pas de ';'int Somme(int*);main (){ int Tab[TAILLE]; int Val; for (i=0;iint Somme(int*, int);main(){ int TAILLE 10; int Tab[TAILLE]; int Val; for (i=0;i J€s€@¸‚H€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ÿ{ int i=0; while ((Dest[i]=Sour[i])!='\0') i++;}void StrCpyBis (char *Dest, char *Sour) // Ver1 avec pointeurs{ while ((*Dest=*Sour)!='\0') { Dest++; Sour++; }}void StrCpyBis (char *Dest, char *Sour) // Ver2 avec pointeurs{ while((*Dest++=*Sour++)!='\0') ; // Attention au ';'}void StrCpyBis (char *Dest, char *Sour) // Ver3 avec pointeurs{ while (*Dest++=*Sour++);}(Š8Œ% €€‚H€‚ÿ(Œ`Œ% €€‚H€‚ÿ(8ŒˆŒ% €€‚H€‚ÿK `ŒÓŒ+ &€@€ ‚HâÑPkR€‰‚ÿ VERSION NON - ENREGISTREE %ˆŒøŒ" €€€ ÿ _.ÓŒW1¨g„r 2WúqTableaux de pointeurs - pointeurs de pointeurs'øŒ~$ €€f€ ‚ÿ|@Wú<#H€€À.€€f€‚€€‚€ ‚ÿÿÿTableaux de pointeurs - pointeurs de pointeurs &~ Ž# €€€ ‚ÿ±ƒúÑŽ. *€€@¸€‚€‚€‚‚ÿUn pointeur étant une variable, on peut créer des tableaux de pointeurs.int *Tab[10];Tab[i] est un pointeur vers un entier.2 Ž+ &€€€‚€‚€‚ÿI ÑŽL) "€@€âÑPkR€‰‚ÿ VERSION NON - ENREGISTREE %q" €€€ ÿ LL½1_ š„3½uÀ£ÆTableaux multidimensionnels'q À$ €€f€ ‚ÿ½ Àqi-½uÀ<#H€ZÀ.€€f€‚€€‚€ ‚ÿÿÿTableaux multidimensionnels & À›À# €€€ ‚ÿ´|uÀOÂ8 >€ù€@¸€‚€‚€‚€‚‚‚‚€‚ÿTableau de 10 lignes par 20 colonnes :Int Tab[10][20];En C, un tableau à 2 dimensions est un tableau à 1 dimension dont chaque élément est un tableau. Les éléments sont rangés par ligne. Un tableau s'initialise par une liste de valeurs entre accolades. Chaque ligne d'un tableau bidimensionnel s'initialise par une sous-liste.int Tab[2][3]={ {1, 2, 3}, {4, 5, 6}};ûÖ›ÀJÃ% €­€@È€‚ÿSi on passe un tableau à deux dimensions en paramètre à une fonction, il faut préciser le nombre de colonnes au niveau de la déclaration (paramètre formel) du paramètre. Le nombre de lignes est sans importance.h:O²Ã. ,€t€@¸€‚€‚‚‚‚‚‚‚ÿmain (){ int Tab[2][3]; ... Fonc(Tab); ...}ãJÕÄb#’€6RQ€€€€‚ÿ€R€€€‚ÿ€ª€€€‚ÿÿÿ void Fonc (int Tab[][3]) { ... } Ou void Fonc (int Tab[2][3]) { ... } Ou void Fonc (int (*Tab)[3]) { ... } n3²ÃÆ; D€g€@¸€‚€€€€€€‚‚‚‚ÿRemarque : avec la version 3, les parenthèses sont obligatoires. Sinon, *Tab[3] est un tableau de 3 pointeurs vers des entiers alors qu'on veut que Tab soit un pointeur sur un tableau de 3 entiers.En C, lorsqu'on passe des tableaux à plusieurs dimensions, seule la première dimension est libre.2•Ä5Æ+ &€€€!‚€‚€‚ÿI Æ~Æ) "€@€âÑPkR€‰‚ÿ VERSION NON - ENREGISTREE %5Æ£Æ" €€€ ÿ F~ÆéÆ1ãr 4éÆsÇ1Gestion de la mémoire'£ÆÇ$ €€f€ ‚ÿc'éÆsÇ<#H€NÀ.€€f€‚€€‚€ ‚ÿÿÿGestion de la mémoire &Ç™Ç# €€€ ‚ÿ™tsÇ2È% €è€@¸€‚‚ÿTout d'abord, différence entre tableau de caractères à 2 dimensions et tableau de pointeurs vers des caractères.p.™Ç¢ÉB#R€]úþ€€€‚ÿ€@‚ÿÿÿ// Tableau à 2 dimensions : char Nom1[][10]={"janvier", "fevrier", "mars", "avril", ... }// Tableau de pointeurs : char *Nom2[]={"janvier", "fevrier", "mars", "avril", ... }†A2È(ÌE X€ƒ€@¸€‚€€€€€€€€‚€€‚ÿNom1 est un vrai tableau à 2 dimensions de taille 12x10 caractères. Nom1[i][j] est le caractère à la position 10*i+j par rapport à Nom1. 120 octets contigus sont alloués.Nom2 correspond à 12 pointeurs. Chaque pointeur pointe vers un caractère qui est le premier d'une chaîne. Le gros avantage est que la longueur de chaque chaîne peut être différente. Chaque chaîne a des caractères qui sont contigus. Mais les chaînes ne sont pas contigus entre elles. 12 cellules sont réservées en mémoire pour stocker une adresse chacune + autant de caractères que nécessaire.Ò¢É=ÎC T€¥€@¸€‚€€‚€€‚‚€‚‚‚‚‚‚‚‚‚‚‚‚ÿIl faut allouer l'espace mémoire pour stocker les entiers. La fonction malloc() permet d'allouer dynamiquement de la mémoire.void *malloc (size_t n) retourne un pointeur sur un espace de n octets de mémoire non initialisés.#include #include void main (){ int *Ptr, N, i; printf("Taille du tableau : "); scanf("%d", &N); // allocation dynamique Ptr=(int *) malloc (N*sizeof(int)); // par exemple, remplissage du tableauÎ(Ì=Ï2 2€€@¸‚H€‚‚‚ƒƒ‚‚‚‚‚‚‚ÿ for (i=0;ifloat Somme (float A, float B);float Difference (float C, float D);void CaDepend (float (*Ptr)(float E, float F));main(){ printf ("\n --premier appel-- ") ; CaDepend (Somme) ; printf ("\n --deuxieme appel-- ") ; CaDepend (Difference) ;}float Somme (float A, float B){ return A+B ;}float Difference (float C, float D){ return C-D ;}void CaDepend (float (*Ptr)(float E, float F)){ float MonReel1 = 3.14,Ô1R3 4€©€@¸€‚‚‚‚‚€‚‚€‚‚ÿ MonReel2 = 2.718, MonRes ; MonRes = (*Ptr) (MonReel1, MonReel2) ; printf ("resultat : %f", MonRes) ;}Résultat :--premier appel-- resultat : 5.858--deuxieme appel-- resultat : 0.4222K„+ &€€€‚€‚€‚ÿI RÍ) "€@€âÑPkR€‰‚ÿ VERSION NON - ENREGISTREE %„ò" €€€ ÿ ; Í-1¦ÿÿÿÿ‚6-¬BEStructures'òT$ €€f€ ‚ÿX-¬<#H€8À.€€f€‚€€‚€ ‚ÿÿÿStructures &TÒ# €€€ ‚ÿP¬_= H€¡€@¸€‚€‚‚‚‚‚‚‚€‚‚€‚€‚‚ÿLes structures permettent de représenter une collection de données liées dont les types peuvent être différents. La syntaxe est la suivante :struct Nom{ Membre1; Membre2; ... MembreN;};Une fois définie la composition de la structure, des variables ayant le type de cette structure peuvent être déclarées de la façon suivante :classe_memo struct Nom variable1, variable2, ..., variableP;Il est possible de condenser en une seule écriture la déclaration de variables de type structure et la composition de ce type de structure. L'identificateur Nom est alors facultatif :VùÒµ ] ˆ€ó€@¸€‚‚‚‚‚‚‚€‚€‚€‚‚‚‚€‚€‚‚‚‚‚‚‚‚€‚‚€‚€‚€€‚ÿclasse_memo struct Nom{ Membre1; Membre2; ... MembreN;} Variable1, variable2, ..., VariableP ;Exemples :struct Point{ int X, Y;} A, B, C, D;struct Date{ int Jour; int Mois; int Annee;};struct Date Anniv ;On peut initialiser également une variable de type structure au cours de sa déclaration.struct Date Anniv = {14, 7, 1989};Remarque : Les membres d'une structure peuvent être de type quelconque, hormis une structure identique (sinon récursif à l'infini!).½_¹ G \€{€@¸€‚€‚‚‚‚‚‚‚€‚‚€€€€‚‚€‚‚ÿstruct Personne{ char Nom[30]; char Prenom[30]; struct Date Naissance; struct Personne *Pere, *Mere;};En règle générale, les membres d'une structure sont manipulés individuellement grâce aux opérateurs '.' et '->'. Le point se met entre une structure et l'un de ses champs. La flèche se met entre un pointeur de structure et l'un des champs de la structure pointée.struct Personne Moi, *Toi ;Moi.Naissance.Jour = 21 ;0éµ é G \€Ó€@¸€‚‚‚‚€‚€€€€€€€‚€‚‚ÿToi = (struct Personne *) malloc (sizeof (struct Personne));Toi->Date.Mois = 12;Moi.Pere=Toi;Moi.Pere->Date.Jour = 8;Attention : ne pas confondre *(P.X)=*P.X et (*P).X ßà P->XOpérations possibles entre structures :F¹ /, (€4€P€:‚€€"ƒ€‚ÿ-affectation et copie¸|é ç< H€ø€P€:‚H€"ƒ€‚€"ƒ€‚€"ƒ€‚ÿ-passage en argument de fonction-faire retourner une structure à une fonction-initialiser lors de sa définition`7/G) "€n€@¸‚H€€‚ÿAttention, on ne peut pas comparer deux structures.)çp& €€@¸‚H€‚ÿvPG @& € €@¸‚H€‚ÿIl est également possible de définir et manipuler des tableaux de structures.p @ò?pK@& €2€@¸‚H€‚ÿstruct Point Carre[4];, @w@& € €@¸‚H€‚ÿ...8K@¯@& €$€@¸‚H€‚ÿCarre[2].X=100;,w@Û@& € €@¸‚H€‚ÿ...)¯@A& €€@¸‚H€‚ÿtNÛ@xA& €œ€@¸‚H€‚ÿLes structures sont très prisées pour la manipulation des listes chaînées :7A¯A& €"€@¸‚H€‚ÿstruct Element*xAÙA& €€@¸‚H€‚ÿ{8¯AB& €$€@¸‚H€‚ÿ char Nom[30];4ÙAEB& €€@¸‚H€‚ÿ int Note;G!BŒB& €B€@¸‚H€‚ÿ struct Element *Ptr_Suivant;+EB·B& € €@¸‚H€‚ÿ};)ŒBàB& €€@¸‚H€‚ÿ6·BC1 2€ € ‚H€†"€€‚ÿ)àB?C& €€@¸‚H€‚ÿôCZD' €é€@¸‚H€‚ÿOn peut très facilement (c'est-à-dire de façon dynamique) mettre à jour, ajouter ou supprimer des éléments à la liste. Mais attention, lorsque l'on souhaite créer un élément de la liste, il faut tout d'abord effectuer une allocation mémoire.(?C‚D% €€‚H€‚ÿ(ZDªD% €€‚H€‚ÿ(‚DÒD% €€‚H€‚ÿK ªDE+ &€@€ ‚HâÑPkR€‰‚ÿ VERSION NON - ENREGISTREE %ÒDBE" €€€ ÿ PE’E1OT„7’E&FDITypes de données personnalisées'BE¹E$ €€f€ ‚ÿm1’E&F<#H€bÀ.€€f€‚€€‚€ ‚ÿÿÿTypes de données personnalisées &¹ELF# €€€ ‚ÿÄ&F_HO l€‰€@¸€€€‚€‚‚€‚‚€‚€‚‚‚‚‚€‚€‚€‚‚‚ÿLa directive typedef permet de créer des types de données personnels équivalents à des types existants.typedef int age;age male, femelle; // équivaut à int male, femelle;Cette directive est pratique pour la déclaration de structures. Cela évite de répéter à chaque appel la séquence struct.Exemple :typedef struct{ int Jour, Mois, Annee ;} Date;Date Anniversaire ;Plutôt que :Struct Sdate{ int Jour, Mois, Annee ;E LF¤H% €@€@¸€‚‚ÿ};struct SDate Anniversaire;2_HÖH+ &€€€‚€‚€‚ÿI ¤HI) "€@€âÑPkR€‰‚ÿ VERSION NON - ENREGISTREE %ÖHDI" €€€ ÿ 7I{I1º‚Õ‡8{IöINUnions'DI¢I$ €€f€ ‚ÿT{IöI<#H€0À.€€f€‚€€‚€ ‚ÿÿÿUnions &¢IJ# €€€ ‚ÿÇöI,LI `€€@¸€‚€‚‚‚‚‚‚‚€‚‚€‚€‚€€‚€‚‚‚ÿUne union peut être considérée comme une structure dans laquelle tous les éléments sont alignés sur la même adresse. La syntaxe est la suivante :union Type_Union{ Membre1;Membre2;...MembreN;};Des variables de ce type union peuvent ensuite être déclarées de la façon suivante :classe_memo union type_union Variable1, Variable2, ..., VariableP;Le symbole type_union est alors facultatif dans ce cas.union Type_union{ char Carcat ;³rJßMA P€å€@¸€‚‚‚‚€‚€€€€€€‚‚‚ÿ int Ent ; char Chaine[20] ;} u1, *u2;u1.Ent = 5;u1 est une variable qui est soit un char, soit un int ou soit une chaîne de 20 caractères.Lorsqu'une variable de type union est déclarée, un espace mémoire suffisant pour stocker le plus grand des éléments est alloué. On accède aux éléments d'une union de la même façon qu'aux éléments d'une structure.2,LN+ &€€€‚€‚€‚ÿI ßMZN) "€@€âÑPkR€‰‚ÿ VERSION NON - ENREGISTREE %NN" €€€ ÿ = ZN¼N1OT„ÿÿÿÿ9¼N=Og‚Enumérations'NãN$ €€f€ ‚ÿZ¼N=O<#H€<À.€€f€‚€€‚€ ‚ÿÿÿEnumérations &ãNcO# €€€ ‚ÿ»=OrH ^€w€@¸€‚€‚‚‚€‚‚€‚€‚€€‚‚€€‚‚ÿUne énumération est une liste symbolique. La syntaxe est la suivante :enum IdentifcOrNicateur {liste de constantes symboliques};enum TJour {Lundi, Mardi, Mercredi, ...} ;enum TJour UnJour ;ouenum Jour {Lundi, Mardi, Mercredi, ...} UnJour;UnJour peut prendre une des constantes de l'énumération.Remarque : Les éléments de la liste sont considérés comme des constantes entières. Par défaut, elles sont numérotées à partir de 0.+cO$ €€@¸€‚ÿEx :\.rù. ,€\€€€‚€‚€‚ÿUnJour = 0; équivaut à UnJour = Lundi;I B‚) "€@€âÑPkR€‰‚ÿ VERSION NON - ENREGISTREE %ùg‚" €€€ ÿ GB‚®‚1Á ÿÿÿÿµ‡ :®‚9ƒÉŒOuverture et fermeture'g‚Õ‚$ €€f€ ‚ÿd(®‚9ƒ<#H€PÀ.€€f€‚€€‚€ ‚ÿÿÿOuverture et fermeture &Õ‚_ƒ# €€€ ‚ÿÔ9ƒr…? L€©€@¸€‚€‚€€€€€€€‚ÿPour utiliser un fichier de données séquentiel (un flux), il faut dans un premier temps créer une mémoire-tampon dans laquelle sont enregistrées les informations avant d'être transférées de la mémoire centrale au fichier de données. La création de cette mémoire-tampon se fait de la façon suivante :FILE *Fich ;où Fich est un pointeur indiquant l'adresse de départ de la mémoire-tampon. Le type structuré FILE est défini dans le fichier d'en-tête stdio.h.N_ƒÀ†4 6€5€@¸€‚‚€‚€€€‚ÿL'ouverture d'un fichier de données s'effectue au moyen de l'instruction suivante :Fich = fopen (Nom_Du_Fichier, mode) ;où Nom_Du_Fichier et mode sont 2 chaînes de caractères désignant respectivement le nom du fichier et son mode d'utilisation. Les différents modes sont :e6r…%‡/ .€l€P€:‚€€"ƒ€€‚ÿ-"r" : ouverture du fichier en lecture seulementOþÀ†t‰Q p€ý€P€:‚H€"ƒ€€‚€"ƒ€€‚€"ƒ€€‚€"ƒ€€‚ÿ-"w" : création et ouverture du fichier en écriture seulement ; si le fichier existe, il est détruit et remplacé par le fichier créé-"a" : ouverture d'un fichier existant pour lui ajouter des enregistrements à la suite des enregistrements existants ; si le fichier n'existe pas, il est créé-"r+" : ouverture en lecture et écriture d'un fichier existant-"w+" : création d'un fichier et ouverture en lecture et écriture ; si le fichier existe, il est détruit et remplacé par le fichier crééÀ%‡4Š0 .€!€P€:‚H€"ƒ€€‚ÿ-"a+" : ouverture en lecture et écriture d'un fichier auquel on peut ajouter des enregistrements ; si le fichier n'existe pas, il est créé)t‰]Š& €€@¸‚H€‚ÿ¿†4Š‹9 @€ €@¸‚H€€€€€€€‚ÿLa valeur retournée par la fonction fopen() est NULL si le fichier n'a pus être ouvert, sinon Fich pointe en début de fichier)]ŠE‹& €€@¸‚H€‚ÿd>‹©‹& €|€@¸‚H€‚ÿLa fermeture d'un fichier s'effectue de la façon suivante :8E‹á‹& €$€@¸‚H€‚ÿfclose (Fich) ;(©‹ Œ% €€‚H€‚ÿ(á‹1Œ% €€‚H€‚ÿ( ŒYŒ% €€‚H€‚ÿK 1Œ¤Œ+ &€@€ ‚HâÑPkR€‰‚ÿ VERSION NON - ENREGISTREE %YŒÉŒ" €€€ ÿ B¤Œ 1‹ÿÿÿÿÁ€ ; ‘ëŽE/S de caractères'ÉŒ2$ €€f€ ‚ÿ_# ‘<#H€FÀ.€€f€‚€€‚€ ‚ÿÿÿE/S de caractères &2·# €€€ ‚ÿ{N‘2Ž- *€œ€@¸€‚€‚€‚‚ÿLecture d'un caractère :caract = getc (Fich);Ecriture d'un caractère :K·}Ž. ,€:€€€‚€‚€‚ÿputc (Caract, Fich); I 2ŽÆŽ) "€@€âÑPkR€‰‚ÿ VERSION NON - ENREGISTREE %}ŽëŽ" €€€ ÿ MÆŽ81 Á€ *ƒ <8ÉzÁE/S de chaînes de caractères'ëŽ_$ €€f€ ‚ÿj.8É<#H€\À.€€f€‚€€‚€ ‚ÿÿÿE/S de chaînes de caractères &_ À# €€€ ‚ÿÉ À뎶‚ÉÂÀ4 6€€@¸€€€‚€‚€‚‚ÿLecture de n-1 caractères au maximum, qui seront stockés dans une chaîne :fgets(Chaine, n, Fich);Ecriture d'une chaine :J À Á. ,€8€€€‚€‚€‚ÿfputs(Chaine, Fich);I ÂÀUÁ) "€@€âÑPkR€‰‚ÿ VERSION NON - ENREGISTREE % ÁzÁ" €€€ ÿ > UÁ¸Á1™@ ÷ =¸Á:¢ÅE/S formatées'zÁßÁ$ €€f€ ‚ÿ[¸Á:Â<#H€>À.€€f€‚€€‚€ ‚ÿÿÿE/S formatées &ßÁ`Â# €€€ ‚ÿ1Õ:‘Ä\ †€«€@¸€‚€‚€‚€‚€‚€€€€€€‚‚€€€€€€‚ÿDe nombreux fichiers contiennent des structures composées de données de types différents.fscanf (Fich, Chaîne_de_Format, arg1, arg2, ..., argn) ;fprintf (Fich, "Chaîne_de_Format", arg1, arg2, ..., argn) ;fscanf() et fscanf() retournent le nombre d'éléments lus ou EOF si la fin de fichier est atteinte.Remarque : Il existe sscanf() et sprintf() qui fonctionnent de la même façon sauf que le premier argument est un nom de chaîne de caractères.qE`ÂÅ, (€Š€@¸€‚€‚€‚ÿExemple :sprintf(Ch2, "bonjour %s, il est %d heures", Ch1, H);2‘Ä4Å+ &€€€‚€‚€‚ÿI Å}Å) "€@€âÑPkR€‰‚ÿ VERSION NON - ENREGISTREE %4Å¢Å" €€€ ÿ I}ÅëÅ1 ÷ ÿÿÿÿ>ëÅxÆQÌE/S binaires bufferisées'¢ÅÆ$ €€f€ ‚ÿf*ëÅxÆ<#H€TÀ.€€f€‚€€‚€ ‚ÿÿÿE/S binaires bufferisées &ÆžÆ# €€€ ‚ÿk%xÆ ÉF Z€K€@¸€€€€€‚€‚‚€€€€€‚ÿLorsque l'on souhaite créer et manipuler des fichiers constitués de structures ayant la même composition, il est préférable de lire ou écrire les données par blocs entiers sur le fichier. Les fonctions fwrite() et fread() sont habituellement désignées sous le terme fonctions d'E/S binaires. La syntaxe est la suivante :fwrite (&client, sizeof(enregistrement), n, Fich);fread (&client, sizeof(enregistrement), n, Fich);où client est une variable structure de type enregistrement et Fich le pointeur de flux associé au fichier ouvert. žÆËt ¶€A€@¸€‚€€€€€€€€€€‚€€€€€€€€€€€€‚‚€‚‚‚‚‚‚‚ÿfread() lit n éléments de données du type de client à partir du flot de données pointé par Fich et place le tout à partir de l'adresse &client.fwrite() écrit n éléments de données du type de client dans le fichier pointé par Fich. Les n éléments sont pris à partir de l'adresse &client.FILE *Fich ;struct Personne { char Nom[30], Prenom[30]; int Age;};struct Personne Moi;”l ɱË( €Ø€@¸€‚‚‚‚‚ÿ...Fich = fopen ("essai.dat", "w");fwrite (&Moi, sizeof (struct Personne), 1, Fich);fclose (Fich);...2ËãË+ &€€€‚€‚€‚ÿI ±Ë,Ì) "€@€âÑPkR€‰‚ÿ VERSION NON - ENREGISTREE %ãËQÌ" €€€ ÿ L,ÌÌ1DX xƒ ?Ì-ÍFonctions de positionnement'QÌÄÌ$ €€f€ ‚ÿi-Ì-Í<#H€ZÀ.€€f€‚€€‚€ ‚ÿÿÿFonctions de positionnement &ÄÌSÍ# €€€ ‚ÿ Å-Í_ÎG \€‹€@¸€‚€€€€€€€€€€€‚ÿfseek (Fich, Déplacement, mode);où Deplacement est de type long et mode de type int. Cette procédure a pour but de déplacer le pointeur de fichier Fich de Deplacement octets depuis :O#SÍ®Î, (€F€P€:‚€€"ƒ€‚ÿ-le début du fichier si mode=0†J_Î4Ï< H€”€P€:‚H€"ƒ€‚€"ƒ€‚€"ƒ€‚ÿ-la position courante si mode=1-la fin de fichier si mode=2.-i:®ÎÏ/ .€t€@¸‚H€€€€‚ÿrewind (Fich); est équivalent à fseek (Fich, 0L, 0);)4ÏÆÏ& €€@¸‚H€‚ÿÉ“Ï›6 :€'€@¸‚H€€€€€€‚ÿfteÆÏ›QÌll (Fich); retourne la valeur, qui est de type int, de la position courante du pointeur de fichier Fich par rapport au début du fichier.½ÆÏX- (€!€@¸‚H€€€‚ÿRemarque : Lorsque l'on effectue une E/S dans un fichier de données, le pointeur de fichier se déplace d'autant de valeurs lues ou écrites.(›€% €€‚H€‚ÿ(X¨% €€‚H€‚ÿK €ó+ &€@€ ‚HâÑPkR€ ‰‚ÿ VERSION NON - ENREGISTREE %¨" €€€ ÿ Gó_1ÿÿÿÿÿÿÿÿ@ÿÿÿÿ_Autres fonctionnalités)ˆ% €€f€ ‚‚ÿj._ò< H€\€’‚‚ñ€ã_€ ‰‚ã_‰‚ã_‰‚ÿMacrosPré-processeur CFonction main&ˆ# €€f€ ÿ 7òO1!ÿÿÿÿ  AOʺ Macros'v$ €€f€ ‚ÿTOÊ<#H€0À.€€f€‚€€‚€ ‚ÿÿÿMacros &vð# €€€ ‚ÿ¿ÊõF Z€€@¸€€€‚€‚‚‚€‚€€‚€‚‚‚‚‚‚‚ÿL'instruction #define est utilisée comme définition de constantes symboliques.#define UNE_CTE_ENTIERE 10#define UNE_CTE_REELLE 0.5#define UNE_CTE_CHAINE "Bonjour"On peut aller plus loin en utilisant l'instruction #define pour définir des macros. Une macro contient des expressions, des instructions ou des groupes d'instructions.#include #define Perimetre 3.14*Diametremain (){ int Diametre; printf("Diametre : ");•SðŠB R€§€@¸€‚‚‚€‚€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€‚‚ÿ scanf("%d", &Diametre); printf("Le perimetre est %d.\n", Perimetre);}#include #define Boucle for(L=1;L<=N;L++) \ { \ printf("\n"); \ for (C=1;C<=N;C++) \ printf(" "); \ }main (){ int L, C, N; printf("Taille : "); scanf("%d", &N); Boucle // le ';' est inutile}On peut même ajouter des arguments dans une définition de macro. La parenthèse ouvrante doit suivre immédiatement le nom de la macro (ni espace, ni tabulation).Xõ 8 >€±€@¸€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€‚‚ÿ#include #define Boucle(N) for (L=1;L<=N;L++) \ { \ printf("\n"); \ for (C=1;C<=N;C++) \ printf(" "); \ }main (){ int L, C, N; printf("Taille : "); scanf("%d", &N); Boucle(N) // le ';' est inutile}Lors de la compilation, les références à une macro sont remplacées par les instructions correspondantes. Donc gain de temps lors de l'exécution du programme mais augmentation de la taille (ce qui les différencie des fonctions).2ŠL + &€€€‚€‚€‚ÿI  • ) "€@€âÑPkR€‰‚ÿ VERSION NON - ENREGISTREE %L º " €€€ ÿ A• û 1.î ,€ Bû € ßAPré-processeur C'º " $ €€f€ ‚ÿ^"û € <#H€DÀ.€€f€‚€€‚€ ‚ÿÿÿPré-processeur C &" ¦ # €€€ ‚ÿ¦€ ¼p ®€M€@¸€€€€€€€€€€€€€€€€€€€‚€‚‚‚‚‚‚€‚‚€‚‚‚‚ÿLe pré-processeur C est formé d'un ensemble d'instructions particulières (#define, #include, #if, #elif, #else, #endif, #ifdef, #ifndef, #undef). Ces instructions (appelées directives) sont exécutées au début de la compilation (première passe).#if defined (VAR1) #define VAR2 0#else #define VAR1 1 #define VAR2 2#endifou#ifdef VAR1 #define VAR2 0#else #define VAR1 1H¦ ) "€>€@¸€‚‚€‚ÿ #define VAR2 2#endif祼÷@B R€K€@¸‚H€ƒ‚‚‚‚‚‚‚€‚€‚€‚€‚€‚ÿUn cas d'utilisation est l'écriture d'un programme qui doit fonctionner sous Unix et sous Windows.Lorsque le pg doit tourner sous Unix, il suffit d'avoir au début du pg#define UNIX ÷@º  1Lorsque le pg doit tourner sous Windows, il suffit d'avoir au début du pg#define UNIX 0Ensuite, dans le programme,#if UNIX==1 définitions propres au système Unix#else définitions propres au système Windows#endif(A% €€‚H€‚ÿ(÷@GA% €€‚H€‚ÿ(AoA% €€‚H€‚ÿK GAºA+ &€@€ ‚HâÑPkR€‰‚ÿ VERSION NON - ENREGISTREE %oAßA" €€€ ÿ > ºAB1w  ÿÿÿÿCBŸBåFFonction main'ßADB$ €€f€ ‚ÿ[BŸB<#H€>À.€€f€‚€€‚€ ‚ÿÿÿFonction main &DBÅB# €€€ ‚ÿ/çŸBôDH ^€Ï€@¸€€€€€€€€€‚‚€‚‚‚‚‚‚‚ÿIl est possible de passer des arguments à la fonction main depuis le système d'exploitation, usuellement appelés argc et argv, respectivement de type entier et tableau de chaîne de caractères. La valeur de argc indique le nombre de paramètres passés et les différents paramètres sont stockés dans le tableau défini par argv.#include main (int argc, char *argv[]){ int compteur ; printf ("argc = %d\n", argc) ; for (compteur=0 ; compteur exemple bleu blanc rougele programme affichera :argc = 4argv[0] = exempleargv[1] = bleuargv[2] = blancargv[3] = rouge2ôDwF+ &€€€‚€‚€‚ÿI EFÀF) "€@€âÑPkR€‰‚ÿ VERSION NON - ENREGISTREE %wFåF" €€€ ÿ Q ÀF6G1Õµ‡ ÿÿÿÿD6GËGoJCréation d'un fichier de données'åF]G$ €€f€ ‚ÿn26GËG<#H€dÀ.€€f€‚€€‚€ ‚ÿÿÿCréation d'un fichier de données &]GñG# €€€ ‚ÿO+ËG@H$ €V€@¸€‚ÿIl y a 4 classes de fichier de données :¦uñGæH1 2€ê€€‚€‚‚‚€‚€‚ÿ E/S de caractères E/S formatées E/S de chaînes de caractères E/S binaires bufferiséesL!@H2I+ &€B€>‚~‚ø¼H€‚ÿ... Table des matières (suite)£`æHÕIC V€À€’‚‚ñ€ã>_€‰‚ã?_‰‚ã@_‰‚ãA_‰‚ÿE/S de caractèresE/S formatéesE/S de chaînes de caractèresE/S binaires bufferisées,2IJ' € €€‚€‚ÿI ÕIJJ) "€@€âÑPkR€‰‚ÿ VERSION NON - ENREGISTREE %JoJ" €€€ ÿ BJJ±J1‹ÿÿÿÿ°… E±J7K‘LE/S de caractères'oJØJ$ €€f€ ‚ÿ_#±J7K<#H€FÀ.€€f€‚€€‚€ ‚ÿÿÿE/S de caractères &ØJ]K# €€€ ‚ÿ{N7KØK- *€œ€@¸€‚€‚€‚‚ÿLecture d'un caractère :caract = getc (Fich);Ecriture d'un caractère :K]K#L. ,€:€€€‚€‚€‚ÿputc (Caract, Fich); I ØKlL) "€@€âÑPkR€‰‚ÿ VERSION NON - ENREGISTREE %#L‘L" €€€ ÿ > lLÏL1œù„ * FÏLQMÅ€E/S formatées'‘LöL$ €€f€ ‚ÿ[ÏLQM<#H€>À.€€f€‚€€‚€ ‚ÿÿÿE/S formatées &öLwM# €€€ ‚ÿ1ÕQM¨O\ †€«€@¸€‚€‚€‚€‚€‚€€€€€€‚‚€€€€€€‚ÿDe nombreux fichiers contiennent des structures composées de données de types différents.fscanf (Fich, Chaîne_de_Format, arg1, arg2, ..., argn) ;fprintf (Fich, "Chaîne_de_Format", arg1, arg2, ..., argn) ;fscanf() et fscanf() retournent le nombre d'éléments lus ou EOF si la fin de fichier est atteinte.Remarque : Il existe sscanf() et sprintf() qui fonctionnent de la même façon sauf que le premier argument est un nom de chaîne de caractères.qEwM%€, (€Š€@¸€‚€‚€‚ÿExemple :sprintf(Ch2, "bonjour %s, il e¨O%€‘Lst %d heures", Ch1, H);2¨OW€+ &€€€‚€‚€‚ÿI %€ €) "€@€âÑPkR€‰‚ÿ VERSION NON - ENREGISTREE %W€Å€" €€€ ÿ M €1Å°…  G£7ƒE/S de chaînes de caractères'Å€9$ €€f€ ‚ÿj.£<#H€\À.€€f€‚€€‚€ ‚ÿÿÿE/S de chaînes de caractères &9É# €€€ ‚ÿ¶‚£‚4 6€€@¸€€€‚€‚€‚‚ÿLecture de n-1 caractères au maximum, qui seront stockés dans une chaîne :fgets(Chaine, n, Fich);Ecriture d'une chaine :JÉÉ‚. ,€8€€€‚€‚€‚ÿfputs(Chaine, Fich);I ‚ƒ) "€@€âÑPkR€‰‚ÿ VERSION NON - ENREGISTREE %É‚7ƒ" €€€ ÿ Iƒ€ƒ1 * ÿÿÿÿH€ƒ „æ‰E/S binaires bufferisées'7ƒ§ƒ$ €€f€ ‚ÿf*€ƒ „<#H€TÀ.€€f€‚€€‚€ ‚ÿÿÿE/S binaires bufferisées &§ƒ3„# €€€ ‚ÿk% „ž†F Z€K€@¸€€€€€‚€‚‚€€€€€‚ÿLorsque l'on souhaite créer et manipuler des fichiers constitués de structures ayant la même composition, il est préférable de lire ou écrire les données par blocs entiers sur le fichier. Les fonctions fwrite() et fread() sont habituellement désignées sous le terme fonctions d'E/S binaires. La syntaxe est la suivante :fwrite (&client, sizeof(enregistrement), n, Fich);fread (&client, sizeof(enregistrement), n, Fich);où client est une variable structure de type enregistrement et Fich le pointeur de flux associé au fichier ouvert. 3„²ˆt ¶€A€@¸€‚€€€€€€€€€€‚€€€€€€€€€€€€‚‚€‚‚‚‚‚‚‚ÿfread() lit n éléments de données du type de client à partir du flot de données pointé par Fich et place le tout à partir de l'adresse &client.fwrite() écrit n éléments de données du type de client dans le fichier pointé par Fich. Les n éléments sont pris à partir de l'adresse &client.FILE *Fich ;struct Personne { char Nom[30], Prenom[30]; int Age;};struct Personne Moi;”lž†F‰( €Ø€@¸€‚‚‚‚‚ÿ...Fich = fopen ("essai.dat", "w");fwrite (&Moi, sizeof (struct Personne), 1, Fich);fclose (Fich);...2²ˆx‰+ &€€€‚€‚€‚ÿI F‰Á‰) "€@€âÑPkR€‰‚ÿ VERSION NON - ENREGISTREE %x‰æ‰" €€€ ÿ : Á‰ Š1—ÿÿÿÿÿÿÿÿIÿÿÿÿ Š}‹Cours C++)æ‰IŠ% €€f€ ‚‚ÿ4Õ Š}‹_ Œ€«€‚H€#ƒ‚ƒ‚ƒ‚ƒÈ&EF("http://welcome.to/archidoc",`',1)€$‰€#‚ƒ‚ÿNombre de pages : 72Date de création : 17/04/2004 14:32:38Mise à jour du : 17/04/2004 19:29:54Créé à l'aide de : ArchiDoc > http://welcome.to/archidocSous licence : Fin d'évaluation dans 30 jour(s)1IŠÿÿÿÿ1ÿÿÿÿÿÿÿÿJÿÿÿÿÿÿÿÿÿÿÿÿh_%ÈCourierMS Sans SerifTahomaCourier NewWingdingsTimes New Roman0$ÿÿ üú€'ƒ¤‚µǃxƒ íì *ƒ @ ù„ Ù‡÷ * o°… Á€ Õ‡‹‚,€ iµ‡ €š„… ÿ.Zr‡î °*5dƒ i‚X Àg„  Þ† (Ňø„ΗŒ r Ù‚T„,€r õ'/ & ;)F24ÿÿ9 'ÿÿautobreakCompléments sur les fonctions externesConstantes ContinueCréation d'un fichier de donnéesDéclarationdo-whileE/S binaires bufferisées E/S de caractères(E/S de caractères isolés0E/S de chaînes caractères4E/S de chaînes de caractères8E/S de données mises en forme@E/S formatéesDEnumérationsLexternPFonction mainTfonctionsXFonctions de positionnement\for`Gestion de la mémoiredgotohHistoriquelif-elsepInstructions et blocstIntroductionxMacros„Noms de variablesˆOpérateurs arithmétiquesŒOpérateurs d'affectationOpérateurs de comparaison et opérateurs logiques”Opérateurs de traitement de bits˜Opérateurs unairesœOpérations sur les pointeurs Ouverture et fermeture¤Passage de paramètres par adresse¨Passage de tableau en paramètres¬Pointeur vers une fonction°ÿÿPré-processeur C´Principes fondamentaux¸Programme mono-fichier¼Programme multi-fichierÀregisterÄstaticÈStructure d'un programme CÌStructuresÐswitchÔTableau mono-dimentionnelØTableaux de pointeurs - pointeurs de pointeursÜTableaux multidimensionnelsàTypes de données et taillesäTypes de données personnaliséesèUnionsìvariablesðVariables, classes de mémorisationôwhileøt\for`Gestion de la mémoiredgotohHistoriquelif-elsepInstructions et blocstIntroductionxMacros„Noms de variablesˆOpérateurs arithmétiquesŒOpérateurs d'affectationOpérateurs de comparaison et opérateurs logiques”Opérateurs de traitement de bits˜Opérateurs unairesœOpérations sur les pointeurs Ouverture et fermeture¤Passage de paramètres par adresse¨Passage de tableau en paramètres¬Pointeur vers une fonction°çPré-processeur C/&;)LzÿÿKKÿÿÿÿIntroductionÚGénéralités HistoriqueÎStructure d'un programme Cm‹Entrées/SortiesÜ‹Types, Opérateurs, ExpressionsóStructures de contrôleZIntroductionE/S de caractères isolésoE/S de données mises en formeÙ‡E/S de chaînes caractèresNoms de variablesÙTypes de données et taillesµConstantesíDéclaration°Opérateurs arithmétiques Opérateurs unaires5Opérateurs de comparaison et opérateurs logiquesdƒOpérateurs de traitement de bits*Opérateurs d'affectation.Instructions et blocsÿif-else—switchõwhileìdo-while€for'ƒbreakǃContinue…goto÷…Fonctions et structures de programmesÞ†Principes fondamentauxr Variables, classes de mémorisation Programme mono-fichierú€auto‹‚externø„staticŇregister(Programme multi-fichierifonctions,€variables¤‚Compléments sur les fonctions externesA…Pointeurs et Tableaux_†Structures, unions, énumérations¯†Fichiers de donnéesr‡IntroductionÀPassage de paramètres par adresseŒTableau mono-dimentionneli‚Opérations sur les pointeursg„Passage de tableau en paramètres Tableaux de pointeurs - pointeurs de pointeursr Tableaux multidimensionnelsš„Gestion de la mémoirePointeur vers une fonctionStructures‚Types de données personnaliséesT„UnionsÕ‡EnumérationsX Ouverture et fermeture@ E/S de caractères÷ E/S de chaînes de caractèresÁ€ E/S formatées*ƒ E/S binaires bufferiséesµ‡ Fonctions de positionnement¹ Autres fonctionnalitésî Macros  Pré-processeur C,€ Fonction mainxƒ Création d'un fichier de donnéesù„ E/S de caractères°… E/S formatées* E/S de chaînes de caractères E/S binaires bufferiséesª Cours C++ƒ /&;)L4ÿÿI°Iÿÿÿÿ01Ú2 3Î7m‹8Ü‹^Z^^o^Ù‡^^Ù^µ^í^ó<^ =^5>^dƒ?^*A^.B^ÿC^—D^õE^°g^€h^'ƒi^ǃj^…k^÷…l^Þ†m^r n^ p^ì’^‹‚“^ø„”^Ň•^(–^i—^,€˜^¤‚š^A…›^ú€½^¯†¾^r‡¿^ÀÀ^ŒÁ^i‚Â^g„Ã^ Ä^r Å^š„Æ^_†è^é^‚ê^T„ë^Õ‡ì^X î^@ ï^÷ ð^Á€ ñ^_µ‡ _¹ _î _  _,€ _*ƒ >_ù„ ?_°… @_* A_ G_xƒ ÑPkRª /&;)LzÿÿI×IÿÿÿÿD:\Cours C++\AD~.RTFD:\Cours C++\AD~.RTFD:\Cours C++\AD~.RTFD:\Cours C++\AD~.RTFD:\Cours C++\AD~.RTFD:\Cours C++\AD~.RTFD:\Cours C++\AD~.RTF D:\Cours C++\AD~.RTF D:\Cours C++\AD~.RTF D:\Cours C++\AD~.RTF D:\Cours C++\AD~.RTF D:\Cours C++\AD~.RTFD:\Cours C++\AD~.RTFD:\Cours C++\AD~.RTFD:\Cours C++\AD~.RTFD:\Cours C++\AD~.RTFD:\Cours C++\AD~.RTFD:\Cours C++\AD~.RTFD:\Cours C++\AD~.RTFD:\Cours C++\AD~.RTFD:\Cours C++\AD~.RTFD:\Cours C++\AD~.RTFD:\Cours C++\AD~.RTFD:\Cours C++\AD~.RTFD:\Cours C++\AD~.RTFD:\Cours C++\AD~.RTFD:\Cours C++\AD~.RTFD:\Cours C++\AD~.RTFD:\Cours C++\AD~.RTFD:\Cours C++\AD~.RTF D:\Cours C++\AD~.RTF!D:\Cours C++\AD~.RTF"D:\Cours C++\AD~.RTF#D:\Cours C++\AD~.RTF$D:\Cours C++\AD~.RTF%D:\Cours C++\AD~.RTF&D:\Cours C++\AD~.RTF'D:\Cours C++\AD~.RTF(D:\Cours C++\AD~.RTF)D:\Cours C++\AD~.RTF*D:\Cours C++\AD~.RTF+D:\Cours C++\AD~.RTF,D:\Cours C++\AD~.RTF-D:\Cours C++\AD~.RTF.D:\Cours C++\AD~.RTF/D:\Cours C++\AD~.RTF0D:\Cours C++\AD~.RTF1D:\Cours C++\AD~.RTF2D:\Cours C++\AD~.RTF3D:\Cours C++\AD~.RTF4D:\Cours C++\AD~.RTF5D:\Cours C++\AD~.RTF6D:\Cours C++\AD~.RTF7D:\Cours C++\AD~.RTF8D:\Cours C++\AD~.RTF9D:\Cours C++\AD~.RTF:D:\Cours C++\AD~.RTF;D:\Cours C++\AD~.RTF<D:\Cours C++\AD~.RTF=D:\Cours C++\AD~.RTF>D:\Cours C++\AD~.RTF?D:\Cours C++\AD~.RTF@D:\Cours C++\AD~.RTFAD:\Cours C++\AD~.RTFBD:\Cours C++\AD~.RTFCD:\Cours C++\AD~.RTFDD:\Cours C++\AD~.RTFED:\Cours C++\AD~.RTFFD:\Cours C++\AD~.RTFGD:\Cours C++\AD~.RTFHD:\Cours C++\AD~.RTFID:\Cours C++\AD~.RTFJD:\Cours C++\AD~.RTF/&;)LzÿÿI­Iÿÿÿÿ_1_2_3_4_8_9_10 _12 _13 _14 _15 _16_17_18_19_20_21_22_23_24_26_27_28_29_30_31_32_33_34_35 _36!_37"_38#_40$_41%_42&_43'_44(_45)_46*_47+_49,_50-_51._52/_530_541_552_563_574_585_596_607_618_629_63:_64;_65<_67=_68>_69?_70@_71A_73B_74C_75D_76E_80F_81G_82H_83I_84JAD_Copyright