T.E.I. § ª ™ ™Ã¢§ ¥ ᢧ¢° ø¡ º ƒª¢°ø¡
¥ª ª § ¥ƒ¢¡ ™
¶ƒ¥°ƒ ªª ¨ ™ª¥™ § ¨ƒ¥¡ ø¡ À¶¥§¥° ™¨ø¡
°§ø™™ ¶ƒ °ƒ ªª ™ª À
ı·Ó·ÛÈÔÛ . Ô˘ÙÛÔÓÈÎÔÏ·Û
Ëáìßá 1995
I
¶ƒ § ° ™ Ïé ðáñïýóåò óçìåéþóåéò ãñÜöôçêáí ãéá íá ÷ñçóéìïðïéçèïýí ùò äéäáêôéêü âïÞèçìá óôï ìÜèçìá "ÐÑÏÃÑÁÌÌÁÔÉÓÌÏÓ ÇËÅÊÔÑÏÍÉÊÙÍ ÕÐÏËÏÃÉÓÔÙÍ ÉÉ" , ôï ïðïßï äéäÜóêåôáé óôï äåýôåñï åîÜìçíï óðïõäþí ôïõ ÔìÞìáôïò ÇëåêôñïíéêÞò ôïõ Ô.Å.É. Ëáìßáò. Ôï ðåñéå÷üìåíï ôïõ ìáèÞìáôïò, åßíáé ç ãëþóóá ðñïãñáììáôéóìïý C. Óêïðüò ôùí óçìåéþóåùí, åßíáé íá åéóÜãïõí ôïõò óðïõäáóôÝò óôéò áñ÷Ýò ôéò Ýííïéåò êáé ôéò äõíáôüôçôåò ôçò ãëþóóáò C. Ìéáò ãëþóóáò éó÷õñÞò ìå äõíáôüôçôåò ðñïãñáììáôéóìïý óå "÷áìçëü åðßðåäï", áëëÜ ôáõôü÷ñïíá äïìçìÝíçò. Ï áíáãíþóôçò èá êáôáíïÞóåé åõêïëüôåñá ôç ãëþóóá C, áí Ý÷åé äéäá÷èåß ôá âáóéêÜ óôïé÷åßá ôçò ãëþóóáò Pascal, êáèüôé ïé äýï ãëþóóåò ïìïéÜæïõí óå áñêåôÜ óçìåßá. Óôï åñãáóôçñéáêü ìÝñïò ôïõ ìáèÞìáôïò ãßíåôáé ÷ñÞóç ôïõ ìåôáãëùôôéóôÞ ôçò Turbo C ôçò åôáéñåßáò Borland International, ôï ðåñéâÜëëïí ôïõ ïðïßïõ åßíáé ó÷åäüí üìïéï ìå áõôü ôçò Turbo Pascal. Ïóïí áöïñÜ ôï ðåñéå÷üìåíï ôùí óçìåéþóåùí, êáëýðôåé Ýíá ìåãÜëï ìÝñïò ôçò èåùñßáò ôçò ãëþóóáò ìå ðáñïõóßáóç ôùí äéáöüñùí åííïéþí êáé áñêåôÜ ðáñáäåßãìáôá. ÐåñéÝ÷ïíôáé åðßóçò, óôï ôÝëïò êÜèå Êåöáëáßïõ, áñêåôÝò áóêÞóåéò ãéá ëýóç, ìåñéêÝò áðü ôéò ïðïßåò ðñÝðåé íá õëïðïéïýíôáé óôá ðëáßóéá ôùí åñãáóôçñéáêþí ùñþí. Óôï 1ï ÊåöÜëáéï äßíåôáé ìå óõíôïìßá ç åîÝëéîç ôçò C êáé ôá ãåíéêÜ ÷áñáêôçñéóôéêÜ ôçò. Åðßóçò áíáöÝñïíôáé ôá âÞìáôá ãéá ôç ãñáöÞ êáé åêôÝëåóç åíüò ðñïãñÜììáôïò êáé ôÝëïò, äßíïíôáé õðü ìïñöÞ ðáñáäåéãìÜôùí ìåñéêÜ áðëÜ ðñïãñÜììáôá óå C. Óôï 2ï ÊåöÜëáéï ðáñïõóéÜæïíôáé ïé äåóìåõìÝíåò ëÝîåéò ôçò C êáèþò êáé ôá åéäéêÜ óýìâïëá ðïõ ìðïñïýí íá ÷ñçóéìïðïéçèïýí ó'Ýíá ðñüãñáììá. Åðßóçò äßíïíôáé ïé êáíüíåò äçìéïõñãßáò áíáãíùñéóôéêþí êáé ôá åßäç ôùí óôáèåñþí. Ôá ðåñéå÷üìåíá ôïõ 3ïõ Êåöáëáßïõ åßíáé ïé âáóéêïß ôýðïé äåäïìÝíùí ðïõ ðáñÝ÷ïíôáé áðü ôç C, ï ôñüðïò äÞëùóçò ôùí ìåôáâëçôþí êáèþò êáé ïé äéÜöïñïé ôåëåóôÝò ôçò C. Áêïëïõèåß ôï 4ï ÊåöÜëáéï ðïõ ðåñéãñÜöåé ôéò óõíáñôÞóåéò åéóüäïõ-åîüäïõ, áðü ôï ðëçêôñïëüãéï óôçí ïèüíç, áíôßóôïé÷á. Óôï 5ï ÊåöÜëáéï ðåñéãñÜöïíôáé ïé åíôïëÝò åëÝã÷ïõ êáé åðáíÜëçøçò êáé óôï 6ï ÊåöÜëáéï ðáñïõóéÜæåôáé ï ôñüðïò äçìéïõñãßáò óõíáñôÞóåùí áðü ôïí ðñïãñáììáôéóôÞ.
II
Áêïëïõèïýí ôá ÊåöÜëáéá 7, 8, 9 êáé 10, üðïõ ðáñïõóéÜæåôáé ï ôñüðïò äçìéïõñãßáò êáé ÷åéñéóìïý ôùí ÐéíÜêùí, ôùí Äïìþí, ôùí Äåéêôþí êáé ôùí Áñ÷åßùí, áíôßóôïé÷á. Ïé óçìåéþóåéò ãñÜöôçêáí ãéá ðñþôç öïñÜ, ó÷åäüí ôáõôü÷ñïíá ìå ôç äéäáóêáëßá ôïõ ìáèÞìáôïò, ôï Öèéíüðùñï ôïõ 1994 êáé äéïñèþèçêáíóõìðëçñþèçêáí ôï ÖåâñïõÜñéï ôïõ 1995. Ðáñ'üëá áõôÜ, ëÜèç, ðáñáëåßøåéò êáé áôÝëåéåò åßíáé áíáðüöåõêôá. Ùò åê ôïýôïõ ðáñáôçñÞóåéò, ðñïôÜóåéò êáé õðïäåßîåéò ëáèþí, ü÷é ìüíï åßíáé åõðñüóäåêôåò, áëëÜ åðéæçôïýíôáé. Ëáìßá, ÖåâñïõÜñéïò 1995
tı. w. {Ô˘ÙÛÔÓÈÎfiÏ·˜
Knowledge rests not upon truth alone, but also upon error Carl Jung
B
III
¶ ƒ à ª ¡z 1. ÅÉÓÁÃÙÃÇ ................................................................................................................................................................................1 1.1 Ç ÅÎÅËÉÎÇ ÊÁÉ ÔÁ ÃÅÍÉÊÁ ×ÁÑÁÊÔÇÑÉÓÔÉÊÁ ÔÇÓ C...............................................1 1.2 ÂÇÌÁÔÁ ÃÑÁÖÇÓ ÊÁÉ ÅÊÔÅËÅÓÇÓ ÐÑÏÃÑÁÌÌÁÔÏÓ ............................................ 2 1.3 ÄÏÌÇ ÐÑÏÃÑÁÌÌÁÔÏÓ ÔÇÓ C ......................................................................................................... 5 1.4 ÕËÏÐÏÉÇÓÇ ÁÐËÙÍ ÐÑÏÃÑÁÌÌÁÔÙÍ................................................................................... 6 2. ÂÁÓÉÊÁ ÓÔÏÉ×ÅÉÁ......................................................................................................................................................... 9 2.1 ÔÏ ËÅÎÉËÏÃÉÏ ÔÇÓ C..................................................................................................................................... 9 2.2 ÁÍÁÃÍÙÑÉÓÔÉÊÁ................................................................................................................................................10 2.3 ÌÅÔÁÂËÇÔÅÓ - ÓÔÁÈÅÑÅÓ ................................................................................................................... 11 2.3.1 ÌåôáâëçôÝò.................................................................................................................................................... 11 2.3.2 ÓôáèåñÝò .......................................................................................................................................................... 11 2.4 Ó×ÏËÉÁ........................................................................................................................................................................14 3. ÔÕÐÏÉ - ÌÅÔÁÂËÇÔÅÓ - ÔÅËÅÓÔÅÓ......................................................................................................15 3.1 ÔÕÐÏÉ ÄÅÄÏÌÅÍÙÍ ......................................................................................................................................15 3.1.1 Âáóéêïß Ôýðïé ÄåäïìÝíùí.................................................................................................................15 3.1.2 ÔñïðïðïéçôÝò Ôýðùí.............................................................................................................................16 3.2 ÄÇËÙÓÅÉÓ ÌÅÔÁÂËÇÔÙÍ.......................................................................................................................17 3.3 ÔÅËÅÓÔÅÓ .................................................................................................................................................................18 3.3.1 Áñéèìçôéêïß ÔåëåóôÝò ...........................................................................................................................18 3.3.2 Óõó÷åôéóôéêïß êáé Ëïãéêïß ÔåëåóôÝò ........................................................................................19 3.3.3 ÔåëåóôÝò Bit (bitwise) ............................................................................................................................21 3.3.4 ÔåëåóôÝò Áðüäïóçò ÔéìÞò (Êáôá÷þñçóçò) ...................................................................... 22 3.4 ÐÁÑÁÓÔÁÓÅÉÓ...................................................................................................................................................... 22 3.5 ÌÅÔÁÔÑÏÐÅÓ ÔÕÐÙÍ ............................................................................................................................... 23 3.5.1 Áõôüìáôåò ÌåôáôñïðÝò ....................................................................................................................... 23 3.5.2 ÑçôÝò ÌåôáôñïðÝò (Cast)................................................................................................................... 23 3.6 ÐÑÏÔÅÑÁÉÏÔÇÔÁ ÔÅËÅÓÔÙÍ...........................................................................................................24 3.7 ÁÓÊÇÓÅÉÓ..................................................................................................................................................................24 4. ÅÉÓÏÄÏÓ - ÅÎÏÄÏÓ ÊÏÍÓÏËÁÓ.................................................................................................................27 4.1 ÅÉÓÏÄÏÓ ÊÁÉ ÅÎÏÄÏÓ ×ÁÑÁÊÔÇÑÙÍ .......................................................................................27 4.2 ÅÉÓÏÄÏÓ ÊÁÉ ÅÎÏÄÏÓ ÁËÖÁÑÉÈÌÇÔÉÊÙÍ..........................................................................27 4.3 ÌÏÑÖÏÐÏÉÇÌÅÍÇ ÅÉÓÏÄÏÓ ÊÁÉ ÅÎÏÄÏÓ.......................................................................... 28 4.3.1 Ç ÓõíÜñôçóç printf() .................................................................................................................... 28 4.3.2 Ç ÓõíÜñôçóç scanf() .......................................................................................................................30 4.4 ÁÓÊÇÓÅÉÓ..................................................................................................................................................................31 5. ÅÍÔÏËÅÓ ÅÐÉËÏÃÇÓ ÊÁÉ ÅÐÁÍÁËÇØÇÓ ...................................................................................... 33 5.1 Ç ÓÕÍÈÅÔÇ ÅÍÔÏËÇ................................................................................................................................. 33 5.2 Ç ÅÍÔÏËÇ ÅÐÉËÏÃÇÓ if-else ........................................................................................................34 5.2.1 Åíèåôåò ÅíôïëÝò if ............................................................................................................................... 35 5.2.2 Ï ÔåëåóôÞò ÓõíèÞêçò ?: ................................................................................................................ 36 5.3 H ÅÍÔÏËÇ ÅÐÉËÏÃÇÓ switch ............................................................................................................37 5.4 Ç ÅÍÔÏËÇ ÅÐÁÍÁËÇØÇÓ while ................................................................................................. 39 5.5 Ç ÅÍÔÏËÇ ÅÐÁÍÁËÇØÇÓ do-while..........................................................................................41 5.6 Ç ÅÍÔÏËÇ ÅÐÁÍÁËÇØÇÓ for........................................................................................................42 5.6.1 Ï ÔåëåóôÞò comma...............................................................................................................................44 5.7 ÁÓÊÇÓÅÉÓ..................................................................................................................................................................44 6. ÓÕÍÁÑÔÇÓÅÉÓ................................................................................................................................................................ 47 6.1 ÏÑÉÓÌÏÓ ÓÕÍÁÑÔÇÓÇÓ............................................................................................................................ 47 6.1.1 Ðñïôõðïðïßçóç ÓõíÜñôçóçò...........................................................................................................48 6.1.2 ÁðëÝò ÓõíáñôÞóåéò ................................................................................................................................48 6.2 Ç ÅÍÔÏËÇ return..............................................................................................................................................49 6.3 ÊËÇÓÇ ÓÕÍÁÑÔÇÓÇÓ "ÊÁÔ'ÁÎÉÁ" (by value)......................................................................50 6.4 ÔÏÐÉÊÅÓ ÊÁÉ ÊÁÈÏËÉÊÅÓ ÌÅÔÁÂËÇÔÅÓ ........................................................................... 52
IV ÊÁÈÏÑÉÓÔÅÓ ÊÁÔÇÃÏÑÉÁÓ ÁÐÏÈÇÊÅÕÓÇÓ....................................................................54 ÐÑÏÓÄÉÏÑÉÓÔÅÓ ÔÕÐÙÍ.......................................................................................................................... 56 ÄÇËÙÓÅÉÓ ÌÅÔÁÂËÇÔÙÍ.......................................................................................................................57 ÁÍÁÄÑÏÌÇ ............................................................................................................................................................57 ÏÄÇÃÉÅÓ ÐÑÏÓ ÔÏÍ ÐÑÏÅÐÅÎÅÑÃÁÓÔÇ .............................................................................. 58 6.9.1 Ç Ïäçãßá #define ................................................................................................................................ 58 6.9.2 Ç Ïäçãßá #include ............................................................................................................................60 6.10 ÌÁÈÇÌÁÔÉÊÅÓ ÓÕÍÁÑÔÇÓÅÉÓ ÂÉÂËÉÏÈÇÊÇÓ .............................................................61 6.11 ÁÓÊÇÓÅÉÓ.................................................................................................................................................................61 7. ÐÉÍÁÊÅÓ ÊÁÉ ÁËÖÁÑÉÈÌÇÔÉÊÁ ............................................................................................................... 63 7.1 ÐÉÍÁÊÅÓ..................................................................................................................................................................... 63 7.7.1 ÄÞëùóç Ðßíáêá......................................................................................................................................... 63 7.1.2 ÁíáöïñÜ óôá Óôïé÷åßá åíüò Ðßíáêá........................................................................................ 63 7.1.3 Ðßíáêåò ðïëëþí ÄéáóôÜóåùí.........................................................................................................64 7.1.4 Áðüäïóç Áñ÷éêþí Ôéìþí óå Ðßíáêåò ...................................................................................66 7.1.5 Ðßíáêåò ùò ÐáñÜìåôñïé óå ÓõíáñôÞóåéò.............................................................................. 67 7.1.6 Ôáîéíüìçóç Ðßíáêá...............................................................................................................................69 7.2 ÁËÖÁÑÉÈÌÇÔÉÊÁ ............................................................................................................................................ 70 7.2.1 ÓõíáñôÞóåéò ÂéâëéïèÞêçò ãéá ÁëöáñéèìçôéêÜ ..................................................................71 7.3 ÁÓÊÇÓÅÉÓ...................................................................................................................................................................73 8. ÄÏÌÅÓ ÊÁÉ ÅÍÙÓÅÉÓ...............................................................................................................................................75 8.1 ÄÏÌÅÓ...........................................................................................................................................................................75 8.1.1 ÄÞëùóç ÄïìÞò............................................................................................................................................75 8.1.2 ÁíáöïñÜ óôá ÌÝëç ìßáò ÄïìÞò ................................................................................................. 76 8.1.3 Åíèåôåò ÄïìÝò ........................................................................................................................................... 78 8.1.4 Áðüäïóç Áñ÷éêþí Ôéìþí óå ÄïìÝò ....................................................................................... 79 8.1.5 ÄïìÝò ùò ÐáñÜìåôñïé óå ÓõíáñôÞóåéò .................................................................................. 79 8.1.6 Ðßíáêåò Äïìþí .........................................................................................................................................80 8.2 ÅÍÙÓÅÉÓ.......................................................................................................................................................................81 8.3 ÁÓÊÇÓÅÉÓ ................................................................................................................................................................. 82 9. ÄÅÉÊÔÅÓ................................................................................................................................................................................ 85 9.1 ÄÇËÙÓÇ ÌÅÔÁÂËÇÔÇÓ ÄÅÉÊÔÇ.................................................................................................... 85 9.2 ÔÅËÅÓÔÅÓ ÄÅÉÊÔÙÍ..................................................................................................................................... 85 9.3 ÐÁÑÁÓÔÁÓÅÉÓ - ÄÅÉÊÔÅÓ ........................................................................................................................88 9.3.1 Áðüäïóç Ôéìþí óå Äåßêôåò............................................................................................................88 9.3.2 ÁñéèìçôéêÞ Äåéêôþí ..............................................................................................................................88 9.3.3 Óýãêñéóç Äåéêôþí ...................................................................................................................................88 9.4 ÄÅÉÊÔÅÓ ÊÁÉ ÓÕÍÁÑÔÇÓÅÉÓ................................................................................................................89 9.5 ÄÅÉÊÔÅÓ ÊÁÉ ÐÉÍÁÊÅÓ...............................................................................................................................90 9.6 ÄÅÉÊÔÅÓ ÊÁÉ ÁËÖÁÑÉÈÌÇÔÉÊÁ .......................................................................................................91 9.7 ÐÉÍÁÊÅÓ ÄÅÉÊÔÙÍ ÊÁÉ ÄÅÉÊÔÅÓ ÓÅ ÄÅÉÊÔÅÓ ................................................................. 93 9.8 ÏÑÉÓÌÁÔÁ ÃÑÁÌÌÇÓ ÄÉÁÔÁÃÙÍ ................................................................................................. 97 9.9 ÄÅÉÊÔÅÓ ÊÁÉ ÄÏÌÅÓ....................................................................................................................................98 9.10 ÁÓÊÇÓÅÉÓ...............................................................................................................................................................99 10. ÁÑ×ÅÉÁ.............................................................................................................................................................................. 101 10.1 ÁÍÏÉÃÌÁ ÊÁÉ ÊËÅÉÓÉÌÏ ÁÑ×ÅÉÏÕ.......................................................................................... 101 10.2 ÐÑÏÓÐÅËÁÓÇ ÁÑ×ÅÉÏÕ......................................................................................................................103 10.2.1 Åßóïäïò êáé Åîïäïò ×áñáêôÞñùí .........................................................................................103 10.2.2 Åßóïäïò êáé Åîïäïò Áëöáñéèìçôéêþí...............................................................................105 10.2.3 ÌïñöïðïéçìÝíç Åßóïäïò êáé Åîïäïò................................................................................106 10.2.4 Åßóïäïò êáé Åîïäïò Äïìþí ÄåäïìÝíùí.........................................................................107 10.3 ÁËËÅÓ ÓÕÍÁÑÔÇÓÅÉÓ ×ÅÉÑÉÓÌÏÕ ÁÑ×ÅÉÙÍ...............................................................109 10.4 ÁÓÊÇÓÅÉÓ............................................................................................................................................................. 110 ÐÁÑÁÑÔÇÌÁ Á'................................................................................................................................................................. 113 ÂÉÂËÉÏÃÑÁÖÉÁ......................................................................................................................................................................117 6.5 6.6 6.7 6.8 6.9
1.
™z°ø°
1.1
• § • z z ° ¡ z Ãzƒz ƒ ™ z ™ C
Ç ãëþóóá C ó÷åäéÜóôçêå êáé õëïðïéÞèçêå ãéá ðñþôç öïñÜ áðü ôïí Dennis Ritchie, ó'Ýíáí õðïëïãéóôÞ DEC PDP-11, óôá åñãáóôÞñéá ôçò Bell óôï New Jersey ôùí Ç.Ð.Á. H C ó÷åäéÜóôçêå áñ÷éêÜ ãéá ôï ëåéôïõñãéêü óýóôçìá UNIX êáé åöáñìüóôçêå ó'áõôü. Ï ðõñÞíáò ôïõ UNIX, ï ìåôáãëùôôéóôÞò ôçò C êáé ó÷åäüí üëá ôá âïçèçôéêÜ ðñïãñÜììáôá ôïõ UNIX, åßíáé ãñáììÝíá óå C. Ç ãëþóóá C åßíáé ôï áðïôÝëåóìá ìéáò åñãáóßáò ðïõ îåêßíçóå áðü ìéá ðáëáéüôåñç ãëþóóá ðïõ ïíïìáæüôáí BCL, ç ïðïßá ó÷åäéÜóôçêå áðü ôïí Martin Richards óôç äåêáåôßá ôïõ 60. H BCL åðçñÝáóå ìéá Üëëç ãëþóóá ðïõ ïíïìÜóôçêå  êáé ó÷åäéÜóôçêå áðü ôïí Ken Thompson (óõíåñãÜôç ôïõ Ritchie) ôï 1970 ãéá ôï ðñþôï óýóôçìá UNIX, óå Ýíáí õðïëïãéóôÞ DEC PDP-7. Ç ãëþóóá  óôç óõíÝ÷åéá, ïäÞãçóå óôçí áíÜðôõîç ôçò C, ãýñù óôï 1972. Áðü ôá ìÝóá ôçò äåêáåôßáò ôïõ 1970, ôï UNIX ÷ñçóéìïðïéåßôáé åêôåôáìÝíá óôá åñãáóôÞñéá ôçò Bell êáé áñãüôåñá åðåêôåßíåôáé ç ÷ñÞóç ôïõ óå äéÜöïñá ÐáíåðéóôÞìéá. Åôóé, ç C Üñ÷éóå óéãÜ-óéãÜ íá áíôéêáèéóôÜ ôéò Üëëåò äéáèÝóéìåò ãëþóóåò óôï UNIX. Ãéá ðïëëÜ ÷ñüíéá, ôï de facto ðñüôõðï ôçò ãëþóóáò C Þôáí ç ðáñå÷üìåíç ÝêäïóÞ ôçò ìå ôçí Ýêäïóç 5 ôïõ UNIX êáé ðåñéãñáöüôáí óôçí ðñþôç Ýêäïóç ôïõ åã÷åéñéäßïõ áíáöïñÜò "The C Programming Language" ôùí Brian Kernighan êáé Dennis Ritchie (óõ÷íÜ áíáöÝñåôáé ùò "ðñüôõðï K&R"). Ìå ôç ñáãäáßá áíÜðôõîç ôùí ìéêñïûðïëïãéóôþí, äçìéïõñãÞèçêå Ýíáò ìåãÜëïò áñéèìüò õëïðïéÞóåùí ôçò C, ïé ïðïßåò ðáñïõóßáæáí áðïêëßóåéò ìåôáîý ôïõò. Åôóé ôï 1983, ôï Áìåñéêáíéêü Åèíéêü Éíóôéôïýôï Ðñïôýðùí (American National Standards Institute - ANSI) óýóôçóå ìéá åðéôñïðÞ ãéá íá äþóåé Ýíáí ðëÞñç êáé óýã÷ñïíï ïñéóìü ôçò C. Ï ïñéóìüò ðïõ ðñïÝêõøå, ôï ðñüôõðï ANSI Þ "ANSI C", åãêñßèçêå ôï 1988. Ôï ðñüôõðï áõôü âáóßæåôáé óôï áñ÷éêü åã÷åéñßäéï áíáöïñÜò. Ç C åßíáé ãëþóóá ãåíéêïý óêïðïý êáé ó÷åôéêÜ ìÝóïõ åðéðÝäïõ. Ï ÷áñáêôçñéóìüò áõôüò äåí åßíáé õðïôéìçôéêüò, áðëþò óçìáßíåé üôé ç C ðáñÝ÷åé óôïí ðñïãñáììáôéóôÞ äõíáôüôçôåò Üìåóçò ðñüóâáóçò óôï õëéêü ôïõ çëåêôñïíéêïý õðïëïãéóôÞ (Ç/Õ) êáé óôéò óôïé÷åéþäåéò ëåéôïõñãßåò ôïõ. Åôóé ç C åðéôñÝðåé óôïí ðñïãñáììáôéóôÞ íá äéá÷åéñßæåôáé bits, bytes êáé äéåõèýíóåéò ìíÞìçò, ìå ìåãÜëç åõêïëßá. ÁõôÝò ïé äõíáôüôçôåò êÜíïõí ôç C êáôÜëëçëç ãéá ðñïãñáììáôéóìü óå åðßðåäï óõóôÞìáôïò. Ðáñ'üëá áõôÜ üìùò, ï êþäéêáò ðïõ ðáñÜãåôáé áðü ôç C åßíáé óå ìåãÜëï âáèìü öïñçôüò. Áõôü óçìáßíåé üôé Ýíá ðñüãñáììá ðïõ Ý÷åé ãñáöôåß ãéá êÜðïéïí ôýðï Ç/Õ, ìðïñåß íá ÷ñçóéìïðïéçèåß êáé óå Ç/Õ Üëëïõ ôýðïõ.
2
H Ãëþóóá Ðñïãñáììáôéóìïý C
Ç ãëþóóá C åßíáé åðßóçò ãíùóôÞ ãéá ôçí åëåõèåñßá ðïõ ðñïóöÝñåé óôïí ÷ñÞóôç. Ðñïöáíþò, êáôÜ÷ñçóç áõôÞò ôçò åëåõèåñßáò äçìéïõñãåß ðñïâëÞìáôá óôá ðñïãñÜììáôá. Ùò óõíÝðåéá áõôÞò ôçò åëåõèåñßáò, ïé áíáêñéâåßò ÷ñÞóôåò ôçò C óýíôïìá èá áíáêáëýøïõí üôé åßíáé ðïëý åýêïëï íá ãñÜøïõí ðñïãñÜììáôá ðïõ åêôåëïýí åíÝñãåéåò äéáöïñåôéêÝò áðü áõôÝò ðïõ èá Þèåëáí. Óå áíôßèåóç ìå ôéò Üëëåò ãëþóóåò, êáé áõôü åßíáé ðïõ åêðëÞóóåé ôïõò Üðåéñïõò ÷ñÞóôåò, óõ÷íÜ ôÝôïéá ðñïãñÜììáôá åßíáé óõíôáêôéêÜ óùóôÜ. Åôóé ï ìåôáãëùôôéóôÞò äå èá áíé÷íåýóåé ëÜèïò, üìùò ôá áðïôåëÝóìáôá ðïõ èá ðÜñïõìå äå èá åßíáé ôá áíáìåíüìåíá. Ãéá ðáñÜäåéãìá, áí áðü ëÜèïò ãñÜøïõìå Ýíá óçìåßï éóüôçôáò (=, ôåëåóôÞò êáôá÷þñçóçò) åêåß ðïõ êáíïíéêÜ Ýðñåðå íá ãñÜøïõìå äýï (==, ôåëåóôÞò óýãêñéóçò), ìðïñåß íá åßíáé ðïëý äýóêïëï íá âñïýìå ãéáôß ðáßñíïõìå ëÜèïò áðïôåëÝóìáôá. Áõôü äåí åßíáé óïâáñü ìåéïíÝêôçìá ôçò ãëþóóáò. Óôïí ðñïãñáììáôéóìü ðñÝðåé íá åßìáóôå ðñïóåêôéêïß êáé åßíáé ëïãéêü, ëÜèïò åíôïëÝò íá ïäçãïýí óå ëÜèïò áðïôåëÝóìáôá. Ìéá áðü ôéò ðéï äçìïöéëåßò õëïðïéÞóåéò ôçò C óôï ÷þñï ôùí ìéêñïûðïëïãéóôþí, åßíáé ç Tubo C (TC). H TC åßíáé ðñïúüí (êáé óÞìá êáôåôåèÝí) ôçò åôáéñåßáò Borland International Inc. Ç TC äåí åßíáé áðëþò Ýíáò ìåôáãëùôôéóôÞò ôçò C, åßíáé Ýíá ïëïêëçñùìÝíï ðåñéâÜëëïí áíÜðôõîçò ðñïãñáììÜôùí óå C. ÁõôÞ ôçí õëïðïßçóç ôçò C èá åîåôÜóïõìå ó'áõôÝò ôéò óçìåéþóåéò.
1.2
~ ªz z °ƒzº ™ z § ™ ™ ¶ƒ °ƒzªªz ™
Ôá ðñïãñÜììáôá ðïõ ãñÜöïíôáé óå C åßíáé ìéá óåéñÜ áðü åíôïëÝò ôá ïíüìáôá ôùí ïðïßùí åßíáé, óõíÞèùò, Ýôóé äéáëåãìÝíá þóôå íá öáíåñþíïõí ôçí åíÝñãåéá ôçò êÜèå åíôïëÞò. Ãéá íá ãñÜøïõìå ôá ðñïãñÜììáôÜ ìáò, ÷ñçóéìïðïéïýìå êÜðïéï óõíôÜêôç êåéìÝíïõ (editor), Ýôóé ðáñÜãïõìå Ýíá ðñüãñáììá óå ìïñöÞ êåéìÝíïõ áíáãíùñßóéìç áðü ôïí Üíèñùðï, áõôÞ ç ìïñöÞ ôïõ ðñïãñÜììáôïò ëÝãåôáé ðçãáßï ðñüãñáììá (source program). Áðü ôçí Üëëç, ç êåíôñéêÞ ìïíÜäá åðåîåñãáóßáò ôïõ Ç/Õ ìðïñåß íá åêôåëÝóåé åíôïëÝò óå äõáäéêÞ ìïñöÞ (ãëþóóá ìç÷áíÞò). Áõôü óçìáßíåé üôé Ýíá ðñüãñáììá ãñáììÝíï óå C, ÷ñåéÜæåôáé íá ìåôáöñáóôåß áðü ôç ìïñöÞ êåéìÝíïõ ðïõ ôï óõíôÜóóåé ï ðñïãñáììáôéóôÞò, óå ãëþóóá ìç÷áíÞò. Ôçí åñãáóßá áõôÞ êÜíåé êáôÜëëçëï ìåôáöñáóôéêü ðñüãñáììá ðïõ ëÝãåôáé ìåôáãëùôôéóôÞò ôçò C (C compiler). O ìåôáãëùôôéóôÞò ëïéðüí åßíáé Ýíá ìåôáöñáóôéêü ðñüãñáììá ç åßóïäïò ôïõ ïðïßïõ åßíáé ôï áñ÷åßï ðçãáßïõ ðñïãñÜììáôïò ôçò C, ôï üíïìá ôïõ ïðïßïõ ðñÝðåé íá Ý÷åé ðñïÝêôáóç ".C", êáèþò êáé ðéèáíÜ áñ÷åßá-åðéêåöáëßäáò (header files). Ôá áñ÷åßá-åðéêåöáëßäáò (ëÝãïíôáé åðßóçò êáé áñ÷åßá óõìðåñßëçøçò: include files) åßíáé áñ÷åßá êåéìÝíïõ. Ìðïñïýí íá óõíäõáóôïýí ìå ôï ðçãáßï áñ÷åßï ðñéí áñ÷ßóåé ç ìåôáãëþôôéóç áõôïý. Ôç äéáäéêáóßá áõôÞ ôçí åðéôåëåß Ýíá ðñüãñáììá ðïõ ëÝãåôáé ðñïåðåîåñãáóôÞò ôçò C (C preprocessor), âëÝðå § 6.9. Ç Ýîïäïò ôïõ ìåôáãëùôôéóôÞ åßíáé Ýíá áñ÷åßï ðïõ Ý÷åé ôï ßäéï üíïìá ìå ôï áñ÷åßï ôïõ ðçãáßïõ ðñïãñÜììáôïò, ðñïÝêôáóç ".OBJ" êáé ëÝãåôáé áíôéêåßìåíï ðñüãñáììá (object program). Áõôü ðñÝðåé íá äéáóõíäåèåß (linking) ìå äéÜöïñá
ÅéóáãùãÞ
3
áñ÷åßá âéâëéïèÞêçò ôçò ãëþóóáò êáé ðéèáíþò ìå Üëëá áíôéêåßìåíá ðñïãñÜììáôá. Ôç äéáäéêáóßá ôçò äéáóýíäåóçò ôçí áíáëáìâÜíåé êáôÜëëçëï ðñüãñáììá ðïõ ëÝãåôáé äéáóõíäåôÞò (linker). Ç Ýîïäïò ôïõ äéáóõíäåôÞ åßíáé Ýíá áñ÷åßï ìå üíïìá ßäéï ìå áõôü ôïõ ðçãáßïõ ðñïãñÜììáôïò êáé ðñïÝêôáóç ".EXE" ðïõ óçìáßíåé üôé åßíáé Ýíá åêôåëÝóéìï ðñüãñáììá (executable program). Ôá áñ÷åßá âéâëéïèÞêçò åßíáé ïìÜäåò áðü ðñï-ìåôáãëùôôéóìÝíåò ñïõôßíåò ãéá ôçí åêôÝëåóç óõãêåêñéìÝíùí åñãáóéþí. Ãéá ðáñÜäåéãìá, áí ÷ñçóéìïðïéÞóïõìå óôï ðñüãñáììÜ ìáò ìéá óõíÜñôçóç óáí ôçí printf() (ôçí ïðïßá èá ðåñéãñÜøïõìå áñãüôåñá) ãéá íá ôõðþóïõìå êÜôé óôçí ïèüíç, ï êþäéêáò ãé'áõôÞ ôçí óõíÜñôçóç ðåñéëáìâÜíåôáé ó'Ýíá áñ÷åßï âéâëéïèÞêçò. ÊÜèå áñ÷åßï âéâëéïèÞêçò Ý÷åé Ýíá âáóéêü ÷áñáêôçñéóôéêü: ìüíï ôá êïììÜôéá ôïõ áõôÜ ðïõ åßíáé áðáñáßôçôá èá óõíäåèïýí ìå ôçí åêôåëÝóéìç Ýêäïóç ôïõ ðñïãñÜììáôïò, ü÷é ïëüêëçñï ôï áñ÷åßï. Ôï Ó÷Þìá 1.1 äåß÷íåé ôá âÞìáôá ðïõ ðñÝðåé íá ãßíïõí êáé ôéò öÜóåéò ðïõ ðåñíÜåé Ýíá áñ÷åßï ðçãáßïõ ðñïãñÜììáôïò Ýùò üôïõ ðáñá÷èåß ôï áíôßóôïé÷ï áñ÷åßï åêôåëÝóéìïõ ðñïãñÜììáôïò. ÐéèáíÜ Áñ÷åßáÅðéêåöáëßäåò .h
Ðçãáßï Ðñüãñáììá .c
ÐñïåðåîåñãáóôÞò
ÌåôáãëùôôéóôÞò
Áñ÷åßá ÂéâëéïèÞêçò .lib
Áíôéêåßìåíï Ðñüãñáììá .obj
ÐéèáíÜ Üëëá Áíôéêåßìåíá ÐñïãñÜììáôá
ÄéáóõíäåôÞò
ÅêôåëÝóéìï Ðñüãñáììá .exe
Ó÷Þìá 1.1: ÃñáöÞ - Ìåôáãëþôôéóç - Äéáóýíäåóç ðñïãñÜììáôïò
Áè. Å. Êïõôóïíéêüëáò
4
H Ãëþóóá Ðñïãñáììáôéóìïý C
ÊáôÜ ôç äéÜñêåéá ôçò ìåôáãëþôôéóçò ï ìåôáãëùôôéóôÞò åëÝã÷åé ôï ðçãáßï ðñüãñáììá ãéá ðéèáíÜ ëÜèç. ÁõôÜ ôá ëÜèç ëÝãïíôáé ëÜèç êáôÜ ôï ÷ñüíï ôçò ìåôáãëþôôéóçò (compile-time errors) êáé åßíáé áðïôÝëåóìá ðáñáâéÜóåùí ôïõ óõíôáêôéêïý ôçò ãëþóóáò. Ãéá êÜèå ëÜèïò ðïõ áíé÷íåýåôáé, ï ìåôáãëùôôéóôÞò ðáñÜãåé êáôÜëëçëï äéáãíùóôéêü ìÞíõìá ëÜèïõò. Åðßóçò áíôßóôïé÷á ìçíýìáôá ëÜèïõò ðáñÜãïíôáé áðü ôï äéáóõíäåôÞ óôçí ðåñßðôùóç ðïõ óõìâåß ëÜèïò êáôÜ ôç äéáóýíäåóç ôïõ ðñïãñÜììáôïò ìå êÜðïéï áðü ôá áñ÷åßá âéâëéïèÞêçò. Ó÷åäßáóç ðñïãñÜììáôïò Óýíôáîç ðñïãñÜììáôïò Ìåôáãëþôôéóç êáé äéáóýíäåóç
ËÜèç êáôÜ ôï ÷ñüíï ìåôáãëþôôéóçò ÍÁÉ Þ äéáóýíäåóçò
ÅêôÝëåóç ôïõ ðñïãñÜììáôïò
ËÜèç êáôÜ ÍÁÉ ôï ÷ñüíï åêôÝëåóçò
Åëåã÷ïò ôïõ ðñïãñÜììáôïò
ËïãéêÜ ëÜèç
ÍÁÉ
ÅÐÉÔÕ×ÉÁ !
Ó÷Þìá 1.2: ÄéÜãñáììá ñïÞò ôùí äéáäéêáóéþí áíÜðôõîçò åíüò ðñïãñÜììáôïò
ÅéóáãùãÞ
5
Ôï åðüìåíï âÞìá ìåôÜ ôçí åðéôõ÷çìÝíç ìåôáãëþôôéóç êáé äéáóýíäåóç ôïõ ðñïãñÜììáôïò, åßíáé ç åêôÝëåóç Þ ôñÝîéìï ôïõ åêôåëÝóéìïõ ðñïãñÜììáôïò. ÊáôÜ ôç äéÜñêåéá åêôÝëåóçò ôïõ ðñïãñÜììáôïò åßíáé ðéèáíü ôï ëåéôïõñãéêü óýóôçìá ôïõ Ç/Õ íá áíé÷íåýóåé ëÜèç. ÁõôÜ ëÝãïíôáé ëÜèç êáôÜ ôï ÷ñüíï åêôÝëåóçò (run-time errors). ÐéèáíÜ ôÝôïéá ëÜèç åßíáé ç äéáßñåóç åíüò áñéèìïý ìå ôï ìçäÝí, ç áðüðåéñá åýñåóçò ôçò ôåôñáãùíéêÞò ñßæáò åíüò áñíçôéêïý áñéèìïý ê.ë.ð. Ôï ðñüãñáììá üìùò, ìðïñåß íá ìçí ðáñïõóéÜæåé ëÜèç êáôÜ ôï ÷ñüíï ìåôáãëþôôéóçò ïýôå êáôÜ ôï ÷ñüíï åêôÝëåóçò, áëëÜ ðáñ'üëá áõôÜ íá ìç äßíåé ôá áíáìåíüìåíá áðïôåëÝóìáôá, ç íá ìç óõìðåñéöÝñåôáé üðùò áíáìåíüôáí åîáéôßáò ëÜèïõò óôïí åðéëåãìÝíï áëãüñéèìï Þ óôçí ÝêöñáóÞ ôïõ óôç ãëþóóá ðñïãñáììáôéóìïý. ÁõôÝò ïé áðïêëßóåéò áðü ôá áíáìåíüìåíá, ëÝãïíôáé ëïãéêÜ ëÜèç (logical errors) êáé åßíáé åõèýíç ôïõ ðñïãñáììáôéóôÞ íá âñåé êáé íá äéïñèþóåé áõôÜ ôá ëÜèç. ÊÜèå öïñÜ ðïõ áíé÷íåýåôáé êÜðïéï ëÜèïò (ïðïéïäÞðïôå áðü ôá ðñïáíáöåñèÝíôá) ðñÝðåé ôï ðçãáßï ðñüãñáììá íá äéïñèùèåß. Ç äéüñèùóç ãßíåôáé ÷ñçóéìïðïéþíôáò ôï óõíôÜêôç êåéìÝíïõ ðïõ ÷ñçóéìïðïéåßôáé êáé ãéá ôç ãñáöÞ ôïõ ðñïãñÜììáôïò. Ôï Ó÷Þìá 1.2 äåß÷íåé óå ìïñöÞ äéáãñÜììáôïò ñïÞò ôéò äéáäéêáóßåò: ôïõ ãñáøßìáôïò ôïõ ðçãáßïõ ðñïãñÜììáôïò (ó÷åäßáóç ôçò ìåèüäïõ åðßëõóçò, óýíôáîç ðñïãñÜììáôïò), ôçò ìåôáãëþôôéóçò êáé ôçò åêôÝëåóçò ôïõ ðñïãñÜììáôïò. Ðáñáôçñïýìå üôé ïé ðáñáðÜíù äéáäéêáóßåò åßíáé äõíáôü íá ãßíïõí ðåñéóóüôåñåò ôçò ìßáò öïñÝò ó'Ýíá ðñüãñáììá, åîáéôßáò äéáöüñùí åéäþí ëáèþí.
1.3
¢ ª ¶ƒ °ƒzªªz ™ ™ C
ÊÜèå ðñüãñáììá ôçò C áðïôåëåßôáé áðü ìßá Þ ðåñéóóüôåñåò óõíáñôÞóåéò (functions). Ìßá óõíÜñôçóç ôçò C åßíáé áíôßóôïé÷ç ôçò õðïñïõôßíáò ôçò BASIC Þ ôçò óõíÜñôçóçò ôçò Pascal. Èá äïýìå ðåñéóóüôåñá ãéá ôéò óõíáñôÞóåéò óôï ÊåöÜëáéï 6. ÊÜèå ðñüãñáììá ðåñéÝ÷åé áðáñáéôÞôùò ìßá êáé ìüíï ìßá óõíÜñôçóç ðïõ êáëåßôáé main(). Áó÷Ýôùò ìå ôï ðüóåò óõíáñôÞóåéò õðÜñ÷ïõí ó'Ýíá ðñüãñáììá, ç main() åßíáé åêåßíç óôçí ïðïßá ðåñíÜåé ï Ýëåã÷ïò áðü ôï ëåéôïõñãéêü óýóôçìá üôáí åêôåëåßôáé ôï ðñüãñáììá, ì'Üëëá ëüãéá åßíáé ç ðñþôç óõíÜñôçóç ðïõ åêôåëåßôáé. Ç main() ìðïñåß íá êáëåß Üëëç óõíÜñôçóç ç ïðïßá ìðïñåß íá êáëåß êÜðïéá Üëëç ê.ï.ê. Ç ìïñöÞ åíüò ðñïãñÜììáôïò ðïõ ðåñéÝ÷åé ìüíï ìßá óõíÜñôçóç, ðïõ öõóéêÜ èá ïíïìÜæåôáé main(), åßíáé: main() { åíôïëÞ1 åíôïëÞ2 ... åíôïëÞn }
Å üíïìá óõíÜñôçóçò (ïé ðáñåíèÝóåéò èá ìðïñïýóáí íá Ý÷ïõí ðáñáìÝôñïõò) Å ïñéïèÝôçò
Å óþìá ôçò óõíÜñôçóçò Å ïñéïèÝôçò
Ïé ðáñåíèÝóåéò ìåôÜ ôï üíïìá ôçò óõíÜñôçóçò åßíáé áðáñáßôçôåò, Ýóôù êé áí äåí ðåñéÝ÷ïõí ïñßóìáôá, ãéá ëüãïõò ðïõ èá ãßíïõí êáôáíïçôïß ðáñáêÜôù. Ôïí
Áè. Å. Êïõôóïíéêüëáò
6
H Ãëþóóá Ðñïãñáììáôéóìïý C
êáèïñéóìü ôçò óõíÜñôçóçò áêïëïõèïýí ôá Üãêéóôñá ðïõ ïñéïèåôïýí ôçí áñ÷Þ êáé ôï ôÝëïò ôïõ óþìáôïò ôçò óõíÜñôçóçò. Ôï Üãêéóôñï áíïßãìáôïò ({ ) äåß÷íåé üôé Ýíá êïììÜôé êþäéêá ðïõ áðïôåëåß ìéá êáèïñéóìÝíç ïìÜäá, ðñüêåéôáé íá îåêéíÞóåé. Ôï Üãêéóôñï êëåéóßìáôïò ( }) ôåñìáôßæåé Ýíá êïììÜôé ôïõ êþäéêá. Ôá Üãêéóôñá óôç C åðéôåëïýí ìßá ðáñüìïéá ëåéôïõñãßá ìå ôéò åíôïëÝò Begin êáé End ôçò Pascal. ÊÜèå åíôïëÞ ôçò C ôåñìáôßæåôáé ìå Ýíá åëëçíéêü åñùôçìáôéêü (;). Áò óçìåéùèåß åäþ, üôé ôï åëëçíéêü åñùôçìáôéêü óôçí C äå äéá÷ùñßæåé åíôïëÝò, üðùò óôçí Pascal, áëëÜ ôåñìáôßæåé åíôïëÝò. Ìßá áêüìá ðáñáôÞñçóç ðïõ ðñÝðåé íá ãßíåé åäþ åßíáé üôé ç C êÜíåé äéÜêñéóç ìåôáîý êåöáëáßùí êáé ðåæþí ãñáììÜôùí. Ìßá óýìâáóç ðïõ èá áêïëïõèÞóïõìå åßíáé üôé èá ãñÜöïõìå ôá ðÜíôá ìå ðåæïýò ÷áñáêôÞñåò (åêôüò áðü ôéò óôáèåñÝò üðùò èá äïýìå áñãüôåñá), ãéá åõêïëßá óôçí ðëçêôñïëüãçóç.
1.4
À§ ¶ ™ z¶§ø¡ ¶ƒ °ƒzªªz ø¡
Ãéá íá ìðïñïýìå íá ãñÜöïõìå áðëÜ ðñïãñÜììáôá óå C, èá äïýìå ó'áõôÞ ôçí ðáñÜãñáöï ìåñéêÜ ðáñáäåßãìáôá, ÷ñçóéìïðïéþíôáò êÜðïéåò áðü ôéò óõíáñôÞóåéò âéâëéïèÞêçò ôçò ãëþóóáò üðùò ç printf() (ãéá åêôýðùóç óôçí ïèüíç) êáé ç scanf() (ãéá äéÜâáóìá áðü ôï ðëçêôñïëüãéï). Èá äïýìå ìå ðåñéóóüôåñåò ëåðôïìÝñåéåò ôïõò âáóéêïýò ôñüðïõò åéóüäïõ-åîüäïõ óôï ÊåöÜëáéï 4. Áò ãñÜøïõìå ëïéðüí ôï ðñþôï ìáò ðñüãñáììá óå C: main() { printf("Áõôü åßíáé ôï ðñþôï ìáò ðñüãñáììá óå C!"); }
Åêôåëþíôáò áõôü ôï ðñüãñáììá èá ðÜñïõìå óôçí ïèüíç ôï ìÞíõìá: Áõôü åßíáé ôï ðñþôï ìáò ðñüãñáììá óå C!
Áõôü åßíáé ôï áðïôÝëåóìá ôçò ìïíáäéêÞò åíôïëÞò ôïõ ðñïãñÜììáôüò ìáò. Ç ëÝîç "printf" åßíáé üíïìá óõíÜñôçóçò üðùò êáé ç ëÝîç "main". Ìéáò êáé ç "printf" åßíáé óõíÜñôçóç áêïëïõèåßôáé áðü ðáñåíèÝóåéò. Ó'áõôÞ ôçí ðåñßðôùóç, ïé ðáñåíèÝóåéò ðåñéÝ÷ïõí ôçí ðñïò åêôýðùóç öñÜóç, ç ïðïßá ðåñéêëåßåôáé áðü äéðëÜ åéóáãùãéêÜ (" "). ÁõôÞ ç öñÜóç åßíáé Ýíá üñéóìá óõíÜñôçóçò. Ðåñéóóüôåñá ãéá ôá ïñßóìáôá èá äïýìå óôï ÊåöÜëáéï 6. Ç öñÜóç "Áõôü åßíáé ôï ðñþôï ìáò ðñüãñáììá óå C!" åßíáé Ýíá ðáñÜäåéãìá áëöáñéèìçôéêïý. Óôçí C, ïé óôáèåñÝò áëöáñéèìçôéêïý, üðùò áõôü, ðåñéêëåßïíôáé áðü äéðëÜ åéóáãùãéêÜ. ×ñçóéìïðïéÞóáìå ôç óõíÜñôçóç printf() ÷ùñßò íá õðÜñ÷åé ï êþäéêáò áõôÞò ôçò óõíÜñôçóçò óôï ðñüãñáììÜ ìáò. Ï êþäéêáò ãé'áõôÞ ôç óõíÜñôçóç õðÜñ÷åé óôï áñ÷åßï âéâëéïèÞêçò ôçò ãëþóóáò. Ïôáí ìåôáãëùôôßæåôáé ôï ðñüãñáììá, ï ìåôáãëùôôéóôÞò áíôéëáìâÜíåôáé üôé ç printf() äåí åßíáé ìéá óõíÜñôçóç ðïõ ðåñéëáìâÜíåôáé óôï ðçãáßï ðñüãñáììá êáé Ýôóé áöÞíåé Ýíá ìÞíõìá óôï äéáóõíäåôÞ ãé'áõôü ôï ãåãïíüò. Ï äéáóõíäåôÞò øÜ÷íåé óôï áñ÷åßï âéâëéïèÞêçò ôçò ãëþóóáò, âñßóêåé ôï êïììÜôé áõôïý ôïõ áñ÷åßïõ ðïõ ðåñéëáìâÜíåé ôçí printf() êáé ðñïêáëåß ôç äéáóýíäåóç áõôïý ôïõ êïììáôéïý ìå ôï ðçãáßï ðñüãñáììá. Ðáñüìïéá äéáäéêáóßá áêïëïõèåßôáé ãéá üëåò ôéò óõíáñôÞóåéò âéâëéïèÞêçò ôçò C.
ÅéóáãùãÞ
7
Ç óõíÜñôçóç printf() ìðïñåß íá ÷ñçóéìïðïéçèåß ãéá ôçí åêôýðùóç óôçí ïèüíç ìå êáèïñéóìÝíç ìïñöÞ ôüóï óôáèåñþí üóï êáé ìåôáâëçôþí. Ãéá ðáñÜäåéãìá áò äïýìå ôï ðáñáêÜôù ðñüãñáììá: main() { printf("Áõôüò åßíáé ï áñéèìüò %d",2); }
Åêôåëþíôáò áõôü ôï ðñüãñáììá èá ðÜñïõìå óôçí ïèüíç ôï ìÞíõìá: Áõôüò åßíáé ï áñéèìüò 2
Ãéáôß ôõðþèçêå ï áñéèìüò 2 êáé ôé ðñïêáëåß ôï %d ; Óôçí óõíÜñôçóç printf() ìðïñïýí íá äïèïýí ðáñáðÜíù áðü Ýíá ïñßóìáôá. Óôï ðñïçãïýìåíï ðáñÜäåéãìá ôçò äþóáìå ìüíï Ýíá: ôï áëöáñéèìçôéêü "Áõôü åßíáé ôï ðñþôï ìáò ðñüãñáììá óå C!". Ôþñá ôçò äþóáìå äýï: Ýíá áëöáñéèìçôéêü ("Áõôüò åßíáé ï áñéèìüò %d") óôá áñéóôåñÜ êáé êáé ìßá ôéìÞ (ôïí áñéèìü 2) óôá äåîéÜ. ÁõôÜ ôá äýï ïñßóìáôá ÷ùñßæïíôáé ìå êüììá. Ç óõíÜñôçóç printf() ðáßñíåé ôçí ôéìÞ äåîéÜ áðü ôï êüììá êáé ôçí ôïðïèåôåß óôï áëöáñéèìçôéêü áñéóôåñÜ. Ç èÝóç ôïõ áëöáñéèìçôéêïý üðïõ ôïðïèåôåßôáé ç ôéìÞ, åßíáé åêåßíç óôçí ïðïßá õðÜñ÷åé Ýíáò êáèïñéóôÞò ìïñöÞò (format specifier). Ï êáèïñéóôÞò ìïñöÞò õðïäåéêíýåé óôçí printf() ðïý íá ôïðïèåôÞóåé ôçí ôéìÞ óôï áëöáñéèìçôéêü êáé ôß ìïñöÞ íá ÷ñçóéìïðïéÞóåé ãéá íá åêôõðþóåé ôçí ôéìÞ. Óôï ðáñáðÜíù ðáñÜäåéãìá, ôï %d õðïäåéêíýåé óôçí printf() íá ôõðþóåé ôçí ôéìÞ 2 óáí äåêáäéêü áêÝñáéï (óôï äåêáäéêü óýóôçìá áñßèìçóçò). Ìðïñïýìå íá ÷ñçóéìïðïéÞóïõìå êáé Üëëïõò êáèïñéóôÝò ãéá ôçí åêôýðùóç ôïõ áñéèìïý 2. Ãéá ðáñÜäåéãìá ôï %f èá Ýêáíå ôï 2 íá ôõðùèåß óáí áñéèìüò êéíçôÞò õðïäéáóôïëÞò êáé ôï %x èá ôï ôýðùíå óáí äåêáåîáäéêü áêÝñáéï (óôï äåêáåîáäéêü óýóôçìá áñßèìçóçò). ×ñçóéìïðïéþíôáò êáèïñéóôÝò ìïñöÞò ìðïñïýìå íá åêôõðþóïõìå ôï ßäéï êáëÜ áëöáñéèìçôéêÝò óôáèåñÝò üðùò êáé áñéèìïýò. Ãéá ðáñÜäåéãìá óôï ðáñáêÜôù ðñüãñáììá, Ýíá áëöáñéèìçôéêü êáé Ýíáò áñéèìüò ôõðþíïíôáé ìáæß: main() { printf("Ï %s åßíáé %d ÷ñüíùí","Íßêïò",28); }
Åêôåëþíôáò áõôü ôï ðñüãñáììá èá ðÜñïõìå óôçí ïèüíç: Ï Íßêïò åßíáé 28 ÷ñüíùí
×ñçóéìïðïéÞóáìå ôïí êáèïñéóôÞ ìïñöÞò %s ãéá íá ôõðþóïõìå áëöáñéèìçôéêÞ óôáèåñÜ "Íßêïò" êáé ôï %d ãéá ôçí áêÝñáéá óôáèåñÜ 28.
ôçí
Ï ôåëåõôáßïò êáèïñéóôÞò ìïñöÞò ðïõ èá äïýìå åäþ åßíáé ï %c ðïõ ÷ñçóéìïðïéåßôáé üôáí èÝëïõìå íá åêôõðþóïõìå ÷áñáêôÞñåò. Ðåñéóóüôåñá ãéá ôïõò êáèïñéóôÝò ìïñöÞò èá äïýìå óôï ÊåöÜëáéï 4, üðïõ èá åîåôÜóïõìå ìå ðåñéóóüôåñç ëåðôïìÝñåéá ôéò óõíáñôÞóåéò printf() êáé scanf(). Áò èåùñÞóïõìå ôï ðáñáêÜôù ðñüãñáììá:
Áè. Å. Êïõôóïíéêüëáò
8
H Ãëþóóá Ðñïãñáììáôéóìïý C
main() { printf("Ôï ãñÜììá %c åßíáé",'á'); printf(" ôï áñ÷éêü ôçò ëÝîçò %s","Üëöá"); }
Ç Ýîïäïò áõôïý ôïõ ðñïãñÜììáôïò åßíáé: Ôï ãñÜììá á åßíáé ôï áñ÷éêü ôçò ëÝîçò Üëöá
Ó'áõôü ôï ðñüãñáììá ôï 'á' åßíáé ÷áñáêôÞñáò êáé ôï "Üëöá" áëöáñéèìçôéêü. Áò ðñïóÝîïõìå üôé ï ÷áñáêôÞñáò ðåñéêëåßåôáé áðü ìïíÜ åéóáãùãéêÜ, åíþ ôï áëöáñéèìçôéêü áðü äéðëÜ. Ðáñáôçñïýìå åðßóçò üôé ðáñüëï ðïõ ôï áðïôÝëåóìá åêôõðþíåôáé áðü äýï îå÷ùñéóôÝò åíôïëÝò, óôçí ïèüíç ðáßñíïõìå ìßá ãñáììÞ êåéìÝíïõ. Áõôü ãßíåôáé ãéáôß ç printf() äåí åêôõðþíåé áõôüìáôá ÷áñáêôÞñá êáéíïýñãéáò ãñáììÞò. Èá ãíùñßóïõìå ôþñá ìå óõíôïìßá ôç óõíÜñôçóç scanf() ðïõ ÷ñçóéìïðïéåßôáé ãéá åßóïäï äåäïìÝíùí óôï ðñüãñáììá, áðü ôï ðëçêôñïëüãéï. Ç ìïñöÞ ôçò, ðïõ èá ðåñéãñáöåß áíáëõôéêÜ óôï ÊåöÜëáéï 4, åßíáé ðáñüìïéá ìå áõôÞ ôçò printf(). ×ñçóéìïðïéåß ôïõò ßäéïõò êáèïñéóôÝò ìïñöÞò, ãéá ôçí áíÜãíùóç ôéìþí, ìå áõôïýò printf(). Óôï ðáñáêÜôù ðñüãñáììá öáßíåôáé ìéá ôõðéêÞ ÷ñÞóç ôçò ôçò scanf(). main() { int i; printf("Äþóå ôçí çëéêßá óïõ óå ÷ñüíéá: "); scanf("%d",&i); printf("Åßóáé %d åôþí",i); }
Óôçí ôñßôç ãñáììÞ ôïõ ðáñáðÜíù ðñïãñÜììáôïò, ãßíåôáé ïñéóìüò ìéáò ìåôáâëçôÞò áêåñáßïõ ôýðïõ, ìå üíïìá i, ðïõ èá ÷ñçóéìïðïéçèåß óôï ðñüãñáììá. Èá åîåôÜóïõìå áíáëõôéêÜ ôïõò äõíáôïýò ôýðïõò ôùí ìåôáâëçôþí êáé ôéò äçëþóåéò ôïõò, óôï ÊåöÜëáéï 3. Áò ðáñáôçñÞóïõìå ôï óýìâïëï & ðïõ õðÜñ÷åé ðñéí ôï üíïìá ôçò ìåôáâëçôÞò óôçí óõíÜñôçóç scanf() , èá äïýìå ôç ÷ñçóéìüôçôá áõôïý ôïõ ôåëåóôÞ áñãüôåñá, óôï ÊåöÜëáéï 9, ðñïò ôï ðáñüí áò óçìåéþóïõìå üôé ç scanf() áðáéôåß ôç ÷ñÞóç ôïõ & ðñéí ôï üíïìá ôçò ìåôáâëçôÞò. ÊáôÜ ôá Üëëá, Ýíá äåßãìá åðéêïéíùíßáò ìå ôï ðñüãñáììá åßíáé: Äþóå ôçí çëéêßá óïõ óå ÷ñüíéá: 28 Åßóáé 28 åôþí
Ç óõíÜñôçóç scanf() ìðïñåß íá äå÷ôåß ìïíïìéÜò äåäïìÝíá óå äéÜöïñåò ìåôáâëçôÝò, üðùò áêñéâþò êáé ç printf() ìðïñåß íá åêôõðþóåé ôéò ôéìÝò ðåñéóóïôÝñùí ôïõ åíüò ïñéóìÜôùí ôçò. Ð.÷: scanf("%c %s %d", &set, &game, &time);
Ó'áõôÞ ôçí ðåñßðôùóç ç scanf() äéáâÜæåé áðü ôï ðëçêôñïëüãéï ôéìÝò ãéá ôñåéò ìåôáâëçôÝò, ïé ôéìÝò ðñÝðåé íá ÷ùñßæïíôáé ìå Ýíá Þ ðåñéóóüôåñá êåíÜ äéáóôÞìáôá. Óôçí ïõóßá ìðïñïýìå íá ÷ñçóéìïðïéÞóïõìå ãéá ôï äéá÷ùñéóìü ôùí ôéìþí, ïðïéïäÞðïôå ëåõêü ÷áñáêôÞñá (êåíü, êáéíïýñãéá ãñáììÞ Þ tab).
2. 2.1
~z™ z ™ Ã z § • § ° ™ C
Ïëåò ïé ãëþóóåò, ôüóï ïé öõóéêÝò üóï êáé ïé ãëþóóåò ðñïãñáììáôéóìïý, êÜíïõí ÷ñÞóç åíüò ëåîéëïãßïõ. Ôï ëåîéëüãéï ôçò C áðïôåëåßôáé áðü ãñÜììáôá, øçößá, äåóìåõìÝíåò ëÝîåéò, ôåëåóôÝò êáé åéäéêÜ óýìâïëá. Ïé ðáñáóôÜóåéò (Þ åêöñÜóåéò) êáé ïé åíôïëÝò (Þ ðñïôÜóåéò) ôçò ãëþóóáò äçìéïõñãïýíôáé êÜíïíôáò ÷ñÞóç ôïõ ëåîéëïãßïõ ôçò ãëþóóáò êáé õðáêïýïíôáò óôïõò ãñáììáôéêïýò êáé óõíôáêôéêïýò êáíüíåò ôçò. Åíá ãñÜììá ìðïñåß íá åßíáé Ýíá áðü ôá 26 ãñÜììáôá ôïõ ëáôéíéêïý áëöáâÞôïõ, êåöáëáßï Þ ðåæü. Åíá øçößï åßíáé Ýíá áðü ôá áñáâéêÜ íïýìåñá '0' Ýùò '9', åðßóçò, óôçí ðåñßðôùóç ðïõ èÝëïõìå íá ðáñáóôÞóïõìå áñéèìïýò óôï äåêáåîáäéêü óýóôçìá áñßèìçóçò, øçößá èåùñïýíôáé êáé ôá ãñÜììáôá 'A' Ýùò 'F' (Þ éóïäýíáìá 'a' Ýùò 'f'). ÄåóìåõìÝíåò ëÝîåéò (Þ ëÝîåéò-êëåéäéÜ, keywords) åßíáé åêåßíåò ïé ëÝîåéò ôùí ïðïßùí ç óçìáóßá åßíáé åéäéêÞ êáé áìåôÜâëçôç ãéá ôï ìåôáãëùôôéóôÞ. Äåí åðéôñÝðåôáé íá ãßíåôáé ÷ñÞóç ìéáò äåóìåõìÝíçò ëÝîçò ãéá Üëëï óêïðü ó'Ýíá ðñüãñáììá. Ï áñéèìüò ôùí äåóìåõìÝíùí ëÝîåùí ðïõ ÷ñçóéìïðïéåß ç C, åßíáé ó÷åôéêÜ ìéêñüò, óõãêñéíüìåíïò ìå ôïí áíôßóôïé÷ï áñéèìü Üëëùí ãëùóóþí ðñïãñáììáôéóìïý. Óôïí Ðßíáêá 2.1 öáßíïíôáé ïé äåóìåõìÝíåò ëÝîåéò ôçò C, üðùò ïñßæåôáé áðü ôï ðñïôåéíüìåíï ðñüôõðï ANSI. ÅðéðëÝïí, ç Turbo C Ý÷åé ðñïóèÝóåé êÜðïéåò äåóìåõìÝíåò ëÝîåéò ãéá íá åðéôñÝðåé êáëýôåñï Ýëåã÷ï ôïõ ôñüðïõ ðïõ ÷ñçóéìïðïéåßôáé ç ìíÞìç, êáèþò êáé ãéá ôçí õðïóôÞñéîç äéáãëùóóéêïý ðñïãñáììáôéóìïý êáé ôùí äéáêïðþí. Óôïí Ðßíáêá 2.2 öáßíåôáé ôï óýíïëï ôùí åðåêôáìÝíùí äåóìåõìÝíùí ëÝîåùí ôçò Turbo C. auto break case char const continue default do
double else enum extern float for goto if
int long register return short signed sizeof static
struct switch typedef union unsigned void volatile while
Ðßíáêáò 2.1: Ïé 32 äåóìåõìÝíåò ëÝîåéò ôçò C, üðùò ïñßæïíôáé áðü ôï ðñüôõðï ANSI asm _ss interrupt
_cs cdecl near
_ds far pascal
_es huge
Ðßíáêáò 2.2: Ôï óýíïëï ôùí åðåêôáìÝíùí äåóìåõìÝíùí ëÝîåùí ôçò Turbo C
10
H Ãëþóóá Ðñïãñáììáôéóìïý C
Ïëåò ïé äåóìåõìÝíåò ëÝîåéò ôçò C ãñÜöïíôáé ìå ðåæÜ ãñÜììáôá. Ïðùò åßíáé ãíùóôü, ç C äéáêñßíåé ôá ðåæÜ áðü ôá êåöáëáßá ãñÜììáôá. Åôóé ð.÷. ôï while åßíáé äåóìåõìÝíç ëÝîç, åíþ ôï WHILE äåí åßíáé. Ç C äéáèÝôåé Ýíá ðïëý ðëïýóéï óýíïëï ôåëåóôþí. Åíáò ôåëåóôÞò (operator) åßíáé Ýíá óýìâïëï ç óçìáóßá ôïõ ïðïßïõ åßíáé êáèïñéóìÝíç ãéá ôï ìåôáãëùôôéóôÞ. Ïé ôåëåóôÝò ðïõ äéáèÝôåé ç C ìðïñïýí íá êáôáôá÷èïýí óôéò åðüìåíåò êáôçãïñßåò: ôïõò áñéèìçôéêïýò (arithmetic), ôïõò óõó÷åôéóôéêïýò (relational), ôïõò ëïãéêïýò (logical) ôïõò ôåëåóôÝò bit (bitwise), ôïõò ôåëåóôÝò äåéêôþí, ôïõò ôåëåóôÝò áðüäïóçò ôéìÞò êáé åéäéêïýò ôåëåóôÝò ãéá åéäéêÝò ëåéôïõñãßåò. Óôïí Ðßíáêá 2.3 öáßíïíôáé áðëþò ïé ôåëåóôÝò êÜèå êáôçãïñßáò. Èá äïýìå êáèÝíáí áðü áõôïýò, áíáëõôéêÜ óå åðüìåíá êåöÜëáéá. Ç C äéáèÝôåé åðßóçò Ýíáí áñéèìü åéäéêþí óõìâüëùí, ðïõ ÷ñçóéìïðïéïýíôáé ãéá äéÜöïñïõò óêïðïýò, üðùò ð.÷. ãéá éåñÜñ÷çóç ôùí ðñÜîåùí óå áñéèìçôéêÝò ðáñáóôÜóåéò, ïñéïèÝôçóç áñ÷Þò êáé ôÝëïõò åíüò êïììáôéïý êþäéêá (åßäáìå áõôÜ ôá óýìâïëá óôçí § 1.3), ôåñìáôéóìü åíôïëþí ê.ë.ð. Óôïí Ðßíáêá 2.3 öáßíïíôáé áõôÜ ôá åéäéêÜ óýìâïëá. Ç åîÞãçóç ôçò ëåéôïõñãßáò êáèåíüò óõìâüëïõ èá ãßíåôáé üôáí áõôü óõíáíôÜôáé ãéá ðñþôç öïñÜ (üðùò Ýãéíå ãéá ôá { } óôçí § 1.3 êáé ôá " " óôçí § 1.4). Êáôçãïñßá
ÔåëåóôÝò
Áñéèìçôéêïß ôåëåóôÝò Óõó÷åôéóôéêïß ôåëåóôÝò Ëïãéêïß ôåëåóôÝò ÔåëåóôÝò bit ÔåëåóôÝò äåéêôþí ÔåëåóôÝò áðüäïóçò ôéìÞò ÄéÜöïñïé ôåëåóôÝò
-
+
>
>=
&&
*
/
<
||
%
<=
-==
++ !=
!
&
|
^
~
>>
*
&
=
+=
-=
*=
?:
,
->
.
<< /=
%=
&=
^=
|=
<<=
>>=
Ôá åéäéêÜ Óýìâïëá ôçò C ( )
[ ]
/* */
{ }
;
"
'
\
Ðßíáêáò 2.3: Ïé ôåëåóôÝò êáé ôá åéäéêÜ óýìâïëá ôçò C
2.2
z¡z°¡øƒ ™ z
ÁíáãíùñéóôéêÜ (identifiers) åßíáé ôá óõìâïëéêÜ ïíüìáôá ðïõ äßíïíôáé óôéò ìåôáâëçôÝò, ôéò óôáèåñÝò, ôéò óõíáñôÞóåéò êáé óå äéÜöïñá Üëëá áíôéêåßìåíá åíüò ðñïãñÜììáôïò. Óôç C, Ýíá áíáãíùñéóôéêü ìðïñåß íá ðïéêßëëåé áðü Ýíá ÷áñáêôÞñá ìÝ÷ñé ðïëëïýò. Óôçí Turbo C ëáìâÜíïíôáé õðüøç ïé 32 ðñþôïé ÷áñáêôÞñåò. Áõôü óçìáßíåé üôé áí äýï áíáãíùñéóôéêÜ Ý÷ïõí ôïõò 32 ðñþôïõò ÷áñáêôÞñåò ôïõò ßäéïõò êáé äéáöÝñïõí óôïí ôñéáêïóôü ôñßôï, ç Turbo C äå èá ìðïñåß íá ôá îå÷ùñßóåé. Ï ðñþôïò ÷áñáêôÞñáò åíüò áíáãíùñéóôéêïý ðñÝðåé íá åßíáé ãñÜììá ôïõ ëáôéíéêïý áëöáâÞôïõ Þ ï ÷áñáêôÞñáò ôçò õðïãñÜììéóçò (_), åíþ ïé õðüëïéðïé
ÂáóéêÜ Óôïé÷åßá
11
÷áñáêôÞñåò ìðïñïýí íá åßíáé ãñÜììáôá, áñéèìïß, Þ ï ÷áñáêôÞñáò ôçò õðïãñÜììéóçò. Åíá áíáãíùñéóôéêü äå ìðïñåß íá åßíáé ßäéï ìå ìéá äåóìåõìÝíç ëÝîç ôçò C. Ìå âÜóç ôïõò ðáñáðÜíù êáíüíåò, ôá ðáñáêÜôù áíáãíùñéóôéêÜ åßíáé óùóôÜ: capacitor volts test1 Sep_94
Åíþ ôá ðáñáêÜôù åßíáé ëÜèïò: version1.1 Km/h 25_Jun_94 $100 case
ðåñéÝ÷åé ôåëåßá ðåñéÝ÷åé / áñ÷ßæåé ìå áñéèìü áñ÷ßæåé ìå $ åßíáé äåóìåõìÝíç ëÝîç
Ç C äéáêñßíåé ôá êåöáëáßá áðü ôá ðåæÜ ãñÜììáôá. Åôóé ôá number, Number êáé NUMBER, åßíáé ôñßá äéáöïñåôéêÜ áíáãíùñéóôéêÜ.
2.3 2.3.1
ª z~§ ™ - ™ z£ ƒ ™ ª z~§ ™
ÌåôáâëçôÞ åßíáé ìßá ïíïìáóìÝíç ðåñéï÷Þ óôç ìíÞìç ôïõ Ç/Õ ðïõ êáôáêñáôåßôáé ãéá óõãêåêñéìÝíï åßäïò äåäïìÝíïõ êáé ôá ðåñéå÷üìåíÜ ôçò äýíáíôáé íá áëëÜæïõí êáôÜ ôç äéÜñêåéá åêôÝëåóçò ôïõ ðñïãñÜììáôïò. Óôçí ðåñéï÷Þ áõôÞ ôçò ìíÞìçò áðïäßäåôáé, áðü ôïí ðñïãñáììáôéóôÞ, Ýíá áíáãíùñéóôéêü ãéá åýêïëç áíáöïñÜ ó'áõôÞí. Ïëåò ïé ìåôáâëçôÝò ðïõ õðåéóÝñ÷ïíôáé óôï ðñüãñáììá ðñÝðåé íá äçëùèïýí (declared) Þ ïñéóôïýí (defined), üóïí áöïñÜ ôï áíáãíùñéóôéêü ôïõò êáé ôïí ôýðï ôùí ôéìþí ðïõ ëáìâÜíïõí, ãéá íá ãíùñßæåé ï ìåôáãëùôôéóôÞò ðüóï ÷þñï ìíÞìçò èá äåóìåýóåé ãéá êáèåìéÜ áð'áõôÝò. Ïé äõíáôïß ôýðïé ôéìþí ðïõ ìðïñïýí íá Ý÷ïõí ïé ìåôáâëçôÝò, ðüóï ÷þñï ìíÞìçò áðáéôåß ï êáèÝíáò áð'áõôïýò êáé ôï ðþò ãßíåôáé ç äÞëùóç ôùí ìåôáâëçôþí, èá êáëõöèïýí óôï ÊåöÜëáéï 3.
2.3.2
™ z£ ƒ ™
ÓôáèåñÜ åßíáé ìßá ôéìÞ ðïõ äå äýíáôáé íá ôñïðïðïéçèåß áðü ôï ðñüãñáììá. Ìßá ôõðéêÞ óôáèåñÜ åßíáé ð.÷. ç ôéìÞ ôïõ ð (3.14159). Ìßá óôáèåñÜ ìðïñåß íá åßíáé áñéèìüò (áêÝñáéïò Þ êëáóìáôéêüò óôï äåêáäéêü, ïêôáäéêü Þ äåêáåîåäéêü óýóôçìá), Ýíáò ÷áñáêôÞñáò Þ Ýíá áëöáñéèìçôéêü. ÁêÝñáéåò ÓôáèåñÝò Ïé áêÝñáéåò äåêáäéêÝò (óôï äåêáäéêü óýóôçìá) óôáèåñÝò ãñÜöïíôáé ùò ìßá óåéñÜ áðü øçößá ð.÷. 1 Þ 255 Þ 32767. Ïé äåêáåîáäéêÝò óôáèåñÝò îåêéíïýí ìå "0x" Þ "0X" (Ýíá ìçäåíéêü áêïëïõèïýìåíï áðü x Þ X), ó'áõôÞ ôçí ðåñßðôùóç ùò øçößá ìðïñïýí íá ÷ñçóéìïðïéçèïýí ôá ãñÜììáôá 'Á' Ýùò 'F' (Þ éóïäýíáìá 'a' Ýùò 'f') ãéá ôéò ôéìÝò ðïõ åßíáé ìåãáëýôåñåò ôïõ 9. Ãéá ðáñÜäåéãìá ï äåêáäéêüò 255 ãñÜöåôáé 0XFF ùò äåêáåîáäéêüò. Ïé ïêôáäéêÝò óôáèåñÝò îåêéíïýí ìå Ýíá ìçäåíéêü, Ýôóé ï äåêáäéêüò 255 ãñÜöåôáé 0377 ùò ïêôáäéêüò.
Áè. Å. Êïõôóïíéêüëáò
12
H Ãëþóóá Ðñïãñáììáôéóìïý C
ÊÜèå áêÝñáéá óôáèåñÜ ìðïñåß íá Ý÷åé ùò åðßèåìá (êáôÜëçîç) Ýíá Þ êáé ôá äýï áðü ôá ðáñáêÜôù ãñÜììáôá, ôá ïðïßá êáèïñßæïõí ôïí ôýðï åíüò áêåñáßïõ (äåò § 3.1.2) (i)
Ôï ãñÜììá 'U' (Þ 'u'), ôï ïðïßï êáèïñßæåé üôé ï áêÝñáéïò åßíáé áðñüóçìïò (unsigned).
(ii) Ôï ãñÜììá 'L' (Þ 'l'), ôï ïðïßï êáèïñßæåé üôé ðñüêåéôáé ãéá ìåãÜëï (long) áêÝñáéï. Áõôïß ïé ôýðïé äéáöÝñïõí ôüóï óôï åýñïò ôùí ôéìþí ðïõ ìðïñïýí íá ëÜâïõí üóï êáé óôï ðëÞèïò ôùí bit ðïõ êáôáëáìâÜíïõí óôç ìíÞìç (üðùò öáßíåôáé óôï Ðßíáêá 3.1). Ãéá ðáñÜäåéãìá ç óôáèåñÜ 32768L åßíáé ôýðïõ long int êáé êáôáëáìâÜíåé 32 bit, áëëÜ ç 32768U åßíáé unsigned int êáé êáôáëáìâÜíåé 16 bit. ÓôáèåñÝò ÊéíçôÞò ÕðïäéáóôïëÞò Ï ôýðïò ôùí óôáèåñþí êéíçôÞò õðïäéáóôïëÞò åßíáé double (äåò § 3.1) åêôüò êáé áí ÷ñçóéìïðïéçèåß êÜðïéï êáôÜëëçëï åðßèåìá ãéá íá áëëÜîåé ôï åýñïò ôéìþí êáé ôçí áêñßâåéÜ ôïõò. Ìðïñåß íá ÷ñçóéìïðïéçèåß Ýíá áðü ôá ðáñáêÜôù äýï åðéèÝìáôá: (i)
Ôï ãñÜììá 'F' (Þ 'f'), ôï ïðïßï êÜíåé ôç óôáèåñÜ ôýðïõ float.
(ii) Ôï ãñÜììá 'L' (Þ 'l'), ôï ïðïßï êÜíåé ôç óôáèåñÜ ôýðïõ long double. ÕðÜñ÷ïõí äýï ìïñöÝò ìå ôéò ïðïßåò ìðïñåß íá ãñáöåß ìßá óôáèåñÜ êéíçôÞò õðïäéáóôïëÞò: (a) ÔõðïðïéçìÝíç ìïñöÞ: ÁêÝñáéï ìÝñïò, äåêáäéêü óçìåßï, êëáóìáôéêü ìÝñïò, ìå ôç äõíáôüôçôá íá ðáñáëåéöèåß Ýíá áðü ôá äýï ìÝñç. Ãéá ðáñÜäåéãìá: 0.99 1.0 Þ éóïäýíáìá .99 1. (b) ÅêèåôéêÞ ìïñöÞ: Ïðùò ðáñáðÜíù, áëëÜ ìå ôçí áêïëïõèßá åíüò 'Å' (Þ 'e') ôï ïðïßï äçëþíåé äýíáìç ôïõ 10, êáé åíüò áêÝñáéïõ áñéèìïý ðïõ åßíáé ï åêèÝôçò. Ãéá ðáñÜäåéãìá: 7.65Å-12 åßíáé 7.65 . 10-12 1.5Å1 1.5e1 15E0 .15E2 150E-1 åßíáé üëá ôï ßäéï: 15 ÓôáèåñÝò ×áñáêôÞñá Ìßá óôáèåñÜ ÷áñáêôÞñá åßíáé Ýíáò ÷áñáêôÞñáò ðïõ ðåñéêëåßåôáé áðü ìïíÜ åéóáãùãéêÜ ð.÷. 'a'. Ç ôéìÞ ìßáò óôáèåñÜò ÷áñáêôÞñá åßíáé ç áñéèìçôéêÞ ôéìÞ ôïõ ÷áñáêôÞñá óôï óýíïëï ÷áñáêôÞñùí ASCII. Ç ÷ñÞóç ìïíþí åéóáãùãéêþí óå üëåò ôéò óôáèåñÝò ÷áñáêôÞñá åßíáé áñêåôÞ ãéá ôïõò ðåñéóóüôåñïõò ÷áñáêôÞñåò, áëëÜ ïñéóìÝíïé åéäéêïß ÷áñáêôÞñåò, üðùò ç áëëáãÞ óåëßäáò (form feed), åßíáé áäýíáôï íá äïèïýí áðü ôï ðëçêôñïëüãéï. Ãéá ôï ëüãï áõôü ç C ðáñÝ÷åé ôéò áêïëïõèßåò äéáöõãÞò (escape sequences) Þ óôáèåñÝò áíÜóôñïöçò êáèÝôïõ, ðïõ öáßíïíôáé ðáñáêÜôù: \a \b \f
áêïõóôéêÞ åéäïðïßçóç ïðéóèïäñüìçóç áëëáãÞ óåëßäáò
BELL BS FF
ÂáóéêÜ Óôïé÷åßá
\n \r \t \v \\ \' \" \? \ooo \xhh
13
íÝá ãñáììÞ NL(LF) åðáíáöïñÜ êåöáëÞò CR ïñéæüíôéïò óôçëïãíþìïíáò (tab) HT êáôáêüñõöïò óôçëïãíþìïíáò VT áíÜóôñïöç êÜèåôïò \ ìïíÜ åéóáãùãéêÜ ' äéðëÜ åéóáãùãéêÜ " ëáôéíéêü åñùôçìáôéêü ? êùäéêüò ASCII óå ïêôáäéêÞ ìïñöÞ (êÜèå 'ï' áíôéðñïóùðåýåé Ýíá øçößï) êùäéêüò ASCII óå äåêáåîáäéêÞ ìïñöÞ (êÜèå 'h' áíôéðñïóùðåýåé Ýíá øçößï)
Ç áêïëïõèßá äéáöõãÞò \ïïï áðïôåëåßôáé áðü ìßá áíÜóôñïöç êÜèåôï áêïëïõèïýìåíç áðü 1, 2 Þ 3 ïêôáäéêÜ øçößá ðïõ êáèïñßæïõí ôçí ôéìÞ ôïõ åðéèõìçôïý ÷áñáêôÞñá óôï óýíïëï ÷áñáêôÞñùí ASCII. ÓõíçèéóìÝíï ðáñÜäåéãìá åßíáé ôï '\0' ðïõ åßíáé ï áíýðáñêôïò ÷áñáêôÞñáò (NULL) êáé ðïõ ðñÝðåé íá îå÷ùñßæåôáé áðü ôï ÷áñáêôÞñá '0' (ìçäÝí) êáé áðü ôï ÷áñáêôÞñá êåíü (space). Ç áêïëïõèßá äéáöõãÞò \xhh áðïôåëåßôáé ìå ôç óåéñÜ ôçò áðü ìßá áíÜóôñïöç êÜèåôï, Ýíá 'x' êáé äåêáåîáäéêÜ øçößá ðïõ êáèïñßæïõí ôçí ôéìÞ ôïõ åðéèõìçôïý ÷áñáêôÞñá. ÁëöáñéèìçôéêÝò ÓôáèåñÝò Ìßá áëöáñéèìçôéêÞ óôáèåñÜ (ëÝãåôáé êáé êõñéïëåêôéêü áëöáñéèìçôéêü) åßíáé ìßá áêïëïõèßá ÷áñáêôÞñùí ðïõ ðåñéêëåßïíôáé áðü äéðëÜ åéóáãùãéêÜ. ÐÜëé ç áíÜóôñïöç êÜèåôïò ìðïñåß íá ÷ñçóéìïðïéçèåß ãéá åéäéêïýò ÷áñáêôÞñåò ðïõ äéáöïñåôéêÜ èá äçìéïõñãïýóáí ðñüâëçìá. Ðáñáäåßãìáôá óôáèåñþí áëöáñéèìçôéêþí åßíáé: "ABC" "A" "%d\n\n" "A\"BC\\d"
Ôï ôåëåõôáßï ðáñÜäåéãìá äçëþíåé ôçí áêïëïõèßá Ýîé ÷áñáêôÞñùí: A"BC\d
ÅóùôåñéêÜ, ï áíýðáñêôïò ÷áñáêôÞñáò (NULL) ðñïóôßèåôáé áìÝóùò ìåôÜ ôïí ôåëåõôáßï ÷áñáêôÞñá åíüò áëöáñéèìçôéêïý. Ãéá ðáñÜäåéãìá ç áëöáñéèìçôéêÞ óôáèåñÜ "ABC" áðïèçêåýåôáé óôç ìíÞìç ôïõ Ç/Õ óå ôÝóóåñá bytes, üðïõ ôï ôÝôáñôï ðåñéÝ÷åé ôï ÷áñáêôÞñá '\0', âëÝðå § 7.2. Ìßá áëöáñéèìçôéêÞ óôáèåñÜ ðïõ ðåñéÝ÷åé ìüíï Ýíá ÷áñáêôÞñá, üðùò ç "Á", äåí ðñÝðåé íá óõã÷Ýåôáé ìå ôçí áíôßóôïé÷ç óôáèåñÜ ÷áñáêôÞñá ('Á'). ÏíïìáóìÝíåò ÓôáèåñÝò Ìðïñïýìå íá äþóïõìå áíáãíùñéóôéêÜ óå óôáèåñÝò ÷ñçóéìïðïéþíôáò ôçí ïäçãßá ðñïò ôïí ðñïåðåîåñãáóôÞ (prerpocessor directive) #define, ùò åîÞò: #define
áíáãíùñéóôéêü
ôéìÞ_óôáèåñÜò
Äßíïíôáò áíáãíùñéóôéêÜ óå óôáèåñÝò, ôá ðñïãñÜììáôá ãßíïíôáé åõêïëüôåñá êáôáíïçôÜ êáé ìðïñïýí íá áëëá÷èïýí åõêïëüôåñá. Äßíïíôáò ð.÷. ôï áíáãíùñéóôéêü PI óôç óôáèåñÜ 3.14 ùò åîÞò: #define PI 3.14
Áè. Å. Êïõôóïíéêüëáò
14
H Ãëþóóá Ðñïãñáììáôéóìïý C
üðïõ óôïí êþäéêá ôïõ ðñïãñÜììáôïò ðñÝðåé íá ãñÜøïõìå 3.14 ãñÜöïõìå áðëþò PI. Áí èåëÞóïõìå íá áëëÜîïõìå ôçí ôéìÞ ôïõ ð êáé íá ôçí êÜíïõìå 3.14159 áñêåß íá áëëÜîïõìå ôçí ïäçãßá #define: #define PI 3.14159
ÐáñáêÜôù öáßíïíôáé ìåñéêÝò áðëÝò áðïäüóåéò áíáãíùñéóôéêþí óå óôáèåñÝò: #define #define #define #define #define #define #define #define
LINE 81 MASK 0X7F RWMODE 0666 PI 3.14159265358979323846 HELP '?' PAGE "Óåëßäá" MINSINDAY 24*60 EPSILON 1E-5
ÊáôÜ óýìâáóç ôá áíáãíùñéóôéêÜ ôùí óôáèåñþí ãñÜöïíôáé ìå êåöáëáßá ãñÜììáôá ãéá íá îå÷ùñßæïõí åýêïëá áðü ôéò ìåôáâëçôÝò.
2.4
™Ã § z
Ó÷üëéá åßíáé ôá ìÝñç åêåßíá ôïõ ðçãáßïõ ðñïãñÜììáôïò ôá ïðïßá áãíïïýíôáé áðü ôï ìåôáãëùôôéóôÞ. ×ñçóéìïðïéïýíôáé ãéá íá êÜíïõí ôï ðñüãñáììá ðéï åõêïëïíüçôï óôïí áíáãíþóôç. Ôá ó÷üëéá ìðïñïýí íá åìöáíßæïíôáé ðáíôïý üðïõ ìðïñåß íá åìöáíéóôåß Ýíá êåíü äéÜóôçìá Þ Ýíáò ÷áñáêôÞñáò óôçëïãíþìïíá Þ íÝáò ãñáììÞò. Ôá ó÷üëéá áñ÷ßæïõí ìå ôï åéäéêü óýìâïëï "/*" êáé ôåëåéþíïõí ìå ôï "*/". Óôç C ôá ó÷üëéá äå ìðïñïýí íá åßíáé Ýíèåôá óå Üëëá ó÷üëéá. ÄçëáäÞ äå ìðïñïýìå íá Ý÷ïõìå: /* Ó÷üëéï1
/* Ó÷üëéï2 */
óõíÝ÷åéá ó÷ïëßïõ1 */
Óôï åîÞò óôá ðñïãñÜììáôÜ ìáò, èá ôïðïèåôïýìå ó÷üëéá ôïõëÜ÷éóôïí óôçí áñ÷Þ ôïõò ðïõ èá áíáöÝñïõí ôï üíïìá ôïõ áñ÷åßïõ ðçãáßïõ êþäéêá êáé ôç ëåéôïõñãßá ôïõ ðñïãñÜììáôïò.
3. 3.1
À¶ - ª z~§ ™ - § ™ ™ À¶ ¢ ¢ ª ¡ø¡
Ôï Ó÷Þìá 3.1 äåß÷íåé ôïõò ôýðïõò äåäïìÝíùí ðïõ ÷ñçóéìïðïéåß ç C. Ó'áõôü ôï êåöÜëáéï èá áó÷ïëçèïýìå ìüíï ìå ôïõò âáóéêïýò ôýðïõò äåäïìÝíùí. Ïé Üëëïé ôýðïé äåäïìÝíùí áðïôåëïýí áíôéêåßìåíï Üëëùí êåöáëáßùí. Ôýðïé ÄåäïìÝíùí
Âáóéêïß Ôýðïé
×áñáêôÞñáò ÁêÝñáéïò
char
int
ÊéíçôÞò õðïäéáóôïëÞò
float
Äåßêôåò
ÊéíçôÞò õðïäéáóôïëÞò ×ùñßò ôéìÞ äéðëÞò áêñßâåéáò
double
void
ÄïìçìÝíïé Ôýðïé
Ðßíáêáò
ÄïìÞ
Åíùóç
array
struct
union
Ó÷Þìá 3.1: Ïé ôýðïé äåäïìÝíùí ôçò C
3.1.1
~z™ À¶ ¢ ¢ ª ¡ø¡
Ïðùò åßäáìå óôçí § 2.3.1, üëåò ïé ìåôáâëçôÝò óôç C ðñÝðåé íá äçëþíïíôáé ðñéí ÷ñçóéìïðïéçèïýí, ãéá íá ãíùñßæåé ï ìåôáãëùôôéóôÞò ðüóï ÷þñï ìíÞìçò èá äåóìåýóåé. Óôç C õðÜñ÷ïõí ðÝíôå âáóéêïß ôýðïé äåäïìÝíùí: ÷áñáêôÞñáò, áêÝñáéïò, ðñáãìáôéêüò êéíçôÞò õðïäéáóôïëÞò, ðñáãìáôéêüò êéíçôÞò õðïäéáóôïëÞò äéðëÞò áêñßâåéáò êáé ÷ùñßò ôéìÞ. Ïé äåóìåõìÝíåò ëÝîåéò ðïõ ÷ñçóéìïðïéïýíôáé, ãéá íá äçëþíïõí ìåôáâëçôÝò áõôþí ôùí ôýðùí åßíáé ïé char, int, float, double êáé void áíôßóôïé÷á êáé ëÝãïíôáé êáèïñéóôÝò ôýðïõ (type specifiers). Ïé ìåôáâëçôÝò ôýðïõ char ÷ñçóéìïðïéïýíôáé ãéá íá áðïèçêåýïõí 8-ìðéôïõò ÷áñáêôÞñåò ASCII, Þ ïðïéáäÞðïôå Üëëç 8-ìðéôç ðïóüôçôá (ìéêñïýò áêåñáßïõò). Ïé ìåôáâëçôÝò ôýðïõ int ìðïñïýí íá ðåñéÝ÷ïõí áêÝñáéåò ðïóüôçôåò êáé ìðïñïýí íá ÷ñçóéìïðïéïýíôáé ãéá íá åëÝã÷ïõí âñü÷ïõò êáé åíôïëÝò ìå óõíèÞêç. Ïé ìåôáâëçôÝò ôýðïõ float êáé double ÷ñçóéìïðïéïýíôáé óôá ðñïãñÜììáôá åßôå üôáí áðáéôïýíôáé êëáóìáôéêïß áñéèìïß åßôå üôáí ç åöáñìïãÞ ÷ñåéÜæåôáé ðïëý ìåãÜëïõò áñéèìïýò. Ç äéáöïñÜ áíÜìåóá óå ìßá ìåôáâëçôÞ float êáé óå ìßá ìåôáâëçôÞ double âñßóêåôáé óôï ìÝãåèïò ôïõ ìåãáëýôåñïõ (êáé ôïõ ìéêñüôåñïõ) áñéèìïý ðïõ ìðïñïýí íá êñáôÜíå (äåò Ðßíáêá 3.1). Ï ôýðïò void êáèïñßæåé Ýíá êåíü óýíïëï
H Ãëþóóá Ðñïãñáììáôéóìïý C
16
ôéìþí. ×ñçóéìïðïéåßôáé óáí ôýðïò ðïõ åðéóôñÝöïõí ïé óõíáñôÞóåéò ðïõ äåí ðáñÜãïõí ôéìÞ (äåò ÊåöÜëáéï 6 üðïõ èá ãßíåé êáôáíïçôüò ï ôýðïò void).
3.1.2
ƒ ¶ ¶ ™ À¶ø¡
Åêôüò ôïõ ôýðïõ void , óôïõò âáóéêïýò ôýðïõò äåäïìÝíùí ìðïñïýí íá åöáñìïóôïýí äéÜöïñïé ôñïðïðïéçôÝò ôýðùí (type modifiers). Óêïðüò ôùí ôñïðïðïéçôþí åßíáé íá ôñïðïðïéïýí ôïõò âáóéêïýò ôýðïõò þóôå íá éêáíïðïéïýíôáé êáëýôåñá ïé áíÜãêåò äéáöüñùí ðñïãñáììÜôùí. Ïé ôñïðïðïéçôÝò åßíáé: signed unsigned long short
(ðñïóçìáóìÝíïò) (áðñüóçìïò) (ìåãÜëïò) (ìéêñüò)
Ïé ôñïðïðïéçôÝò signed, unsigned, long êáé short ìðïñïýí íá åöáñìïóôïýí óôïõò âáóéêïýò ôýðïõò char êáé int. Ï ôñïðïðïéçôÞò long ìðïñåß íá åöáñìïóôåß óôïí âáóéêü ôýðï double. Ï Ðßíáêáò 3.1 ðáñïõóéÜæåé üëïõò ôïõò åðéôñåðüìåíïõò óõíäõáóìïýò ôùí âáóéêþí ôýðùí ìå ôïõò ôñïðïðïéçôÝò ôýðùí. Ðáñüëï ðïõ åðéôñÝðåôáé, ç ÷ñÞóç ôïõ signed óôïõò áêÝñáéïõò êáé ôïõò ÷áñáêôÞñåò åßíáé ðåñéôôÞ, ãéáôß åî'ïñéóìïý ç äÞëùóç åíüò áêÝñáéïõ Þ ÷áñáêôÞñá áöïñÜ Ýíáí ðñïóçìáóìÝíï áñéèìü. Ôýðïò char unsigned char signed char int unsigned int signed int short int unsigned short int signed short int long int signed long int unsigned long int float double long double
Åýñïò óå bits
8 8 8 16 16 16 16 16 16 32 32 32 32 64 80
Åýñïò ôéìþí
-128 0 -128 -32768 0 -32768 -32768 0 -32768 -2147483648 -2147483648 0 3.4E-38 1.7E-308 3.4E-4932
Ýùò Ýùò Ýùò Ýùò Ýùò Ýùò Ýùò Ýùò Ýùò Ýùò Ýùò Ýùò Ýùò Ýùò Ýùò
127 255 127 32767 65535 32767 32767 65535 32767 2147483647 2147483647 4294967295 3.4Å+38 1.7Å+308 1.1Å+4932
Ðßíáêáò 3.1: Ïé äõíáôïß óõíäõáóìïß âáóéêþí ôýðùí êáé ôñïðïðïéçôþí ôçò C
Ôýðïé - ÌåôáâëçôÝò - ÔåëåóôÝò
3.2
17
¢ §ø™ ™ ª z~§ ø¡
Ïëåò ïé ìåôáâëçôÝò ðñÝðåé íá äçëþíïíôáé ðñéí ÷ñçóéìïðïéçèïýí. Ìßá äÞëùóç êáèïñßæåé ôïí ôýðï êáé ðåñéÝ÷åé ìßá ëßóôá ìåôáâëçôþí áõôïý ôïõ ôýðïõ, üðùò öáßíåôáé ðáñáêÜôù: ôýðïò
ëßóôá_ìåôáâëçôþí;
üðïõ ôýðïò ðñÝðåé íá åßíáé Ýíáò áðïäåêôüò ôýðïò äåäïìÝíïõ ôçò C, åíþ ç ëßóôá ìåôáâëçôþí ìðïñåß íá áðïôåëåßôáé áðü Ýíá Þ ðåñéóóüôåñá áíáãíùñéóôéêÜ ÷ùñéóìÝíá ìå êüììá. Ðáñáäåßãìáôá äçëþóåùí ìåôáâëçôþí åßíáé: int i,j,k; char ch; short int si; unsigned long int ui; double lower,upper;
Ç èÝóç üðïõ äçëþíåôáé ìßá ìåôáâëçôÞ åðçñåÜæåé óå ìåãÜëï âáèìü ôïí ôñüðï ìå ôïí ïðïßï ìðïñïýí íá ÷ñçóéìïðïéÞóïõí ôç ìåôáâëçôÞ ôá õðüëïéðá ôìÞìáôá ôïõ ðñïãñÜììáôïò. Ïé êáíüíåò ðïõ êáèïñßæïõí ôçí ïñáôüôçôá ìßáò ìåôáâëçôÞò ìå âÜóç ôç èÝóç üðïõ äçëþèçêå áõôÞ, ëÝãïíôáé êáíüíåò åìâÝëåéáò. Èá äïýìå áíáëõôéêÜ áõôïýò ôïõò êáíüíåò óôï ÊåöÜëáéï 6. Åäþ áðëþò èá áíáöÝñïõìå ôá âáóéêÜ óôïé÷åßá áõôþí ôùí êáíüíùí: ÕðÜñ÷ïõí ôñåéò èÝóåéò óå Ýíá ðñüãñáììá ôçò C üðïõ ìðïñïýí íá äçëùèïýí ìåôáâëçôÝò. Ç ðñþôç èÝóç åßíáé Ýîù áðü üëåò ôéò óõíáñôÞóåéò, óõìðåñéëáìâáíïìÝíçò ôçò óõíÜñôçóçò main(). Ïé ìåôáâëçôÝò ðïõ äçëþíïíôáé êáô'áõôüí ôïí ôñüðï êáëïýíôáé åîùôåñéêÝò (external) êáé Ý÷ïõí êáèïëéêÞ (global) åìâÝëåéá. Åôóé ìðïñïýí íá ÷ñçóéìïðïéïýíôáé áðü ïðïéïäÞðïôå ôìÞìá ôïõ ðñïãñÜììáôïò. Ç äåýôåñç èÝóç üðïõ ìðïñïýí íá äçëùèïýí ìåôáâëçôÝò åßíáé ìÝóá óå ìßá óõíÜñôçóç. Ïé ìåôáâëçôÝò ðïõ äçëþíïíôáé êáô'áõôüí ôïí ôñüðï Ý÷ïõí ôïðéêÞ (local) åìâÝëåéá êáé ìðïñïýí íá ÷ñçóéìïðïéïýíôáé ìüíï áðü áõôÞ ôç óõíÜñôçóç. Ç ôåëåõôáßá èÝóç üðïõ ìðïñïýí íá äçëùèïýí ìåôáâëçôÝò åßíáé óôç äÞëùóç ôùí ôõðéêþí ðáñáìÝôñùí ìßáò óõíÜñôçóçò. Åêôüò ôïõ üôé äéáâéâÜæïõí ôéìÝò óôç óõíÜñôçóç, áõôÝò ïé ðáñÜìåôñïé åíåñãïýí üðùò ïé õðüëïéðåò ôïðéêÝò ìåôáâëçôÝò. Ìßá ìåôáâëçôÞ ìðïñåß íá ëÜâåé áñ÷éêÞ ôéìÞ êáôÜ ôç äÞëùóÞ ôçò, ìå ôï óýìâïëï ôçò éóüôçôáò êáé ìßá óôáèåñÜ ìåôÜ ôï üíïìá ôçò ìåôáâëçôÞò. Ç ãåíéêÞ ìïñöÞ ôçò áðüäïóçò áñ÷éêÞò ôéìÞò êáôÜ ôç äÞëùóç, åßíáé: ôýðïò
áíáãíùñéóôéêü_ìåôáâëçôÞò = óôáèåñÜ;
ÌåñéêÜ ðáñáäåßãìáôá öáßíïíôáé ðáñáêÜôù: char ch='C'; int i=0; float eps=1.0E-5;
Ïé åîùôåñéêÝò ìåôáâëçôÝò ìðïñïýí íá ðáßñíïõí áñ÷éêÞ ôéìÞ ìüíï óôçí áñ÷Þ ôïõ ðñïãñÜììáôïò. Áí äåí ôïõò äïèåß êÜðïéá áñ÷éêÞ ôéìÞ, ôüôå ðáßñíïõí áõôüìáôá áñ÷éêÞ ôéìÞ ìçäÝí. Ïé ôïðéêÝò ìåôáâëçôÝò üìùò, ðáßñíïõí áñ÷éêÞ ôéìÞ êÜèå öïñÜ ðïõ ÷ñçóéìïðïéåßôáé ç óõíÜñôçóç óôçí ïðïßá åßíáé äçëùìÝíåò. Áí óôéò ôïðéêÝò ìåôáâëçôÝò äå äþóïõìå áñ÷éêÞ ôéìÞ, Ý÷ïõí áðñïóäéüñéóôç ôéìÞ (óêïõðßäéá).
Áè. Å. Êïõôóïíéêüëáò
H Ãëþóóá Ðñïãñáììáôéóìïý C
18
Óôç äÞëùóç ïðïéáóäÞðïôå ìåôáâëçôÞò ìå áñ÷éêÞ ôéìÞ, ìðïñåß íá åöáñìüæåôáé ï ðñïóäéïñéóôÞò ôýðïõ (type qualifier) const ðïõ åîáóöáëßæåé üôé ç ôéìÞ ôçò äå èá áëëÜæåé êáôÜ ôç äéÜñêåéá åêôÝëåóçò ôïõ ðñïãñÜììáôïò, öÝñïíôáò Ýôóé ôï ßäéï ó÷åäüí áðïôÝëåóìá ìå ôçí #define. Ð.÷: const double e=2.71828182845905;
Áí ãßíåé áðüðåéñá áëëáãÞò ìßáò const, ï ìåôáãëùôôéóôÞò äßíåé ìÞíõìá ëÜèïõò. Ðåñéóóüôåñá ãéá ôéò äçëþóåéò ìåôáâëçôþí âëÝðå óôçí § 6.7.
3.3
§ ™ ™
Ïðùò åßäáìå óôçí § 2.1, ç C Ý÷åé Ýíá ðïëý ðëïýóéï óýíïëï ôåëåóôþí ôïõò ïðïßïõò ðáñáèÝóáìå óôïí Ðßíáêá 2.3. Óå ôïýôç ôçí ðáñÜãñáöï èá êáëýøïõìå ïñéóìÝíåò áðü ôéò êáôçãïñßåò ôùí ôåëåóôþí, îåêéíþíôáò áðü ôïõò áñéèìçôéêïýò ôåëåóôÝò.
3.3.1
zƒ £ª § ™ ™
Óôïí Ðßíáêá 3.2 ðáñïõóéÜæïíôáé ïé åðôÜ áñéèìçôéêïß ôåëåóôÝò ôçò C. Áñéèìçôéêüò ÔåëåóôÞò + * / % -++
ÐñÜîç Áöáßñåóç, ìïíáäéêü ðëçí Ðñüóèåóç Ðïëëáðëáóéáóìüò Äéáßñåóç Õðüëïéðï äéáßñåóçò áêåñáßùí Ìåßùóç êáôÜ Ýíá Áýîçóç êáôÜ Ýíá
Ðßíáêáò 3.2: Ïé áñéèìçôéêïß ôåëåóôÝò ôçò C
Ïé áñéèìçôéêïß ôåëåóôÝò ìå äýï ôåëåóôÝïõò (äõáäéêïß) +, -, * êáé / ëåéôïõñãïýí óôç C ìå ôïí ßäéï ôñüðï ðïõ ëåéôïõñãïýí êáé óôéò Üëëåò ãëþóóåò ðñïãñáììáôéóìïý. Ï ôåëåóôÞò / ôçò äéáßñåóçò ÷ñåéÜæåôáé åéäéêÞ ðñïóï÷Þ. Óôçí ðñáãìáôéêüôçôá õðÜñ÷ïõí äýï äéáöïñåôéêÝò ðñÜîåéò äéáßñåóçò êáé ç êÜèåôïò (/) ÷ñçóéìïðïéåßôáé êáé ãéá ôéò äýï. Áí äéáéñÝóïõìå äýï áêåñáßïõò, ðáßñíïõìå ôï áêÝñáéï ðçëßêï ôçò äéáßñåóçò, ð.÷: 10/3=3
Áí óôç äéáßñåóç x/y ôïõëÜ÷éóôïí Ýíáò áðü ôïõò ôåëåóôÝïõò åßíáé ôýðïõ êéíçôÞò õðïäéáóôïëÞò, ôï áðïôÝëåóìá èá åßíáé ôýðïõ êéíçôÞò õðïäéáóôïëÞò. Áõôü éó÷ýåé åðßóçò óôçí ðñüóèåóç, áöáßñåóç êáé ðïëëáðëáóéáóìü. ÁëëÜ ãé'áõôÝò ôéò ðñÜîåéò ç ôéìÞ ôïõ áðïôåëÝóìáôïò äåí åðçñåÜæåôáé óõíÞèùò óïâáñÜ áðü ôïí ôýðï ôùí ôåëåóôÝùí. Ãéá ðáñÜäåéãìá: 4+3=7 4.0+3=7.0
(áêÝñáéïò) (êéíçôÞò õðïäéáóôïëÞò)
Ìå ôï / üìùò, ïé ôýðïé äåäïìÝíùí ôùí ôåëåóôÝùí Ý÷ïõí äñáóôéêÞ åðßäñáóç óôï áðïôÝëåóìá: 4/3=1
(áêÝñáéïò)
Ôýðïé - ÌåôáâëçôÝò - ÔåëåóôÝò
19
4.0/3=1.333333... (êéíçôÞò õðïäéáóôïëÞò)
Ï ôåëåóôÞò õðïëïßðïõ % ðáñÜãåé ôï õðüëïéðï ìßáò äéáßñåóçò áêåñáßùí. Äå ìðïñïýìå íá ÷ñçóéìïðïéÞóïõìå ôï % ìå ôïõò ôýðïõò float Þ double. Åôóé ãéá ðáñÜäåéãìá: 39%5=4
(åöüóïí 39=7*5+4)
Ï ìïíáäéêüò (unary) ôåëåóôÞò - ðïëëáðëáóéÜæåé ôïí ôåëåóôÝï ôïõ ìå -1. Åôóé áí ôïðïèåôçèåß ôï óýìâïëï ðëçí ìðñïóôÜ áðü êÜðïéïí áñéèìü, èá ðñïêëçèåß áëëáãÞ ôïõ ðñïóÞìïõ ôïõ. Ç C äéáèÝôåé äýï áóõíÞèéóôïõò ôåëåóôÝò ãéá ôçí áýîçóç êáé ìåßùóç ôùí ôéìþí ôùí ìåôáâëçôþí êáôÜ 1. Ï ôåëåóôÞò áýîçóçò ++ ðñïóèÝôåé 1 óôïí ôåëåóôÝï ôïõ, åíþ ï ôåëåóôÞò ìåßùóçò -- áöáéñåß 1. Åôóé ïé ðñÜîåéò: x++ x--
åßíáé ßäéåò ìå ôéò: x=x+1 x=x-1
Ôï áóõíÞèéóôï åßíáé üôé ïé ++ êáé -- ìðïñïýí íá ÷ñçóéìïðïéïýíôáé åßôå óáí ðñïèåìáôéêïß ôåëåóôÝò (ðñéí áðü ôç ìåôáâëçôÞ, üðùò ++x) åßôå óáí ìåôáèåìáôéêïß (ìåôÜ ôç ìåôáâëçôÞ, üðùò x++). Êáé óôéò äýï ðåñéðôþóåéò ôï áðïôÝëåóìá åßíáé ç ìïíáäéáßá áýîçóç ôïõ ôåëåóôÝïõ. ÁëëÜ ç ðñïèåìáôéêÞ ðáñÜóôáóç áõîÜíåé ôçí ôéìÞ ôïõ ôåëåóôÝïõ ðñéí ÷ñçóéìïðïéçèåß ç ôéìÞ ôïõ, åíþ ç ìåôáèåìáôéêÞ ðáñÜóôáóç áõîÜíåé ôçí ôéìÞ ôïõ ôåëåóôÝïõ áöïý Ý÷åé ÷ñçóéìïðïéçèåß ç ôéìÞ ôïõ. Áõôü óçìáßíåé üôé óôéò ðåñéðôþóåéò ðïõ ÷ñçóéìïðïéåßôáé ç ôéìÞ êáé ü÷é áðëþò ôï áðïôÝëåóìá, ïé x++ êáé ++x åßíáé äéáöïñåôéêÝò. Áí ãéá ðáñÜäåéãìá ôï x åßíáé 5, ôüôå ç ðáñÜóôáóç: y=x++
äßíåé óôï y ôéìÞ 5, åíþ ç ðáñÜóôáóç: y=++x
ôïõ äßíåé ôéìÞ 6. Êáé óôéò äýï ðåñéðôþóåéò, ôï x ãßíåôáé 6.
3.3.2
™À™Ã ™ z § ° § ™ ™
Óôïõò üñïõò óõó÷åôéóôéêüò ôåëåóôÞò êáé ëïãéêüò ôåëåóôÞò, ç ëÝîç óõó÷åôéóôéêüò áíáöÝñåôáé óôéò ó÷Ýóåéò ðïõ ìðïñïýí íá Ý÷ïõí ïé ôåëåóôÝïé, åíþ ç ëÝîç ëïãéêüò áíáöÝñåôáé óôïõò ôñüðïõò ìå ôïõò ïðïßïõò ìðïñïýí íá óõíäåèïýí ìåôáîý ôïõò áõôÝò ïé ó÷Ýóåéò. Ôï êëåéäß óôéò Ýííïéåò ôùí óõó÷åôéóôéêþí êáé ëïãéêþí ôåëåóôþí, åßíáé ïé éäÝåò ôçò áëÞèåéáò êáé ôïõ øåýäïõò. Óôç C, áëçèÞò åßíáé ïðïéáäÞðïôå ðáñÜóôáóç ðïõ Ý÷åé ôéìÞ äéÜöïñç ôïõ ìçäåíüò, åíþ øåõäÞò ïðïéáäÞðïôå ðáñÜóôáóç ðïõ Ý÷åé ôéìÞ ßóç ìå ìçäÝí. Ïé ðáñáóôÜóåéò ðïõ ÷ñçóéìïðïéïýí óõó÷åôéóôéêïýò Þ ëïãéêïýò ôåëåóôÝò åðéóôñÝöïõí ôï ìçäÝí óáí øåõäÞ ôéìÞ êáé ôï Ýíá óáí áëçèÞ ôéìÞ. Óôïí Ðßíáêá 3.3 ðáñïõóéÜæïíôáé ïé óõó÷åôéóôéêïß êáé ëïãéêïß ôåëåóôÝò. Ïé óõó÷åôéóôéêïß ôåëåóôÝò ÷ñçóéìïðïéïýíôáé ãéá íá êáèïñßæïõí ôç ó÷Ýóç ôçò ìßáò ðáñÜóôáóçò ìå ôçí Üëëç. ÅðéóôñÝöïõí ðÜíôïôå 1 Þ 0, áíÜëïãá ìå ôï áðïôÝëåóìá ôïõ åëÝã÷ïõ. Ôï ðáñáêÜôù ðñüãñáììá äåß÷íåé ôï áðïôÝëåóìá êÜèå ðñÜîçò åìöáíßæïíôÜò ôï ìå 0 Þ 1:
Áè. Å. Êïõôóïíéêüëáò
20
H Ãëþóóá Ðñïãñáììáôéóìïý C
/* relation.c */ /* ×ñÞóç ôùí óõó÷åôéóôéêþí ôåëåóôþí */ main() { int i,j; printf("Äþóôå äýï áêÝñáéïõò áñéèìïýò: "); scanf("%d %d",&i,&j); printf("Ç ó÷Ýóç %d==%d åßíáé %d\n",i,j,i==j); printf("Ç ó÷Ýóç %d!=%d åßíáé %d\n",i,j,i!=j); printf("Ç ó÷Ýóç %d<=%d åßíáé %d\n",i,j,i<=j); printf("Ç ó÷Ýóç %d>=%d åßíáé %d\n",i,j,i>=j); printf("Ç ó÷Ýóç %d<%d åßíáé %d\n",i,j,i<j); printf("Ç ó÷Ýóç %d>%d åßíáé %d\n",i,j,i>j); }
Ôï ðáñáðÜíù ðñüãñáììá ðåñéëáìâÜíåé ôï óýìâïëï, ôï '\n' ôï ïðïßï, üðùò Ý÷ïõìå äåé óôçí § 2.3.2, åßíáé Ýíáò ìüíï ÷áñáêôÞñáò ðïõ, üôáí ðáñåìâÜëëåôáé óå Ýíá áëöáñéèìçôéêü, ðñïêáëåß ìßá áëëáãÞ ãñáììÞò, äçëáäÞ ìåôÜ ôï ÷áñáêôÞñá '\n' ç åêôýðùóç áñ÷ßæåé áð'ôçí áñ÷Þ ìßáò íÝáò ãñáììÞò. Óõó÷åôéóôéêüò ÔåëåóôÞò > >= < <= == !=
Óçìáóßá Ìåãáëýôåñï Ìåãáëýôåñï Þ ßóï Ìéêñüôåñï Ìéêñüôåñï Þ ßóï Éóï ÄéÜöïñï
Ëïãéêüò ÔåëåóôÞò && || !
ÐñÜîç AND (ëïãéêÞ óýæåõîç) OR (ëïãéêÞ äéÜæåõîç) NOT (ëïãéêÞ Üñíçóç)
Ðßíáêáò 3.3: Ïé óõó÷åôéóôéêïß êáé ïé ëïãéêïß ôåëåóôÝò ôçò C
Ïé ëïãéêïß ôåëåóôÝò ÷ñçóéìïðïéïýíôáé ãéá íá õðïóôçñßæïõí ôéò âáóéêÝò ëïãéêÝò ðñÜîåéò ÊÁÉ (AND), H (OR), êáé Ï×É (NOT) ìå âÜóç ôïí ðßíáêá áëÞèåéáò ðïõ áêïëïõèåß, ï ïðïßïò ÷ñçóéìïðïéåß ôï 1 ãéá ôï áëçèÝò êáé ôï 0 ãéá ôï øåõäÝò: p 0 0 1 1
q 0 1 1 0
p AND q 0 0 1 0
p OR q 0 1 1 1
NOT p 1 1 0 0
Ôüóï ïé óõó÷åôéóôéêïß üóï êáé ïé ëïãéêïß ôåëåóôÝò, Ý÷ïõí ÷áìçëüôåñç ðñïôåñáéüôçôá áðü ôïõò áñéèìçôéêïýò ôåëåóôÝò. Áõôü óçìáßíåé üôé ç ðáñÜóôáóç: 15>1+20
èá õðïëïãéóôåß óáí íá Þôáí ãñáììÝíç: 15>(1+20)
Ôï ðáñáêÜôù ðñüãñáììá äåß÷íåé ðþò ëåéôïõñãïýí ïé ëïãéêïß ôåëåóôÝò:
Ôýðïé - ÌåôáâëçôÝò - ÔåëåóôÝò
21
/* logical.c */ /* ×ñÞóç ëïãéêþí ôåëåóôþí */ main() { int i,j; printf("Äþóôå äýï áñéèìïýò (ï êáèÝíáò íá åßíáé 0 Þ 1): "); scanf("%d %d",&i,&j); printf("%d AND %d ìáò êÜíåé %d\n",i,j,i&&j); printf("%d OR %d ìáò êÜíåé %d\n",i,j,i||j); printf("NOT %d ìáò êÜíåé %d\n",i,!i); }
3.3.3 § ™ ™ BIT (BITWISE) Ç C äéáèÝôåé Ýîé ôåëåóôÝò ãéá ÷åéñéóìü bit (bitwise). Áõôïß ìðïñïýí íá åöáñìüæïíôáé ìüíï óå áêÝñáéïõò ôåëåóôÝïõò, äçëáäÞ óå char, short, int êáé long, ðñïóçìáóìÝíïõò Þ áðñüóçìïõò êáé äñïýí ðÜíù óôá bits ôùí áêåñáßùí. Óôïí Ðßíáêá 3.4 ðáñïõóéÜæïíôáé ïé ôåëåóôÝò bit. ÔåëåóôÞò bit & | ^ ~ >> <<
ÐñÜîç AND (óýæåõîç) OR (äéÜæåõîç) XOR (áðïêëåéóôéêÞ äéÜæåõîç) ÓõìðëÞñùìá ùò ðñïò Ýíá Ïëßóèçóç äåîéÜ Ïëßóèçóç áñéóôåñÜ
Ðßíáêáò 3.4: Ïé ôåëåóôÝò bit ôçò C
Ãéá ðáñÜäåéãìá, ç ôéìÞ ôïõ 23&26 åßíáé 18. Ãéá íá ôï êáôáëÜâïõìå áõôü ðñÝðåé íá åßìáóôå åîïéêåéùìÝíïé ìå ôï äõáäéêü óýóôçìá áñéèìþí, üðïõ ïé áñéèìïß ãñÜöïíôáé ùò áêïëïõèßåò äõáäéêþí øçößùí, óôç óõíÝ÷åéá ç ðñÜîç AND åöáñìüæåôáé ãéá ôá áíôßóôïé÷á bits ôùí ôåëåóôÝùí: 23 = 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 26 = 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 18 = 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0
&
Ç ãåíéêÞ ìïñöÞ ìßáò ðáñÜóôáóçò ïëßóèçóçò åßíáé: ìåôáâëçôÞ >> (Þ <<) áñéèìüò_èÝóåùí
Óçìåéþóôå üôé ïëßóèçóç åíüò áêåñáßïõ êáôÜ ìßá èÝóç äåîéÜ éóïäõíáìåß ìå äéáßñåóÞ ôïõ ìå ôï 2, åíþ ïëßóèçóç êáôÜ ìßá èÝóç áñéóôåñÜ éóïäõíáìåß ìå ðïëëáðëáóéáóìü ôïõ ìå ôï 2. Ãéá ðáñÜäåéãìá Ýóôù: x=18
(=0000000000010010)
ôüôå ìå äåîéÜ ïëßóèçóç êáôÜ Ýíá bit (x>>1) ðñïêýðôåé: 0000000000001001
(=9)
åíþ ìå áñéóôåñÞ ïëßóèçóç êáôÜ Ýíá bit (x<<1) ðñïêýðôåé: 0000000000100100
Áè. Å. Êïõôóïíéêüëáò
(=36)
H Ãëþóóá Ðñïãñáììáôéóìïý C
22
Åßíáé ðñïöáíÝò üôé ïëßóèçóç êáôÜ ðåñéóóüôåñåò ôçò ìßáò èÝóçò äåîéÜ Þ áñéóôåñÜ, éóïäõíáìåß ìå äéáäï÷éêÝò äéáéñÝóåéò Þ ðïë/ìïýò ôïõ áñéèìïý ìå ôï 2.
3.3.4
§ ™ ™ z¶ ¢ ™ ™ ª ™ ( z zÃøƒ ™ ™)
Óôç C, ï ôåëåóôÞò áðüäïóçò ôéìÞò (Þ ôåëåóôÞò êáôá÷þñçóçò) åßíáé ôï óçìåßï ßóïí (=). Ùóôüóï, ç C åðéôñÝðåé ìßá ðïëý âïëéêÞ óôåíïãñáöéêÞ ìïñöÞ ãéá áðïäüóåéò ôéìþí ôïõ ãåíéêïý ôýðïõ: ìåôáâëçôÞ = ìåôáâëçôÞ
ôåëåóôÞò
ðáñÜóôáóç
ùò åîÞò: ìåôáâëçôÞ
ôåëåóôÞò = ðáñÜóôáóç
Åôóé ð.÷. ïé ðáñáóôÜóåéò: x=x+10 y=y/2
ìðïñïýí íá ãñáöïýí: x+=10 y/=2
3.4
¶zƒz™ z™ ™
Ïé ôåëåóôÝò, ïé óôáèåñÝò êáé ïé ìåôáâëçôÝò åßíáé ôá óõóôáôéêÜ ôùí ðáñáóôÜóåùí. Ìßá ðáñÜóôáóç óôç C åßíáé ïðïéïóäÞðïôå Ýãêõñïò óõíäõáóìüò áõôþí ôùí óôïé÷åßùí. Åíá ðáñÜäåéãìá ðáñÜóôáóçò åßíáé: x=a+b
ðïõ åßíáé ìßá ðáñÜóôáóç áðüäïóçò ôéìÞò ç ïðïßá êáôá÷ùñåß ôï Üèñïéóìá ôùí a êáé b óôï x. Óå áíôßèåóç ìå Üëëåò ãëþóóåò ðñïãñáììáôéóìïý, ç C ìáò åðéôñÝðåé íá ÷ñçóéìïðïéïýìå ôïõò ôåëåóôÝò áðüäïóçò ôéìÞò óå ðáñáóôÜóåéò ðïõ ðåñéÝ÷ïõí êáé Üëëïõò ôåëåóôÝò áðüäïóçò ôéìÞò. Áõôü äéüôé ï ôåëåóôÞò áðüäïóçò ôéìÞò êÜíåé äýï ðñÜãìáôá: Ðñþôïí áðïäßäåé ôçí ôéìÞ ôçò äåîéÜò ðëåõñÜò óôç ìåôáâëçôÞ ôçò áñéóôåñÞò ðëåõñÜò êáé äåýôåñïí ç üëç ðáñÜóôáóç ðáßñíåé áõôÞ ôçí ôéìÞ. Åôóé, ãéá ðáñÜäåéãìá, ç ðáñáêÜôù ðáñÜóôáóç åßíáé óùóôÞ: y=3*(x=5+(u=7))+1
ìåôÜ ôçí åêôÝëåóç ôçò ðáñáðÜíù ðáñÜóôáóçò èá Ý÷ïõìå u=7, x=12, y=37 êáé ç óõíïëéêÞ ôéìÞ ôçò ðáñÜóôáóçò èá åßíáé 37. Åóôù åðßóçò ç ðáñÜóôáóç: r=(p=x*y)<0
óôçí áñ÷Þ õðïëïãßæåôáé ôï ãéíüìåíï x*y êáé ç ôéìÞ ôïõ áðïäßäåôáé óôï p. Óôç óõíÝ÷åéá åëÝã÷åôáé ç ôéìÞ ôçò ðáñÜóôáóçò ðïõ Ý÷åé ôïðïèåôçèåß óôéò ðáñåíèÝóåéò, óå ó÷Ýóç ìå ôï ìçäÝí. Áí åßíáé ìéêñüôåñç ôïõ ìçäåíüò ôüôå óôï r áðïäßäåôáé ç ôéìÞ 1 äéáöïñåôéêÜ áðïäßäåôáé ç ôéìÞ 0. Åôóé áí x=1 êáé y=3 ôüôå ôï r ðáßñíåé ôéìÞ 0. Áí èÝóïõìå ôï óçìåßï ';' (åëëçíéêü åñùôçìáôéêü, ðïõ ëÝãåôáé êáé semicolon) óôï ôÝëïò ìßáò ðáñÜóôáóçò, ôï áðïôÝëåóìá åßíáé ìßá åíôïëÞ. Åôóé: t=5 åßíáé ðáñÜóôáóç áðüäïóçò ôéìÞò t=5; åßíáé åíôïëÞ áðüäïóçò ôéìÞò
Ôýðïé - ÌåôáâëçôÝò - ÔåëåóôÝò
3.5
23
ª z ƒ ¶ ™ À¶ø¡
3.5.1
zÀ ªz ™ ª z ƒ ¶ ™
Ïôáí Ýíáò ôåëåóôÞò Ý÷åé ôåëåóôÝïõò äéáöïñåôéêþí ôýðùí, áõôïß ðñéí ãßíåé ç ðñÜîç, ìåôáôñÝðïíôáé áõôüìáôá óå åíéáßï ôýðï ìå âÜóç ìåñéêïýò êáíüíåò. ÃåíéêÜ ïé ìüíåò áõôüìáôåò ìåôáôñïðÝò åßíáé áõôÝò ðïõ ìåôáôñÝðïõí Ýíáí ôåëåóôÝï "êáôþôåñïõ" ôýðïõ óå Ýíáí ôåëåóôÝï "áíþôåñïõ" ôýðïõ. Ôï áðïôÝëåóìá ôçò ðñÜîçò, öõóéêÜ áíÞêåé óôïí áíþôåñï ôýðï. Ç äéáâÜèìéóç ôùí ôýðùí áíôéóôïé÷åß óôïí áñéèìü ôùí bytes ðïõ êáôáëáìâÜíåé áõôüò ï ôýðïò óôç ìíÞìç. Ïé êáíüíåò ìåôáôñïðÞò åßíáé ïé ðáñáêÜôù: 1.
Ïëïé ïé ôýðïé char êáé short int ìåôáôñÝðïíôáé óå int. Ïëïé ïé float ìåôáôñÝðïíôáé óå double.
2. Ãéá üëá ôá æåýãç ôåëåóôÝùí, ç óåéñÜ ìåôáôñïðÞò åßíáé ç ðáñáêÜôù. Áí ï Ýíáò ôåëåóôÝïò åßíáé long double êáé ï Üëëïò ôåëåóôÝïò ìåôáôñÝðåôáé óå long double. Áí ï Ýíáò áðü ôïõò ôåëåóôÝïõò åßíáé double êáé ï Üëëïò ìåôáôñÝðåôáé óå double. Áí ï Ýíáò ôåëåóôÝïò åßíáé long êáé ï Üëëïò ìåôáôñÝðåôáé óå long. Áí ï Ýíáò åßíáé unsigned êáé ï Üëëïò ìåôáôñÝðåôáé óå unsigned. Áöïý ï ìåôáãëùôôéóôÞò åöáñìüóåé áõôïýò ôïõò êáíüíåò ìåôáôñïðÞò, ôï êÜèå æåõãÜñé ôåëåóôÝùí èá ãßíåé ôïõ áõôïý ôýðïõ, ïðüôå ôï áðïôÝëåóìá ôçò êÜèå ðñÜîçò èá åßíáé ôïõ ßäéïõ ôýðïõ ìå ôïí ôýðï ôùí ôåëåóôÝùí. Óçìåéþíïõìå üôé ï äåýôåñïò êáíüíáò Ý÷åé áñêåôÝò óõíèÞêåò ðïõ ðñÝðåé íá åöáñìïóôïýí äéáäï÷éêÜ.
3.5.2
ƒ ™ ª z ƒ ¶ ™ (CAST)
Óå ïðïéáäÞðïôå ðáñÜóôáóç ìðïñïýí íá åðéâëçèïýí ñçôÝò ìåôáôñïðÝò ôýðïõ, ìå Ýíá ìïíáäéêü ôåëåóôÞ ðïõ ëÝãåôáé ðñïóáñìïãÞ (cast). Ç ãåíéêÞ ìïñöÞ ôçò äïìÞò ðñïóáñìïãÞò åßíáé: (ôýðïò) ðáñÜóôáóç
üðïõ ôýðïò åßíáé Ýíáò áðü ôïõò êáèéåñùìÝíïõò ôýðïõò ôçò C êáé ç ôéìÞ ôçò ðáñÜóôáóçò ìåôáôñÝðåôáé óôïí êáôïíïìáæüìåíï ôýðï. Áò ðñïóÝîïõìå üôé ç ðñïóáñìïãÞ ðáñÜãåé ìßá êáôÜëëçëïõ ôýðïõ ôéìÞ ôçò ðáñÜóôáóçò, ç ßäéá üìùò ç ðáñÜóôáóç äåí áëëÜæåé. Ãéá ðáñÜäåéãìá, áí ï x åßíáé áêÝñáéïõ ôýðïõ êáé èÝëïõìå íá åßìáóôå âÝâáéïé üôé ç ðáñÜóôáóç x/2 èá åßíáé ôýðïõ float þóôå íá õðÜñ÷åé óßãïõñá êëáóìáôéêü ìÝñïò, ìðïñïýìå íá ãñÜøïõìå: (float) x/2
Åäþ ç ðñïóáñìïãÞ (float) óõíäõÜæåôáé ìå ôï x, ðñÜãìá ðïõ êÜíåé ôïí 2 íá ìåôáôñáðåß óå float ïðüôå êáé ôï áðïôÝëåóìá èá åßíáé ôýðïõ float. Ðñïóï÷Þ, áí ãñÜøïõìå ôçí ðñïóáñìïãÞ êáôÜ ôïí ôñüðï: (float) (x/2)
åêôåëåßôáé ìßá áêÝñáéá äéáßñåóç êáé ôï áðïôÝëåóìá (ðïõ åßíáé ôï áêÝñáéï ðçëßêï) ìåôáôñÝðåôáé óå float.
Áè. Å. Êïõôóïíéêüëáò
24
3.6
H Ãëþóóá Ðñïãñáììáôéóìïý C
¶ƒ ƒz z § ™ ø¡
Ï Ðßíáêáò 3.5 óõíïøßæåé ôïõò êáíüíåò ðñïôåñáéüôçôáò êáé ðñïóåôáéñéóôéêüôçôáò ãéá üëïõò ôïõò ôåëåóôÝò, óõìðåñéëáìâáíïìÝíùí êáé áõôþí ðïõ äåí Ý÷ïõìå áêüìá åîåôÜóåé. Ïé ôåëåóôÝò ðïõ åßíáé óôçí ßäéá ãñáììÞ ôïõ ðßíáêá Ý÷ïõí ôçí ßäéá ðñïôåñáéüôçôá, åíþ ïé ãñáììÝò åßíáé ìå áýîïõóá óåéñÜ ðñïôåñáéüôçôáò. Áí èÝëïõìå íá áëëÜîïõìå ôç óåéñÜ ôùí ðñÜîåùí ÷ñçóéìïðïéïýìå ðáñåíèÝóåéò. Ïôáí ëÝìå ðñïóåôáéñéóôéêüôçôá åííïïýìå öïñÜ õðïëïãéóìïý. Ïé ðåñéóóüôåñïé ôåëåóôÝò ðñïóåôáéñßæïõí áðü áñéóôåñÜ ðñïò ôá äåîéÜ. Áõôü óçìáßíåé üôé, ãéá ðáñÜäåéãìá, ç ðáñÜóôáóç: 100-20-1+3
ðñÝðåé íá åñìçíåõèåß ùò: ((100-20)-1)+3
Áí ï õðïëïãéóìüò ãéíüôáí óáí 100-(20-(1+3))
(ðïõ äå óõìâáßíåé !) èá ëÝãáìå üôé ïé ôåëåóôÝò ðñïóåôáéñßæïõí áðü äåîéÜ ðñïò ôá áñéóôåñÜ. ÔåëåóôÝò () [] -> . ! ~ ++ -- -(1) *(4) / % + -(5) << >> < <= > >= == != &(6) ^ | && || ?: = += -= *= /= ,
*(2)
%=
&(3)
&=
Ðñïóåôáéñéóôéêüôçôá (ôýðïò)
^=
|=
sizeof
<<=
>>=
Õðüìíçìá (1) Ìïíáäéêü ðëçí (2) Ðåñéå÷üìåíï äéåýèõíóçò ìíÞìçò (3) Äéåýèõíóç ìíÞìçò ìåôáâëçôÞò (4) Ðïëëáðëáóéáóìüò (5) Áöáßñåóç (6) Bitwise AND Ðßíáêáò 3.5: Ðñïôåñáéüôçôá êáé ðñïóåôáéñéóôéêüôçôá ôåëåóôþí
Æ Å Æ Æ Æ Æ Æ Æ Æ Æ Æ Æ Å Å Æ
ร รฝรฐรฏรฉ - ร รฅรดรกรขรซรงรดร รฒ - ร รฅรซรฅรณรดร รฒ
3.7 1.
25
zโ ขย ย โ ข ย โ ข ร รก รตรฐรฏรซรฏรฃรฉรณรดรฅร รง รดรฉรฌร รดรงรฒ รฐรกรฑร รณรดรกรณรงรฒ: (i/j)*(j/i)
รณรดรฉรฒ รฅรฎร รฒ รฐรฅรฑรฉรฐรดรพรณรฅรฉรฒ: รข) i=3, j=3 รก) i=1, j=3
รฃ) i=3, j=1
2. ร รฅรนรฑร รณรดรฅ รฃรญรนรณรดรผ รผรดรฉ รง รณรตรญร รฑรดรงรณรง sqrt() รฅรฐรฉรณรดรฑร รถรฅรฉ รดรงรญ รดรฅรดรฑรกรฃรนรญรฉรชร รฑร รฆรก รดรฏรต รฏรฑร รณรฌรกรดรผรฒ รดรงรฒ. ร รนรครฉรชรฏรฐรฏรฉร รณรดรฅ รณรดรงรญ C รดรฉรฒ รฐรกรฑรกรชร รดรน รกรฑรฉรจรฌรงรดรฉรชร รฒ รฐรกรฑรกรณรดร รณรฅรฉรฒ: รก) 2S ย รค)
m D
รข) K
Q 1 1 ( 2 2) 4 SHH 0 r1 r2
รฅ)
X ย K ย E 360
r r2 S ย 1 ย R4 L 8r
รฃ) K0(1 r )2 (1 รณรด)
b
r ย n ) 360
b2 4 ac 2a
3. ร รญ a=4, b=1, รชรกรฉ c=7, รญรก รตรฐรฏรซรฏรฃรฉรณรดรฅร รง รดรฉรฌร รฃรฉรก รชรกรจรฅรฌรฉร รกรฐรผ รดรฉรฒ รฅรฐรผรฌรฅรญรฅรฒ รฐรกรฑรกรณรดร รณรฅรฉรฒ: รก) a<b && b<c รข) b<c && (a<b || a>c) รฃ) (b>c || a>c) || c>a รค) ! (a>b && (! b>c)) รฅ) b>c || (a<c || b<c) && a<b 4. ร รก รชรนรครฉรชรฏรฐรฏรฉรงรจรฏรฝรญ รณรดรง รฃรซรพรณรณรก C รฏรฉ รฐรกรฑรกรชร รดรน รฐรฑรฏรดร รณรฅรฉรฒ: รก) ร รฏ x รฌรฉรชรฑรผรดรฅรฑรฏ รดรฏรต รฌรงรครฅรญรผรฒ รชรกรฉ รฌรฅรฃรกรซรฝรดรฅรฑรฏ รดรฏรต y ร รดรฏ x รฌรฉรชรฑรผรดรฅรฑรฏ รดรฏรต รฌรงรครฅรญรผรฒ รชรกรฉ รดรฏ z ร รณรฏ รฌรฅ รดรฏ r. รข) ร รฏ รขร รฑรฏรฒ รญรก รฌรงรญ รฅร รญรกรฉ รฌรฉรชรฑรผรดรฅรฑรฏ รดรนรญ 50 Kgr รชรกรฉ รดรฏ รฝรธรฏรฒ รญรก รฌรงรญ รฅร รญรกรฉ รฌรฅรฃรกรซรฝรดรฅรฑรฏ รดรนรญ 1,90 m. รฃ) ร x รฅร รญรกรฉ รจรฅรดรฉรชรผรฒ รกรชร รฑรกรฉรฏรฒ รฌรฉรชรฑรผรดรฅรฑรฏรฒ รดรฏรต 152. รค) ร รงรซรฉรชร รก รญรก รฅร รญรกรฉ รฌรฅรดรกรฎรฝ 20 รชรกรฉ 40 รฅรดรพรญ. 5. ร รฑร รธรดรฅ ร รญรก รฐรฑรผรฃรฑรกรฌรฌรก รฐรฏรต รญรก รคร รทรฅรดรกรฉ รดรฏ รฌร รชรฏรฒ รชรกรฉ รดรฏ รฐรซร รดรฏรฒ รฅรญรผรฒ รฏรฑรจรฏรฃรนรญร รฏรต รชรกรฉ รญรก รดรตรฐรพรญรฅรฉ รณรดรงรญ รฏรจรผรญรง รดรฏ รฅรฌรขรกรครผรญ รชรกรฉ รดรงรญ รฐรฅรฑร รฌรฅรดรฑรฏ รกรตรดรฏรฝ. 6. ร รฑร รธรดรฅ รฐรฑรผรฃรฑรกรฌรฌรก รฐรฏรต รญรก รคร รทรฅรดรกรฉ รดรฏ รฌร รชรฏรฒ , รดรฏ รฐรซร รดรฏรฒ, รดรฏ รฝรธรฏรฒ รชรกรฉ รดรง รฌร รฆรก รฅรญรผรฒ รดรฏรฝรขรซรฏรต รชรกรฉ รญรก รดรตรฐรพรญรฅรฉ รณรดรงรญ รฏรจรผรญรง รดรฏรญ รผรฃรชรฏ รดรฏรต รชรกรฉ รดรงรญ รฐรตรชรญรผรดรงรดร รดรฏรต. 7.
ร รก รฃรฑรกรถรฅร รฐรฑรผรฃรฑรกรฌรฌรก รฐรฏรต รญรก รคร รทรฅรดรกรฉ รดรงรญ รงรซรฉรชร รก รฅรญรผรฒ รกรดรผรฌรฏรต รณรฅ ร รดรง รชรกรฉ รญรก รดรง รฌรฅรดรกรดรฑร รฐรฅรฉ รณรฅ รงรฌร รฑรฅรฒ, รพรฑรฅรฒ รชรกรฉ รซรฅรฐรดร .
8. ร รฑร รธรดรฅ รฐรฑรผรฃรฑรกรฌรฌรก รฐรฏรต รญรก รคร รทรฅรดรกรฉ รดรง รจรฅรฑรฌรฏรชรฑรกรณร รก รณรฅ รขรกรจรฌรฏรฝรฒ Fahrenheit รชรกรฉ รญรก รดรง รฌรฅรดรกรดรฑร รฐรฅรฉ รณรฅ รขรกรจรฌรฏรฝรฒ Celsius. ร รดรฝรฐรฏรฒ รฌรฅรดรกรดรฑรฏรฐร รฒ รฅร รญรกรฉ: C
( F 32) *
ร รจ. ร . ร รฏรตรดรณรฏรญรฉรชรผรซรกรฒ
5 9
26
H ร รซรพรณรณรก ร รฑรฏรฃรฑรกรฌรฌรกรดรฉรณรฌรฏรฝ C
9. ร รก รฃรฑร รธรฅรดรฅ รฐรฑรผรฃรฑรกรฌรฌรก รฐรฏรต รญรก รคร รทรฅรดรกรฉ รดรฏ รฌรฉรณรจรผ รฅรญรผรฒ รตรฐรกรซรซร รซรฏรต (รณรฅ รกรชร รฑรกรฉรฏ รกรฑรฉรจรฌรผ รครฑรกรทรฌรพรญ) รชรกรฉ รญรก รดรตรฐรพรญรฅรฉ รณรดรงรญ รฏรจรผรญรง รดรฏรญ รฅรซร รทรฉรณรดรฏ รกรฑรฉรจรฌรผ รทรกรฑรดรฏรญรฏรฌรฉรณรฌร รดรนรญ รชรกรฉ รชรฅรฑรฌร รดรนรญ รฐรฏรต รทรฑรฅรฉร รฆรฏรญรดรกรฉ รฃรฉรก รญรก รฐรซรงรฑรนรจรฅร . ร รงรซรกรคร รญรก รดรตรฐรพรญรฅรฉ รฐรผรณรก รฐรฅรญรดรฏรทร รซรฉรกรฑรก, รทรฉรซรฉร รฑรฉรชรก, รฐรฅรญรดรกรชรฏรณร รฑรฉรชรก, รช.รซ.รฐ. รฐรฑร รฐรฅรฉ รญรก รครฏรจรฏรฝรญ รณรดรฏรญ รตรฐร รซรซรงรซรฏ รพรณรดรฅ รกรตรดร รญรก รฅร รญรกรฉ รฅรซร รทรฉรณรดรก รณรดรฏรญ รกรฑรฉรจรฌรผ. 10. ร รก รฃรฑรกรถรฅร รฐรฑรผรฃรฑรกรฌรฌรก รฐรฏรต รญรก รคร รทรฅรดรกรฉ รดรฉรฌร รฒ รฃรฉรก รครฝรฏ รกรชร รฑรกรฉรฅรฒ รฌรฅรดรกรขรซรงรดร รฒ x รชรกรฉ y, รณรดรง รณรตรญร รทรฅรฉรก รญรก รฅรญรกรซรซร รณรณรฅรฉ รดรฉรฒ รดรฉรฌร รฒ รดรนรญ รครฝรฏ รฌรฅรดรกรขรซรงรดรพรญ รชรกรฉ รญรก รดรตรฐรพรญรฅรฉ รณรดรงรญ รฏรจรผรญรง รดรฉรฒ รดรฉรฌร รฒ รดรนรญ x รชรกรฉ y รฌรฅรดร รดรงรญ รฅรญรกรซรซรกรฃร . 11. ร รก รฃรฑรกรถรฅร รฐรฑรผรฃรฑรกรฌรฌรก รฐรฏรต รญรก รคร รทรฅรดรกรฉ รดรฉรฌร รฒ รฃรฉรก รดรฑรฅรฉรฒ รกรชร รฑรกรฉรฅรฒ รฌรฅรดรกรขรซรงรดร รฒ x, y รชรกรฉ z รชรกรฉ รญรก รฅรญรกรซรซร รณรณรฅรฉ รชรตรชรซรฉรชร รดรฉรฒ รดรฉรฌร รฒ รดรฏรตรฒ. ร รฅรซรฉรชร รญรก รดรตรฐรพรญรฅรฉ รณรดรงรญ รฏรจรผรญรง รดรฉรฒ รดรฉรฌร รฒ รดรนรญ x ,y รชรกรฉ z รฌรฅรดร รดรงรญ รฅรญรกรซรซรกรฃร . 12. ร รก รฃรฑรกรถรฅร รฐรฑรผรฃรฑรกรฌรฌรก รฐรฏรต รญรก รคร รทรฅรดรกรฉ รดรงรญ รกรชรดร รญรก รฅรญรผรฒ รชรฝรชรซรฏรต รชรกรฉ รญรก รฅรชรดรตรฐรพรญรฅรฉ รณรดรงรญ รฏรจรผรญรง รดรฏ รฅรฌรขรกรครผรญ รดรฏรต รชรฝรชรซรฏรต รชรกรจรพรฒ รชรกรฉ รดรฏ รฅรฌรขรกรครผรญ รดรฏรต รดรฅรดรฑรกรฃรพรญรฏรต รฐรฏรต รฅร รญรกรฉ รฐรฅรฑรฉรฃรฅรฃรฑรกรฌรฌร รญรฏ รณรดรฏรญ รชรฝรชรซรฏ. 13. ร รฑร รธรดรฅ รฐรฑรผรฃรฑรกรฌรฌรก รฐรฏรต รญรก รคร รทรฅรดรกรฉ รฐร รญรดรฅ รกรชร รฑรกรฉรฅรฒ รดรฉรฌร รฒ รชรกรฉ รญรก รตรฐรฏรซรฏรฃร รฆรฅรฉ รชรกรฉ รดรตรฐรพรญรฅรฉ รดรง รฌร รณรง รดรฉรฌร รดรฏรตรฒ. 14. ร รก รฃรฑรกรถรฅร รฐรฑรผรฃรฑรกรฌรฌรก รฐรฏรต รญรก รคร รทรฅรดรกรฉ ร รญรกรญ รกรชร รฑรกรฉรฏ รกรฑรฉรจรฌรผ รชรกรฉ รญรก รขรฑร รณรชรฅรฉ รกรญ รฅร รญรกรฉ รครฉรกรฉรฑรฅรดรผรฒ รฌรฅ รดรฏ รครฝรฏ รดรฏ รดรฑร รก รชรกรฉ รดรฏ รดร รณรณรฅรฑรก รดรกรตรดรผรทรฑรฏรญรก. 15. ร รฑร รธรดรฅ ร รญรก รฐรฑรผรฃรฑรกรฌรฌรก รฐรฏรต รญรก รคร รทรฅรดรกรฉ รกรฐรผ รดรฏ รฐรซรงรชรดรฑรฏรซรผรฃรฉรฏ รดรงรญ รดรฉรฌร รชร รฐรฏรฉรฏรต รกรญรดรฉรชรฅรฉรฌร รญรฏรต, รทรนรฑร รฒ ร ร ร รชรกรฉ รดรฏ รณรตรญรดรฅรซรฅรณรดร ร ร ร . ร รกรดรผรฐรฉรญ รญรก รตรฐรฏรซรฏรฃร รฆรฅรฉ รชรกรฉ รดรตรฐรพรญรฅรฉ รดรงรญ รดรฉรฌร รฌรฅ ร ร ร . 16. ร รฒ รตรฐรฏรจร รณรฏรตรฌรฅ รผรดรฉ รง ร ร ร รทรฑรฅรพรญรฅรฉ 17.15 รครฑรท/kWh รฃรฉรก รดรฏ รงรฌรฅรฑร รณรฉรฏ รฑรฅรฝรฌรก รชรกรฉ 10.61 รครฑรท/kWh รฃรฉรก รดรฏ รญรตรทรดรฅรฑรฉรญรผ รชรกรฉ 2605 รครฑรท รฐร รฃรฉรฏ. ร ร รญรน รณรดรฏ รณรฝรญรฏรซรฏ รดรนรญ รฐรกรฑรกรฐร รญรน รฏ รชรกรดรกรญรกรซรนรดร รฒ รฐรซรงรฑรพรญรฅรฉ ร ร ร 18%. ร รฑร รธรดรฅ รฐรฑรผรฃรฑรกรฌรฌรก รฐรฏรต รญรก รคร รทรฅรดรกรฉ รดรงรญ รงรฌรฅรฑร รณรฉรก รชรกรฉ รดรง รญรตรชรดรฅรฑรฉรญร รชรกรดรกรญร รซรนรณรง รฑรฅรฝรฌรกรดรฏรฒ รณรฅ kWh รชรกรฉ รญรก รขรฃร รฆรฅรฉ รดรฏ รซรฏรฃรกรฑรฉรกรณรฌรผ. 17. ร รญ รณรตรญรคร รณรฏรตรฌรฅ รครฝรฏ รกรญรดรฉรณรดร รณรฅรฉรฒ R1 รชรกรฉ R2 รณรฅ รณรฅรฉรฑร , รง รณรตรญรฏรซรฉรชร รกรญรดร รณรดรกรณรง รฅร รญรกรฉ: R
R1 R 2
ร รฑร รธรดรฅ รฐรฑรผรฃรฑรกรฌรฌรก รฐรฏรต รญรก รคร รทรฅรดรกรฉ รดรฉรฒ รดรฉรฌร รฒ รดรนรญ R1 รชรกรฉ R2 รชรกรฉ รญรก รตรฐรฏรซรฏรฃร รฆรฅรฉ รชรกรฉ รดรตรฐรพรญรฅรฉ รดรงรญ R. 18. ร รญ รณรตรญรคร รณรฏรตรฌรฅ รครฝรฏ รกรญรดรฉรณรดร รณรฅรฉรฒ R1 รชรกรฉ R2 รฐรกรฑร รซรซรงรซรก, รง รณรตรญรฏรซรฉรชร รกรญรดร รณรดรกรณรง รฅร รญรกรฉ: R
R1 * R 2 R1 R 2
ร รฑร รธรดรฅ รฐรฑรผรฃรฑรกรฌรฌรก รฐรฏรต รญรก รคร รทรฅรดรกรฉ รดรฉรฒ รดรฉรฌร รฒ รดรนรญ R1 รชรกรฉ R2 รชรกรฉ รญรก รตรฐรฏรซรฏรฃร รฆรฅรฉ รชรกรฉ รดรตรฐรพรญรฅรฉ รดรงรญ R. 19. ร รฒ รตรฐรฏรจร รณรฏรตรฌรฅ รผรดรฉ รฏ รฌรฉรณรจรผรฒ รฅรญรผรฒ รฅรฑรฃรกรฆรฏรฌร รญรฏรต รฐรฑรฏรณรกรตรฎร รญรฅรดรกรฉ รชรกรดร 4% รฃรฉรก รชร รจรฅ รทรฑรผรญรฏ รตรฐรงรฑรฅรณร รกรฒ รชรกรฉ รชรกรดร 5000 รครฑรท รฃรฉรก รชร รจรฅ รฐรกรฉรคร . ร รฑร รธรดรฅ รฐรฑรผรฃรฑรกรฌรฌรก รฐรฏรต รญรก รคร รทรฅรดรกรฉ รดรฏ รขรกรณรฉรชรผ รฌรฉรณรจรผ, รดรก รทรฑรผรญรฉรก รตรฐรงรฑรฅรณร รกรฒ รชรกรฉ รดรฏรญ รกรฑรฉรจรฌรผ รดรนรญ รฐรกรฉรครฉรพรญ รฅรญรผรฒ รตรฐรกรซรซร รซรฏรต รชรกรฉ รญรก รตรฐรฏรซรฏรฃร รฆรฅรฉ รชรกรฉ รดรตรฐรพรญรฅรฉ รดรฏ รณรตรญรฏรซรฉรชรผ รฌรฉรณรจรผ รดรฏรต.
4.
™ ¢ ™ - • ¢ ™ ¡™ §z™
Ïé óõíáñôÞóåéò åéóüäïõ áðü ôï ðëçêôñïëüãéï êáé åîüäïõ óôçí ïèüíç åßíáé: getchar() (getche,getch) gets() scanf()
êáé êáé êáé
putchar() puts() printf()
Ôï ðñþôï æåõãÜñé ÷ñçóéìåýåé ãéá åßóïäï êáé Ýîïäï ÷áñáêôÞñùí, ôï äåýôåñï ãéá áëöáñéèìçôéêÜ êáé ôï ôñßôï ãéá ìïñöïðïéçìÝíç (formatted) åßóïäï êáé Ýîïäï.
4.1
™ ¢ ™ z • ¢ ™ Ãzƒz ƒø¡
Ç óõíÜñôçóç getchar() äåí ðáßñíåé êáìßá ðáñÜìåôñï êáé åðéóôñÝöåé ìßá áêÝñáéá ôéìÞ ðïõ åßíáé ç ôéìÞ ôïõ ÷áñáêôÞñá ASCII ðïõ äéáâÜæåé áðü ôï ðëçêôñïëüãéï. ÌåôÜ ôçí åêôÝëåóç ôçò åíôïëÞò: c=getchar();
ç ìåôáâëçôÞ c ðåñéÝ÷åé ôï ÷áñáêôÞñá ðïõ èá ðëçêôñïëïãÞóïõìå. Ãéá íá äéáâÜóåé Ýíá ÷áñáêôÞñá ç getchar() ðñÝðåé ìåôÜ ôï ÷áñáêôÞñá íá äþóïõìå ìßá åðáíáöïñÜ êåöáëÞò (ENTER). Áõôü ðïëëÝò öïñÝò åßíáé åíï÷ëçôéêü. Åôóé ìðïñïýìå íá ÷ñçóéìïðïéÞóïõìå ôç óõíÜñôçóç getche() ç ïðïßá äéáâÜæåé Ýíá ÷áñáêôÞñá áðü ôï ðëçêôñïëüãéï ÷ùñßò íá ÷ñåéÜæåôáé íá äþóïõìå åðáíáöïñÜ êåöáëÞò. Ï ÷áñáêôÞñáò ðïõ äéáâÜæåôáé áðü ôçí getche() åìöáíßæåôáé (áíôç÷åßôáé) óôçí ïèüíç. Áí èÝëïõìå ï ÷áñáêôÞñáò ðïõ äéáâÜæåôáé íá ìçí åìöáíßæåôáé óôçí ïèüíç, èá ðñÝðåé íá ÷ñçóéìïðïéÞóïõìå ôç óõíÜñôçóç getch() ç ïðïßá ëåéôïõñãåß üðùò áêñéâþò êáé ç getche() ìå ôç äéáöïñÜ üôé äåí åìöáíßæåôáé óôçí ïèüíç ï ÷áñáêôÞñáò ðïõ ðëçêôñïëïãïýìå. Ç óõíÜñôçóç putchar() åìöáíßæåé óôçí ïèüíç ôï ÷áñáêôÞñá ðïõ Ý÷åé ùò üñéóìá. Åôóé ìåôÜ ôçí åêôÝëåóç ôçò åíôïëÞò: putchar(c);
èá ôõðùèåß óôçí ïèüíç ç ôéìÞ ôçò ìåôáâëçôÞò ÷áñáêôÞñá c.
4.2
™ ¢ ™ z • ¢ ™ z§ºzƒ £ª ø¡
Ç óõíÜñôçóç gets() äéáâÜæåé áðü ôï ðëçêôñïëüãéï Ýíá áëöáñéèìçôéêü êáé ôï ôïðïèåôåß óôç ìåôáâëçôÞ ðïõ äÝ÷åôáé ùò üñéóìá. Ôï üñéóìá ôçò óõíÜñôçóçò ðñÝðåé íá åßíáé ôýðïõ ðßíáêá ÷áñáêôÞñùí. Ð.÷. ìåôÜ ôçí åêôÝëåóç ôçò åíôïëÞò: gets(str);
ç ìåôáâëçôÞ str èá ðåñéÝ÷åé ôï áëöáñéèìçôéêü ðïõ èá ðëçêôñïëïãÞóïõìå. Ç óõíÜñôçóç puts() ãñÜöåé óôçí ïèüíç ôï áëöáñéèìçôéêü ðïõ Ý÷åé ùò üñéóìÜ ôçò êáé óôç óõíÝ÷åéá áëëÜæåé ãñáììÞ. Åôóé ð.÷. ç åíôïëÞ: puts("×áßñå");
ãñÜöåé óôçí ïèüíç ôç ëÝîç "×áßñå" êáé óôç óõíÝ÷åéá áëëÜæåé ãñáììÞ.
H Ãëþóóá Ðñïãñáììáôéóìïý C
28
4.3
ª ƒº ¶ ª ¡ ™ ¢ ™ z • ¢ ™
Åêôüò áðü ôéò áðëÝò óõíáñôÞóåéò åéóüäïõ/åîüäïõ êïíóüëáò ðïõ ðåñéãñÜöôçêáí ðñïçãïõìÝíùò, ç êáèéåñùìÝíç âéâëéïèÞêç ôçò C ðåñéëáìâÜíåé äýï óõíáñôÞóåéò ðïõ ðñáãìáôïðïéïýí ìïñöïðïéçìÝíç åßóïäï êáé Ýîïäï ôùí âáóéêþí ôýðùí äåäïìÝíùí. Ï üñïò ìïñöïðïéçìÝíç áíáöÝñåôáé óôï ãåãïíüò üôé áõôÝò ïé óõíáñôÞóåéò ìðïñïýí íá äéáâÜæïõí êáé íá ãñÜöïõí äåäïìÝíá óå äéÜöïñåò ìïñöÝò ôéò ïðïßåò ìðïñïýìå åìåßò íá êáèïñßæïõìå.
4.3.1
™À¡zƒ ™ printf()
H óõíÜñôçóç prinf() åðéôñÝðåé ôç äéï÷Ýôåõóç ìïñöïðïéçìÝíùí óôïé÷åßùí åîüäïõ óôç ïèüíç. Ç ãåíéêÞ ìïñöÞ ôçò åßíáé: printf(áëöáñéèìçôéêü_åëÝã÷ïõ , ëßóôá_ïñéóìÜôùí)
Ôï áëöáñéèìçôéêü åëÝã÷ïõ áðïôåëåßôáé áðü óôïé÷åßá äýï ôýðùí: (á) êáíïíéêïýò ÷áñáêôÞñåò ïé ïðïßïé èá ôõðùèïýí áðü ôç óõíÜñôçóç óôçí ïèüíç êáé (â) êáèïñéóôÝò ìïñöÞò (format specifier) ðïõ êáèïñßæïõí ôç ìïñöÞ ìå ôçí ïðïßá èá åìöáíéóôïýí ïé ôéìÝò ôùí ïñéóìÜôùí óôçí ïèüíç. ÊÜèå êáèïñéóôÞò ìïñöÞò áñ÷ßæåé ìå ôï óýìâïëï % êáé óôç óõíÝ÷åéá ðåñéÝ÷åé Ýíá ÷áñáêôÞñá ï ïðïßïò êáèïñßæåé ìå ðïéá ìïñöÞ èá ôõðùèåß óôçí ïèüíç ç ôéìÞ ôïõ ïñßóìáôïò ðïõ áíôéóôïé÷åß ó'áõôüí ôïí êáèïñéóôÞ ìïñöÞò. Óôïí Ðßíáêá 4.1 öáßíïíôáé ïé êáèïñéóôÝò ìïñöÞò ôçò printf(). Ï áñéèìüò ôùí ïñéóìÜôùí ðñÝðåé íá åßíáé ßóïò ìå ôïí áñéèìü ôùí êáèïñéóôþí ìïñöÞò êáé ìÜëéóôá ðñÝðåé íá Ý÷ïõí ôçí ßäéá óåéñÜ. Ãéá ðáñÜäåéãìá ôï ðáñáêÜôù ðñüãñáììá: /* printf1.c */ /* ÐáñÜäåéãìá ÷ñÞóçò ôçò óõíÜñôçóçò printf() */ main() { int set=3; char game='A'; float time=27.25; printf("Ôï %do óåô ôïõ %c áãþíá ", set,game); printf("äéÞñêåóå %f ëåðôÜ\n",time); }
èá äþóåé áðïôÝëåóìá: Ôï 3ï óåô ôïõ Á áãþíá äéÞñêåóå 27.250000 ëåðôÜ
Óôï ðáñáðÜíù ðñüãñáììá ðáñáôçñïýìå üôé óôçí Ýîïäï ôõðþèçêå ï áñéèìüò 27.250000 ìå Ýîé øçößá óôá äåîéÜ ôçò õðïäéáóôïëÞò, áí êáé ìüíï äýï áð'áõôÜ åßíáé óçìáíôéêÜ. ÐñïâëÞìáôá óáí ôï ðñïçãïýìåíï ëýíïíôáé, ìéáò êáé ìå ôïõò êáèïñéóôÝò ìïñöÞò ôçò printf() ìðïñïýìå íá êáèïñßóïõìå ôï åýñïò ôïõ ðåäßïõ ðïõ ðïõ èá êáôáëÜâåé Ýíá åêôõðïýìåíï áðïôÝëåóìá, ôïí áñéèìü ôùí êëáóìáôéêþí øçößùí ôïõ áðïôåëÝóìáôïò êáèþò êáé ôï áí ôï áðïôÝëåóìá èá åßíáé óôïé÷éóìÝíï äåîéÜ Þ áñéóôåñÜ ìÝóá óôï ðåäßï. Ôï åëÜ÷éóôï åýñïò ôïõ ðåäßïõ åêôýðùóçò åíüò áðïôåëÝóìáôïò êáèïñßæåôáé áðü ôï êáèïñéóôéêü åëÜ÷éóôïõ åýñïõò ðïõ åßíáé Ýíáò áêÝñáéïò ðïõ ôïðïèåôåßôáé ìåôáîý ôïõ óõìâüëïõ % êáé ôïõ ÷áñáêôÞñá ôïõ êáèïñéóôÞ ìïñöÞò. Áí ôï åêôõðïýìåíï
Åßóïäïò - Åîïäïò Êïíóüëáò
29
áðïôÝëåóìá åßíáé ìåãáëýôåñï áðü ôï åëÜ÷éóôï åýñïò ðåäßïõ, ôüôå èá ôõðùèåß ïëüêëçñï áãíïþíôáò ôï åëÜ÷éóôï åýñïò ðåäßïõ. Åî ïñéóìïý ÷ñçóéìïðïéïýíôáé êåíÜ äéáóôÞìáôá ãéá íá óõìðëçñþíåôáé ç Ýîïäïò. Áí èÝëïõìå ç Ýîïäïò íá óõìðëçñþíåôáé ìå ìçäåíéêÜ, ðñÝðåé íá ôïðïèåôÞóïõìå ôï 0 (ìçäÝí) ðñéí áðü ôï êáèïñéóôéêü åëÜ÷éóôïõ åýñïõò. Ãéá íá êáèïñßóïõìå ôïí áñéèìü ôùí êëáóìáôéêþí øçößùí ðïõ èÝëïõìå íá åìöáíßæïíôáé óå Ýíáí áñéèìü êéíçôÞò õðïäéáóôïëÞò, ôïðïèåôïýìå ìéáí õðïäéáóôïëÞ (ôåëåßá) ìåôÜ ôï êáèïñéóôéêü åëÜ÷éóôïõ åýñïõò ôïõ ðåäßïõ êáé óôç óõíÝ÷åéá Ýíáí áêÝñáéï ðïõ åêöñÜæåé ôïí áñéèìü ôùí êëáóìáôéêþí øçößùí ðïõ èÝëïõìå íá åìöáíßæïíôáé. Ãéá ðáñÜäåéãìá ôï %10.4f èá åìöáíßóåé Ýíáí áñéèìü êéíçôÞò õðïäéáóôïëÞò ðëÜôïõò ôïõëÜ÷éóôïí 10 ÷áñáêôÞñùí ìå ôÝóóåñá êëáóìáôéêÜ øçößá. Ïôáí åöáñìüæïõìå ìßá ìïñöÞ óáí áõôÞ óå áëöáñéèìçôéêÜ Þ áêåñáßïõò, ï áñéèìüò ðïõ áêïëïõèåß ôçí ôåëåßá êáèïñßæåé ôï ìÝãéóôï ìÞêïò ôïõ ðåäßïõ. Ãéá ðáñÜäåéãìá, ôï %5.7s èá åìöáíßóåé Ýíá áëöáñéèìçôéêü ìÞêïõò ôïõëÜ÷éóôïí ðÝíôå ÷áñáêôÞñùí êáé ü÷é ìåãáëýôåñï ôùí 7 ÷áñáêôÞñùí. Áí ôï áëöáñéèìçôéêü åßíáé ìåãáëýôåñï áðü ôï ìÝãéóôï ìÞêïò ðåäßïõ, èá áðïêïðïýí óôçí åêôýðùóç ïé åðéðëÝïí ÷áñáêôÞñåò ðïõ âñßóêïíôáé óôï ôÝëïò ôïõ. Åî ïñéóìïý, ç Ýîïäïò åßíáé åõèõãñáììéóìÝíç äåîéÜ ìÝóá óôï ðåäßï. Ìðïñïýìå íá óôïé÷ßóïõìå ôçí Ýîïäï áñéóôåñÜ ôïðïèåôþíôáò ôï óýìâïëï ðëçí (-) ìåôÜ ôï %. Ãéá ðáñÜäåéãìá, ôï %-10.2f èá óôïé÷ßóåé óôá áñéóôåñÜ Ýíáí áñéèìü êéíçôÞò õðïäéáóôïëÞò ìå äýï êëáóìáôéêÜ øçößá ó'Ýíá ðåäßï äÝêá ÷áñáêôÞñùí. Ùò ðáñÜäåéãìá üëùí ôùí ðáñáðÜíù áò èåùñÞóïõìå ôï ðáñáêÜôù ðñüãñáììá: /* printf2.c */ /* Åêôýðùóç êëáóìáôéêþí áñéèìþí ìå ÷ñÞóç ôçò óõíÜñôçóçò printf() */ main() { float a,b,c,d,e,f; a=3.0; b=12.5; c=523.3; d=300.0; e=1200.5; f=5300.3; printf("|%.1f|%.1f|%.1f|\n",a,b,c); printf("|%.1f|%.1f|%.1f|\n\n",d,e,f); printf("|%8.1f|%8.1f|%8.1f|\n",a,b,c); printf("|%8.1f|%8.1f|%8.1f|\n\n",d,e,f); printf("|%-8.1f|%-8.1f|%-8.1f|\n",a,b,c); printf("|%-8.1f|%-8.1f|%-8.1f|\n\n",d,e,f); }
Ôï áðïôÝëåóìá ðïõ ðáßñíïõìå áí ôñÝîïõìå ôï ðáñáðÜíù ðñüãñáììá åßíáé áõôü ðïõ öáßíåôáé ðáñáêÜôù. ÐñïóðáèÞóôå íá åñìçíåýóåôå áõôü ôï áðïôÝëåóìá. |3.0|12.5|523.3| |300.0|1200.5|5300.3| | |
3.0| 300.0|
|3.0 |300.0
Áè. Å. Êïõôóïíéêüëáò
12.5| 1200.5|
|12.5 |1200.5
523.3| 5300.3|
|523.3 |5300.3
| |
H Ãëþóóá Ðñïãñáììáôéóìïý C
30
4.3.2
™À¡zƒ ™ scanf()
Ç óõíÜñôçóç scanf() ìðïñåß íá äéáâÜæåé ôéìÝò ãéá ìåôáâëçôÝò üëùí ôùí âáóéêþí ôýðùí äåäïìÝíùí êáé íá ìåôáôñÝðåé áõôüìáôá ôïõò áñéèìïýò óôçí êáôÜëëçëç åóùôåñéêÞ ìïñöÞ. Ç ãåíéêÞ ìïñöÞ ôçò scanf() åßíáé: scanf(áëöáñéèìçôéêü_åëÝã÷ïõ , ëßóôá_ïñéóìÜôùí)
Ôï áëöáñéèìçôéêü åëÝã÷ïõ óôç scanf() áðïôåëåßôáé áðü óôïé÷åßá ôñéþí ôýðùí: (á) êáèïñéóôÝò ìïñöÞò, (â) ÷áñáêôÞñåò êåíþí, (ã) ÷áñáêôÞñåò ìç-êåíþí. ÊÜèå êáèïñéóôÞò ìïñöÞò áñ÷ßæåé ìå ôï óýìâïëï % êáé óôç óõíÝ÷åéá ðåñéÝ÷åé Ýíá ÷áñáêôÞñá ï ïðïßïò ðëçñïöïñåß ôç scanf() ãéá ôïí ôýðï ôùí äåäïìÝíùí ðïõ èá äéáâÜóåé óôç óõíÝ÷åéá. Ïé êáèïñéóôÝò ìïñöÞò ãéá ôçí scanf()öáßíïíôáé óôïí Ðßíáêá 4.1. ÌïñöÞ
ÊáèïñéóôÝò ÌïñöÞò printf()
scanf()
%c %c ÷áñáêôÞñáò %d Þ %i %d ðñïó/ìÝíïò äåêáäéêüò áêÝñáéïò %e %e Þ %f êéíçôÞò õðïäéáóôïëÞò (åêèåôéêÞ ìïñöÞ) %f %e Þ %f êéíçôÞò õðïäéáóôïëÞò (ôõðïðïéçìÝíç ìïñöÞ) %g êéíçôÞò õðïäéáóôïëÞò (%e Þ %f üðïéï åßíáé ðéï ìéêñü) %o %o áðñüóçìïò ïêôáäéêüò áêÝñáéïò %s %s áëöáñéèìçôéêü %u %u áðñüóçìïò äåêáäéêüò áêÝñáéïò %x %x áðñüóçìïò äåêáåîáäéêüò áêÝñáéïò %p %p äåßêôçò %ld,%li,%lo,%lu,%lx %D,%U,%O,%X Þ %ld ê.ë.ð. long áêÝñáéïé %hd,%hi,%ho,%hu,%hx %hd,%hi,%ho,%hu,%hx short áêÝñáéïé Ðßíáêáò 4.1: Ïé êáèïñéóôÝò ìïñöÞò ôùí scanf() êáé printf()
Åíáò ÷áñáêôÞñáò êåíïý ìÝóá óôï áëöáñéèìçôéêü åëÝã÷ïõ õðï÷ñåþíåé ôçí scanf() íá áãíïÞóåé Ýíáí Þ ðåñéóóüôåñïõò ÷áñáêôÞñåò êåíïý ðïõ äßíïíôáé ùò
åßóïäïò. Åíáò ÷áñáêôÞñáò êåíïý åßíáé åßôå Ýíá êåíü äéÜóôçìá, åßôå Ýíáò óôçëïãíþìïíáò (tab), Þ ìßá íÝá ãñáììÞ. ÏõóéáóôéêÜ Ýíáò ÷áñáêôÞñáò ëåõêïý êåíïý ìÝóá óôï áëöáñéèìçôéêü åëÝã÷ïõ õðï÷ñåþíåé ôçí scanf() íá äéáâÜóåé, áëëÜ ü÷é êáé íá áðïèçêåýóåé, ïðïéïíäÞðïôå áñéèìü ÷áñáêôÞñùí ëåõêïý êåíïý, ìÝ÷ñé íá óõíáíôçèåß ï ðñþôïò ÷áñáêôÞñáò ìç-êåíïý. Åíáò ÷áñáêôÞñáò ìç-êåíïý ìÝóá óôï áëöáñéèìçôéêü åëÝã÷ïõ õðï÷ñåþíåé ôçí scanf() íá äéáâÜóåé êáé íá áðïññßøåé êÜðïéï óõãêåêñéìÝíï ÷áñáêôÞñá. Ãéá ðáñÜäåéãìá ôï áëöáñéèìçôéêü åëÝã÷ïõ
Åßóïäïò - Åîïäïò Êïíóüëáò
31
"%d,%d" õðï÷ñåþíåé ôçí scanf() íá äéáâÜóåé ðñþôá Ýíáí áêÝñáéï, óôç óõíÝ÷åéá íá äéáâÜóåé êáé íá áðïññßøåé Ýíá êüììá êáé ôÝëïò íá äéáâÜóåé Ýíáí Üëëïí áêÝñáéï. Ïëåò ïé ìåôáâëçôÝò ðïõ ÷ñçóéìïðïéïýíôáé ãéá íá äÝ÷ïíôáé ôéìÝò ìÝóù ôçò scanf() ðñÝðåé íá ðåñíÜíå ìÝóù ôùí äéåõèýíóåþí ôïõò. Ãéá íá áíáöåñèïýìå óôç äéåýèõíóç ìßáò ìåôáâëçôÞò ôýðïõ ÷áñáêôÞñá Þ áñéèìïý, ðñÝðåé ìðñïóôÜ áðü ôï üíïìá ôçò ìåôáâëçôÞò íá ôïðïèåôïýìå ôï óýìâïëï & ðïõ ëÝãåôáé ôåëåóôÞò äéåýèõíóçò. ÊÜèå ìåôáâëçôÞ êáôáëáìâÜíåé óõãêåêñéìÝíç èÝóç óôç ìíÞìç ôïõ Ç/Õ êáé ç äéåýèõíóç ôïõ ðñþôïõ byte ìíÞìçò ðïõ êáôáëáìâÜíåé ç ìåôáâëçôÞ ëÝãåôáé äéåýèõíóç ôçò ìåôáâëçôÞò. Áò õðïèÝóïõìå üôé óå Ýíá ðñüãñáììá Ý÷ïõìå äçëþóåé ìßá ìåôáâëçôÞ áêåñáßïõ ôýðïõ ìå üíïìá num êáé ôçò Ý÷ïõìå äþóåé ôçí ôéìÞ 2. Áí áñãüôåñá ôï ðñüãñáììá áíáöåñèåß óôï üíïìá ôçò ìåôáâëçôÞò (num) ï ìåôáãëùôôéóôÞò èá åðéóôñÝøåé ôçí ôéìÞ ðïõ åßíáé áðïèçêåõìÝíç óôç ìåôáâëçôÞ, äçëáäÞ 2. Áí üìùò áíáöåñèïýìå óôï üíïìá ôçò ìåôáâëçôÞò âÜæïíôáò ìðñïóôÜ ôï & (&num) ï ìåôáãëùôôéóôÞò èá åðéóôñÝøåé ôç äéåýèõíóç óôçí ïðïßá åßíáé áðïèçêåõìÝíç ç num. Ôï ðáñáêÜôù ðñüãñáììá äåß÷íåé áõôÞ ôç ëåéôïõñãßá: /* testaddr.c */ /* Åêôýðùóç ôçò äéåýèõíóçò ìßáò ìåôáâëçôÞò */ main() { int num=2; printf("\nÔéìÞ=%d Äéåýèõíóç=%ld",num,&num); getch(); }
Ôï áðïôÝëåóìá åßíáé: ÔéìÞ=2
Äéåýèõíóç=196562
Åßíáé óßãïõñï üôé ç äéåýèõíóç èá åßíáé äéáöïñåôéêÞ óå äéáöïñåôéêü Ç/Õ.
4.4 1.
z™ ™ ™ ÐëçêôñïëïãÞóôå êáé åêôåëÝóôå ôá ðáñáêÜôù ðñïãñÜììáôá. Åñìçíåýóôå ôá áðïôåëÝóìáôá: /* printf3.c */ /* ×ñÞóç ôçò óõíÜñôçóçò printf() */ main() { char c='a'; int i=1234; float x=-123.456789; printf("|%c|%s|%d|%f|%e|\n",c,"hello",i,x,x); printf("|%2c|%8s|%5d|%12f|%-13e|\n",c,"hello",i,x,x); printf("|%-2c|%-8s|%-5d|%-12f|%-13e|\n",c,"hello",i,x,x); printf("|%0c|%6s|%3d|%10f|%11e|\n",c,"hello",i,x,x); } /* ************************************************************* */
Áè. Å. Êïõôóïíéêüëáò
32
H Ãëþóóá Ðñïãñáììáôéóìïý C
/* printf4.c */ /* ×ñÞóç ôçò óõíÜñôçóçò printf() */ main() { char c='a'; int i=1234; float x=-123.456789; printf("|%13.2f|%13.2e|\n",x,x); printf("|%13.0f|%13.0e|\n",x,x); printf("|%13.26f|\n",x); printf("|%40.32f|\n",x); printf("|%6.1c|%6.1d|\n",c,i); printf("|%8.35s|%8.1s|%8.0s|\n","hello","hello","hello"); } /* ************************************************************* */ /* printf5.c */ /* ×ñÞóç ôçò óõíÜñôçóçò printf() */ main() { char c='a'; int i=1234; float x=-123.456789; printf("|%c|%d|%f|\n",c,c,c); printf("|%s|%d|%f|\n","hello","hello","hello"); printf("|%c|%d|%f|\n",i,i,i); printf("|%f|%d|\n",x,x); } /* ************************************************************* */ /* scanf1.c */ /* ×ñÞóç ôçò óõíÜñôçóçò scanf() */ main() { int set; char game; float time; printf("Äþóå áñéèìü ôïõ óåô, ãñÜììá áãþíá êáé þñá: "); scanf("%d %c %f", &set, &game, &time); printf("To %do óåô ôïõ %c áãþíá äéÞñêåóå ",set,game); printf("%1f ëåðôÜ\n",time); }
5.
¡ § ™ ¶ § ° ™ z ¶z¡z§ æ ™ Óôï Ó÷Þìá 5.1 öáßíïíôáé ïé äéÜöïñïé ôýðïé ôùí åíôïëþí ôçò C. ÅíôïëÝò ôçò C
Êáôá÷þñçóçò
ÄïìçìÝíåò
goto
ÅðáíÜëçøçò
ÅðéëïãÞò
Óýíèåôåò
if-else
switch
while
do-while
for
Ó÷Þìá 5.1: Ïé åíôïëÝò ôçò C
Ìßá åíôïëÞ êáôá÷þñçóçò Þ áðüäïóçò ôéìÞò, üðùò Ý÷ïõìå äåé óôéò § 3.3 êáé 3.4 åßíáé ôçò ìïñöÞò: ìåôáâëçôÞ = ðáñÜóôáóç;
Ó'áõôü ôï êåöÜëáéï èá åîåôÜóïõìå ôéò äïìçìÝíåò åíôïëÝò.
5.1
™À¡£ ¡ §
Ïðùò Ý÷ïõìå áíáöÝñåé óôçí § 3.4, ìßá ðáñÜóôáóç üðùò ç x=0, ç i++, Þ ç printf(...) ãßíåôáé åíôïëÞ (statement) üôáí áêïëïõèåßôáé áðü åëëçíéêü åñùôçìáôéêü (;), üðùò óôéò: x=0; i++; printf(...);
Óôç C, ôï åëëçíéêü åñùôçìáôéêü åßíáé óçìåßï ôåñìáôéóìïý åíôïëþí, êé ü÷é äéá÷ùñéóôéêü üðùò åßíáé óå Üëëåò ãëþóóåò, ð.÷. óôçí Pascal. Óôçí ðåñßðôùóç ðïõ èÝëïõìå ðåñéóóüôåñåò áðü ìßá åíôïëÝò íá åßíáé óõíôáêôéêÜ éóïäýíáìåò ìå ìßá ìüíï åíôïëÞ (áõôü èá ãßíåé ðåñéóóüôåñï êáôáíïçôü óôçí åîÝôáóç ôùí åíôïëþí if-else, switch, while, do, for ðïõ èá ãßíåé ðáñáêÜôù)
34
H Ãëþóóá Ðñïãñáììáôéóìïý C
ôüôå ðñÝðåé íá ïìáäïðïéÞóïõìå áõôÝò ôéò åíôïëÝò óå ìßá óýíèåôç åíôïëÞ Þ ìðëïê, ÷ñçóéìïðïéþíôáò ôá Üãêéóôñá { êáé }. Ç óýíèåôç åíôïëÞ ëáìâÜíåôáé áðü ôï ìåôáãëùôôéóôÞ ïëüêëçñç (ôï {, ïé åíôïëÝò ðïõ ðåñéÝ÷åé êáé ôï }) ùò ìßá åíôïëÞ ôçò C, ìå ôï åëëçíéêü åñùôçìáôéêü áíôéëçðôü. Åôóé äå ÷ñåéÜæåôáé íá ôïðïèåôïýìå åëëçíéêü åñùôçìáôéêü ìåôÜ ôï Üãêéóôñï êëåéóßìáôïò (}).
5.2
¡ § ¶ § ° ™ if-else
Ç åíôïëÞ if-else ÷ñçóéìïðïéåßôáé ãéá ôçí õðü óõíèÞêç åêôÝëåóç åíôïëþí. Ç ãåíéêÞ ìïñöÞ ôçò åßíáé: if (ðáñÜóôáóç) åíôïëÞ1 else åíôïëÞ2
üðïõ ôï ôìÞìá ôïõ else åßíáé ðñïáéñåôéêü. Áí ç ðáñÜóôáóç åßíáé áëçèÞò (äéáöïñåôéêÞ ôïõ ìçäåíüò) ôüôå åêôåëåßôáé ç åíôïëÞ1. Áí åßíáé øåõäÞò (ßóç ìå ìçäÝí) êáé áí õðÜñ÷åé ôï ôìÞìá else, åêôåëåßôáé ç åíôïëÞ2, üðùò öáßíåôáé óôï Ó÷Þìá 5.2. Ïé åíôïëÞ1 êáé åíôïëÞ2 ìðïñïýí íá åßíáé ôüóï áðëÝò üóï êáé óýíèåôåò åíôïëÝò. Åóôù ôï áêüëïõèï ôìÞìá êþäéêá:
(ðáñÜóôáóç) !=0
==0
åíôïëÞ 2
åíôïëÞ 1
Ó÷Þìá 5.2: Ç åíôïëÞ if-else
if (x>=0) sum1 +=x; else { sum1 -=x; sum2--; }
üôáí ç ìåôáâëçôÞ x åßíáé ìåãáëýôåñç Þ ßóç ìå ôï ìçäÝí, ç ôéìÞ ôçò ìåôáâëçôÞò sum1 áõîÜíåôáé êáôÜ x. Óôçí ðåñßðôùóç ðïõ ç ìåôáâëçôÞ x åßíáé ìéêñüôåñç ôïõ ìçäåíüò ôüôå ç ôéìÞ ôçò ìåôáâëçôÞò sum1 ìåéþíåôáé êáôÜ x êáé ç ôéìÞ ôçò ìåôáâëçôÞò sum2 ìåéþíåôáé êáôÜ 1. Ïðùò âëÝðïõìå ìåôÜ ôï else áêïëïõèåß ìßá óýíèåôç åíôïëÞ. Ìå ôçí åõêáéñßá, ðñïóÝîôå ôï åëëçíéêü åñùôçìáôéêü ðñéí áðü ôï else, åßíáé áðáñáßôçôï !! Áò äïýìå ôþñá Ýíá áðëü ðñüãñáììá ôï ïðïßï âñßóêåé ôï ìåãáëýôåñï áðü äýï ðñáãìáôéêïýò áñéèìïýò ðïõ ðëçêôñïëïãåß ï ÷ñÞóôçò. Áñ÷éêÜ õðïèÝôïõìå üôé ìåãáëýôåñïò åßíáé ï ðñþôïò áñéèìüò êáé ôïí êáôá÷ùñïýìå óôç ìåôáâëçôÞ max, óôç óõíÝ÷åéá óõãêñßíïõìå ôçí ôéìÞ ôçò max ìå ôï äåýôåñï áñéèìü, áí ï äåýôåñïò áñéèìüò åßíáé ìåãáëýôåñïò áðü ôçí ôéìÞ ôçò max, ôüôå êáôá÷ùñïýìå ôï äåýôåñï áñéèìü óôç ìåôáâëçôÞ max. ÔÝëïò ôõðþíïõìå ôçí ôéìÞ ôçò max. Ìå ôçí ßäéá ëïãéêÞ ìðïñïýìå íá õðïëïãßóïõìå ôï ìåãáëýôåñï áðü ðåñéóóüôåñïõò áðü äýï áñéèìïýò:
ÅíôïëÝò ÅðéëïãÞò êáé ÅðáíÜëçøçò
35
/* max1.c */ /* ×ñÞóç ôçò if ãéá åýñåóç ôïõ ìåãáëýôåñïõ áðü äýï áñéèìïýò */ main() { float x,y,max; puts("\nÄþóå äýï áñéèìïýò: "); scanf("%f %f", &x,&y); max=x; if (y>x) max=y; printf("\nÌåãáëýôåñïò åßíáé ï %.2f",max); }
Óôç óõíÝ÷åéá ðáñïõóéÜæåôáé Ýíá ðñüãñáììá ðïõ æçôÜåé Ýíáí áêÝñáéï áñéèìü êáé ôõðþíåé ôçí çìÝñá ôçò åâäïìÜäáò ðïõ áíôéóôïé÷åß ó'áõôüí (ôï 1 áíôéóôïé÷åß óôçí ÊõñéáêÞ êáé ôï 7 óôï ÓÜââáôï). Óôçí ðåñßðôùóç ðïõ ï áñéèìüò åßíáé ìåãáëýôåñïò ôïõ 7 Þ ìéêñüôåñïò ôïõ 1, ôõðþíåôáé êáôÜëëçëï ìÞíõìá: /* week1.c */ /* Åêôýðùóç çìÝñáò ôçò åâäïìÜäáò ðïõ áíôéóôïé÷åß óå Ýíáí áêÝñáéï */ main() { int i; printf("\nÄþóå Ýíáí áêÝñáéï áðü 1 Ýùò 7: "); scanf("%d",&i); if (i==1) puts("ÊõñéáêÞ"); if (i==2) puts("ÄåõôÝñá"); if (i==3) puts("Ôñßôç"); if (i==4) puts("ÔåôÜñôç"); if (i==5) puts("ÐÝìðôç"); if (i==6) puts("ÐáñáóêåõÞ"); if (i==7) puts("ÓÜââáôï"); if (i>7 || i<1) puts("Áêõñïò áñéèìüò"); }
5.2.1
¡£ ™ ¡ § ™ if
ÖõóéêÜ óå ìßá äïìÞ if-else ôüóï ç åíôïëÞ1 üóï êáé ç åíôïëÞ2 ìðïñïýí íá åßíáé åíôïëÝò if.
Ç áðëïýóôåñç ðåñßðôùóç åßíáé üôáí ç åíôïëÞ2 åßíáé åíôïëÞ if-else . Ôüôå ëÝìå üôé Ý÷ïõìå ìßá äïìÞ if-else-if, üðùò ðáñáêÜôù: if (ðáñÜóôáóç1) åíôïëÞ1 else if (ðáñÜóôáóç2) åíôïëÞ2 else ... else if (ðáñÜóôáóçn) åíôïëÞn else åíôïëÞn+1
Þ éóïäýíáìá
if (ðáñÜóôáóç1) åíôïëÞ1 else if (ðáñÜóôáóç2) åíôïëÞ2 else ... else if (ðáñÜóôáóçn) åíôïëÞn else åíôïëÞn+1
Ï ìåôáãëùôôéóôÞò õðïëïãßæåé ôéò ðáñáóôÜóåéò ìå ôç óåéñÜ êáé áí êÜðïéá ðáñÜóôáóç âñåèåß áëçèÞò (äéÜöïñç ôïõ ìçäåíüò) åêôåëåßôáé ç åíôïëÞ ðïõ
Áè. Å. Êïõôóïíéêüëáò
H Ãëþóóá Ðñïãñáììáôéóìïý C
36
ó÷åôßæåôáé ì'áõôÞí ôçí ðáñÜóôáóç êáé ç üëç áëõóßäá ôåñìáôßæåôáé. Áí êáìßá ðáñÜóôáóç äåí åßíáé áëçèÞò, ôüôå åêôåëåßôáé ç åíôïëÞ ðïõ ó÷åôßæåôáé ìå ôï ôåëéêü else. Åôóé ëïéðüí ôï ôåëåõôáßï else ÷åéñßæåôáé ôçí ðåñßðôùóç "ôßðïôá áðü ôá ðáñáðÜíù" (ðïõ ëÝãåôáé êáé "åî ïñéóìïý" ðåñßðôùóç). Áí äåí õðÜñ÷åé óõãêåêñéìÝíç åíÝñãåéá ãéá ôçí åî ïñéóìïý ðåñßðôùóç, ôüôå ôï ôåëåõôáßï else ìðïñåß íá ðáñáëåéöèåß. Ìðïñïýìå íá ÷ñçóéìïðïéÞóïõìå ôçí ðáñáðÜíù äïìÞ ãéá íá âåëôéþóïõìå ôï ðñüãñáììá week1.c ðïõ åßäáìå ðáñáðÜíù. Ç áñ÷éêÞ Ýêäïóç ôïõ ðñïãñÜììáôïò, åêôåëåß ìå ôç óåéñÜ üëåò ôéò åíôïëÝò if áêüìá êé áí êÜðïéá áðü ôéò ðñïçãïýìåíåò Ý÷åé ðñïêýøåé áëçèÞò êáé êáôÜ óõíÝðåéá äåí õðÜñ÷åé ðåñßðôùóç íá áëçèåýåé êáìßá åðüìåíç if. Åßíáé ðñïöáíÝò ôþñá ôé ðñÝðåé íá êÜíïõìå ãéá íá âåëôéþóïõìå ôï ðñüãñáììá (êÜíôå ôï !!).
Ìßá ðåñéóóüôåñï ðïëýðëïêç (ãéá ôïõò áñ÷Üñéïõò) ðåñßðôùóç åßíáé ç ðáñáêÜôù: if (ðáñÜóôáóç1) if (ðáñÜóôáóç2) åíôïëÞ1 else åíôïëÞ2
Ó'áõôÞ ôçí ðåñßðôùóç óå ðïéï if áíôéóôïé÷åß ôï else ; ÃåíéêÜ éó÷ýåé ï åðüìåíïò êáíüíáò: Åíá else áíôéóôïé÷åß óôï ôåëåõôáßï if ðïõ äåí Ý÷åé ôï äéêü ôïõ else. Åôóé óôçí ðáñáðÜíù ðåñßðôùóç ôï else áíôéóôïé÷åß óôï äåýôåñï if. Áí èÝëïõìå üìùò êÜðïéï else íá áíôéóôïé÷åß óôï ðñïçãïýìåíï if ðáñÜ ó'áõôü ðïõ èá áíôéóôïé÷ïýóå ðñáãìáôéêÜ, ðñÝðåé íá ÷ñçóéìïðïéÞóïõìå Üãêéóôñá ãéá íá ðåñéêëåßóïõìå ôï åíäéÜìåóï if. Åôóé áí èÝëáìå óôçí ðáñáðÜíù ðåñßðôùóç ôï else íá áíôéóôïé÷åß óôï ðñþôï if êáé ü÷é óôï äåýôåñï, èá Ýðñåðå íá ãñÜøïõìå: if (ðáñÜóôáóç1) { if (ðáñÜóôáóç2) åíôïëÞ1 } else åíôïëÞ2
5.2.2
§ ™ ™ ™À¡£ ™ ?:
Ï ôåëåóôÞò ?: åßíáé Ýíáò ôñéáäéêüò ôåëåóôÞò (ìå ôñåéò ôåëåóôÝïõò) ðïõ ÷ñçóéìïðïéåßôáé óôéò ðáñáóôÜóåéò õðü óõíèÞêç. Ìßá ðáñÜóôáóç õðü óõíèÞêç Ý÷åé ôçí ðáñáêÜôù ìïñöÞ: ðáñÜóôáóç1
?
ðáñÜóôáóç2
:
ðáñÜóôáóç3
Õðïëïãßæåôáé ðñþôá ç ðáñÜóôáóç1. Áí åßíáé ìç-ìçäåíéêÞ (áëçèÞò), õðïëïãßæåôáé ç ðáñÜóôáóç2 êáé áõôÞ åßíáé ç ôéìÞ ôçò ðáñÜóôáóçò õðü óõíèÞêç. ÄéáöïñåôéêÜ, õðïëïãßæåôáé ç ðáñÜóôáóç3 êáé áõôÞ åßíáé ç ôéìÞ ôçò ðáñÜóôáóçò õðü óõíèÞêç. Ìüíï ìßá áðü ôéò ðáñÜóôáóç2 êáé ðáñÜóôáóç3 õðïëïãßæåôáé. Ïé ðáñáóôÜóåéò õðü óõíèÞêç ÷ñçóéìïðïéïýíôáé ãéá íá áíôéêáèéóôïýí åíôïëÝò if-else ôçò ãåíéêÞò ìïñöÞò:
ÅíôïëÝò ÅðéëïãÞò êáé ÅðáíÜëçøçò
37
if (ðáñÜóôáóç1) ìåôáâëçôÞ=ðáñÜóôáóç2; else ìåôáâëçôÞ=ðáñÜóôáóç3;
ùò åîÞò: ìåôáâëçôÞ=ðáñÜóôáóç1 ? ðáñÜóôáóç2 : ðáñÜóôáóç3;
Ãéá ðáñÜäåéãìá ôï ðáñáêÜôù ôìÞìá êþäéêá ðïõ êáôá÷ùñåß óôçí max ôï ìåãáëýôåñï ôùí a êáé b: if (a>b) max=a; else max=b;
ìðïñåß íá ãñáöåß ùò: max=a>b?a:b;
5.3
H ¡ § ¶ § ° ™ switch
Ïðùò åßäáìå ðñïçãïõìÝíùò ç äïìÞ if-else-if åðéôñÝðåé ôçí åðéëïãÞ ìßáò êáôÜóôáóçò áðü Ýíá óýíïëï ðïëëþí êáôáóôÜóåùí ìå âÜóç ôçí ôéìÞ êÜðïéáò ðáñÜóôáóçò. Ç ãëþóóá C üìùò äéáèÝôåé ìßá ðïëõêëáäéêÞ åíôïëÞ áðïöÜóåùí, ôçí switch, ç ïðïßá åëÝã÷åé áí ç ôéìÞ ìßáò ðáñÜóôáóçò ôáõôßæåôáé ìå ìßá ôéìÞ áðü Ýíá óýíïëï óôáèåñþí áêåñáßùí ôéìþí, Þ ÷áñáêôÞñùí êáé äéáêëáäþíåôáé áíÜëïãá. Ôï óõíôáêôéêü ôçò åíôïëÞò switch åßíáé ôï áêüëïõèï: switch (ðáñÜóôáóç) { case óôáèåñÜ1 : åíôïëÝò1 case óôáèåñÜ2 : åíôïëÝò2 ... case óôáèåñÜn : åíôïëÝòn default : åíôïëÝò }
Ç ðáñÜóôáóç ðïõ áêïëïõèåß ôç ëÝîç switch ìðïñåß íá åßíáé: (i) Ìßá áêÝñáéá óôáèåñÜ üðùò 1, 2, 3 ... (ii) Ìßá óõíÜñôçóç ðïõ åðéóôñÝöåé áêÝñáéï áñéèìü (iii) Ìßá áñéèìçôéêÞ ðáñÜóôáóç, ðïõ äßíåé ùò ôéìÞ áêÝñáéï áñéèìü (iv) Åíáò ÷áñáêôÞñáò ÊÜèå ðåñßðôùóç (case) áêïëïõèåßôáé áðü ìßá óôáèåñÜ ðïõ ìðïñåß íá åßíáé ìßá áêÝñáéá óôáèåñÜ (ð.÷. 1), Ýíáò ÷áñáêôÞñáò (ð.÷. 'Â'), Þ ìßá áêÝñáéá áñéèìçôéêÞ ðáñÜóôáóç (ð.÷. 4*3+8). Äåí åðéôñÝðåôáé ðåñéóóüôåñåò áðü ìßá case íá Ý÷ïõí ôçí ßäéá óôáèåñÜ. Áñ÷éêÜ õðïëïãßæåôáé ç ôéìÞ ôçò ðáñÜóôáóçò êáé êáôüðéí åñåõíþíôáé Ýíá ðñïò Ýíá ôá case ãéá íá âñåèåß üìïéá ôéìÞ. Åöüóïí âñåèåß, ôüôå ç åêôÝëåóç óõíå÷ßæåôáé áðü ôçí åíôïëÞ ðïõ áêïëïõèåß ôçí case. ÄéáöïñåôéêÜ ç åêôÝëåóç óõíå÷ßæåôáé áðü ôçí ðñþôç åíôïëÞ ìåôÜ ôï default, áí õðÜñ÷åé. Áí êáìßá óôáèåñÜ äå óõìöùíåß ìå ôçí ôéìÞ ôçò ðáñÜóôáóçò êáé äåí õðÜñ÷åé default, ôüôå äåí ðñáãìáôïðïéåßôáé êáìßá åíÝñãåéá. Ôï default ìðïñåß íá ôåèåß ïðïõäÞðïôå áíÜìåóá óôéò case, ü÷é ìüíï óôï ôÝëïò. ×ñçóéìïðïéþíôáò ôçí åíôïëÞ switch ôï ðñüãñáììá week1.c ôçò § 5.2 ãñÜöåôáé ùò åîÞò:
Áè. Å. Êïõôóïíéêüëáò
38
H Ãëþóóá Ðñïãñáììáôéóìïý C
/* week2.c */ /* Åêôýðùóç çìÝñáò ôçò åâäïìÜäáò ðïõ áíôéóôïé÷åß óå Ýíáí áêÝñáéï */ main() { int i; printf("\nÄþóå Ýíáí áêÝñáéï áðü 1 Ýùò 7: "); scanf("%d",&i); switch (i) { case 1 : puts("ÊõñéáêÞ"); break; case 2 : puts("ÄåõôÝñá"); break; case 3 : puts("Ôñßôç"); break; case 4 : puts("ÔåôÜñôç"); break; case 5 : puts("ÐÝìðôç"); break; case 6 : puts("ÐáñáóêåõÞ"); break; case 7 : puts("ÓÜââáôï"); break; default: puts("Áêõñïò áñéèìüò"); } }
Áò ðñïóÝîïõìå ôç ÷ñÞóç ôçò åíôïëÞò break óôï ðáñáðÜíù ðñüãñáììá. Ç åíôïëÞ break ÷ñçóéìïðïéåßôáé åäþ ãéá íá ðñïêáëÝóåé Üìåóç Ýîïäï áðü ôçí switch. ÅðåéäÞ ïé case åîõðçñåôïýí áðëþò óáí óçìåßá üðïõ ìåôáöÝñåôáé ï Ýëåã÷ïò ôïõ ðñïãñÜììáôïò (åôéêÝôåò), ìåôÜ ôçí åêôÝëåóç ôïõ êþäéêá êÜðïéáò case ôï ðñüãñáììá óõíå÷ßæåé ìå ôïí êþäéêá ôçò åðüìåíçò case ê.ï.ê. Ýùò üôïõ öôÜóåé óå êÜðïéá break Þ óôï ôÝëïò ôçò åíôïëÞò switch. Ùóôüóï ìðïñïýìå íá åêìåôáëëåõôïýìå, óå ìåñéêÝò ðåñéðôþóåéò, ôç óõíÝ÷éóç ôçò åêôÝëåóçò ôïõ êþäéêá ôçò åðüìåíçò case, üðùò öáßíåôáé óôï ðáñáêÜôù ðñüãñáììá, üðïõ õðïëïãßæåôáé ìå Ýíáí "Ýîõðíï" ôñüðï ôï ðáñáãïíôéêü åíüò áñéèìïý: /* fact1.c */ /* Õðïëïãéóìüò ðáñáãïíôéêïý åíüò áêåñáßïõ óôï äéÜóôçìá 1..8 */ main() { int number; unsigned int factorial=1; printf("\nÄþóå áêÝñáéï: "); scanf("%d",&number); switch (number) { case 8 : factorial=8; case 7 : factorial *=7; case 6 : factorial *=6; case 5 : factorial *=5; case 4 : factorial *=4; case 3 : factorial *=3; case 2 : factorial *=2; case 1 : case 0 : printf("Ôï ðáñáãïíôéêü ôïõ %d åßíáé %u\n",number,factorial); break; default: printf("Äå ìðïñþ íá õðïëïãßóù ôï ðáñáãïíôéêü ôïõ %d\n",number); } }
ÅíôïëÝò ÅðéëïãÞò êáé ÅðáíÜëçøçò
39
Åðßóçò áðü ôï ðáñáðÜíù ðñüãñáììá öáßíåôáé ðþò ìðïñïýìå íá áíôéóôïé÷Þóïõìå óå ðåñéóóüôåñåò áðü ìßá case ôçí ßäéá åíÝñãåéá (ôï ðáñáãïíôéêü ôüóï ôïõ 0 üóï êáé ôïõ 1 åßíáé 1). Óôï ðáñáêÜôù ôìÞìá êþäéêá áõôü öáßíåôáé êáëýôåñá. ÈÝëïõìå íá ÷áñáêôçñßóïõìå ôçí åðßäïóç åíüò ìáèçôÞ (A, B, C, D) áíÜëïãá ìå ôï âáèìü ôïõ (9-10, 7-8, 5-6, 0-4): switch (score) { case 10 : case 9 : grade='A'; break; case 8 : case 7 : grade='B'; break; case 6 : case 5 : grade='C'; break; case 4 : case 3 : case 2 : case 1 : case 0 : grade='D'; break; default : printf("\nÁêõñïò âáèìüò"); }
5.4
¡ § ¶z¡z§ æ ™ while
Ç åíôïëÞ while åßíáé ìßá åíôïëÞ åðáíÜëçøçò êáé ÷ñçóéìïðïéåßôáé üôáí èÝëïõìå íá åêôåëåßôáé óõíÝ÷åéá êÜðïéá åíÝñãåéá üóï ìßá óõíèÞêç åßíáé áëçèÞò. Ç åíôïëÞ while Ý÷åé ôçí áêüëïõèç ìïñöÞ: while (ðáñÜóôáóç) åíôïëÞ
Ç åíôïëÞ ðïõ áêïëïõèåß ôï while ìðïñåß íá åßíáé ïðïéáäÞðïôå áðëÞ Þ óýíèåôç åíôïëÞ. Áñ÷éêÜ õðïëïãßæåôáé ç ðáñÜóôáóç êáé áí åßíáé ìç-ìçäåíéêÞ, åêôåëåßôáé ç åíôïëÞ êáé ç ðáñÜóôáóç õðïëïãßæåôáé îáíÜ. Ï âñü÷ïò óõíå÷ßæåôáé ìÝ÷ñé íá ãßíåé ç ðáñÜóôáóç ìçäÝí, ïðüôå ç åêôÝëåóç óõíå÷ßæåôáé áðü ôï óçìåßï ìåôÜ ôçí åíôïëÞ, üðùò öáßíåôáé óôï Ó÷Þìá 5.3. Ôï áêüëïõèï ðñüãñáììá ÷ñçóéìïðïéåß Ýíá âñü÷ï
(ðáñÜóôáóç)
==0
!=0
åíôïëÞ
Ó÷Þìá 5.3: Ç åíôïëÞ while
while ãéá íá ôõðþóåé ôïõò áñéèìïýò 0 Ýùò 9 üðùò
åðßóçò êáé ôï ôñÝ÷ïí Üèñïéóìá: /* wloop.c */ /* Åêôýðùóç ôùí áñéèìþí áðü 0 ùò 9 êáé ôïõ ôñÝ÷ïíôïò áèñïßóìáôïò */ main() { int count=0; int total=0; while(count<10) printf("ÌåôñçôÞò=%d, Áèñïéóìá=%d\n", count++, total+=count); }
Ôï áðïôÝëåóìá ôïõ ðñïãñÜììáôïò åßíáé:
Áè. Å. Êïõôóïíéêüëáò
40
H Ãëþóóá Ðñïãñáììáôéóìïý C
ÌåôñçôÞò=0, ÌåôñçôÞò=1, ÌåôñçôÞò=2, ÌåôñçôÞò=3, ÌåôñçôÞò=4, ÌåôñçôÞò=5, ÌåôñçôÞò=6, ÌåôñçôÞò=7, ÌåôñçôÞò=8, ÌåôñçôÞò=9,
Áèñïéóìá=0 Áèñïéóìá=1 Áèñïéóìá=3 Áèñïéóìá=6 Áèñïéóìá=10 Áèñïéóìá=15 Áèñïéóìá=21 Áèñïéóìá=28 Áèñïéóìá=36 Áèñïéóìá=45
Ï âñü÷ïò while åßíáé ï ðëÝïí êáôÜëëçëïò óå ðåñéðôþóåéò ðïõ äåí åßíáé ãíùóôüò åê ôùí ðñïôÝñùí ï áñéèìüò ôùí åðáíáëÞøåùí êáé ï âñü÷ïò ìðïñåß íá ôåñìáôéóôåß áðñüóìåíá áðü óõíèÞêåò ðïõ áíáêýðôïõí ìÝóá óôï âñü÷ï. Ùò ðáñÜäåéãìá áò äïýìå ôï ðáñáêÜôù ðñüãñáììá: /* charcnt.c */ /* Áðáñßèìçóç ÷áñáêôÞñùí ðñüôáóçò */ main() { int count=0; printf("ÃñÜøå ìéá ðñüôáóç (ãéá ôÝëïò äþóå ENTER):\n"); while(getche() != '\r') count++ ; printf("\nÏ áñéèìüò ôùí ÷áñáêôÞñùí åßíáé %d\n",count); }
Áõôü ôï ðñüãñáììá ìáò ðñïóêáëåß íá ðëçêôñïëïãÞóïõìå ìßá ðñüôáóç. Êáèþò åéóÜãïõìå êÜèå ÷áñáêôÞñá ôï ðñüãñáììá áðáñéèìåß ôïõò ÷áñáêôÞñåò ðïõ ðëçêôñïëïãïýìå êáé üôáí ðáôÜìå ENTER ôõðþíåé ôï óýíïëï. ÐñïóÝîôå ôï ÷áñáêôÞñá '\r' ðïõ óçìáßíåé åðáíáöïñÜ êåöáëÞò (âëÝðå § 2.3.2). Ç åíôïëÞ óôï âñü÷ï while ìðïñåß íá åßíáé êáé ç êåíÞ åíôïëÞ. Ç êåíÞ åíôïëÞ åßíáé áðëþò Ýíá åëëçíéêü åñùôçìáôéêü (;), ç åêôÝëåóç áõôÞò ôçò åíôïëÞò äåí Ý÷åé êáíÝíá Üëëï áðïôÝëåóìá åêôüò ôçò êáèõóôÝñçóçò. Ãéá ðáñÜäåéãìá ï ðáñáêÜôù âñü÷ïò èá åêôåëåßôáé óõíÝ÷åéá ìÝ÷ñé íá ðëçêôñïëïãÞóïõìå ôï ÷áñáêôÞñá 'Á': while((ch=getche())!='A') ;
Ðñéí áöÞóïõìå ôï âñü÷ï while èá äïýìå äýï ðáñáäåßãìáôá. Ôï ðñþôï õðïëïãßæåé ôï ðáñáãoíôéêü åíüò áñéèìïý (óõãêñßíôå ìå ôï fact1.c ôçò § 5.3): /* fact2.c */ /* Õðïëïãéóìüò ðáñáãïíôéêïý åíüò ìç-áñíçôéêïý áêåñáßïõ */ main() { unsigned long int factorial; int number; printf("\nÄþóå áêÝñáéï: "); scanf("%d",&number); factorial=1; while (number>1) factorial *=number--; printf("Ôï ðáñáãïíôéêü åßíáé: %lu\n",factorial); }
Ôï äåýôåñï ðáñÜäåéãìá õðïëïãßæåé ôçí ôéìÞ ôïõ áèñïßóìáôïò S=1+1/2+1/3+...+1/n
ãéá äïóìÝíï êÜèå öïñÜ n.
ÅíôïëÝò ÅðéëïãÞò êáé ÅðáíÜëçøçò
41
/* series1.c */ /* Õðïëïãéóìüò ôïõ áèñïßóìáôïò 1+1/2+1/3+...+1/n */ main() { unsigned long int n, i=0; float sum=0.0; puts("Äþóå ôï ðëÞèïò ôùí üñùí:"); scanf("%U",&n); while (i<n) sum+=1.0/++i; printf("Ïé %lu üñïé ôçò óåéñÜò Ý÷ïõí Üèñïéóìá %.6f\n",n,sum); }
5.5
¡ § ¶z¡z§ æ ™ do-while
Ïðùò åßäáìå óôçí ðñïçãïýìåíç ðáñÜãñáöï, ï âñü÷ïò while åëÝã÷åé ôç óõíèÞêç ôåñìáôéóìïý óôçí áñ÷Þ ôïõ âñü÷ïõ. Áíôßèåôá ï âñü÷ïò do-while, ôçí åëÝã÷åé óôï ôÝëïò ôïõ, áöïý óõìðëçñùèåß êÜèå ðÝñáóìá áðü ôï óþìá ôïõ âñü÷ïõ. Åôóé ôï óþìá ôïõ âñü÷ïõ åêôåëåßôáé ðÜíôïôå ôïõëÜ÷éóôïí ìßá öïñÜ. Ç ãåíéêÞ ìïñöÞ ôïõ âñü÷ïõ do-while åßíáé ç áêüëïõèç: do åíôïëÞ while (ðáñÜóôáóç);
åíôïëÞ
!=0
(ðáñÜóôáóç) ==0
üðïõ åíôïëÞ ìðïñåß íá åßíáé ïðïéáäÞðïôå áðëÞ Þ óýíèåôç åíôïëÞ ôçò C. Åêôåëåßôáé ç åíôïëÞ êáé ìåôÜ õðïëïãßæåôáé ç ðáñÜóôáóç. Áí åßíáé áëçèÞò (ìçÓ÷Þìá 5.4: H åíôïëÞ do-while ìçäåíéêÞ) åêôåëåßôáé îáíÜ ê.ï.ê. Ïôáí ç ðáñÜóôáóç ãßíåé øåõäÞò (ìçäåíéêÞ), ï âñü÷ïò ôåñìáôßæåôáé, üðùò öáßíåôáé óôï Ó÷Þìá 5.4. Ìßá åíôïëÞ while ãßíåôáé éóïäýíáìç ìßáò do-while êáé ìßá do-while ãßíåôáé éóïäýíáìç ìßáò åíôïëÞò while, ùò áêïëïýèùò: while(ðáñÜóôáóç) åíôïëÞ
if(ðáñÜóôáóç) do åíôïëÞ do åíôïëÞ while(ðáñÜóôáóç) åíôïëÞ while(ðáñÜóôáóç) åíôïëÞ while(ðáñÜóôáóç)
Ôï ãíùóôü ìáò ðñüãñáììá ðïõ ôõðþíåé ôïõò áñéèìïýò áðü 0 Ýùò 9 êáé ôï ôñÝ÷ïí Üèñïéóìá, ÷ñçóéìïðïéþíôáò ôçí åíôïëÞ do-while ãßíåôáé: /* doloop.c */ /* Åêôýðùóç ôùí áñéèìþí áðü 0 ùò 9 êáé ôïõ ôñÝ÷ïíôïò áèñïßóìáôïò */ main() { int count=0; int total=0; do printf("ÌåôñçôÞò=%d, Áèñïéóìá=%d\n", count++, total+=count); while(count<10); }
Áè. Å. Êïõôóïíéêüëáò
42
H Ãëþóóá Ðñïãñáììáôéóìïý C
Ôï áðïôÝëåóìá åßíáé ôï ßäéï ìå áõôü ôïõ wloop.c. To ðáñáêÜôù ðñüãñáììá õðïëïãßæåé ôï ðëÞèïò (n) ôùí üñùí ôïõ áèñïßóìáôïò S=1+1/2+1/3+...+1/n
ðïõ ÷ñåéÜæïíôáé þóôå ôï Üèñïéóìá íá ãßíåé ìåãáëýôåñï áðü êÜðïéï üñéï: /* series2.c */ /* Õðïëïãéóìüò ôïõ ðëÞèïõò ôùí üñùí ôïõ áèñïßóìáôïò 1+1/2+1/3+... */ /* Ýùò üôïõ áõôü ãßíåé ìåãáëýôåñï áðü êÜðïéï äåäïìÝíï üñéï */ main() { unsigned long int n=0; /* ôï ðëÞèïò ôùí üñùí */ float limit,sum=0; /* ôï üñéï êáé ôï Üèñïéóìá */ puts("Äþóå ôï üñéï:"); scanf("%f",&limit); do { n++; sum+=1.0/n; } while (sum<=limit); printf("Ïé áñéèìüò ôùí üñùí åßíáé %lu\n",n); }
5.6
¡ § ¶z¡z§ æ ™ for
Ç ãåíéêÞ ìïñöÞ ôçò åíôïëÞò for åßíáé ç áêüëïõèç: for (ðáñÜóôáóç1 ; ðáñÜóôáóç2 ; ðáñÜóôáóç3) åíôïëÞ
Óôç óõíçèÝóôåñç ðåñßðôùóç, ïé ðáñÜóôáóç1 êáé ðáñÜóôáóç3 åßíáé ðáñáóôÜóåéò áðüäïóçò ôéìÞò êáé ç ðáñÜóôáóç óõó÷Ýôéóçò. Ç ðáñÜóôáóç2 åßíáé ðáñÜóôáóç1 ÷ñçóéìïðïéåßôáé ãéá íá äßíåôáé áñ÷éêÞ ôéìÞ óôç ìåôáâëçôÞ åëÝã÷ïõ ôïõ âñü÷ïõ. Ç ðáñÜóôáóç2 , ùò óõó÷åôéóôéêÞ ðáñÜóôáóç, åëÝã÷åé ôç ìåôáâëçôÞ åëÝã÷ïõ ôïõ âñü÷ïõ óå ó÷Ýóç ìå ìßá ôéìÞ, ãéá íá êáèïñßóåé ôç óôéãìÞ åîüäïõ áðü ôï âñü÷ï. Áí ç ðáñÜóôáóç2 åßíáé áëçèÞò (ìç-ìçäåíéêÞ) ç åíôïëÞ åêôåëåßôáé, äéáöïñåôéêÜ ï âñü÷ïò ôåñìáôßæåôáé. ÌåôÜ ôçí åêôÝëåóç ôçò åíôïëÞò áðïôéìÜôáé ç ðáñÜóôáóç3 ç ïðïßá êáèïñßæåé ôïí ôñüðï ìåôáâïëÞò ôçò ìåôáâëçôÞò åëÝã÷ïõ ôïõ âñü÷ïõ (âÞìá), êÜèå öïñÜ ðïõ åðáíáëáìâÜíåôáé ï âñü÷ïò. Óôç óõíÝ÷åéá åëÝã÷åôáé ðÜëé ç ðáñÜóôáóç2 êé áí åßíáé áëçèÞò åêôåëåßôáé ç åíôïëÞ ê.ï.ê., âëÝðå Ó÷Þìá 5.5. Åßíáé ðñïöáíÝò üôé ç åíôïëÞ ìðïñåß íá åßíáé ïðïéáäÞðïôå áðëÞ Þ óýíèåôç åíôïëÞ ôçò C.
ðáñÜóôáóç 1
ðáñÜóôáóç 2
==0
!=0
åíôïëÞ ðáñÜóôáóç 3
Ó÷Þìá 5.5: H åíôïëÞ for
Ç åíôïëÞ for åßíáé éóïäýíáìç ìå ôçí áêüëïõèç åíôïëÞ while:
ÅíôïëÝò ÅðéëïãÞò êáé ÅðáíÜëçøçò
43
ðáñÜóôáóç1; while (ðáñÜóôáóç2) { åíôïëÞ ðáñÜóôáóç3; }
Ç åðéëïãÞ ôçò åíôïëÞò while Þ for åîáñôÜôáé áðü ôïí ðñïãñáììáôéóôÞ. ÓõíÞèùò ç åíôïëÞ for ÷ñçóéìïðïéåßôáé üôáí ãíùñßæïõìå åê ôùí ðñïôÝñùí ðüóåò öïñÝò èá åêôåëåóôåß ï âñü÷ïò. Ôï ãíùóôü ìáò ðñüãñáììá ðïõ ôõðþíåé ôïõò áñéèìïýò áðü ôï 0 Ýùò ôï 9 êáé ôï ôñÝ÷ïí Üèñïéóìá, ÷ñçóéìïðïéþíôáò ôçí åíôïëÞ for, ãßíåôáé: /* forloop.c */ /* Åêôýðùóç ôùí áñéèìþí áðü 0 ùò 9 êáé ôïõ ôñÝ÷ïíôïò áèñïßóìáôïò */ main() { int count, total=0; for(count=0,total=0; count<10; count++) printf("ÌåôñçôÞò=%d, Áèñïéóìá=%d\n",count,total+=count); }
Óôï ðñüãñáììá ðïõ áêïëïõèåß ãßíåôáé ÷ñÞóç ôùí åíôïëþí for êáé while ãéá ôçí åêôýðùóç üëùí ôùí ðñþôùí áñéèìþí áðü ôï 1 Ýùò êÜðïéï äåäïìÝíï üñéï. Åíáò áñéèìüò åßíáé ðñþôïò üôáí äåí Ý÷åé Üëëïõò äéáéñÝôåò åêôüò ôïõ åáõôïý ôïõ êáé ôçò ìïíÜäáò: /* prime.c */ /* Åýñåóç ôùí ðñþôùí áñéèìþí áðü ôï 1 Ýùò êÜðïéï äåäïìÝíï üñéï */ #include <math.h> main() { int nominator,number,prime,limit; printf("\nÄþóå ôï üñéï: "); scanf("%d",&limit); for(number=1;number<=limit;number++) { nominator=1; prime=1; while((++nominator<=sqrt(number)) && prime) if(number%nominator==0) prime=0; if(prime) printf("%5d",number); } }
ÏðïéáäÞðïôå áðü ôéò ôñåéò ðáñáóôÜóåéò ôçò åíôïëÞò for ìðïñåß íá ðáñáëåßðåôáé, üìùò ôá åëëçíéêÜ åñùôçìáôéêÜ ðñÝðåé íá ðáñáìÝíïõí. Ôçí Ýëëåéøç ôçò ðáñÜóôáóçò ï ìåôáãëùôôéóôÞò ôç èåùñåß ùò áëçèÞ ðáñÜóôáóç êé Ýôóé ìßá äïìÞ for ôçò ìïñöÞò: for(ðáñÜóôáóç1;
;ðáñÜóôáóç3) åíôïëÞ
åßíáé Ýíáò áôÝñìùí âñü÷ïò ðïõ äéáêüðôåôáé ìå Üëëá ìÝóá, üðùò ìßá åíôïëÞ break. Ç åíôïëÞ óôï âñü÷ï for ìðïñåß íá åßíáé ç êåíÞ åíôïëÞ. Ìå ôïí ôñüðï áõôü ìðïñïýìå íá äçìéïõñãïýìå âñü÷ïõò ÷ñïíéêÞò êáèõóôÝñçóçò, ð.÷.: for(i=0;i<1000;i++);
Áè. Å. Êïõôóïíéêüëáò
H ร รซรพรณรณรก ร รฑรฏรฃรฑรกรฌรฌรกรดรฉรณรฌรฏรฝ C
44
5.6.1
ย ย ยง โ ขย ย โ ข comma
ร รตรทรญร รณ'ร รญรก รขรฑรผรทรฏ for รฃร รญรฅรดรกรฉ รทรฑร รณรง รครฝรฏ ร รฐรฅรฑรฉรณรณรผรดรฅรฑรนรญ รฌรฅรดรกรขรซรงรดรพรญ รฅรซร รฃรทรฏรต รดรฏรต รขรฑรผรทรฏรต, รผรฐรนรฒ รฐ.รท. รณรดรฏ รฐรกรฑรกรชร รดรน รดรฌร รฌรก รชรพรครฉรชรก: for(x=0,y=0; x+y<100; x++,y++) printf("%d",x+y);
รฌรฅ รดรฏ รฏรฐรฏร รฏ รดรตรฐรพรญรฏรญรดรกรฉ รฏรฉ รกรฑรฉรจรฌรฏร รกรฐรผ 0 ร รนรฒ 98 รณรฅ รขร รฌรกรดรก รดรฏรต 2. ร รกรฑรกรดรงรฑรฏรฝรฌรฅ รผรดรฉ รทรฑรงรณรฉรฌรฏรฐรฏรฉรฅร รดรกรฉ รชรผรฌรฌรก (,) รณรดรฉรฒ รกรฑรทรฉรชร รฒ รดรฉรฌร รฒ รชรกรฉ รณรดรก รขร รฌรกรดรก. ร รดรงรญ รฐรฑรกรฃรฌรกรดรฉรชรผรดรงรดรก รดรฏ รชรผรฌรฌรก รฅร รญรกรฉ รดรฅรซรฅรณรดร รฒ รดรงรฒ C (รขรซร รฐรฅ ร ร รญรกรชรก 3.5) รชรกรฉ รซร รฃรฅรดรกรฉ รดรฅรซรฅรณรดร รฒ รณรฅรฉรฑรฉรกรชร รฒ รกรฐรฏรดร รฌรงรณรงรฒ รฌรฉรกรฒ รชรกรฉ รทรฑรงรณรฉรฌรฅรฝรฅรฉ รณรดรฏ รญรก รทรนรฑร รฆรฏรตรฌรฅ รฌร รก รซร รณรดรก รกรฐรผ ร รครฉรก รณรดรฏรฉรทรฅร รก รฐรฏรต รฐรฑรผรชรฅรฉรดรกรฉ รญรก รกรฐรฏรดรฉรฌรงรจรฏรฝรญ รฌรฅ รดรง รณรฅรฉรฑร รกรฐรผ รกรฑรฉรณรดรฅรฑร รฐรฑรฏรฒ รดรก รครฅรฎรฉร . ร รดรกรญ รฏ รดรฅรซรฅรณรดร รฒ รชรผรฌรฌรก รทรฑรงรณรฉรฌรฏรฐรฏรฉรฅร รดรกรฉ รณรดรง รครฅรฎรฉร รฐรซรฅรตรฑร รฌร รกรฒ รฐรกรฑร รณรดรกรณรงรฒ รกรฐรผรครฏรณรงรฒ รดรฉรฌร รฒ, รดรผรดรฅ รง รดรฉรฌร รฐรฏรต รกรฐรฏรคร รครฅรดรกรฉ รณรดรฏ รกรฑรฉรณรดรฅรฑรผ รฌร รซรฏรฒ (รชรกรฉ รชรกรดร รณรตรญร รฐรฅรฉรก รณรฅ รผรซรง รดรงรญ รฐรกรฑร รณรดรกรณรง) รฅร รญรกรฉ รง รดรฉรฌร รดรงรฒ รดรฅรซรฅรตรดรกร รกรฒ รฐรกรฑร รณรดรกรณรงรฒ รดรงรฒ รซร รณรดรกรฒ รดรนรญ รฐรกรฑรกรณรดร รณรฅรนรญ รฐรฏรต รทรนรฑร รฆรฏรญรดรกรฉ รฌรฅ รชรผรฌรฌรก. ร รฉรก รฐรกรฑร รครฅรฉรฃรฌรก, รผรดรกรญ รฅรชรดรฅรซรฅรณรดรฏรฝรญ รฏรฉ: y=10; x=(y-=5,100/y);
รดรฏ x รจรก ร รทรฅรฉ รดรงรญ รดรฉรฌร 20, รฅรฐรฅรฉรคร รง รกรฑรทรฉรชร รดรฉรฌร 10 รดรฏรต y รฌรฅรฉรพรญรฅรดรกรฉ รชรกรดร 5 รชรกรฉ รฌรฅรดร รกรตรดร รง รดรฉรฌร รครฉรกรฉรฑรฅร รดรฏ 100, รคร รญรฏรญรดรกรฒ รกรฐรฏรดร รซรฅรณรฌรก 20.
5.7 1.
zโ ขย ย โ ข ย โ ข ร รก รฃรฑรกรถรฅร รฐรฑรผรฃรฑรกรฌรฌรก รฐรฏรต รญรก รคร รทรฅรดรกรฉ รดรงรญ รดรฉรฌร รฅรญรผรฒ รกรฑรฉรจรฌรฏรฝ รชรกรฉ รญรก รขรฑร รณรชรฅรฉ รชรกรฉ รดรตรฐรพรญรฅรฉ รดรงรญ รกรฐรผรซรตรดรง รดรฉรฌร รกรตรดรฏรฝ.
2. ร รฉรก รญรก รตรฐร รฑรทรฅรฉ รดรฑร รฃรนรญรฏ รฌรฅ รฐรซรฅรตรฑร รฒ a, b, c รฐรฑร รฐรฅรฉ รญรก รฉรณรทรฝรฅรฉ: a<b+c รชรกรฉ b<a+c รชรกรฉ c<a+b. ร รฑร รธรดรฅ รฐรฑรผรฃรฑรกรฌรฌรก รฐรฏรต รญรก รคร รทรฅรดรกรฉ รดรก a, b, c รชรกรฉ รชรกรฉ รญรก รดรตรฐรพรญรฅรฉ รดรฏ รฅรฌรขรกรครผ รดรฏรต รดรฑรฉรฃรพรญรฏรต รฌรฅ รฐรซรฅรตรฑร รฒ a, b, c รกรญ รตรฐร รฑรทรฅรฉ. ร รฏ รฅรฌรขรกรครผ รคร รญรฅรดรกรฉ รกรฐรผ รดรฏรญ รดรฝรฐรฏ: E s (s a ) (s b ) (s c ) รผรฐรฏรต 2s a b c 3. ร รฒ รตรฐรฏรจร รณรฏรตรฌรฅ รผรดรฉ รฏรฉ รฌร รญรฅรฒ รดรฏรต ร รดรฏรตรฒ, ร รกรญรฏรตร รฑรฉรฏรฒ ร รนรฒ ร รฅรชร รฌรขรฑรฉรฏรฒ, รกรญรดรฉรณรดรฏรฉรทรฏรฝรญ รณรดรฏรตรฒ รกรฑรฉรจรฌรฏรฝรฒ 1 ร รนรฒ 12. ร รฑร รธรดรฅ รฐรฑรผรฃรฑรกรฌรฌรก รฐรฏรต รญรก รคร รทรฅรดรกรฉ ร รญรกรญ รกรชร รฑรกรฉรฏ รกรฑรฉรจรฌรผ รชรกรฉ รญรก รดรตรฐรพรญรฅรฉ รดรฏ รผรญรฏรฌรก รดรงรฒ รฅรฐรฏรทร รฒ รณรดรงรญ รฏรฐรฏร รก รกรญร รชรฅรฉ รฏ รฌร รญรกรฒ, รกรญ รตรฐร รฑรทรฅรฉ. 4. ร รฑร รธรดรฅ ร รญรก รฐรฑรผรฃรฑรกรฌรฌรก รฐรฏรต รฐรฏรต รญรก รตรฐรฏรซรฏรฃร รฆรฅรฉ รดรฉรฒ รฑร รฆรฅรฒ รดรงรฒ รฅรฎร รณรนรณรงรฒ ax2+bx+c=0. ร รฐรฅรญรจรตรฌร รฆรฅรดรกรฉ รผรดรฉ รกรญ aย 0 รฏรฉ รฑร รฆรฅรฒ รคร รญรฏรญรดรกรฉ รกรฐรผ รดรฏรญ รดรฝรฐรฏ: x1,2
b r
b2 4 ac 2a
5. ร รฑร รธรดรฅ ร รญรก รฐรฑรผรฃรฑรกรฌรฌรก รฐรฏรต รจรก รคร รทรฅรดรกรฉ ร รญรกรญ รกรชร รฑรกรฉรฏ รครฅรชรกรครฉรชรผ รกรฑรฉรจรฌรผ รชรกรฉ รจรก ร รทรฅรฉ รดรง รครตรญรกรดรผรดรงรดรก, รฌร รณรก รกรฐรผ รชร รฐรฏรฉรฏ menu, รญรก รฌรฅรดรกรดรฑร รฐรฅรฉ รกรตรดรผรญ รณรดรฏรญ รกรญรดร รณรดรฏรฉรทรฏ รฏรชรดรกรครฉรชรผ ร รครฅรชรกรฅรฎรกรครฉรชรผ รกรชร รฑรกรฉรฏ. 6. ร รก รฃรฑรกรถรฅร รฐรฑรผรฃรฑรกรฌรฌรก รฐรฏรต รญรก รคร รทรฅรดรกรฉ รดรงรญ รดรฉรฌร รฅรญรผรฒ รกรชรฅรฑรกร รฏรต รกรฑรฉรจรฌรฏรฝ รชรกรฉ รญรก รฅรซร รฃรทรฅรฉ รกรญ รกรตรดรผรฒ รฅร รญรกรฉ รฐรฑรพรดรฏรฒ.
ÅíôïëÝò ÅðéëïãÞò êáé ÅðáíÜëçøçò
7.
45
Íá ãñáöåß Ýíá ðñüãñáììá ðïõ íá ìåôñÜ ôéò ëÝîåéò, ôïõò ÷áñáêôÞñåò êáé ôá øçößá ìßáò öñÜóçò ðïõ èá äßíåé ï ÷ñÞóôçò áðü ôï ðëçêôñïëüãéï.
8. Ìßá ìðÜëá áöÞíåôáé íá ðÝóåé áðü Ýíá äåäïìÝíï ýøïò ðÜíù áðü ôï ïñéæüíôéï åðßðåäï êáé óå êÜèå áíáðÞäçóç öôÜíåé óôï 75% ôïõ ýøïõò ðïõ åß÷å ðñïçãïõìÝíùò. ÃñÜøôå Ýíá ðñüãñáììá ðïõ íá äÝ÷åôáé ôï áñ÷éêü ýøïò, óå ìÝôñá, êáé íá õðïëïãßæåé ðüóåò áíáðçäÞóåéò èá êÜíåé ç ìðÜëá ìÝ÷ñé íá óôáìáôÞóåé. ÈåùñÞóôå üôé ïé áíáðçäÞóåéò óôáìáôÜíå üôáí ôï ýøïò ôïõò ãßíåé ìéêñüôåñï ôùí 10mm. 9. Íá ãñáöåß ðñüãñáììá ðïõ íá äÝ÷åôáé áðü ôï ðëçêôñïëüãéï Ýíá óýíïëï áñéèìþí êáé íá ôõðþíåé ôç ìÝóç áñéèìçôéêÞ ôéìÞ ôïõò, ôï ìéêñüôåñï êáé ôï ìåãáëýôåñï áð'áõôïýò. Ôï ôÝëïò ôïõ óõíüëïõ íá äçëþíåôáé ìå ôïí áñéèìü 0. 10. ÃñÜøôå ðñüãñáììá ðïõ íá õðïëïãßæåé êáé åêôõðþíåé ôçí ôéìÞ ôïõ ð (3.14...) ãéá êáèÝíáí áðü ôïõò ôýðïõò ðïõ äßíïíôáé ðáñáêÜôù, ðñïóèÝôïíôáò (Þ ðïë/Üæïíôáò) ôïõò üñïõò ðïõ åßíáé ìåãáëýôåñïé ôïõ 10-6. á) ð4/96 = 1 + 1/34 + 1/54 + 1/74 +... â) ð2/6 = 1 + 1/22 + 1/32 + 1/42 + ... ã) ð/4 = 1 - 1/3 + 1/5 - 1/7 + 1/9 +... 11. ÃñÜøôå ðñüãñáììá ðïõ íá õðïëïãßæåé êáé ôõðþíåé ôéò ôéìÝò ôùí ðáñáêÜôù ðáñáóôÜóåùí ëáìâÜíïíôáò õðüøç üñïõò ðïõ åßíáé ìåãáëýôåñïé ôïõ 10-6. = 1 + x/1! + x2/2! + x3/3! +... á) ex â) sin(x) = x - x3/3! + x5/5! - x7/7! +... ã) cos(x) = 1 - x2/2! + x4/4! - x6/6! +... Óôéò ôñéãùíïìåôñéêÝò óõíáñôÞóåéò ç ãùíßá íá äßíåôáé óå ìïßñåò êáé êáôüðéí íá ìåôáôñÝðåôáé óå áêôßíéá ðñéí ôçí åöáñìïãÞ ôùí ôýðùí. 12. Äßíïíôáé äéáäï÷éêÜ áðü ôï ðëçêôñïëüãéï ôá âÜñç ìåñéêþí êéâùôßùí (áðñïóäéüñéóôï ôï ðëÞèïò ôïõò) ìå ôï ôåëåõôáßï êéâþôéï íá åßíáé Üäåéï (âÜñïò ìçäÝí). Æçôåßôáé íá ìåôñçèåß: á) Ôï ðëÞèïò ôùí êéâùôßùí ðïõ Ý÷ïõí âÜñïò ìåãáëýôåñï ôùí 100 Nt â) Ôï ðëÞèïò ôùí êéâùôßùí ðïõ Ý÷ïõí âÜñïò ìéêñüôåñï Þ ßóï ôùí 100 Nt êáé ìåãáëýôåñï ôùí 50 Nt êáé ã) Ôï ðëÞèïò ôùí êéâùôßùí ðïõ Ý÷ïõí âÜñïò ìéêñüôåñï Þ ßóï ôùí 50 Nt. 13. Äßíïíôáé áðü ôï ðëçêôñïëüãéï äýï ÷áñáêôÞñåò. Æçôåßôáé íá ãñáöåß ðñüãñáììá ðïõ íá ôõðþíåé áõôïýò ôïõò ÷áñáêôÞñåò êáé üëïõò ôïõò åíäéÜìåóïõò. 14. Íá ãñáöåß ðñüãñáììá ðïõ íá ôõðþíåé á) Ôïõò ÷áñáêôÞñåò ðïõ áíôéóôïé÷ïýí óôïõò êùäéêïýò ASCII áðü 65 Ýùò 90. â) Ôïõò êùäéêïýò ASCII ðïõ áíôéóôïé÷ïýí óôïõò ðåæïýò ëáôéíéêïýò ÷áñáêôÞñåò. 15. ÃñÜøôå ðñüãñáììá ðïõ íá õðïëïãßæåé êáé ôõðþíåé óôï ôÝëïò êÜèå Ýôïõò ôïí ôüêï åíüò ãíùóôïý êåöáëáßïõ ãéá Ýíáí ïñéóìÝíï áñéèìü åôþí êáé ìå ãíùóôü åðéôüêéï.
Áè. Å. Êïõôóïíéêüëáò
46
H ร รซรพรณรณรก ร รฑรฏรฃรฑรกรฌรฌรกรดรฉรณรฌรฏรฝ C
16. ร รฑร รธรดรฅ รฐรฑรผรฃรฑรกรฌรฌรก รฐรฏรต รญรก รฐรกรฑร รฃรฅรฉ ร รญรกรญ รฐร รญรกรชรก รฌรฅรดรกรดรฑรฏรฐร รฒ รจรฅรฑรฌรฏรชรฑรกรณรฉรพรญ รกรฐรผ รขรกรจรฌรฏรฝรฒ Celsius รณรฅ รขรกรจรฌรฏรฝรฒ Fahrenheit รณรดรงรญ รฐรฅรฑรฉรฏรทร รกรฐรผ -40ย C ร รนรฒ +40ย C. ร รดรฝรฐรฏรฒ รฌรฅรดรกรดรฑรฏรฐร รฒ รคร รญรฅรดรกรฉ รณรดรงรญ ร รณรชรงรณรง 8 รดรฏรต ร รฅรถรกรซรกร รฏรต 3. 17. ร รก รฃรฑรกรถรฏรฝรญ รฐรฑรฏรฃรฑร รฌรฌรกรดรก รฐรฏรต รญรก รดรตรฐรพรญรฏรตรญ รชรกรจร รญรก รกรฐรผ รดรก รฐรกรฑรกรชร รดรน: 1 12 123 1234 12345
1 23 345 4567 56789
1 13 135 1357 13579
18. ร รก รฃรฑรกรถรฏรฝรญ รฐรฑรฏรฃรฑร รฌรฌรกรดรก รฐรฏรต รญรก รดรตรฐรพรญรฏรตรญ รชรกรจร รญรก รกรฐรผ รดรก รฐรกรฑรกรชร รดรน: * ** *** **** *****
***** **** *** ** *
* ** *** **** *****
***** **** *** ** *
* ** *** **** *** ** *
* *** ***** ******* ***** *** *
******* ***** *** * *** ***** *******
************* ***** ***** *** *** * * *** *** ***** ***** *************
19. ร รฑร รธรดรฅ รฐรฑรผรฃรฑรกรฌรฌรก รฐรฏรต รญรก รตรฐรฏรซรฏรฃร รฆรฅรฉ รดรฏรตรฒ N (รครฅรครฏรฌร รญรฏ) รฐรฑรพรดรฏรตรฒ รผรฑรฏรตรฒ รดรงรฒ รกรชรฏรซรฏรตรจร รกรฒ Fibonacci. ร รกรชรฏรซรฏรตรจร รก รฏรฑร รฆรฅรดรกรฉ รนรฒ รฅรฎร รฒ: F1 = 1 , F2 = 1 รชรกรฉ FN = FN-1 + FN-2 รฃรฉรก ร >2 20. ร รฑร รธรดรฅ รฐรฑรผรฃรฑรกรฌรฌรก รฐรฏรต รญรก รตรฐรฏรซรฏรฃร รฆรฅรฉ รดรงรญ รดรฅรดรฑรกรฃรนรญรฉรชร รฑร รฆรก (x) รฅรญรผรฒ รกรฑรฉรจรฌรฏรฝ (a) รทรฑรงรณรฉรฌรฏรฐรฏรฉรพรญรดรกรฒ รดรฏรญ รฅรฐรกรญรกรซรงรฐรดรฉรชรผ รกรซรฃรผรฑรฉรจรฌรฏ รดรฏรต Newton: xi 1
a xi xi 2
รฌรฅ x0 รดรตรทรกร รฏ รฐ.รท.:
x0
a
2
รฌรฅ รกรชรฑร รขรฅรฉรก 6 รชรซรกรณรฌรกรดรฉรชรพรญ รธรงรถร รนรญ. 21. ร รก รฃรฑรกรถรฅร รฐรฑรผรฃรฑรกรฌรฌรก รฐรฏรต รญรก รตรฐรฏรซรฏรฃร รฆรฅรฉ รชรกรฉ รดรตรฐรพรญรฅรฉ รดรก รฐรฑรพรดรก 20 รฌรฅรฑรฉรชร รกรจรฑรฏร รณรฌรกรดรก รดรฏรต รฅรฐรผรฌรฅรญรฏรต รณรตรญรฅรทรฏรฝรฒ รชรซร รณรฌรกรดรฏรฒ: 1 SK 1 รฐรกรฑรกรดรงรฑรพรญรดรกรฒ รผรดรฉ: S1=1 รชรกรฉ SK+1=1+1/SK 1 1
1
1 1
1 ...
22. ร รฑร รธรดรฅ รฐรฑรผรฃรฑรกรฌรฌรก รฐรฏรต รญรก รตรฐรฏรซรฏรฃร รฆรฅรฉ รดรฏรตรฒ รณรตรญรครตรกรณรฌรฏรฝรฒ รชรกรฉ รดรฉรฒ รครฉรกรดร รฎรฅรฉรฒ รดรนรญ ร รกรญร ร . ร รฑร รฐรฅรฉ รญรก รฉรณรทรฝรฅรฉ: ร ย ร , ร >0, ร >0. ยงMยท
ร รตรญรครตรกรณรฌรฏร : ยจยจ ยธยธ N ยฉ ยน
ร รฉรกรดร รฎรฅรฉรฒ:
PM ,N
M! N!(M N)! M( M 1)...( M N 1)
6. 6.1
™À¡zƒ ™ ™ ƒ ™ª ™ ™À¡zƒ ™ ™
Ç ãëþóóá C âáóßæåôáé óôçí áñ÷Þ ôùí äïìéêþí ôìçìÜôùí (building blocks). Ôá äïìéêÜ ôìÞìáôá êáëïýíôáé óõíáñôÞóåéò (functions). Ìßá óõíÜñôçóç åßíáé Ýíá ôìÞìá êþäéêá, ðïõ åêôåëåß êÜðïéï óõãêåêñéìÝíï Ýñãï. Åíá ðñüãñáììá óå C åßíáé ìßá óõëëïãÞ áðü óõíáñôÞóåéò. Äåí õðÜñ÷åé ðåñéïñéóìüò óôïí áñéèìü ôùí óõíáñôÞóåùí ðïõ ìðïñïýí íá õðÜñ÷ïõí ó'Ýíá ðñüãñáììá. Ï ìüíïò ðåñéïñéóìüò åßíáé üôé ðñÝðåé íá õðÜñ÷åé ìßá êáé ìüíï ìßá óõíÜñôçóç ìå üíïìá main(), ç ïðïßá åßíáé êáé ç ðñþôç óõíÜñôçóç ôïõ ðñïãñÜììáôïò ðïõ åêôåëåßôáé. ÁõôÞ ìå ôç óåéñÜ ôçò ìðïñåß íá êáëåß Üëëåò óõíáñôÞóåéò, öõóéêÜ êáé ïé Üëëåò óõíáñôÞóåéò Ý÷ïõí äéêáßùìá íá êáëïýí êé áõôÝò óõíáñôÞóåéò ìå ôç óåéñÜ ôïõò. ÌÝ÷ñé ôþñá Ý÷ïõìå ÷ñçóéìïðïéÞóåé ìüíï óõíáñôÞóåéò óáí ôéò printf(), scanf(), getche(), ðïõ ôéò âñÞêáìå Ýôïéìåò (óôç âéâëéïèÞêç ôçò ãëþóóáò). Ôþñá Ýöôáóå ç óôéãìÞ íá ãñÜøïõìå ôéò äéêÝò ìáò óõíáñôÞóåéò. Ç ãåíéêÞ ìïñöÞ ïñéóìïý ìßáò óõíÜñôçóçò åßíáé: åðéóôñåöüìåíïò_ôýðïò áíáãí_óõíÜñô(ëßóôá_äçëþóåùí_ôõðéêþí_ðáñáì) { äçëþóåéò_ôïðéêþí_ìåôáâëçôþí åíôïëÝò }
Ïðïõ åðéóôñåöüìåíïò_ôýðïò åßíáé ï ôýðïò ôçò ôéìÞò ðïõ åðéóôñÝöåé ç óõíÜñôçóç. Ìðïñåß üìùò ç óõíÜñôçóç íá ìçí åðéóôñÝöåé êáìßá ôéìÞ, áðëþò íá åðéôåëåß ìßá êáèïñéóìÝíç åñãáóßá, ôüôå áõôÞ ç óõíÜñôçóç èá Ý÷åé ôýðï void. Áí ï åðéóôñåöüìåíïò ôýðïò ìßáò óõíÜñôçóçò åßíáé áêÝñáéïò Þ void, ôüôå ìðïñïýìå íá ôïí ðáñáëåßøïõìå áðü ôïí ïñéóìü ôçò óõíÜñôçóçò. Ç ëßóôá_äçëþóåùí_ôõðéêþí_ðáñáìÝôñùí åßíáé ìßá ëßóôá ðïõ êáèïñßæåé ôïõò ôýðïõò êáé ôá áíáãíùñéóôéêÜ ôùí ðáñáìÝôñùí ðïõ ÷ñçóéìïðïéïýíôáé ãéá ôïí ïñéóìü ôçò óõíÜñôçóçò (ëÝãïíôáé ôõðéêÝò ðáñÜìåôñïé). ÊÜèå äÞëùóç ÷ùñßæåôáé áðü ôçí åðüìåíç ìå êüììá. Áðü áõôÞ ôç ëßóôá ðáñáëáìâÜíïíôáé ïé ôéìÝò ôùí ðñáãìáôéêþí ðáñáìÝôñùí (ëÝãïíôáé êáé ïñßóìáôá) êáôÜ ôçí êëÞóç ôçò óõíÜñôçóçò. ÅðåéäÞ ìßá óõíÜñôçóç ìðïñåß íá ìç äÝ÷åôáé ðáñáìÝôñïõò, ç ëßóôá ìðïñåß íá åßíáé êåíÞ, ïé ðáñåíèÝóåéò üìùò åßíáé áðáñáßôçôåò. Óôï ôìÞìá äçëþóåéò_ôïðéêþí_ìåôáâëçôþí äçëþíïíôáé üëåò ïé ìåôáâëçôÝò ðïõ ÷ñåéÜæïíôáé ãéá íá õëïðïéçèåß ç óõíÜñôçóç (åêôüò ôùí ôõðéêþí ðáñáìÝôñùí), áõôÝò ïé ìåôáâëçôÝò Ý÷ïõí ôïðéêÞ åìâÝëåéá. ÄçëáäÞ åßíáé ãíùóôÝò ìüíï ìÝóá óôç óõíÜñôçóç üðïõ äçëþíïíôáé.
H Ãëþóóá Ðñïãñáììáôéóìïý C
48
6.1.1
¶ƒ À¶ ¶ ™ ™À¡zƒ ™ ™
Ìßá óõíÜñôçóç åßíáé ãíùóôÞ óôï ðñüãñáììá ðïõ ïñßæåôáé, áðü ôï óçìåßï ïñéóìïý ôçò êáé Ýðåéôá. Ãéá íá ôç ÷ñçóéìïðïéÞóïõìå ðñéí áðü ôïí ïñéóìü ôçò èá ðñÝðåé íá ãíùóôïðïéÞóïõìå ôïí ôýðï ôçò óôï õðüëïéðï ðñüãñáììá, äçëáäÞ èá ðñÝðåé íá ôç äçëþóïõìå óôçí áñ÷Þ ôïõ ðñïãñÜììáôïò, ÷ñçóéìïðïéþíôáò Ýíá ðñüôõðï, ùò åîÞò: åðéóôñåöüìåíïò_ôýðïò
áíáãí_óõíÜñôçóçò(ëßóôá_ôýðùí_ôõðéêþí_ðáñáì);
Ç äéáäéêáóßá áõôÞ ëÝãåôáé ðñïôõðïðïßçóç óõíÜñôçóçò. Ç ðñïôõðïðïßçóç ãéá óõíáñôÞóåéò ðïõ åðéóôñÝöïõí ôéìÝò áêåñáßïõ ôýðïõ êáèþò êáé ãéá ôéò óõíáñôÞóåéò void åßíáé ðñïáéñåôéêÞ.
6.1.2
z¶§ ™ ™À¡zƒ ™ ™
Áò äïýìå ôþñá Ýíá áðëü ðñüãñáììá ðïõ êÜíåé ÷ñÞóç ìßáò óõíÜñôçóçò: /* textbox.c */ /* Äçìéïõñãßá ðëáéóßïõ ìå '*' */ void line(); /* ðñüôõðï óõíÜñôçóçò, èá ìðïñïýóå íá ðáñáëåéöèåß */ main() { line(); printf("* ÌÅÃÁÓ ÁËÅÎÁÍÄÑÏÓ *\n"); line(); } /* line() */ /* Åêôýðùóç ãñáììÞò ÷ñçóéìïðïéþíôáò 20 '*' */ void line() { int j; /* ôïðéêÞ ìåôáâëçôÞ */ for(j=1;j<=20;j++)printf("*"); printf("\n"); }
Ôï áðïôÝëåóìá áõôïý ôïõ ðñïãñÜììáôïò åßíáé: ******************** * ÌÅÃÁÓ ÁËÅÎÁÍÄÑÏÓ * ********************
Óôï ðáñáêÜôù ðñüãñáììá ãßíåôáé ðÜëé êëÞóç ìßáò óõíÜñôçóçò ç ïðïßá ôõðþíåé ôï ÷áñáêôÞñá ðïõ ç äåêáåîáäéêÞ ôïõ ôéìÞ óôïí êþäéêá ASCII åßíáé 7, áõôüò ï ÷áñáêôÞñáò êáëåßôáé BELL (êáìðáíÜêé) êáé ç åêôýðùóÞ ôïõ ðñïêáëåß Ýíáí Þ÷ï "ìðéð" áðü ôï ìåãÜöùíï ôïõ Ç/Õ: /* beeptest.c */ /* Åëåã÷ïò óõíÜñôçóçò */ void twobeep(); main() { twobeep(); printf("ÐÜôá Ýíá ðëÞêôñï\n"); getche(); twobeep(); }
ÓõíáñôÞóåéò
49
/* twobeep() */ /* Ðñüêëçóç ç÷çôéêïý óÞìáôïò áðü ôï ìåãÜöùíï ôïõ Ç/Õ */ void twobeep() { int k; printf("\x7"); /* ðñþôï ìðéð */ for(k=1;k<=5000;k++); /* êáèõóôÝñçóç */ printf("\x7"); /* äåýôåñï ìðéð */ }
Áõôü ôï ðñüãñáììá óôçí áñ÷Þ êáëåß ìßá óõíÜñôçóç, ôçí twobeep(), ðïõ êÜíåé áêñéâþò áõôü ðïõ ëÝåé ôï üíïìÜ ôçò: ç÷åß äýï ìðéð ÷ùñéóìÝíá áðü Ýíá óýíôïìï óéùðçëü äéÜëåéììá. Åðåéôá ôï ðñüãñáììá ìáò æçôÜ íá ðáôÞóïõìå Ýíá ðëÞêôñï, üôáí ôï ðáôÞóïõìå, ç÷åß îáíÜ äýï ìðéð.
6.2
¡ § return
Ïé óõíáñôÞóåéò ðïõ åßäáìå óôá ðñïçãïýìåíá ðáñáäåßãìáôá äåí åðÝóôñåöáí êáìßá ôéìÞ óôç óõíÜñôçóç ðïõ ôéò êáëïýóå. Áðëþò, ìåôÜ ôçí êëÞóç ôïõò, åêôåëïýíôáí üëåò ïé åíôïëÝò ðïõ ðåñéåß÷áí êáé ï Ýëåã÷ïò ôïõ ðñïãñÜììáôïò åðÝóôñåöå ÷ùñßò ôéìÞ óôçí åðüìåíç åíôïëÞ ôçò êáëïýóáò óõíÜñôçóçò. Åôóé ëïéðüí ç åêôÝëåóç ôçò óõíÜñôçóçò ôåñìáôéæüôáí üôáí óõíáíôéüôáí ôï Üãêéóôñï êëåéóßìáôïò (}). Ìðïñïýìå üìùò íá êÜíïõìå ìßá óõíÜñôçóç íá ôåñìáôßóåé, êáé ï Ýëåã÷ïò íá åðéóôñÝøåé óôçí êáëïýóá óõíÜñôçóç, óå ïðïéïäÞðïôå óçìåßï ôçò ÷ñçóéìïðïéþíôáò ôçí åíôïëÞ: return;
Ó'áõôÞ ôçí ðåñßðôùóç ç óõíÜñôçóç ôåñìáôßæåôáé üôáí åêôåëåóôåß ç return êáé äåí åðéóôñÝöåôáé êáìßá ôéìÞ óôçí êáëïýóá óõíÜñôçóç. Åßíáé ðñïöáíÝò üôé ç åðéóôñïöÞ ÷ùñßò ôéìÞ áðü ìßá óõíÜñôçóç, ìðïñåß íá ÷ñçóéìïðïéçèåß ìüíï óå óõíáñôÞóåéò ðïõ Ý÷ïõí ïñéóôåß ôýðïõ void. Ãéá ðáñÜäåéãìá ç ðáñáêÜôù óõíÜñôçóç åìöáíßæåé ôï áðïôÝëåóìá ôçò ýøùóçò åíüò áñéèìïý ó'Ýíá èåôéêü áêÝñáéï: void power() { int exp; float base, i=1; printf("\nÄþóå ôç âÜóç êáé ôïí åêèÝôç "); scanf("%f %d",&base,&exp); if(exp<0) return; /* äå ìðïñåß íá ÷åéñéóôåß áñíçôéêïýò åêèÝôåò */ for( ;exp;exp--) i*=base; printf("ÁðïôÝëåóìá: %.5f",i); }
Áí ï åêèÝôçò åßíáé áñíçôéêüò, ç åíôïëÞ return ôåñìáôßæåé ôç óõíÜñôçóç ðñéí öôÜóåé óôï ôåëéêü Üãêéóôñï, áëëÜ äåí åðéóôñÝöåé êáìßá ôéìÞ. Ìßá óõíÜñôçóç ìðïñåß íá Ý÷åé ðåñéóóüôåñåò áðü ìßá åíôïëÝò return. Ãéá íá åðéóôñÝøåé ç êáëïýìåíç óõíÜñôçóç ìßá ôéìÞ óôçí êáëïýóá, ðñÝðåé ôï return íá áêïëïõèåßôáé áðü ìßá ðáñÜóôáóç: return(ðáñÜóôáóç);
Áè. Å. Êïõôóïíéêüëáò
50
H Ãëþóóá Ðñïãñáììáôéóìïý C
üðïõ ïé ðáñåíèÝóåéò åßíáé ðñïáéñåôéêÝò, áëëÜ óõíéóôþíôáé. Ï åðéóôñåöüìåíïò ôýðïò åßíáé áõôüò ðïõ ïñßóôçêå êáôÜ ôïí ïñéóìü ôçò óõíÜñôçóçò. Ìå ôç ÷ñÞóç ôçò return, ìüíï ìßá ôéìÞ ìðïñåß íá åðéóôñáöåß áðü ìßá óõíÜñôçóç.. Ôï ðáñáêÜôù ðñüãñáììá ÷ñçóéìïðïéåß ôç óõíÜñôçóç read_int() ç ïðïßá äéáâÜæåé áðü ôï ðëçêôñïëüãéï Ýíáí áêÝñáéï êáé ôïí åðéóôñÝöåé óôç main(). Ç main() ðñïóèÝôåé ìßá áêïëïõèßá áêåñáßùí, ôçò ïðïßáò ôï ôÝëïò äçëþíåôáé ìå ôïí áñéèìü ìçäÝí: /* add.c */ /* Ðñüóèåóç áêïëïõèßáò áêåñáßùí ðïõ ôåëåéþíåé ìå 0 */ int read_int(); main() { int i,s=0; printf("\nÄþóå áêÝñáéïõò, 0 ãéá ôÝëïò:\n"); while(i=read_int()) s+=i; printf("To Üèñïéóìá åßíáé %d\n",s); } /* read_int() */ /* ÄÝ÷åôáé áêÝñáéï êáé ôïí åðéóôñÝöåé óôç main() */ int read_int() { int x; scanf("%d",&x); return(x); }
Óôçí ðáñÜóôáóç áðüäïóçò ôéìÞò: i=read_int()
ôïõ ðáñáðÜíù ðñïãñÜììáôïò, ç äåîéÜ ðëåõñÜ ïíïìÜæåôáé êëÞóç ôçò óõíÜñôçóçò. Ç ôéìÞ ôçò ðáñÜóôáóçò åßíáé ç ôéìÞ ôïõ i. Åöüóïí åßíáé ìç-ìçäåíéêÞ, åñìçíåýåôáé ùò áëçèÞò êáé ôï s åíçìåñþíåôáé ìå ôçí åíôïëÞ: s+=i;
6.3
§ ™ ™À¡zƒ ™ ™ " z 'z• z" (by value)
ÌÝ÷ñé ôþñá ïé óõíáñôÞóåéò ðïõ ÷ñçóéìïðïéÞóáìå äåí Þôáí ðïëý åõÝëéêôåò. Ôéò êáëïýóáìå êáé Ýêáíáí áõôÜ ðïõ ó÷åäéÜóôçêáí íá êÜíïõí, åðéóôñÝöïíôáò Þ ü÷é ìßá ôéìÞ. Ç êáëïýóá óõíÜñôçóç äå ìåôáâßâáæå ðëçñïöïñßåò óôçí êáëïýìåíç (ç ëßóôá äçëþóåùí ôõðéêþí ðáñáìÝôñùí Þôáí êåíÞ). Ï ìç÷áíéóìüò ãéá ôç ìåôáâßâáóç ðëçñïöïñéþí óå ìßá óõíÜñôçóç åßíáé ç ðáñÜìåôñïò. Ìðïñïýìå íá ìåôáâéâÜóïõìå óå ìßá óõíÜñôçóç ôéò ôéìÝò üóùí ðáñáìÝôñùí èÝëïõìå. Óôï åðüìåíï ðñüãñáììá ÷ñçóéìïðïéïýìå ôç óõíÜñôçóç area() ç ïðïßá äÝ÷åôáé ìßá ôéìÞ ðïõ áíôéðñïóùðåýåé ôçí áêôßíá ìßáò óöáßñáò êáé åðéóôñÝöåé ôï åìâáäüí ôçò åðéöÜíåéáò ôçò óöáßñáò (E=4ðr2). Ç ìåôáâßâáóç ôçò ðëçñïöïñßáò óôçí area() ãßíåôáé ìÝóù ìßáò ðáñáìÝôñïõ. Ç rad åßíáé ôõðéêÞ ðáñÜìåôñïò, åíþ ç radius åßíáé ðñáãìáôéêÞ, ï ôýðïò ôçò ðñáãìáôéêÞò ðáñáìÝôñïõ åßíáé ßäéïò ìå áõôüí ôçò ôõðéêÞò:
ÓõíáñôÞóåéò
51
/* sphere.c */ /* Õðïëïãéóìüò åìâáäïý óöáßñáò */ #define PI 3.14159 float area(float); main() { float radius; printf("Äþóå ôçí áêôßíá ôçò óöáßñáò: "); scanf("%f", &radius); printf("Ôï åìâáäüí ôçò óöáßñáò åßíáé %.2f\n",area(radius)); } /* area() */ /* ÅðéóôñÝöåé ôï åìâáäüí ôçò óöáßñáò */ float area(float rad) { return(4*PI*rad*rad); }
Óôï ðáñáêÜôù ðñüãñáììá ÷ñçóéìïðïéïýìå ôç óõíÜñôçóç power() ç ïðïßá âñßóêåé ôç äýíáìç åíüò ðñáãìáôéêïý áñéèìïý, õøùìÝíïõ ó'Ýíáí áêÝñáéï åêèÝôç. Ç óõíÜñôçóç power() Ý÷åé äýï ðáñáìÝôñïõò (ôç âÜóç êáé ôïí åêèÝôç) êáé åðéóôñÝöåé ìßá ôéìÞ ç ïðïßá êáé ôõðþíåôáé: /* power.c */ /* Õðïëïãéóìüò äýíáìçò åíüò ðñáãìáôéêïý óå åêèÝôç áêÝñáéï */ float power(float,int); main() { float base; int exp; puts("\nÄþóå ôç âÜóç êáé ôïí åêèÝôç: "); scanf("%f %d",&base, &exp); printf("%.5f óôçí %d = %.5f",base,exp,power(base,exp)); /* ôá base, exp åßíáé ïé ðñáãìáôéêÝò ðáñÜìåôñïé */ } /* power() */ /* ÅðéóôñÝöåé ôç äýíáìç */ float power(float b,int e) /* ôá b,e åßíáé ïé ôõðéêÝò ðáñÜìåôñïé */ { int i; float p=1.0; i=abs(e); /* åðéóôñÝöåé ôçí áðüëõôç ôéìÞ ôïõ ïñßóìáôüò ôçò */ for( ;i;i--) p*=b; if(e>=0) return(p); /* áí ï åêèÝôçò åßíáé ìç-áñíçôéêüò */ else return(1/p); /* áí ï åêèÝôçò åßíáé áñíçôéêüò */ }
Óôçí êëÞóç ìßáò óõíÜñôçóçò, ïé ðáñÜìåôñïé ðåñéëáìâÜíïíôáé ìÝóá óôéò ðáñåíèÝóåéò (). Óôçí ðåñßðôùóç ôïõ ðáñáðÜíù ðáñáäåßãìáôïò õðÜñ÷ïõí äýï ðáñÜìåôñïé, ðïõ åßíáé ïé base êáé exp. Ïé ðáñÜìåôñïé áõôÝò ëÝãïíôáé ðñáãìáôéêÝò ðáñÜìåôñïé Þ ïñßóìáôá (actual parameters). Áíôßèåôá ïé ðáñÜìåôñïé ðïõ ÷ñçóéìïðïéïýíôáé êáôÜ ôïí ïñéóìü ôçò óõíÜñôçóçò, ëÝãïíôáé ôõðéêÝò ðáñÜìåôñïé Þ áðëþò ðáñÜìåôñïé (formal parameters).
Áè. Å. Êïõôóïíéêüëáò
52
H Ãëþóóá Ðñïãñáììáôéóìïý C
Ç êëÞóç ôçò óõíÜñôçóçò üðùò Ýãéíå óôï ðñïçãïýìåíï ðáñÜäåéãìá: power(base,exp)
ïíïìÜæåôáé êëÞóç êáô'áîßá (call by value) ðïõ åßíáé ï ìüíïò ôñüðïò ìåôáâßâáóçò ðáñáìÝôñùí óôç ãëþóóá C. Êáô'áõôüí ôïí ôñüðï ç ôéìÞ ìéáò ðñáãìáôéêÞò ðáñáìÝôñïõ áíôéãñÜöåôáé óôçí áíôßóôïé÷ç ôõðéêÞ ðáñÜìåôñï ôçò óõíÜñôçóçò. Åôóé, ïé ðéèáíÝò áëëáãÝò ðïõ ãßíïíôáé óôéò ôéìÝò ôùí ôõðéêþí ðáñáìÝôñùí ôçò óõíÜñôçóçò, äåí Ý÷ïõí êáìßá åðßäñáóç óôéò ôéìÝò ôùí ðñáãìáôéêþí ðáñáìÝôñùí. Áõôü öáßíåôáé êáé óôï áêüëïõèï ðñüãñáììá: /* value.c */ main() { int i=0; printf("\n%3d",i); p(i); printf("%3d\n",i); } /* p() */ p(int j) { do printf("%3d",++j); while(j<5); }
ôï ïðïßï ôõðþíåé: 0
1
2
3
4
5
0
Ç ôéìÞ ôçò ìåôáâëçôÞò i óôç óõíÜñôçóç main() äå ìðïñåß íá áëëá÷èåß áðü ôçí p(), åöüóïí ìüíï Ýíá áíôßãñáöï ôçò ôéìÞò ôïõ i ìåôáöÝñåôáé óôçí p().
6.4
¶ ™ z z£ § ™ ª z~§ ™
Ìßá ìåôáâëçôÞ ç ïðïßá äçëþíåôáé ìÝóá ó'Ýíá ôìÞìá êþäéêá, ôï ïðïßï ïñéïèåôåßôáé áðü ôá Üãêéóôñá áíïßãìáôïò êáé êëåéóßìáôïò ({}), åßíáé ôïðéêÞ (local) ãéá ôï óõãêåêñéìÝíï ôìÞìá. Ç åìâÝëåéá ôùí ôïðéêþí ìåôáâëçôþí, ðåñéïñßæåôáé óôï ôìÞìá ðïõ äçëþíïíôáé. Åôóé, ïé ìåôáâëçôÝò ðïõ äçëþíïíôáé ìÝóá óå ìßá óõíÜñôçóç åßíáé ãíùóôÝò ìüíï ó'áõôÞí êáé óå êáìßá Üëëç. Áò äïýìå ôï ðáñáêÜôù ðñüãñáììá: /* local.c */ main() { int x=10; printf("Ç x óôç main() åßíáé : %3d\n",x); f(); printf("Ç x óôç main() ðáñáìÝíåé: %3d\n",x); } /* f() */ f() { float x=100.123; printf("Ç x óôçí f() åßíáé }
: %.3f\n",x);
ÓõíáñôÞóåéò
53
Ç Ýîïäïò ôïõ ðñïãñÜììáôïò åßíáé: Ç x óôç main() åßíáé : 10 Ç x óôçí f() åßíáé : 100.123 Ç x óôç main() ðáñáìÝíåé: 10
Óôï ðáñáðÜíù ðñüãñáììá Ý÷ïõìå äýï ìåôáâëçôÝò ìå ôï ßäéï üíïìá x, ìßá áêÝñáéá ìåôáâëçôÞ óôç main() êáé ìßá ìåôáâëçôÞ êéíçôÞò õðïäéáóôïëÞò óôçí f(). Ç x ôçò main() äåí Ý÷åé êáìßá ó÷Ýóç ìå ôç x ôçò f(), ãéáôß êáèåìéÜ åßíáé ãíùóôÞ ìüíï óôïí êþäéêá ôïõ äéêïý ôçò ôìÞìáôïò. Åíá âáóéêü ÷áñáêôçñéóôéêü ôùí ôïðéêþí ìåôáâëçôþí åßíáé üôé áðïêôïýí õðüóôáóç ìüíï êáôÜ ôç äéÜñêåéá åêôÝëåóçò ôïõ ôìÞìáôïò ôïõ êþäéêá üðïõ äçëþíïíôáé. ÄçëáäÞ ìßá ôïðéêÞ ìåôáâëçôÞ äçìéïõñãåßôáé üôáí ï Ýëåã÷ïò ôïõ ðñïãñÜììáôïò åéóÝñ÷åôáé óôï áíôßóôïé÷ï ôìÞìá êþäéêá êáé êáôáóôñÝöåôáé ìå ôçí Ýîïäï áðü ôï ôìÞìá. Ãé'áõôü ôï ëüãï ïé ôïðéêÝò ìåôáâëçôÝò ìßáò óõíÜñôçóçò äå ìðïñïýí íá äéáôçñïýí ôçí ôéìÞ ôïõò ìåôáîý ôùí êëÞóåùí ôçò óõíÜñôçóçò. (Ôá ðáñáðÜíù äåí éó÷ýïõí áí ÷ñçóéìïðïéçèåß ï êáèïñéóôÞò êáôçãïñßáò áðïèÞêåõóçò static, âëÝðå § 6.5). Áí óôéò ôïðéêÝò ìåôáâëçôÝò äå äþóïõìå áñ÷éêÞ ôéìÞ, ôï ðåñéå÷üìåíü ôïõò åßíáé áðñïóäéüñéóôï. Ïé ôõðéêÝò ðáñÜìåôñïé ìßáò óõíÜñôçóçò óõìðåñéöÝñïíôáé ùò ôïðéêÝò ìåôáâëçôÝò. Óå áíôßèåóç ìå ôéò ôïðéêÝò ìåôáâëçôÝò, ïé êáèïëéêÝò (global) ìåôáâëçôÝò åßíáé ãíùóôÝò óå ïëüêëçñï ôï áñ÷åßï ôïõ ðñïãñÜììáôïò êáé ìðïñïýí íá ÷ñçóéìïðïéïýíôáé áðü ïðïéïäÞðïôå ôìÞìá êþäéêá. Ç åìâÝëåéÜ ôïõò åßíáé êáèïëéêÞ êáé ï ÷ñüíïò æùÞò ôïõò åßíáé ï ÷ñüíïò åêôÝëåóçò ôïõ ðñïãñÜììáôïò. Áò äïýìå ôï ðáñáêÜôù ðñüãñáììá, üðïõ ïñßæåôáé ç ìåôáâëçôÞ count Ýîù áðü üëåò ôéò óõíáñôÞóåéò: /* external.c */ int count; /* ç count åßíáé êáèïëéêÞ */ main() { count=100; printf("Óôçí main() count=%d\n",count); f1(); } /* f1() */ f1() { int temp; temp=count; f2(); printf("Óôçí f1() } /* f2() */ f2() { int count=200; printf("Óôçí f2() }
Áè. Å. Êïõôóïíéêüëáò
/* åìöáíßæåé ôï 100 */
count=%d\n",count);
/* åìöáíßæåé ôï 100 */
count=%d\n",count);
/* åìöáíßæåé ôï 200 */
54
H Ãëþóóá Ðñïãñáììáôéóìïý C
Ç Ýîïäïò ôïõ ðñïãñÜììáôïò åßíáé: Óôçí main() count=100 Óôçí f2() count=200 Óôçí f1() count=100
Ðáñüëï ðïõ ïýôå ç main() ïýôå ç f1() Ý÷ïõí äçëþóåé ôç ìåôáâëçôÞ count, ùóôüóï ìðïñïýí íá ôç ÷ñçóéìïðïéïýí. Ïìùò, ç f2() Ý÷åé äçëþóåé ìßá ôïðéêÞ ìåôáâëçôÞ ìå üíïìá count. Ïôáí áíáöÝñåôáé óôçí count, ç f2() áíáöÝñåôáé óôçí ôïðéêÞ ôçò ìåôáâëçôÞ, ü÷é óôçí êáèïëéêÞ. Ïé êáèïëéêÝò ìåôáâëçôÝò ïíïìÜæïíôáé åðßóçò êáé åîùôåñéêÝò (external) äéüôé ïñßæïíôáé Ýîù áðü üëåò ôéò óõíáñôÞóåéò. Óå áíôßèåóç ìå ôéò ôïðéêÝò ìåôáâëçôÝò, ïé åîùôåñéêÝò äéáôçñïýí ôçí õðüóôáóÞ ôïõò ìüíéìá, Ýôóé äéáôçñïýí ôéò ôéìÝò ôïõò áêüìá êáé ìåôÜ ôçí åðéóôñïöÞ ôçò óõíÜñôçóçò ðïõ üñéóå ôçí áñ÷éêÞ ôéìÞ ôïõò. Áí óôéò åîùôåñéêÝò ìåôáâëçôÝò äå äþóïõìå áñ÷éêÞ ôéìÞ ðáßñíïõí áõôüìáôá ôçí ôéìÞ ìçäÝí. Åßíáé óçìáíôéêü íá êÜíïõìå äéÜêñéóç áíÜìåóá óôç äÞëùóç (declaration) êáé ôïí ïñéóìü (definition) ìéáò åîùôåñéêÞò ìåôáâëçôÞò. Ìßá äÞëùóç áíáêïéíþíåé ôï üíïìá êáé ôéò éäéüôçôåò ìßáò ìåôáâëçôÞò (êõñßùò ôïí ôýðï ôçò), åíþ Ýíáò ïñéóìüò ðñïêáëåß êáé äÝóìåõóç ÷þñïõ óôç ìíÞìç. ÃåíéêÜ Ý÷ïõìå: ïñéóìüò=äÞëùóç+äÝóìåõóç ìíÞìçò
ÌÝóá ó'Ýíá ðñüãñáììá ìðïñïýìå íá äéáêñßíïõìå ôïõò ïñéóìïýò áðü ôéò äçëþóåéò. Áí ïé ãñáììÝò: int i; double f;
åìöáíßæïíôáé Ýîù áðü ïðïéáäÞðïôå óõíÜñôçóç, ïñßæïõí ôéò åîùôåñéêÝò ìåôáâëçôÝò i êáé f äåóìåýïíôáò ìíÞìç ãé'áõôÝò êáé äçëþíïíôÜò ôåò ãéá ôï õðüëïéðï áñ÷åßï ôïõ ðçãáßïõ êþäéêá. Áðü ôçí Üëëç ïé: extern int i; extern double f;
÷ñçóéìïðïéïýí ôç äåóìåõìÝíç ëÝîç extern ãéá íá äçëþóïõí, ãéá ôï õðüëïéðï áñ÷åßï ðçãáßïõ êþäéêá ôéò åîùôåñéêÝò ìåôáâëçôÝò i êáé f, áëëÜ äå äçìéïõñãïýí ôéò ìåôáâëçôÝò, ïýôå äåóìåýïõí ÷þñï óôç ìíÞìç. Óôçí ðåñßðôùóç ðïõ ï ðçãáßïò êþäéêáò áðïôåëåßôáé áðü ðåñéóóüôåñá ôïõ åíüò áñ÷åßá, èá ðñÝðåé íá õðÜñ÷åé ìüíï Ýíáò ïñéóìüò ìßáò åîùôåñéêÞò ìåôáâëçôÞò óå Ýíá áñ÷åßï, ãéá üëá ôá áñ÷åßá. ôá Üëëá áñ÷åßá ìðïñïýí íá ðåñéÝ÷ïõí äçëþóåéò extern ãéá ôçí ðñïóðÝëáóÞ ôçò. Äåò êáé § 6.5.
6.5
z£ ƒ ™ ™ z ° ƒ z™ z¶ £ À™ ™
Ïé êáèïñéóôÝò êáôçãïñßáò áðïèÞêåõóçò (storage class specifiers) áðïäßäïõí óôéò ìåôáâëçôÝò ôçò C Ýíá ÷áñáêôçñéóôéêü ðïõ êáëåßôáé êáôçãïñßá áðïèÞêåõóçò. Ç êáôçãïñßá áðïèÞêåõóçò êáèïñßæåé äýï ÷áñáêôçñéóôéêÜ ôçò ìåôáâëçôÞò: ôï ÷ñüíï æùÞò êáé ôçí åìâÝëåéÜ ôçò (Þ ïñáôüôçôá). Ïé êáèïñéóôÝò êáôçãïñßáò áðïèÞêåõóçò åßíáé ïé: auto, register, extern, static.
ÓõíáñôÞóåéò
55
auto Ïé ìåôáâëçôÝò ðïõ äçëþíïíôáé ìÝóá óå ìßá óõíÜñôçóç Þ Ýíá ôìÞìá êþäéêá êáèþò êáé ïé ôõðéêÝò ðáñÜìåôñïé ìßáò óõíÜñôçóçò (ôïðéêÝò) åßíáé åî ïñéóìïý áõôüìáôåò, êé Ýôóé ï êáèïñéóôÞò auto ðáñáëåßðåôáé ãé'áõôÝò ôéò ìåôáâëçôÝò. Äçìéïõñãïýíôáé üôáí êáëåßôáé ç óõíÜñôçóç ðïõ ôéò ðåñéÝ÷åé êáé êáôáóôñÝöïíôáé üôáí ï Ýëåã÷ïò åðéóôñÝöåé óôç óõíÜñôçóç ðïõ Ýêáíå ôçí êëÞóç. Áí äå äïèåß áñ÷éêÞ ôéìÞ óå ìßá ìåôáâëçôÞ auto, ôüôå ôï ðåñéå÷üìåíü ôçò åßíáé áðñïóäéüñéóôï. register Ï êáèïñéóôÞò register åßíáé éóïäýíáìïò ìå ôïí êáèïñéóôÞ auto áëëÜ õðïäåéêíýåé óôï ìåôáãëùôôéóôÞ üôé ç ìåôáâëçôÞ (ðïõ ðñÝðåé íá åßíáé áêåñáßïõ ôýðïõ Þ ÷áñáêôÞñá) èá ÷ñçóéìïðïéçèåß óõ÷íÜ. Ï óêïðüò åßíáé ïé ìåôáâëçôÝò register íá ôïðïèåôïýíôáé óå êáôá÷ùñçôÝò ôçò ÊåíôñéêÞò ÌïíÜäáò Åðåîåñãáóßáò, áí áõôü åßíáé äõíáôü, äéáöïñåôéêÜ áíôéìåôùðßæïíôáé óáí áõôüìáôåò ìåôáâëçôÝò. Ï êáèïñéóôÞò register ìðïñåß íá åöáñìüæåôáé óå ôïðéêÝò ìåôáâëçôÝò. Áí äå äïèåß áñ÷éêÞ ôéìÞ óå ìßá ìåôáâëçôÞ register, ôüôå ôï ðåñéå÷üìåíü ôçò åßíáé áðñïóäéüñéóôï. extern Ï êáèïñéóôÞò extern ÷ñçóéìïðïéåßôáé ãéá íá äçëþíåé ìßá ìåôáâëçôÞ ç ïðïßá Ý÷åé ïñéóôåß óå Üëëï áñ÷åßï ôïõ ðñïãñÜììáôïò êáé åßíáé åîùôåñéêÞ ìåôáâëçôÞ (äçëáäÞ êáèïëéêÞ). ×ñçóéìåýåé óôï íá êÜíåé ìßá åîùôåñéêÞ ìåôáâëçôÞ ïñáôÞ óå Ýíá áñ÷åßï åêôüò ôïõ áñ÷åßïõ óôï ïðïßï ïñßóôçêå.
Ð.÷. áí óôï áñ÷åßï file1.c õðÜñ÷åé ï êþäéêáò: /* file1.c */ int var1; /* áõôüò ï ïñéóìüò äåóìåýåé ìíÞìç ãéá ôçí var1 */ main() { ... }
ôüôå ãéá íá åßíáé ç ìåôáâëçôÞ var1 ïñáôÞ óôï áñ÷åßï file2.c ðñÝðåé íá äçëùèåß ùò extern: /* file2.c */ function1() { extern int var1; ... }
/* áõôÞ ç äÞëùóç êÜíåé ïñáôÞ ôçí var1 */
Áí ï ïñéóìüò ìéáò åîùôåñéêÞò ìåôáâëçôÞò óõíáíôçèåß óôï áñ÷åßï ðçãáßïõ êþäéêá ðñéí ÷ñçóéìïðïéçèåß áðü ìßá óõãêåêñéìÝíç óõíÜñôçóç ç ïðïßá õðÜñ÷åé óôï ßäéï áñ÷åßï, äåí õðÜñ÷åé áíÜãêç íá äçëùèåß ùò extern ìÝóá ó'áõôÞ ôç óõíÜñôçóç. ÌÜëéóôá åßíáé êïéíÞ ðñáêôéêÞ íá ôïðïèåôïýíôáé ïé ïñéóìïß üëùí ôùí åîùôåñéêþí ìåôáâëçôþí óôçí áñ÷Þ ôïõ áñ÷åßïõ ðçãáßïõ êþäéêá, êáé ìåôÜ íá ðáñáëåßðïíôáé üëåò ïé äçëþóåéò extern. Ð.÷.: /* abc.c */ int var2; main() { var2=13; ... }
Áè. Å. Êïõôóïíéêüëáò
H Ãëþóóá Ðñïãñáììáôéóìïý C
56
function2() { /* äåí åßíáé áðáñáßôçôï íá äçëùèåß extern int var2 */ printf("%d\n",var2); }
Áí äå äïèåß áñ÷éêÞ ôéìÞ óå ìßá åîùôåñéêÞ ìåôáâëçôÞ, ôüôå ðáßñíåé áõôüìáôá áñ÷éêÞ ôéìÞ ìçäÝí. static Ï êáèïñéóôÞò static ÷ñçóéìïðïéåßôáé óôéò áêüëïõèåò äýï ðåñéðôþóåéò: (i) Óôïí ïñéóìü ìåôáâëçôþí Ýîù áðü êÜèå óõíÜñôçóç (åîùôåñéêÝò). Óôçí ðåñßðôùóç áõôÞ ç åîùôåñéêÞ ìåôáâëçôÞ ðïõ Ý÷åé êáèïñéóôåß ùò static Ý÷åé åìâÝëåéá ìüíï åíôüò ôïõ áñ÷åßïõ ðïõ Ý÷åé ïñéóôåß. Äå ìðïñåß íá ÷ñçóéìïðïéçèåß áðü Üëëï áñ÷åßï ðïõ èÝëïíôáò íá Ý÷åé ðñüóâáóç ó'áõôÞ ôç äçëþíåé ùò extern. Åôóé ðáñÝ÷åé Ýíáí ôñüðï áðüêñõøçò ìåôáâëçôþí. (ii) Óôç äÞëùóç ìåôáâëçôþí ìÝóá óå ìßá óõíÜñôçóç Þ Ýíá ôìÞìá êþäéêá (ôïðéêÝò). Ó'áõôÞí ôçí ðåñßðôùóç ç ôïðéêÞ ìåôáâëçôÞ ðïõ Ý÷åé äçëùèåß ùò static Ý÷åé âÝâáéá ôïðéêÞ åìâÝëåéá, áëëÜ äéáôçñåß ôçí ôéìÞ ôçò êáé ìåôÜ ôçí Ýîïäï áðü ôï ôìÞìá üðïõ Ý÷åé äçëùèåß. Áí äå äïèåß áñ÷éêÞ ôéìÞ óå ìßá ìåôáâëçôÞ static, ðáßñíåé áõôüìáôá áñ÷éêÞ ôéìÞ ìçäÝí. Ï Ðßíáêáò 6.1 äåß÷íåé ðåñéëçðôéêÜ ôï ÷ñüíï æùÞò êáé ôçí åìâÝëåéá ôùí ìåôáâëçôþí óå ó÷Ýóç ìå ôçí ðåñéï÷Þ óôçí ïðïßá äçëþíïíôáé êáé ìå ôïõò êáèïñéóôÝò êáôçãïñßáò áðïèÞêåõóçò ðïõ åöáñìüæïíôáé ó'áõôÝò. Ðåñéï÷Þ ÄÞëùóçò
óõíÜñôçóç óõíÜñôçóç óõíÜñôçóç åîùôåñéêÜ åîùôåñéêÜ Þ óå óõíÜñôçóç åîùôåñéêÜ
ÊáèïñéóôÞò Êáôçãïñßáò ÁðïèÞêåõóçò auto (åî ïñéóìïý) register static extern static
×ñüíïò ÆùÞò
ÅìâÝëåéá (Ïñáôüôçôá)
óõíÜñôçóç óõíÜñôçóç ðñüãñáììá ðñüãñáììá ðñüãñáììá ðñüãñáììá
óõíÜñôçóç óõíÜñôçóç óõíÜñôçóç ìüíï óôï áñ÷åßï ðïõ ïñßæåôáé óôçí ðåñéï÷Þ ðïõ äçëþíåôáé áñ÷åßï
Ðßíáêáò 6.1: Êáôçãïñßåò ÁðïèÞêåõóçò
6.6
¶ƒ ™¢ ƒ ™ ™ À¶ø¡
Ï ôýðïò ìéáò ìåôáâëçôÞò ìðïñåß íá Ý÷åé ðñüóèåôïõò ðñïóäéïñéóìïýò, const, volatile. Áí óå ìéá ìåôáâëçôÞ åöáñìïóôåß ï ðñïóäéïñéóôÞò const áõôÞ ìðïñåß íá ðÜñåé áñ÷éêÞ ôéìÞ áëëÜ äåí åðéôñÝðåôáé êáìßá åðüìåíç áëëáãÞ ôçò ôéìÞò ôçò, ð.÷.: const float pi=3.14159;
ÓõíáñôÞóåéò
57
Ï ðñïóäéïñéóôÞò volatile ÷ñçóéìïðïéåßôáé ãéá íá äçëþíåé óôï ìåôáãëùôôéóôÞ üôé ìßá ìåôáâëçôÞ ìðïñåß íá áëëÜæåé ôï ðåñéå÷üìåíü ôçò ìå ôñüðïõò ðïõ äåí ïñßæïíôáé ñçôÜ áðü ôï ðñüãñáììá. Ãéá ðáñÜäåéãìá, ìåôáâëçôÝò ðïõ áëëÜæïõí áðü ôï õëéêü, üðùò ñïëüãéá ðñáãìáôéêïý ÷ñüíïõ, äéáêïðÝò ê.ë.ð. ðñÝðåé íá ïñßæïíôáé ùò volatile.
6.7
¢ §ø™ ™ ª z~§ ø¡
Ìå âÜóç ôá üóá áíáðôý÷èçêáí óôéò ðñïçãïýìåíåò ðáñáãñÜöïõò (§ 6.5, 6.6) ôï óõíôáêôéêü ãéá ôç äÞëùóç ìéáò ìåôáâëçôÞò åßíáé: (i) Åíáò ðñïáéñåôéêüò ðñïóäéïñéóôÞò ôýðïõ (âëÝðå § 6.6) (ii) Åíáò ðñïáéñåôéêüò êáèïñéóôÞò êáôçãïñßáò áðïèÞêåõóçò (âëÝðå § 6.5) (iii) Ôï üíïìá ôïõ ôýðïõ áêïëïõèïýìåíï áðü ìßá ëßóôá åíüò Þ ðåñéóóïôÝñùí áíáãíùñéóôéêþí ìåôáâëçôþí ÷ùñéóìÝíùí ìå êüììá (iv) Ìßá ðñïáéñåôéêÞ áðüäïóç áñ÷éêÞò ôéìÞò, ÷ñçóéìïðïéþíôáò ôïí ôåëåóôÞ = êáé ìßá ðáñÜóôáóç. Ðáñáäåßãìáôá äçëþóåùí ìåôáâëçôþí: int i,j,k; register char alpha; static float beta=1.234; const auto double N=6.023E23;
6.8
z¡z¢ƒ ª
Ïé óõíáñôÞóåéò ôçò C ìðïñïýí íá ÷ñçóéìïðïéïýíôáé áíáäñïìéêÜ, äçëáäÞ ìßá óõíÜñôçóç ìðïñåß íá êáëåß ôïí åáõôü ôçò. ÁõôÞ ç äõíáôüôçôá ìðïñåß íá ÷ñçóéìïðïéçèåß ãéá ëýóç ðñïâëçìÜôùí ìå áíáäñïìéêÞ ìïñöÞ (áíáäñïìÞ åßíáé ï ôñüðïò ìå ôïí ïðïßï ïñßæïõìå êÜôé ìÝóù ôïõ ßäéïõ ôïõ ïñéæüìåíïõ). Åóôù üôé ìáò æçôÜíå íá õðïëïãßóïõìå ôï ðáñáãïíôéêü (Í!) åíüò ìç-áñíçôéêïý áñéèìïý (Í). Ôï ðáñáãïíôéêü ïñßæåôáé ùò åîÞò: N!=1*2*3*...*N, ãéá Í>0 0!=1
ìðïñåß åðßóçò íá ïñéóôåß êáé áíáäñïìéêÜ: Í!=(Í-1)!*Í ãéá Í>0 0!=1
ÐáñáêÜôù äßíïíôáé äýï óõíáñôÞóåéò (ìßá ìç-áíáäñïìéêÞ êáé ìßá áíáäñïìéêÞ) ãéá ôïí õðïëïãéóìü ôïõ ðáñáãïíôéêïý åíüò áñéèìïý: unsigned long int fact1(int n) { int t; unsigned long int answer=1; for(t=1;t<=n;t++) answer*=t; return(answer); }
Áè. Å. Êïõôóïíéêüëáò
/* ìç-áíáäñïìéêÞ */
H Ãëþóóá Ðñïãñáììáôéóìïý C
58
unsigned long int fact2(int n) { unsigned long int answer; if (n==0) return(1); answer=fact2(n-1)*n; return(answer); }
/* áíáäñïìéêÞ */
Ï ôñüðïò ðïõ äïõëåýåé ç ìç-áíáäñïìéêÞ óõíÜñôçóç èá ðñÝðåé íá åßíáé öáíåñüò. Ï ôñüðïò ðïõ äïõëåýåé ç áíáäñïìéêÞ èá öáíåß êáèáñÜ áí ôçí ðáñáêïëïõèÞóïõìå äßíïíôáò ìßá ðñáãìáôéêÞ ðáñÜìåôñï, ð.÷. n=3. Áêïëïõèþíôáò ôéò äéáäï÷éêÝò êëÞóåéò ôçò óõíÜñôçóçò fact2() Ý÷ïõìå: fact2(3)=fact2(2)*3=(fact2(1)*2)*3=((fact2(0)*1)*2)*3=((1*1)*2)*3=1* 1*2*3=6
6.9
¢ ° ™ ¶ƒ ™ ¡ ¶ƒ ¶ • ƒ°z™
ÊÜèå ðçãáßï ðñüãñáììá ôçò C ðñéí ìåôáãëùôôéóôåß ðåñíÜ áðü ôç öÜóç ôçò ðñïåðåîåñãáóßáò. Ôç äéáäéêáóßá áõôÞ ôçí åðéôåëåß Ýíá ðñüãñáììá ðïõ ëÝãåôáé ðñïåðåîåñãáóôÞò ôçò C (C preprocessor). Ï ðñïåðåîåñãáóôÞò øÜ÷íåé óôï ðçãáßï ðñüãñáììá êáé åêôåëåß ïäçãßåò ðïõ áðåõèýíïíôáé ó'áõôüí. ÊÜèå ïäçãßá ðñïò ôïí ðñïåðåîåñãáóôÞ (preprocessor directive) áñ÷ßæåé ìå ôï óýìâïëï #. Ó'áõôÞí ôçí ðáñÜãñáöï èá äïýìå äýï ïäçãßåò ðñïò ôïí ðñïåðåîåñãáóôÞ.
6.9.1
¢ ° z #define
H ãåíéêÞ ìïñöÞ áõôÞò ôçò ïäçãßáò åßíáé: #define áíáãíùñéóôéêü
áêïëïõèßá_óõìâüëùí
áõôÞ ç ïäçãßá êÜíåé ôïí ðñïåðåîåñãáóôÞ íá áíôéêáôáóôÞóåé üëåò ôéò åìöáíßóåéò ôïõ áíáãíùñéóôéêïý óôï áñ÷åßï ðçãáßïõ êþäéêá, ìå ôçí êáèïñéæüìåíç áêïëïõèßá_óõìâüëùí (üðùò ç åðéëïãÞ "âñåò êáé áíôéêáôÝóôçóå" (find and replace) óôïõò åðåîåñãáóôÝò êåéìÝíïõ). Ç ðéï áðëÞ ÷ñÞóç ôçò ïäçãßáò #define åßíáé ç áíÜèåóç ïíïìÜôùí óå óôáèåñÝò, üðùò Ý÷ïõìå äåé êáé óôçí § 2.3.2. Ãéá ðáñÜäåéãìá âëÝðå ôï ðñüãñáììá sphere.c óôçí § 6.3. Ç áêïëïõèßá_óõìâüëùí ìðïñåß áêüìá íá åßíáé êáé ìßá åíôïëÞ ôçò C. Áò õðïèÝóïõìå üôé óôï ðñüãñáììÜ ìáò èÝëïõìå íá ôõðþóïõìå ôï ìÞíõìá "ËÜèïò" óå äéÜöïñá óçìåßá. ×ñçóéìïðïéþíôáò ôçò ïäçãßá: #define ERROR
printf("\nËÜèïò\n");
áí Ý÷ïõìå óôï ðñüãñáììá ìßá åíôïëÞ óáí êé áõôÞ: if (input>640) ERROR
ðñéí ôç ìåôáãëþôôéóç, èá åðåêôáèåß áðü ôïí ðñïåðåîåñãáóôÞ óå: if (input>640) printf("\nËÜèïò\n");
Ìßá ïäçãßá #define ìðïñåß íá Ý÷åé êáé ðáñáìÝôñïõò: #define áíáãíùñéóôéêü(ëßóôá_áíáãíùñéóôéêþí)
áêïëïõèßá_óõìâüëùí
üðïõ äåí õðÜñ÷åé êåíü áíÜìåóá óôï áíáãíùñéóôéêü êáé óôçí ðáñÝíèåóç '('. Óôçí ðåñßðôùóç áõôÞ ìéëÜìå ãéá ìáêñïåíôïëÝò (macros).
ÓõíáñôÞóåéò
59
To ðáñáêÜôù ðñüãñáììá ÷ñçóéìïðïéåß áõôÞ ôç äõíáôüôçôá ãéá íá ôõðþíåé ÷ùñßò ìðåëÜ äýï áñéèìïýò êéíçôÞò õðïäéáóôïëÞò: /* macroprn.c */ /* ×ñÞóç ìáêñïåíôïëþí */ #define PR(n) printf("%.2f\n",n); main() { float num1, num2=455.89; num1=1.0/4.0; PR(num1) PR(num2) }
Ó'áõôü ôï ðñüãñáììá üôáí ï ðñïåðåîåñãáóôÞò âëÝðåé ôç öñÜóç "PR(n)" ôçí åðåêôåßíåé óôçí åíôïëÞ: printf("%.2f\n",n); Ïé ìáêñïåíôïëÝò Ý÷ïõí êÜðïéá áðü ôá ÷áñáêôçñéóôéêÜ ôùí óõíáñôÞóåùí, üðùò èá ãßíåé ðéï óáöÝò óôï åðüìåíï ðáñÜäåéãìá: /* sphereM.c */ /* Õðïëïãéóìüò åìâáäïý óöáßñáò, ÷ñçóéìïðïéþíôáò ìáêñïåíôïëÞ */ #define PI 3.14159 /* êáèïñéóìüò ôïõ "ð" */ #define AREA(X) (4*PI*X*X) /* ìáêñïåíôïëÞ ãéá ôï åìâáäüí */ main() { float radius; puts("Äþóå ôçí áêôßíá ôçò óöáßñáò:"); scanf("%f",&radius); printf("Ôï åìâáäü ôçò óöáßñáò åßíáé %.2f\n",AREA(radius)); }
Áõôü ôï ðñüãñáììá êÜíåé ôï ßäéï ìå ôï ðñüãñáììá sphere.c ôçò § 6.3, ìüíï ðïõ ôþñá áíôß ãéá óõíÜñôçóç ÷ñçóéìïðïéåß ìáêñïåíôïëÞ. Ïôáí ïñßæïõìå ìáêñïåíôïëÝò, ÷ñåéÜæåôáé ðñïóï÷Þ óôéò ðáñåíèÝóåéò ðïõ ÷ñçóéìïðïéïýìå. Áò õðïèÝóïõìå üôé ôï ðñüãñáììÜ ìáò Ý÷åé ôéò åîÞò ãñáììÝò: #define SUM(x,y) x+y ... ans=10*SUM(3,4);
ðïéá ôéìÞ èá äïèåß óôçí ans; Óêåöôüìåíïò êÜðïéïò åðéðüëáéá èá íïìßóåé üôé ç ans èá ðÜñåé ôçí ôéìÞ 70 (10*(3+4)), üìùò áõôü åßíáé ëÜèïò. Ï ðñïåðåîåñãáóôÞò èá åðåêôåßíåé ôçí åíôïëÞ áðüäïóçò ôéìÞò ùò åîÞò: ans=10*3+4;
áð'üðïõ ðñïêýðôåé üôé ç ans ðáßñíåé ôçí ôéìÞ 34. Áí üìùò åß÷áìå ôçí ïäçãßá: #define SUM(x,y) (x+y)
ôþñá ç åíôïëÞ áðüäïóçò ôéìÞò åðåêôåßíåôáé óå ans=10*(3+4);
êáé ç ans ðáßñíåé ôçí ôéìÞ 70. Áò õðïèÝóïõìå ôþñá üôé Ý÷ïõìå ôéò áêüëïõèåò ãñáììÝò êþäéêá: #define PRODUCT(x,y) (x*y) ... ans=PRODUCT(2+3,4);
Áè. Å. Êïõôóïíéêüëáò
H Ãëþóóá Ðñïãñáììáôéóìïý C
60
ðïéá ôéìÞ èá ðÜñåé ç ans; Áí íïìßæïõìå üôé èá ðÜñåé ôçí ôéìÞ 20 êÜíïõìå ëÜèïò, äéüôé Ý÷ïõìå: ans=(2+3*4)
áð'üðïõ ðñïêýðôåé üôé ç ans ðáßñíåé ôçí ôéìÞ 14. Áí üìùò åß÷áìå ãñÜøåé ôçí ïäçãßá: #define PRODUCT(x,y) ((x)*(y))
ôüôå èá åß÷áìå: ans=((2+3)*4)
äçëáäÞ ç ans ðáßñíåé ôçí ôéìÞ 20.
6.9.2
¢ ° z #include
H ïäçãßá #include äßíåé åíôïëÞ óôïí ðñïåðåîåñãáóôÞ íá óõìðåñéëÜâåé Ýíá Üëëï áñ÷åßï ðçãáßïõ êþäéêá, ó'áõôü ðïõ ðåñéÝ÷åé ôçí ïäçãßá. Ç ãåíéêÞ ìïñöÞ ôçò åßíáé: #include "üíïìá_áñ÷åßïõ"
Þ #include <üíïìá_áñ÷åßïõ>
Áí ôï üíïìá_áñ÷åßïõ âñßóêåôáé ìÝóá óå åéóáãùãéêÜ (" ") ç áíáæÞôçóç ôïõ áñ÷åßïõ áõôïý ãßíåôáé óôïí êáôÜëïãï (directory) ðïõ ðåñéÝ÷åé ôï áñ÷åßï ðçãáßïõ êþäéêá. Áí ôï üíïìá_áñ÷åßïõ âñßóêåôáé óå ãùíéþäåéò áãêýëåò (< >) ç áíáæÞôçóç ãßíåôáé óôïí êáôÜëïãï ôùí áñ÷åßùí-åðéêåöáëßäáò (header files). Åíá ðáñÜäåéãìá ðïõ äåß÷íåé ãéáôß ðéèáíþò èá èÝëáìå íá óõìðåñéëÜâïõìå Ýíá áñ÷åßï ó'Ýíá Üëëï, åßíáé ôï åîÞò: Áò õðïèÝóïõìå üôé ãñÜöïõìå ðïëëÜ ðñïãñÜììáôá ìáèçìáôéêþí ðïõ óõíå÷þò áíáöÝñïíôáé óå áëãïñßèìïõò ãéá ôïí õðïëïãéóìü ôùí åìâáäþí äéáöüñùí ó÷çìÜôùí. Èá ìðïñïýóáìå íá ôïðïèåôÞóïõìå üëïõò áõôïýò ôïõò áëãïñßèìïõò ùò ìáêñïåíôïëÝò ó'Ýíá îå÷ùñéóôü áñ÷åßï. Õóôåñá áíôß íá ðñÝðåé íá îáíáãñÜöïõìå üëåò ôéò ìáêñïåíôïëÝò êÜèå öïñÜ ðïõ ãñÜöïõìå Ýíá ðñüãñáììá ðïõ ôéò ÷ñçóéìïðïéåß, èá ìðïñïýìå íá ôéò åéóÜãïõìå óôï ðçãáßï áñ÷åßï ÷ñçóéìïðïéþíôáò ôçí ïäçãßá #include. Åíá ôÝôïéï îå÷ùñéóôü áñ÷åßï èá ìðïñïýóå íá Þôáí êÜðùò Ýôóé: #define #define #define #define #define #define
PI 3.14159 AREA_CIRCLE(radius) AREA_SQUARE(length,width) AREA_TRIANGLE(base,height) AREA_ELLIPSE(radius1,radius2) AREA_TRAPEZOID(height,b1,b2)
(PI*radius*redius) (length*width) (base*height/2) (PI*radius1*radius2) (height*(b1+b2)/2)
Èá ìðïñïýóáìå íá ïíïìÜóïõìå áõôü ôï áñ÷åßï areas.h. Ç ðñïÝêôáóç 'h' ÷ñçóéìïðïéåßôáé ãéá ôá áñ÷åßá-åðéêåöáëßäáò, ôá ïðïßá åßíáé ìßá ïìÜäá åíôïëþí ðïõ ôïðïèåôåßôáé óôçí áñ÷Þ ôïõ ðñïãñÜììáôüò ìáò. Ç ãëþóóá C ðáñÝ÷åôáé ì'Ýíá ðëÞèïò áðü áñ÷åßá-åðéêåöáëßäáò ãéá üëåò ôéò óõíáñôÞóåéò âéâëéïèÞêçò. ÊÜèå áñ÷åßï ðåñéÝ÷åé ôïõò ïñéóìïýò êáé ôá ðñüôõðá ãéá ìßá êáôçãïñßá óõíáñôÞóåùí êáèþò êáé ìáêñïåíôïëÝò. Ôá áñ÷åßá áõôÜ âñßóêïíôáé ïìáäïðïéçìÝíá óôïí êáôÜëïãï INCLUDE. Óôçí ðñáãìáôéêüôçôá êÜðïéåò ðïëý óõíçèéóìÝíåò "óõíáñôÞóåéò" âéâëéïèÞêçò ôçò C åßíáé ìáêñïåíôïëÝò ðïõ ïñßæïíôáé óôá áñ÷åßá-åðéêåöáëßäáò. Ð.÷. ïé óõíáñôÞóåéò getchar() êáé putchar() ðïõ
ÓõíáñôÞóåéò
61
åßäáìå óôçí § 4.1 ðñïÝñ÷ïíôáé áðü äýï Üëëåò óõíáñôÞóåéò, ôçí getc() êáé ôçí putc(). Ôï áñ÷åßï stdio.h ðåñéÝ÷åé áõôïýò ôïõò ïñéóìïýò: #define getchar() getc(stdin) #define putchar(c) putc((c),stdout)
Åôóé áí èåëÞóïõìå íá ÷ñçóéìïðïéÞóïõìå êÜðïéá áð'áõôÝò ôéò óõíáñôÞóåéò óôï ðñüãñáììÜ ìáò, ðñÝðåé íá ÷ñçóéìïðïéÞóïõìå ôçí ïäçãßá: #include <stdio.h>. Åðßóçò óôá áñ÷åßá-åðéêåöáëßäáò õðÜñ÷ïõí êáé ôá ðñüôõðá (âëÝðå § 6.1.1) ôùí óõíáñôÞóåùí âéâëéïèÞêçò. Åôóé åßíáé êáëü íá óõìðåñéëáìâÜíïõìå ôá êáôÜëëçëá áñ÷åßá-åðéêåöáëßäáò, ðñéí ÷ñçóéìïðïéÞóïõìå êÜðïéá óõíÜñôçóç âéâëéïèÞêçò.
6.10
ªz£ ªz ™ ™À¡zƒ ™ ™ ~ ~§ £ ™
Óôï áñ÷åßï-åðéêåöáëßäáò math.h ðåñéëáìâÜíïíôáé äçëþóåéò ìáèçìáôéêþí óõíáñôÞóåùí, ïé êõñéüôåñåò áðü ôéò ïðïßåò åßíáé: double double double double double double double double double double int double double double double double double double
6.11 1.
cos(double x) /* óõí(x), ôï x óå áêôßíéá sin(double x) /* çì(x), ôï x óå áêôßíéá tan(double x) /* åö(x), ôï x óå áêôßíéá exp(double x) /* ex log(double x) /* ln(x) log10(double x) /* log10(x) pow(double x, double y) /* xy sqrt(double x) /* x floor(double x) /* floor(4.9)=4.0 ceil(double x) /* ceil(1.02)=2.0 abs(int x) /* |x|, äçëþíåôáé óôï stdlib.h fabs(double x) /* |x| acos(double x) /* ôïîóõí(x), ôï x [-1..1] asin(double x) /* ôïîçì(x), ôï x [-1..1] atan(double x) /* ôïîåö(x) cosh(double x) /* õðåñóõí(x), ôï x óå áêôßíéá sinh(double x) /* õðåñçì(x), ôï x óå áêôßíéá tanh(double x) /* õðåñåö(x), ôï x óå áêôßíéá
*/ */ */ */ */ */ */ */ */ */ */ */ */ */ */ */ */ */
z™ ™ ™
ÃñÜøôå Ýíá ðñüãñáììá ðïõ íá ôõðþíåé óôçí ïèüíç ôï ìåãáëýôåñï áðü äýï áñéèìïýò ïé ïðïßïé åéóÜãïíôáé áðü ôï ðëçêôñïëüãéï. ×ñçóéìïðïéÞóôå ìßá óõíÜñôçóç ðïõ èá êÜíåé ôçí ðñáãìáôéêÞ óýãêñéóç ôùí äýï áñéèìþí. ÐåñÜóôå ôïõò äýï áñéèìïýò óôç óõíÜñôçóç ùò ðáñáìÝôñïõò êáé êÜíôå ôç óõíÜñôçóç íá åðéóôñÝöåé ôçí áðÜíôçóç ìå return().
2. ÃñÜøôå ìßá óõíÜñôçóç rectang(length,width) ðïõ íá åêôõðþíåé Ýíá ïñèïãþíéï ðáñáëëçëüãñáììï, ðïõ ïé ðëåõñÝò ôïõ áðïôåëïýíôáé áðü áóôåñßóêïõò. Ôï ìÞêïò êáé ôï ðëÜôïò ôïõ ðáñáëëçëïãñÜììïõ åßíáé length êáé width áíôßóôïé÷á. 3. Íá ãñáöåß ðñüãñáììá ðïõ íá äÝ÷åôáé áðü ôï ðëçêôñïëüãéï ôñåéò áêÝñáéïõò áñéèìïýò ðïõ èá äçëþíïõí ôéò ìçíéáßåò ðùëÞóåéò åíüò õëéêïý áðü ôïõò
Áè. Å. Êïõôóïíéêüëáò
62
H Ãëþóóá Ðñïãñáììáôéóìïý C
ðùëçôÝò ÃéÜííç, Ìáñßá, ÅëÝíç áíôßóôïé÷á. Åðåéôá, áíÜëïãá ìå ôï ýøïò ôùí ðùëÞóåùí, íá ôõðþíåôáé ãéá êÜèå ðùëçôÞ ìßá ïñéæüíôéá ãñáììÞ áíÜëïãïõ ìÞêïõò, ÷ñçóéìïðïéþíôáò ôï ÷áñáêôÞñá '='. 4. Íá ãñáöåß ìßá óõíÜñôçóç ðïõ íá õðïëïãßæåé ôï sin(x) ÷ñçóéìïðïéþíôáò ôïí ôýðï: sin(x) = x - x3/3! + x5/5! - x7/7! +...
Ï áñéèìüò ôùí üñùí ðïõ èá ÷ñçóéìïðïéïýíôáé íá äßíåôáé ùò ðáñÜìåôñïò óôçí êëÞóç ôçò óõíÜñôçóçò. Ð.÷. sin(x,3) óçìáßíåé íá õðïëïãéóôåß ôï sin(x) ìå ôç ÷ñÞóç ôùí ôñéþí ðñþôùí üñùí. 5. Ï áíáäñïìéêüò ïñéóìüò ôçò äýíáìçò an ãéá n Z+ êáé a R åßíáé: 1
áí n=0
a*an-1
áí n>0
an =
ÃñÜøôå áíáäñïìéêÞ óõíÜñôçóç an.
power(a,n) ðïõ íá åðéóôñÝöåé ôç äýíáìç
6. Íá ãñáöåß áíáäñïìéêÞ óõíÜñôçóç ãéá ôïí õðïëïãéóìü ôïõ n-ïóôïý üñïõ ôçò áêïëïõèßáò Fibonacci. Ïé üñïé ôçò áêïëïõèßáò Fibonacci ïñßæïíôáé áðü ôéò ó÷Ýóåéò: F1 = 1 , F2 = 1 êáé FN = FN-1 + FN-2 ãéá Í>2 7.
ÃñÜøôå ìßá áíáäñïìéêÞ óõíÜñôçóç ðïõ íá õðïëïãßæåé ôï Üèñïéóìá ìéáò óåéñÜò áêåñáßùí èåôéêþí áñéèìþí áðü ôï 1 ìÝ÷ñé ôï limit, üðïõ limit ãíùóôüò èåôéêüò áêÝñáéïò áñéèìüò.
8. Íá ãñáöåß ìßá óõíÜñôçóç ðïõ íá äÝ÷åôáé Ýíá èåôéêü áêÝñáéï áñéèìü êáé íá ôïí åðéóôñÝöåé áíôåóôñáìÝíï (ð.÷. ôï 123 íá ôï åðéóôñÝöåé ùò 321). 9. Íá ãñáöåß ìßá óõíÜñôçóç ç ïðïßá íá äÝ÷åôáé Ýíáí áêÝñáéï áñéèìü êáé íá åðéóôñÝöåé ôï ðëÞèïò ôùí øçößùí ôïõ. 10. ÅîçãÞóôå ôá áðïôåëÝóìáôá ôïõ ðáñáêÜôù ðñïãñÜììáôïò: #define SQUARE(x) x*x #define SUM(x,y) x+y #define PRODUCT(x,y) (x*y) #define TYPE(x) printf("%d\n",x) main() { TYPE(SQUARE(3+1)); TYPE(125/SQUARE(5)); TYPE(10*SUM(3,4)); TYPE(PRODUCT(2+3,4)); getch(); }
11. ÃñÜøôå Ýíá ðñüãñáììá ðïõ íá õðïëïãßæåé ôá åìâáäÜ ôùí åîÞò ó÷çìÜôùí: ïñèïãùíßïõ ðáñáëëçëïãñÜììïõ, êýêëïõ, ôñéãþíïõ êáé ôñáðåæßïõ. Ç åðéëïãÞ ãéá ôï ðïéïõ ó÷Þìáôïò ôï åìâáäüí èá õðïëïãéóôåß, íá ãßíåôáé ìÝóá áðü Ýíá menu åðéëïãþí. Ïé åðéëïãÝò ôïõ menu íá êáëïýí êáôÜëëçëåò óõíáñôÞóåéò, Þ ìáêñïåíôïëÝò, ðïõ íá õðïëïãßæïõí ôï áíôßóôïé÷ï åìâáäüí.
7.
¶ ¡z ™ z z§ºzƒ £ª z
7.1
¶ ¡z ™
Ðßíáêáò (array) åßíáé Ýíáò äïìçìÝíïò ôýðïò äåäïìÝíùí ðïõ ÷ñçóéìïðïéåßôáé ãéá ôçí êáôá÷þñçóç äåäïìÝíùí ôïõ ßäéïõ ôýðïõ óå äéáäï÷éêÝò èÝóåéò ôçò ìíÞìçò. Ï ôýðïò ôùí äåäïìÝíùí ôïõ ðßíáêá ëÝãåôáé âáóéêüò ôýðïò. ÅðåéäÞ ôá äåäïìÝíá ôïõ ðßíáêá åßíáé üëá ôïõ ßäéïõ ôýðïõ, ï ðßíáêáò ÷áñáêôçñßæåôáé ùò ïìïãåíÞò äïìçìÝíïò ôýðïò.
7.7.1
¢ §ø™ ¶ ¡z z
Ç ãåíéêÞ ìïñöÞ ôçò åíôïëÞò äÞëùóçò åíüò ðßíáêá åßíáé: ôýðïò
áíáãíùñéóôéêü[ìÝãåèïò];
üðïõ ôýðïò åßíáé ï âáóéêüò ôýðïò (base type) ôïõ ðßíáêá, êáé ôï ìÝãåèïò åßíáé Ýíáò áêÝñáéïò áñéèìüò ðïõ êáèïñßæåé ôïí áñéèìü ôùí óôïé÷åßùí ðïõ èá ðåñéÝ÷åé ï ðßíáêáò. Ð.÷. ç åíôïëÞ: int ar[5];
äçëþíåé Ýíáí ðßíáêá áêåñáßùí ìå üíïìá ar, éêáíü íá áðïèçêåýóåé 5 áêÝñáéåò ìåôáâëçôÝò (êáèåìéÜ áðü ôéò ìåôáâëçôÝò ôïõ ðßíáêá ïíïìÜæåôáé óôïé÷åßï). Ôï Ó÷Þìá 7.1 åßíáé ìßá ó÷çìáôéêÞ áíáðáñÜóôáóç ôïõ ðßíáêá ar. üíïìá ôïõ ðßíáêá Æ ar êÜèå óôïé÷åßï ôïõ ðßíáêá åßíáé ôýðïõ int
ar[0]
0
ar[1]
1
ar[2]
2
ar[3]
3
ar[4]
4
Å 5 ï áñéèìüò ôùí óôïé÷åßùí ôïõ ðßíáêá
Ó÷Þìá 7.1: Ó÷çìáôéêÞ áíáðáñÜóôáóç åíüò ðßíáêá
7.1.2
z¡zº ƒz ™ z ™ Ã z ¡ ™ ¶ ¡z z
Ãéá íá áíáöåñèïýìå óôï êÜèå óôïé÷åßï ôïõ ðßíáêá îå÷ùñéóôÜ ÷ñçóéìïðïéïýìå Ýíá äåßêôç-ðßíáêá (subscript). Ï äåßêôçò-ðßíáêá åßíáé Ýíáò áêÝñáéïò áñéèìüò, Þ ìßá áêÝñáéá ðáñÜóôáóç, ðïõ ãñÜöåôáé ìÝóá óå áãêýëåò ([]) ðïõ áêïëïõèïýí ôï áíáãíùñéóôéêü ôïõ ðßíáêá. Áò ðñïóÝîïõìå üôé áõôüò ï áñéèìüò Ý÷åé äéáöïñåôéêÞ óçìáóßá üôáí áíáöåñüìáóôå ó'Ýíá óôïé÷åßï ôïõ ðßíáêá áð'ü,ôé üôáí äçëþíïõìå ôïí ðßíáêá, üðïõ ï áñéèìüò óôéò áãêýëåò êáèïñßæåé ôï ìÝãåèïò ôïõ ðßíáêá. Ïôáí áíáöåñüìáóôå ó'Ýíá óôïé÷åßï ôïõ ðßíáêá, áõôüò ï áñéèìüò êáèïñßæåé ôç èÝóç ôïõ óôïé÷åßïõ. Ïëá ôá óôïé÷åßá ôïõ ðßíáêá áñéèìïýíôáé áñ÷ßæïíôáò áðü ôï ìçäÝí. Åôóé, ð.÷. ôï ôÝôáñôï óôïé÷åßï ôïõ ðßíáêá ar ðïõ äçëþóáìå ðáñáðÜíù èá áíáöåñèåß ùò:
H Ãëþóóá Ðñïãñáììáôéóìïý C
64
ar[3]
êáé ôï ôåëåõôáßï óôïé÷åßï ôïõ ðßíáêá ùò (âëÝðå Ó÷Þìá 7.1): ar[4]
Óôï ðñüãñáììá ðïõ áêïëïõèåß ÷ñçóéìïðïéïýìå Ýíáí ðßíáêá temper ãéá íá áðïèçêåýóïõìå ôéò èåñìïêñáóßåò ôùí çìåñþí ìßáò åâäïìÜäáò. ×ñçóéìïðïéïýìå ìßá åíôïëÞ for ãéá ôçí åéóáãùãÞ ôùí èåñìïêñáóéþí óôïí ðßíáêá. Óôç óõíÝ÷åéá õðïëïãßæïõìå ôï Üèñïéóìá êáé ôç ìÝóç ôéìÞ ôùí èåñìïêñáóéþí, ôçí ïðïßáí åìöáíßæïõìå óôçí ïèüíç: /* temper.c */ /* ÌÝóç ôéìÞ ôùí èåñìïêñáóéþí ìéáò åâäïìÜäáò */ #define LIM 7 main() { float temper[LIM], sum=0; int day; for(day=0;day<LIM;day++) { printf("Äþóå ôç èåñìïêñáóßá ôçò %dçò ìÝñáò: ",day+1); scanf("%f",&temper[day]); sum+=temper[day]; } printf("Ç ìÝóç ôéìÞ åßíáé %.2f",sum/LIM); }
×ñåéÜæåôáé ðñïóï÷Þ üôáí ÷åéñéæüìáóôå ðßíáêåò, ãéáôß ç ãëþóóá C äåí åêôåëåß Ýëåã÷ï ïñßùí óôïõò ðßíáêåò. Åôóé ôßðïôá äå ìáò åìðïäßæåé íá îåðåñÜóïõìå ôï ôÝëïò åíüò ðßíáêá. Áí îåðåñÜóïõìå ôï ôÝëïò åíüò ðßíáêá êáôÜ ôç ëåéôïõñãßá áðüäïóçò ôéìÞò, ôá äåäïìÝíá ðïõ èá áðïäþóïõìå èá ôïðïèåôçèïýí óôç ìíÞìç Ýîù áðü ôïí ðßíáêá, ðéèáíüí óå èÝóåéò ìíÞìçò ðïõ Ý÷ïõí êñáôçèåß ãéá Üëëåò ìåôáâëçôÝò, Þ óå èÝóåéò ìíÞìçò üðïõ õðÜñ÷åé áðïèçêåõìÝíï ôï ßäéï ôï ðñüãñáììá. Áõôü èá ïäçãÞóåé ôïõëÜ÷éóôïí óå áðñüóìåíá áðïôåëÝóìáôá êáé äå èá õðÜñîåé áðü ôï ìåôáãëùôôéóôÞ ìÞíõìá ëÜèïõò ãéá íá ìáò åéäïðïéÞóåé ãéá ôï ôé óõìâáßíåé.
7.1.3
¶ ¡z ™ ¶ §§ø¡ ¢ z™ z™ ø¡
Åùò ôþñá Ý÷ïõìå äåé ðßíáêåò ìå ìßá ìüíï äéÜóôáóç: ìå Ýíá ìüíï äåßêôçðßíáêá. Åßíáé üìùò äõíáôüí, ïé ðßíáêåò íá Ý÷ïõí ðåñéóóüôåñåò ôçò ìßáò äéáóôÜóåéò. Åíáò ðßíáêáò äýï äéáóôÜóåùí ìðïñåß íá èåùñçèåß ùò Ýíáò ðßíáêáò ìßáò äéÜóôáóçò, ôïõ ïðïßïõ ôá óôïé÷åßá åßíáé åðßóçò ðßíáêåò ìßáò äéÜóôáóçò. Ãåíéêåýïíôáò ìðïñïýìå íá ïñßæïõìå ðßíáêåò ìå ðåñéóóüôåñåò äéáóôÜóåéò. Ç ãåíéêÞ ìïñöÞ ôçò åíôïëÞò äÞëùóçò åíüò ðïëõäéÜóôáôïõ ðßíáêá åßíáé: ôýðïò
áíáãíùñéóôéêü[ìÝãåèïò1][ìÝãåèïò2]...[ìÝãåèïòn];
Åôóé, ãéá ðáñÜäåéãìá, ç ðáñáêÜôù åíôïëÞ äçìéïõñãåß Ýíá äéäéÜóôáôï ðßíáêá áêåñáßùí 4x3 (äçëáäÞ ìå 4 ãñáììÝò êáé 3 óôÞëåò): int towd[4][3];
Ç áíáöïñÜ óôá óôïé÷åßá åíüò ðßíáêá ìå ðåñéóóüôåñåò ôçò ìßáò äéáóôÜóåéò ãßíåôáé ìå ôç ÷ñÞóç ðåñéóóüôåñùí áðü Ýíá äåéêôþí-ðßíáêá. Ð.÷. ãéá íá áíáöåñèïýìå óôï óôïé÷åßï ôçò 2çò ãñáììÞò êáé ôçò 3çò óôÞëçò ôïõ ðßíáêá towd ãñÜöïõìå:
Ðßíáêåò êáé ÁëöáñéèìçôéêÜ
65
towd[1][2]
Óôï Ó÷Þìá 7.2 äßíåôáé ìßá ó÷çìáôéêÞ áíáðáñÜóôáóç ôïõ ðßíáêá towd. óôÞëåò üíïìá ôïõ ðßíáêá êÜèå óôïé÷åßï ôïõ ðßíáêá åßíáé ôýðïõ int
Æ towd ãñáììÝò 0 1
0
1
2 Å towd[1][2]
2 3 n towd[3][0]
Ó÷Þìá 7.2: Ó÷çìáôéêÞ áíáðáñÜóôáóç åíüò äéäéÜóôáôïõ ðßíáêá
Ôï ðñüãñáììá ðïõ áêïëïõèåß ÷ñçóéìïðïéåß Ýíá äéäéÜóôáôï ðßíáêá áêåñáßùí 4x5, ôá óôïé÷åßá ôïõ ïðïßïõ äßíïíôáé áð'ôï ÷ñÞóôç, ìüëéò ïëïêëçñùèåß ç åéóáãùãÞ ï ðßíáêáò åìöáíßæåôáé óôçí ïèüíç. Óôç óõíÝ÷åéá ï ÷ñÞóôçò êáëåßôáé íá äþóåé Ýíáí áêÝñáéï, ôïí ïðïßïí ôï ðñüãñáììá áíáæçôÜ ìÝóá óôïí ðßíáêá. Áí ôïí åíôïðßóåé ôõðþíåé ôç èÝóç ôçí ïðïßá âñßóêåôáé (ãñáììÞ, óôÞëç): /* found.c */ /* ÁíáæÞôçóç óôïé÷åßïõ óå ðßíáêá äýï äéáóôÜóåùí */ #define LINES 4 #define COLUMNS 5 main() { int matrix[LINES][COLUMNS], i, j, num, found=0; for(i=0;i<LINES;i++) /* åéóáãùãÞ óôïé÷åßùí */ for(j=0;j<COLUMNS;j++) /* óôïí ðßíáêá */ { printf("Äþóå ôï óôïé÷åßï %d,%d ôïõ ðßíáêá: ",i,j); scanf("%d",&matrix[i][j]); } for(i=0;i<LINES;i++) /* åêôýðùóç ðßíáêá */ { for(j=0;j<COLUMNS;j++) printf("%5d",matrix[i][j]); printf("\n"); } printf("Äþóå ôïí áêÝñáéï ðïõ èÝëåéò íá øÜîù: "); scanf("%d",&num); i=0; while(!found && i<LINES) /* Ýñåõíá ôïõ ðßíáêá */ { j=0; while(!found && j<COLUMNS) if(matrix[i][j]==num) found=1; else j++; if(!found) i++; } if(found) printf("O áñéèìüò %d õðÜñ÷åé óôç èÝóç %d,%d",num,i,j); else printf("Ï áñéèìüò %d äåí õðÜñ÷åé óôïí ðßíáêá",num); }
Áè. Å. Êïõôóïíéêüëáò
H Ãëþóóá Ðñïãñáììáôéóìïý C
66
7.1.4
z¶ ¢ ™ zƒÃ ø¡ ªø¡ ™ ¶ ¡z ™
Ãéá íá èÝóïõìå áñ÷éêÝò ôéìÝò ó'Ýíáí ðßíáêá, èá ðñÝðåé áõôüò íá Ý÷åé ïñéóôåß åîùôåñéêÜ Þ íá Ý÷åé êáèïñéóôåß ùò static (âëÝðå § 6.5). Ç ãåíéêÞ ìïñöÞ ôçò åíôïëÞò áðüäïóçò áñ÷éêþí ôéìþí óå Ýíáí ðßíáêá, ìïéÜæåé ìå ôùí Üëëùí ìåôáâëçôþí: static ôýðïò áíáãíùñ.[ìÝã.1]...[ìÝã.n]={ëßóôá_ôéìþí};
üðïõ ëßóôá_ôéìþí åßíáé ìßá ëßóôá óôáèåñþí ðïõ ÷ùñßæïíôáé ìåôáîý ôïõò ìå êüììá êáé ï ôýðïò ôïõò åßíáé óõìâáôüò ìå ôï âáóéêü ôýðï ôïõ ðßíáêá. ÁõôÞ ç åíôïëÞ ôïðïèåôåß ôçí ðñþôç óôáèåñÜ óôçí ðñþôç èÝóç ôïõ ðßíáêá, ôç äåýôåñç óôáèåñÜ óôç äåýôåñç èÝóç ê.ï.ê. Ç ðáñáêÜôù åíôïëÞ áðïäßäåé áñ÷éêÝò ôéìÝò ó'Ýíá ìïíïäéÜóôáôï ðßíáêá: static float array[5]={18.3,7.98,6.8,3.1,7.21};
Ïôáí áðïäßäïõìå áñ÷éêÝò ôéìÝò ó'Ýíá ìïíïäéÜóôáôï ðßíáêá, ìðïñïýìå áí èÝëïõìå íá ðáñáëåßøïõìå ôï ìÝãåèïò ôïõ ðßíáêá. Óôçí ðåñßðôùóç áõôÞ ï ìåôáãëùôôéóôÞò èá ìáò êÜíåé ôç ÷Üñç íá ìåôñÞóåé ôï ðëÞèïò ôùí óôïé÷åßùí óôç ëßóôá ôùí áñ÷éêþí ôéìþí êáé íá èÝóåé áõôü óáí ìÝãåèïò ôïõ ðßíáêá. Åôóé ç ðáñáðÜíù åíôïëÞ èá ìðïñïýóå íá Þôáí: static float array[]={18.3,7.98,6.8,3.1,7.21};
Ùò ðáñÜäåéãìá áò äïýìå ôï ðáñáêÜôù ðñüãñáììá ôï ïðïßï æçôÜ áðü ôï ÷ñÞóôç íá äþóåé êÜðïéï ðïóü óå äñá÷ìÝò êáé êáôüðéí áõôü ôï ðïóü ìåôáôñÝðåôáé óôïí åëÜ÷éóôï áñéèìü êåñìÜôùí êáé ÷áñôïíïìéóìÜôùí ðïõ ÷ñåéÜæïíôáé ãéá íá óõìðëçñùèåß áõôü: /* change.c */ /* ÌåôáôñïðÞ ðïóïý óôïí åëÜ÷éóôï áñéèìü íïìéóìÜôùí */ # define LIM 10 main() { static int table[]={5000,1000,500,100,50,20,10,5,2,1}; /* áñ÷éêÝò ôéìÝò óôïí ðßíáêá table */ long int amount; int i,quantity; printf("Äþóå ðïóü óå äñá÷ìÝò: "); scanf("%D", &amount); for(i=0;i<LIM;i++) { quantity=amount/table[i]; printf("Íüìéóìá %4d äñ÷. ôåìÜ÷éá=%d\n", table[i],quantity); amount %=table[i]; } }
Ïé ðïëõäéÜóôáôïé ðßíáêåò ðáßñíïõí áñ÷éêÝò ôéìÝò êáôÜ ôïí ßäéï ôñüðï ðïõ ðáßñíïõí êáé ïé ìïíïäéÜóôáôïé. Ãéá ðáñÜäåéãìá ç ðáñáêÜôù åíôïëÞ äßíåé óôïí ðßíáêá sqrs ùò áñ÷éêÝò ôéìÝò ôïõò áñéèìïýò áðü 1 Ýùò 4 êáé ôá ôåôñÜãùíÜ ôïõò: static int sqrs[4][2]={{1,1}, Þ éóïäýíáìá static int sqrs[4][2]={1,1, {2,4}, 2,4, {3,9}, 3,9, {4,16}}; 4,16};
Ðßíáêåò êáé ÁëöáñéèìçôéêÜ
67
ÖõóéêÜ ïé áñ÷éêÝò ôéìÝò èá ìðïñïýóáí íá ãñáöïýí êáé óå ìßá ãñáììÞ, áí êáé áõôü äå ìáò âïçèÜ óôç ó÷çìáôéêÞ áíáðáñÜóôáóç ôïõ ðßíáêá. ÊáôÜ ôçí áðüäïóç áñ÷éêþí ôéìþí óå ðïëõäéÜóôáôïõò ðßíáêåò, ìðïñïýìå áí èÝëïõìå, íá ðáñáëåßøïõìå ôçí áñéóôåñüôåñç äéÜóôáóç ôïõ ðßíáêá. Áõôü äåí åìðïäßæåé ôï ìåôáãëùôôéóôÞ íá õðïëïãßóåé áõôÞ ôç äéÜóôáóç, áöïý üëá ôá óôïé÷åßá ôïõ ðßíáêá åßíáé ìå ôç óåéñÜ áðïèçêåõìÝíá êáôÜ ãñáììÝò, áðü ôï ðñþôï ùò ôï ôåëåõôáßï, óå äéáäï÷éêÝò èÝóåéò ìíÞìçò. Ãéá ðáñÜäåéãìá ç áðüäïóç áñ÷éêþí ôéìþí óôïí ðßíáêá sqrs èá ìðïñïýóå íá Þôáí: static int sqrs[][2]{1,1, 2,4, 3,9, 4,16};
áð'üðïõ åßíáé ðñïöáíÝò üôé åöüóïí ï ðßíáêáò Ý÷åé äýï óôÞëåò êáé óõíïëéêÜ ïêôþ óôïé÷åßá, ôï ìÝãåèïò ôçò äéÜóôáóçò ðïõ äåí êáèïñßæåôáé åßíáé 4 (ãñáììÝò x óôÞëåò = 8 ãñáììÝò = 8/óôÞëåò).
7.1.5
¶ ¡z ™ ø™ ¶zƒzª ƒ ™ ™À¡zƒ ™ ™
Ïðùò îÝñïõìå ôá óôïé÷åßá åíüò ðßíáêá êáôáëáìâÜíïõí äéáäï÷éêÝò èÝóåéò óôç ìíÞìç ôïõ Ç/Õ. ÊÜèå èÝóç ìíÞìçò Ý÷åé ÷ùñçôéêüôçôá 1 byte (=8 bits) êáé ôçò áíôéóôïé÷åß Ýíáò áñéèìüò ðïõ êáëåßôáé äéåýèõíóç. Ïé äéåõèýíóåéò áñ÷ßæïõí áðü ôï ìçäÝí êáé äéáäï÷éêÝò èÝóåéò ìíÞìçò Ý÷ïõí äéåõèýíóåéò ðïõ äéáöÝñïõí êáôÜ Ýíá. Ùò äéåýèõíóç ôïõ ðßíáêá åííïåßôáé ç äéåýèõíóç ìíÞìçò üðïõ âñßóêåôáé áðïèçêåõìÝíï ôï ðñþôï óôïé÷åßï ôïõ. ÖõóéêÜ, áöïý îÝñïõìå ôïí ôýðï ôùí óôïé÷åßùí ôïõ ðßíáêá (êáé êáôÜ óõíÝðåéá ôïí áñéèìü ôùí bytes ðïõ êáôáëáìâÜíåé êáèÝíá áð'áõôÜ) êáé ôç äéåýèõíóç ôïõ ðñþôïõ óôïé÷åßïõ ôïõ, ìðïñïýìå íá âñïýìå ôç äéåýèõíóç ïðïéïõäÞðïôå óôïé÷åßïõ ôïõ. Ôï åñþôçìá åßíáé: ðþò áíáöåñüìáóôå óôç äéåýèõíóç ôïõ ðßíáêá; Êáé ç áðÜíôçóç: ÷ñçóéìïðïéþíôáò ôï áíáãíùñéóôéêü ôïõ ðßíáêá, ÷ùñßò ôéò áãêýëåò. Áðü ôçí Üëëç, ç äéåýèõíóç ôïõ ðñþôïõ óôïé÷åßïõ ôïõ ðßíáêá (÷ñçóéìïðïéþíôáò ôïí ôåëåóôÞ äéåýèõíóçò &, ðïõ Ý÷ïõìå äåé óôçí § 4.3.2) åßíáé: &áíáãíùñéóôéêü[0]
Åôóé, ìå âÜóç ôá ðáñáðÜíù ðñïêýðôåé üôé: äéåýèõíóç_ðßíáêá==äéåýèõíóç_ðñþôïõ_óôïé÷åßïõ_ôïõ
êáé Üñá áíáãíùñéóôéêü==&áíáãíùñéóôéêü[0]
Ãéá íá ãßíïõí êáôáíïçôÜ ôá ðáñáðÜíù áò èåùñÞóïõìå ôïí ïñéóìü: static int list[4]={42,1,64,33};
ôï Ó÷Þìá 7.3 äåß÷íåé ôç ó÷Ýóç ìåôáîý ôçò ó÷çìáôéêÞò áíáðáñÜóôáóçò ôïõ ðßíáêá êáé ôçò ðñáãìáôéêÞò ôïõ õðüóôáóçò óôç ìíÞìç. Åðßóçò äåß÷íåé ôç äéáöïñÜ ìåôáîý ôçò äéåýèõíóçò åíüò óôïé÷åßïõ ôïõ ðßíáêá êáé ôçò ôéìÞò áõôïý. Ôþñá ðïõ êáôáíïÞóáìå ôá ðåñß äéåõèýíóåùí ôùí ðéíÜêùí, áò äïýìå ðþò ÷ñçóéìïðïéïýíôáé ïé ðßíáêåò ùò ðáñÜìåôñïé óå óõíáñôÞóåéò. ÌÝ÷ñé ôþñá Ý÷ïõìå äåé ðáñáäåßãìáôá ðïõ ÷ñçóéìïðïéïýóáí ìåôáâëçôÝò âáóéêþí ôýðùí äåäïìÝíùí ùò ðñáãìáôéêÝò ðáñáìÝôñïõò óå ìßá óõíÜñôçóç. Óôçí ðåñßðôùóç áõôÞ ìåôáâéâÜæïíôáé
Áè. Å. Êïõôóïíéêüëáò
68
H Ãëþóóá Ðñïãñáììáôéóìïý C
óôç óõíÜñôçóç ïé ôéìÝò ôùí ìåôáâëçôþí. Ìå Üëëá ëüãéá, äçìéïõñãïýíôáé áíôßãñáöá ôùí ìåôáâëçôþí êáé ìüíï ó'áõôÜ ôá áíôßãñáöá ìðïñåß íá Ý÷åé ðñüóâáóç ç óõíÜñôçóç (êëÞóç êáô'áîßá). Ïíïìá äéåýèõíóçò ðßíáêá
Ó÷çìáôéêÞ áíáðáñÜóôáóç ôïõ ðßíáêá
Äéåýèõíóç ðßíáêá Ðßíáêáò óôç ìíÞìç
list ¢
Äéåýèõíóç óôïé÷åßïõ ôïõ ðßíáêá
¢+1 ¢+2 ¢+3 ¢+4 ¢+5 ¢+6 ¢+7
42 1 64 33
0
1
2
3
42
1
64
33
} list[0] } list[1] } list[2] } list[3] Ïíïìá óôïé÷åßïõ ôïõ ðßíáêá
&list[3]
ÔéìÞ óôïé÷åßïõ ôïõ ðßíáêá Ïíïìá ôçò äéåýèõíóçò óôïé÷åßïõ ôïõ ðßíáêá
Ó÷Þìá 7.3: Ç äéåýèõíóç êáé ôá óôïé÷åßá åíüò ðßíáêá
Ïôáí ÷ñçóéìïðïéïýìå Ýíáí ðßíáêá ùò ðáñÜìåôñï óå ìßá óõíÜñôçóç, äå ìåôáâéâÜæïíôáé ïé ôéìÝò ôïõ ðßíáêá óôç óõíÜñôçóç, äçëáäÞ äå äçìéïõñãåßôáé Ýíá áíôßãñáöï ôïõ ðßíáêá, ðÜíù óôï ïðïßï èá Ý÷åé ðñüóâáóç ç óõíÜñôçóç. Áõôü ðïõ ìåôáâéâÜæåôáé åßíáé ç äéåýèõíóç ôïõ ðßíáêá. Åôóé ïðïéáäÞðïôå áëëáãÞ ãßíåé áðü ôç óõíÜñôçóç óôá óôïé÷åßá ôïõ ðßíáêá, åßíáé ðñáãìáôéêÞ. Ùò åöáñìïãÞ ôùí ðáñáðÜíù áò äïýìå Ýíá ðñüãñáììá ðïõ äÝ÷åôáé áðü ôï ðëçêôñïëüãéï áêÝñáéåò ôéìÝò ãéá ôá óôïé÷åßá åíüò äéäéÜóôáôïõ ðßíáêá êáé óôç óõíÝ÷åéá âñßóêåé êáé ôõðþíåé ôç ìåãáëýôåñç áð'áõôÝò. Ç åýñåóç ôçò ìåãáëýôåñçò ôéìÞò ãßíåôáé áðü ôç óõíÜñôçóç max() ç ïðïßá äÝ÷åôáé ùò ðáñÜìåôñï Ýíáí ðßíáêá. Áò ðáñáôçñÞóïõìå üôé óôç äÞëùóç ôïõ ðßíáêá ùò ôõðéêÞò ðáñáìÝôñïõ óôç óõíÜñôçóç, äå ÷ñåéÜæåôáé íá ðïýìå óôç óõíÜñôçóç ðüóåò ãñáììÝò Ý÷åé ï ðßíáêáò. Áõôü äéüôé áõôÞ ç äÞëùóç äåí êñáôÜåé ÷þñï óôç ìíÞìç ãéá ôïí ðßíáêá. Ôï ìüíï ðïõ ÷ñåéÜæåôáé íá îÝñåé ç óõíÜñôçóç åßíáé ôï ðüóåò óôÞëåò Ý÷åé ï ðßíáêáò, áõôü ôçò åðéôñÝðåé íá áíáöÝñåôáé ìå áêñßâåéá óå ïðïéïäÞðïôå óôïé÷åßï ôïõ ðßíáêá, êáèüóïí ôá óôïé÷åßá ôïõ äéäéÜóôáôïõ ðßíáêá áðïèçêåýïíôáé êáôÜ ãñáììÝò óå äéáäï÷éêÝò èÝóåéò óôç ìíÞìç. Ãéá ðáñÜäåéãìá ãéá íá âñåé ôç èÝóç óôç ìíÞìç (ùò ðñïò ôï ðñþôï óôïé÷åßï ôïõ ðßíáêá) ðïõ åßíáé áðïèçêåõìÝíï ôï óôïé÷åßï matrix[3][1], ðïëëáðëáóéÜæåé ôïí áñéèìü ôçò ãñáììÞò (3) ìå ôïí áñéèìü ôùí óôïé÷åßùí áíÜ ãñáììÞ (COLUMNS, ðïõ åßíáé 5) êáé ìåôÜ ðñïóèÝôåé ôïí áñéèìü ôçò óôÞëçò (ðïõ åßíáé 1). Ôï áðïôÝëåóìá åßíáé 3*5+1=16.
Ðßíáêåò êáé ÁëöáñéèìçôéêÜ
69
/* maxnum.c */ /* Åýñåóç ôïõ ìåãáëýôåñïõ áñéèìïý óå ðßíáêá äýï äéáóôÜóåùí */ #define LINES 4 #define COLUMNS 5 main() { int matrix[LINES][COLUMNS],i,j,num; for(i=0;i<LINES;i++) for(j=0;j<COLUMNS;j++) { printf("Äþóå ôï óôïé÷åßï %d,%d ôïõ ðßíáêá: ",i,j); scanf("%d",&matrix[i][j]); } num=max(matrix); printf("To ìÝãéóôï óôïé÷åßï ôïõ ðßíáêá åßíáé ôï %d\n",num); } /* max() */ /* ÅðéóôñÝöåé ôï ìåãáëýôåñï max(int matr[][COLUMNS]) { int i,j,m; m=matr[0][0]; /* for(i=0;i<LINES;i++) /* for(j=0;j<COLUMNS;j++) if(m<matr[i][j]) /* m=matr[i][j]; /* return(m); }
7.1.6
óôïé÷åßï ôïõ ðßíáêá */
õðïèÝôïõìå üôé ìåãáëýôåñï óôïé÷åßï åßíáé ôï 0,0 */ åëÝã÷ïõìå üëá ôá õðüëïéðá óôïé÷åßá */ áí êÜðïéï åßíáé ìåãáëýôåñï */ èÝôïõìå áõôü óôç ìåôáâëçôÞ m */
z• ¡ ª ™ ¶ ¡z z
Ðñéí ðñï÷ùñÞóïõìå óôá áëöáñéèìçôéêÜ, èá äïýìå ìßá óõíÜñôçóç ðïõ ôáîéíïìåß ôéò ôéìÝò åíüò ðßíáêá. Ç ôáîéíüìçóç åßíáé óçìáíôéêÞ ëåéôïõñãßá, éäéáßôåñá óå ðñïãñÜììáôá ðïõ ÷åéñßæïíôáé âÜóåéò äåäïìÝíùí (databases), óôá ïðïßá ï ÷ñÞóôçò èÝëåé íá áíáäéáôÜîåé ìßá áñéèìçôéêÞ Þ áëöáâçôéêÞ ëßóôá óôïé÷åßùí, óå áýîïõóá Þ öèßíïõóá óåéñÜ. ÕðÜñ÷ïõí áñêåôÝò ìÝèïäïé ôáîéíüìçóçò, ìßá áðü ôéò áðëïýóôåñåò åßíáé ç ìÝèïäïò ôçò åðéëïãÞò (sorting by selection). Ç ìÝèïäïò áõôÞ åßíáé ç åîÞò: Âñßóêïõìå ôï ìéêñüôåñï óôïé÷åßï ôïõ ðßíáêá êáé ôï áíôáëëÜóóïõìå ìå ôï ðñþôï óôïé÷åßï áõôïý. Eðåéôá êÜíïõìå ôï ßäéï óôïí ðßíáêá ðïõ ìÝíåé áí áãíïÞóïõìå ôï ðñþôï óôïé÷åßï ôïõ áñ÷éêïý ðßíáêá, êÜíïõìå ôï ßäéï óôïí ðßíáêá ðïõ ìÝíåé áí áãíïÞóïõìå ôá äýï ðñþôá óôïé÷åßá ôïõ áñ÷éêïý ðßíáêá ê.ï.ê. Ç ìÝèïäïò óôáìáôÜåé áí öôÜóïõìå óå ðßíáêá ìå Ýíá ìüíï óôïé÷åßï. /* sortsel.c */ #define SIZE 5 main() { int list[SIZE],i; for(i=0;i<SIZE;i++) { printf("Äþóå ôï %do óôïé÷åßï ôïõ ðßíáêá: ",i); scanf("%d",&list[i]); }
Áè. Å. Êïõôóïíéêüëáò
H Ãëþóóá Ðñïãñáììáôéóìïý C
70
sort(list); printf("Ï ðßíáêáò ôáîéíïìçìÝíïò åßíáé:\n"); for(i=0;i<SIZE;i++) printf("%d ",list[i]); } /* sort() */ /* Ôáîéíïìåß ôïí ðßíáêá ìå ôç ìÝèïäï ôçò åðéëïãÞò */ sort(int list[]) { int i,j,k,min,temp; for(i=0;i<SIZE-1;i++) { /*õðïèÝôïõìå üôé ôï åëÜ÷éóôï óôïé÷åßo */ min=i; /*âñßóêåôáé óôçí 1ç èÝóç ôïõ ðßíáêá */ for(j=i+1;j<SIZE;j++) /*óáñþíïõìå ôïí ðßíáêá êáé âñßóêïõìå ôç */ if(list[j]<list[min]) min=j;/*èÝóç ôïõ ðñáãìáôéêÜ åëÜ÷éóôïõ óôïé÷åßïõ*/ if (min!=i) { temp=list[i]; /*ôÝëïò åíáëëÜóóïõìå ôçí ôéìÞ ôçò ðñþôçò */ list[i]=list[min]; /*èÝóçò ìå áõôÞ ôçò èÝóçò ðïõ âñÞêáìå ôï */ list[min]=temp; /*ðñáãìáôéêÜ åëÜ÷éóôï óôïé÷åßï */ } } }
7.2
z§ºzƒ £ª z
Ç óõíçèÝóôåñç ÷ñÞóç ôùí ìïíïäéÜóôáôùí ðéíÜêùí åßíáé óôç äçìéïõñãßá áëöáñéèìçôéêþí (strings). Óôç C Ýíá áëöáñéèìçôéêü, äåí åßíáé ôßðïôá Üëëï áðü Ýíáí ðßíáêá ÷áñáêôÞñùí, ï ïðïßïò ôåñìáôßæåé ìå ôï ÷áñáêôÞñá '\0' ï ïðïßïò ëÝãåôáé áíýðáñêôïò ÷áñáêôÞñáò (null character) êáé Ý÷åé áñéèìçôéêÞ ôéìÞ ìçäÝí. Ãéá ôï ëüãï áõôü èá ðñÝðåé íá äçëþíïõìå ôïõò ðßíáêåò ÷áñáêôÞñùí êáôÜ Ýíá ÷áñáêôÞñá ìåãáëýôåñïõò áðü ôï ìåãáëýôåñï áëöáñéèìçôéêü ðïõ åðéèõìïýìå íá ÷ùñÜíå. Ïðùò ìðïñïýìå íá èÝóïõìå áñ÷éêÝò ôéìÝò óôïõò ðßíáêåò, Ýôóé ìðïñïýìå êáé óôá áëöáñéèìçôéêÜ, ìéáò êé áõôÜ åßíáé ðßíáêåò ÷áñáêôÞñùí. Åôóé ç ðáñáêÜôù åíôïëÞ: static char str[]={'Ê','á','ë','ç','ì','Ý','ñ','á','\0'};
èÝôåé ôçí áñ÷éêÞ ôéìÞ "ÊáëçìÝñá" óôï áëöáñéèìçôéêü str. Ïìùò ç C ìáò ðáñÝ÷åé Ýíáí ðéï óýíôïìï ôñüðï ãéá íá êÜíïõìå ôï ßäéï ðñÜãìá: static char str[]="ÊáëçìÝñá";
áò ðñïóÝîïõìå üôé óôï äåýôåñï ôñüðï äå ÷ñåéÜæåôáé íá êÜíïõìå ÷ñÞóç ôïõ '\0'. Ôï ðáñáêÜôù ðñüãñáììá åîåôÜæåé ðþò åßíáé áðïèçêåõìÝíï Ýíá áëöáñéèìçôéêü óôç ìíÞìç ôïõ Ç/Õ. Óôï ðñüãñáììá áõôü öáßíåôáé êáé ìßá íÝá óõíÜñôçóç âéâëéïèÞêçò, ç strlen(), ôçí ïðïßá èá äïýìå óôçí åðüìåíç ðáñÜãñáöï. /* strexam.c */ main() { char name[81]; int i; puts("Äþóå ôï üíïìÜ óïõ: "); gets(name); for(i=0;i<strlen(name)+4;i++) printf("Äéåýèõíóç=%5u ×áñáêôÞñáò='%c'=%3d\n",&name[i],name[i],name[i]); }
Ðßíáêåò êáé ÁëöáñéèìçôéêÜ
71
Ãéá íá äåßîïõìå ôé óõìâáßíåé ìåôÜ ôï ôÝëïò ôïõ áëöáñéèìçôéêïý, óôï ðñïçãïýìåíï ðñüãñáììá, ôõðþíïõìå áêüìá ôÝóóåñéò ÷áñáêôÞñåò ìåôÜ ôï ôÝëïò ôïõ.
7.2.1
™À¡zƒ ™ ™ ~ ~§ £ ™ ° z z§ºzƒ £ª z
Å÷ïõìå äåé óôçí § 4.2 ôéò óõíáñôÞóåéò gets() êáé puts() ãéá ôï äéÜâáóìá êáé ôçí åêôýðùóç áëöáñéèìçôéêþí. Ïôáí äéáâÜæïõìå ìå ôçí gets() Ýíá áëöáñéèìçôéêü áðü ôï ðëçêôñïëüãéï, ï ÷áñáêôÞñáò ôåñìáôéóìïý '\0' ðñïóôßèåôáé áõôüìáôá óôï ôÝëïò ôïõ. Åêôüò áð'áõôÝò, ç C ðáñÝ÷åé Ýíá óýíïëï áðü óõíáñôÞóåéò ÷åéñéóìïý áëöáñéèìçôéêþí, ôéò êõñéüôåñåò áð'ôéò ïðïßåò èá äïýìå ðáñáêÜôù: strlen() Ç êëÞóç ôçò strlen() Ý÷åé ôçí ðáñáêÜôù ìïñöÞ: strlen(s);
üðïõ s åßíáé Ýíá áëöáñéèìçôéêü. Ç óõíÜñôçóç åðéóôñÝöåé ôï ðëÞèïò ôùí ÷áñáêôÞñùí (ìÞêïò) ôïõ áëöáñéèìçôéêïý. Äå ìåôñÜ ôï ÷áñáêôÞñá ôåñìáôéóìïý '\0'. strcpy() Ç êëÞóç ôçò strcpy() Ý÷åé ôçí ðáñáêÜôù ìïñöÞ: strcpy(s1,s2);
üðïõ s1, s2 áëöáñéèìçôéêÜ. Ç óõíÜñôçóç áíôéãñÜöåé ôï áëöáñéèìçôéêü s2 óôï s1. Ôï s1 ðñÝðåé íá åßíáé áñêåôÜ ìåãÜëï ãéá íá ÷ùñÝóåé ôï s2. strcat() Ç êëÞóç ôçò strcat() Ý÷åé ôçí ðáñáêÜôù ìïñöÞ: strcat(s1,s2);
üðïõ s1, s2 áëöáñéèìçôéêÜ. Ç óõíÜñôçóç ðñïóáñôÜ ôï s2 óôï ôÝëïò ôïõ s1. Ôï s1 ðñÝðåé íá åßíáé áñêåôÜ ìåãÜëï ãéá íá ÷ùñÝóåé êáé ôï s2. strcmp() Ç êëÞóç ôçò strcmp() Ý÷åé ôçí ðáñáêÜôù ìïñöÞ: strcmp(s1,s2);
üðïõ s1, s2 áëöáñéèìçôéêÜ. Ç óõíÜñôçóç óõãêñßíåé ôá s1, s2 êáé åðéóôñÝöåé ôéìÞ áñíçôéêÞ, ìçäåíéêÞ, Þ èåôéêÞ, áí ôï s1 åßíáé, ëåîéêïãñáöéêÜ, ìéêñüôåñï áðü, ßóï ìå, Þ ìåãáëýôåñï áðü ôï s2 áíôßóôïé÷á. ÐáñáêÜôù äßíïíôáé ìåñéêÜ ðñïãñÜììáôá ðïõ ÷åéñßæïíôáé áëöáñéèìçôéêÜ, êÜíïíôáò ÷ñÞóç ôùí óõíáñôÞóåùí ðïõ ðñïáíáöÝñáìå. Ôï ðñþôï ðñüãñáììá ÷ñçóéìïðïéåß ôç óõíÜñôçóç strcmp() ãéá íá óõãêñßíåé äýï áëöáñéèìçôéêÜ: /* compare.c */ /* Óýãêñéóç äýï áëöáñéèìçôéêþí ìå ôç óõíÜñôçóç strcmp() */ main() { char string1[81], string2[81]; int i; printf("\nÄþóå ôï ðñþôï áëöáñéèìçôéêü: "); gets(string1); printf("Äþóå ôï äåýôåñï áëöáñéèìçôéêü: "); gets(string2); i=strcmp(string1,string2); if(i<0) printf("%s < %s",string1,string2); else if(i>0) printf("%s > %s",string1,string2); else printf("%s = %s",string1,string2); }
Áè. Å. Êïõôóïíéêüëáò
72
H Ãëþóóá Ðñïãñáììáôéóìïý C
Ôï åðüìåíï ðñüãñáììá æçôÜ áðü ôï ÷ñÞóôç íá ðëçêôñïëïãÞóåé Ýíá áëöáñéèìçôéêü êáé Ýíáí áêÝñáéï áñéèìü. Óôç óõíÝ÷åéá äéáãñÜöåé áðü ôï áëöáñéèìçôéêü ôï ÷áñáêôÞñá ðïõ âñßóêåôáé óôç èÝóç ðïõ áíôéóôïé÷åß óôïí áñéèìü ðïõ Ýäùóå ï ÷ñÞóôçò: /* delete.c */ /* ÄéáãñáöÞ ÷áñáêôÞñá áðü Ýíá áëöáñéèìçôéêü, */ /* ìå ÷ñÞóç ôçò óõíÜñôçóçò strcpy() */ main() { char string[81]; int position; printf("\nÄþóå áëöáñéèìçôéêü [ENTER], èÝóç\n"); gets(string); scanf("%d",&position); strdel(string,position); puts(string); } /* strdel */ /* ÄéáãñÜöåé ÷áñáêôÞñá áðü áëöáñéèìçôéêü */ strdel(char str[],int n) { /* ìåôáêéíïýìå ôï äåýôåñï ôìÞìá ôïõ */ strcpy(&str[n],&str[n+1]); /* áëöáñéèìçôéêïý, ìßá èÝóç áñéóôåñÜ */ }
ÔÝëïò ôï åðüìåíï ðñüãñáììá êÜíåé ôï áíôßèåôï. ÄéáâÜæåé Ýíá áëöáñéèìçôéêü, Ýíá ÷áñáêôÞñá êáé Ýíáí áñéèìü êáé ðáñåìâÜëëåé óôç èÝóç ôïõ áëöáñéèìçôéêïý óôçí ïðïßá áíôéóôïé÷åß ï áñéèìüò, ôï ÷áñáêôÞñá: /* insert.c */ /* ÅéóáãùãÞ ÷áñáêôÞñá óå Ýíá áëöáñéèìçôéêü, */ /* ìå ÷ñÞóç ôçò ôçò óõíÜñôçóçò strcpy() */ main() { char character, string[81]; int position; printf("\nÄþóå áëöáñéèìçôéêü [ENTER],÷áñáêôÞñá, èÝóç\n"); gets(string); scanf("%c %d",&character,&position); strins(string,character,position); puts(string); } /* strins */ /* ÐáñåìâÜëëåé ÷áñáêôÞñá óå áëöáñéèìçôéêü */ strins(char str[],char ch,int n) { char temp[81]; /* ðñïóùñéíÞ ìåôáâëçôÞ */ strcpy(temp,&str[n]); /* áðïèçêåýïõìå ôï äåýôåñï ìéóü óôçí temp */ str[n]=ch; /* åéóÜãïõìå ôï ÷áñáêôÞñá óôç èÝóç ôïõ */ strcpy(&str[n+1],temp); /* ïëéóèáßíïõìå ôï äåýôåñï ìéóü äåîéÜ */ }
Ðßíáêåò êáé ÁëöáñéèìçôéêÜ
7.3 1.
73
z™ ™ ™ ÃñÜøôå ðñüãñáììá ðïõ íá äÝ÷åôáé áðü ôï ðëçêôñïëüãéï óôïé÷åßá ãéá Ýíá äéäéÜóôáôï ðßíáêá áêåñáßùí 4x4 êáé íá âñßóêåé êáé ôõðþíåé ôï ìÝãéóôï êé åëÜ÷éóôï óôïé÷åßï áõôïý, êáèþò êáé ôéò èÝóåéò ðïõ âñßóêïíôáé (ãñáììÞ, óôÞëç).
2. Íá ãñáöåß ðñüãñáììá ðïõ íá äÝ÷åôáé áêÝñáéåò ôéìÝò ãéá ôá óôïé÷åßá åíüò ðßíáêá 3x3 êáé íá õðïëïãßæåé êáé ôõðþíåé ôï Üèñïéóìá ôùí óôïé÷åßùí ôçò êýñéáò êáé ôçò äåõôåñåýïõóáò äéáãùíßïõ ôïõ. 3. ÃñÜøôå Ýíá ðñüãñáììá ðïõ íá äÝ÷åôáé ùò åßóïäï ôá óôïé÷åßá åíüò äéäéÜóôáôïõ ðßíáêá áêåñáßùí 4x3 êáé íá åìöáíßæåé ôïí ðßíáêá óôçí ïèüíç. Åðßóçò íá ìåôñÜåé êáé íá åìöáíßæåé óôçí ïèüíç ôï ðëÞèïò ôùí èåôéêþí, áñíçôéêþí êáé ìçäåíéêþí óôïé÷åßùí ôïõ ðßíáêá. 4. ÃñÜøôå Ýíá ðñüãñáììá ðïõ íá äÝ÷åôáé ùò åßóïäï ôá óôïé÷åßá åíüò äéäéÜóôáôïõ ðßíáêá ðñáãìáôéêþí 4x3 êáé íá áíáóôñÝöåé áõôüí. ÁíÜóôñïöïò åíüò ðßíáêá, åßíáé Ýíáò Üëëïò ðßíáêáò ôïõ ïðïßïõ ïé ãñáììÝò åßíáé ïé óôÞëåò êáé ïé óôÞëåò åßíáé ïé ãñáììÝò ôïõ ðñþôïõ. Ôï ðñüãñáììá íá åìöáíßæåé óôçí ïèüíç ôüóï ôïí áñ÷éêü ðßíáêá üóï êáé ôïí áíåóôñáììÝíï. 5. ÃñÜøôå Ýíá ðñüãñáììá ðïõ íá äÝ÷åôáé áðü ôï ðëçêôñïëüãéï ôá óôïé÷åßá ãéá äýï ìïíïäéÜóôáôïõò ðßíáêåò áêåñáßùí 10 èÝóåùí ï êáèÝíáò êáé íá õðïëïãßæåé ôï Üèñïéóìá áõôþí ôùí äýï ðéíÜêùí. Áèñïéóìá äýï ìïíïäéÜóôáôùí ðéíÜêùí åßíáé Ýíáò ôñßôïò ðßíáêáò, ôï êÜèå óôïé÷åßï ôïõ ïðïßïõ åßíáé ôï Üèñïéóìá ôùí áíôßóôïé÷ùí óôïé÷åßùí ôùí äýï ðéíÜêùí ðïõ ðñïóôßèåíôáé. 6. Íá äïèïýí ïé ôéìÝò ðïõ èá ðÜñïõí ôá óôïé÷åßá ôïõ ðßíáêá p, ìåôÜ ôçí åêôÝëåóç ôïõ ðáñáêÜôù âñü÷ïõ: main() { int p[31],i=0; p[0]=0; while(i<15) { p[30-i]=p[0]-1; i++; p[i]=p[31-i]+1 } }
7.
ÃñÜøôå Ýíá ðñüãñáììá ðïõ íá êáèïñßæåé ôçí ôéìÞ ôùí óôïé÷åßùí ôïõ äéäéÜóôáôïõ ðßíáêá a, ðïõ äçëþíåôáé ùò åîÞò: int a[20][20];
óýìöùíá ìå ôïí ðáñáêÜôù êáíüíá: a[i][j]=1, üôáí ôï Üèñïéóìá i+j åßíáé Üñôéï êáé a[i][j]=-1, üôáí ôï Üèñïéóìá i+j åßíáé ðåñéôôü. Óôï ôÝëïò ôï ðñüãñáììá ðñÝðåé íá ôõðþíåé ôá óôïé÷åßá ôïõ ðßíáêá a.
Áè. Å. Êïõôóïíéêüëáò
74
H ร รซรพรณรณรก ร รฑรฏรฃรฑรกรฌรฌรกรดรฉรณรฌรฏรฝ C
8. ร รณรดรน รดรฏ รฐรกรฑรกรชร รดรน รฐรฑรผรฃรฑรกรฌรฌรก. ร รพรณรดรฅ รดรฉรฒ รดรฉรฌร รฒ รฐรฏรต รจรก รฐร รฑรฏรตรญ รดรก รณรดรฏรฉรทรฅร รก รดรฏรต รฐร รญรกรชรก p, รฌรฅรดร รดรงรญ รฅรชรดร รซรฅรณร รดรฏรต: #define N 10 main(); { int p[N],x,i; puts("ร ร ร ร x= "); scanf("%d",&x); p[0]=x; for(i=1;i<N;i++) p[i]=p[i-1]*x; }
9. ร รครฉรครฉร รณรดรกรดรฏรฒ รฐร รญรกรชรกรฒ a รครงรซรพรญรฅรดรกรฉ รนรฒ รฅรฎร รฒ: int a[20][20];
ร รฑร รธรดรฅ ร รญรก รดรฌร รฌรก รฐรฑรฏรฃรฑร รฌรฌรกรดรฏรฒ รฐรฏรต รญรก รฌรงรครฅรญร รฆรฅรฉ รดรก รณรดรฏรฉรทรฅร รก รดรฏรต รฐร รญรกรชรก, รฅรชรดรผรฒ รกรฐรผ รกรตรดร รฐรฏรต รขรฑร รณรชรฏรญรดรกรฉ รณรดรง รครฉรกรฃรพรญรฉรผ รดรฏรต รชรกรฉ รณรดรฉรฒ "รฃรฅรฉรดรฏรญรฉรชร รฒ" รครฉรกรฃรนรญร รฏรตรฒ รดรฏรต. 10. ร รฑร รธรดรฅ ร รญรก รฐรฑรผรฃรฑรกรฌรฌรก, รฐรฏรต รญรก รคร รทรฅรดรกรฉ รนรฒ รฅร รณรฏรครฏ n (n=10) รกรชร รฑรกรฉรฏรตรฒ รกรฑรฉรจรฌรฏรฝรฒ _ a1 a2 ... an รชรกรฉ รญรก รตรฐรฏรซรฏรฃร รฆรฅรฉ รชรกรฉ รดรตรฐรพรญรฅรฉ รดรง รฌร รณรง รดรฉรฌร รดรฏรตรฒ: x n
_
รชรกรฉ รดรงรญ รดรตรฐรฉรชร รดรฏรตรฒ รกรฐรผรชรซรฉรณรง: s
_
_
( a1 x )2 (a2 x )2 ... (an x )2 n
11. ร รฎรงรฃร รณรดรฅ รดรฉ รชร รญรฅรฉ รดรฏ รฐรกรฑรกรชร รดรน รฐรฑรผรฃรฑรกรฌรฌรก: #define LIM 10 main() { int i,s=0,a[LIM]; for(i=0;i<LIM;i++) a[i]=i+1; for(i=0;i<LIM;i++) s+=a[i]*a[i]; printf("\n%d",s); getch(); }
12. ร รฑร รธรดรฅ ร รญรก รฐรฑรผรฃรฑรกรฌรฌรก รฐรฏรต รญรก รคร รทรฅรดรกรฉ ร รญรก รกรซรถรกรฑรฉรจรฌรงรดรฉรชรผ รฌรฅ รฅรซรซรงรญรฉรชรฏรฝรฒ รทรกรฑรกรชรดร รฑรฅรฒ รชรกรฉ รญรก รดรฏ รฌรฅรดรกรดรฑร รฐรฅรฉ รฌรฅ รชรฅรถรกรซรกร รฏรตรฒ รทรกรฑรกรชรดร รฑรฅรฒ. ร รตรฌรขรฏรตรซรฅรตรดรฅร รดรฅ รดรฏรญ รฐร รญรกรชรก ASCII. 13. ร รฑร รธรดรฅ ร รญรก รฐรฑรผรฃรฑรกรฌรฌรก รฐรฏรต รญรก รคร รทรฅรดรกรฉ ร รญรก รกรซรถรกรฑรฉรจรฌรงรดรฉรชรผ รชรกรฉ รญรก รฅรฎรฅรดร รฆรฅรฉ รกรญ รฅร รญรกรฉ รฐรกรซรฉรญรครฑรฏรฌรฉรชรผ (รชรกรฑรชรฉรญรฉรชรผ). ร รญรก รกรซรถรกรฑรฉรจรฌรงรดรฉรชรผ รฅร รญรกรฉ รฐรกรซรฉรญรครฑรฏรฌรฉรชรผ รกรญ รครฉรกรขร รฆรฅรดรกรฉ รดรฏ ร รครฉรฏ รชรกรฉ รกรฐรผ รดรก รครฅรฎรฉร รฐรฑรฏรฒ รดรก รกรฑรฉรณรดรฅรฑร , รผรฐรนรฒ รฐ.รท. รดรฏ "radar" รชรกรฉ รดรฏ "ร ร ร ร ".
8.
¢ ª ™ z ¡ø™ ™
8.1
¢ ª ™
Ïðùò åßäáìå óôï ÊåöÜëáéï 7, ôá óôïé÷åßá åíüò ðßíáêá ðñÝðåé íá åßíáé üëá ôïõ ßäéïõ ôýðïõ. Ïôáí üìùò èÝëïõìå íá ïìáäïðïéÞóïõìå Ýíáí áñéèìü ìåôáâëçôþí ïé ïðïßåò åßíáé äéáöïñåôéêïý ôýðïõ êáé íá áíáöåñüìáóôå ó'áõôÝò, ãéá åõêïëßá, ìå Ýíá üíïìá, ôüôå ï ðßíáêáò åßíáé áêáôÜëëçëïò. Ãé'áõôÝò ôéò ðåñéðôþóåéò ç ãëþóóá C ìáò ðáñÝ÷åé Ýíá äïìçìÝíï ôýðï äåäïìÝíùí ðïõ ïíïìÜæåôáé äïìÞ (structure). Óå ìåñéêÝò ãëþóóåò ðñïãñáììáôéóìïý, éäéáßôåñá óôçí Pascal, ïé äïìÝò ïíïìÜæïíôáé åããñáöÝò (records). Åíá êëáóéêü ðáñÜäåéãìá äïìÞò åßíáé ç ïìáäïðïßçóç óôïé÷åßùí õðáëëÞëùí ãéá ìßá åöáñìïãÞ ìéóèïäïóßáò. Óå êÜèå õðÜëëçëï áíôéóôïé÷åß Ýíá óýíïëï óôïé÷åßùí, üðùò: Ïíïìáôåðþíõìï Äéåýèõíóç Âáèìüò ×ñüíéá Õðçñåóßáò ÏéêïãåíåéáêÞ ÊáôÜóôáóç ê.ë.ð. ÊáèÝíá áð'ôá óôïé÷åßá áõôÜ ïíïìÜæåôáé ìÝëïò (member) ôçò äïìÞò. ÌåñéêÜ áðü ôá ìÝëç èá ìðïñïýóáí íá åßíáé êé áõôÜ ìå ôç óåéñÜ ôïõò äïìÝò, üðùò ôï ïíïìáôåðþíõìï, ç äéåýèõíóç ê.ë.ð.
8.1.1
¢ §ø™ ¢ ª ™
Ç ãåíéêÞ ìïñöÞ ôçò åíôïëÞò äÞëùóçò åíüò ôýðïõ äïìÞò åßíáé: struct áíáãíùñéóôéêü_ôýðïõ_äïìÞò { ôýðïò_ìÝëïõò1 áíáãíùñéóôéêü_ìÝëïõò1; ôýðïò_ìÝëïõò2 áíáãíùñéóôéêü_ìÝëïõò2; ... ôýðïò_ìÝëïõòn áíáãíùñéóôéêü_ìÝëïõòn; };
Ç äåóìåõìÝíç ëÝîç struct îåêéíÜ ôç äÞëùóç ôçò äïìÞò, ðïõ åßíáé ìßá ëßóôá äçëþóåùí êëåéóìÝíùí óå Üãêéóôñá. Ôï áíáãíùñéóôéêü_ôýðïõ_äïìÞò êáëåßôáé êáé åôéêÝôá äïìÞò (structure tag). Ç åôéêÝôá äßíåé üíïìá óôç äïìÞ êáé óôç óõíÝ÷åéá ÷ñçóéìïðïéåßôáé ùò óõíôïìïãñáößá ãéá ôç ëßóôá ôùí äçëþóåùí ðïõ õðÜñ÷ïõí ìÝóá óôá Üãêéóôñá. Ôá áíáãíùñéóôéêÜ ôùí ìåëþí ôçò ßäéáò äïìÞò ðñÝðåé íá åßíáé äéáöïñåôéêÜ ìåôáîý ôïõò. Ùóôüóï Ýíá áíáãíùñéóôéêü ìÝëïõò Þ ç åôéêÝôá ôçò äïìÞò, ìðïñåß íá
H Ãëþóóá Ðñïãñáììáôéóìïý C
76
åßíáé ôï ßäéï ìå ôï áíáãíùñéóôéêü ìßáò Üëëçò ìåôáâëçôÞò ðïõ äåí åßíáé ìÝëïò áõôÞò ôçò äïìÞò. Åíá ðáñÜäåéãìá äÞëùóçò äïìÞò åßíáé: struct date { int day; char mon_name[13]; int year; };
/* çìÝñá */ /* ìÞíáò */ /* Ýôïò */
ÁõôÞ ç äïìÞ ïìáäïðïéåß ôñåéò ìåôáâëçôÝò ðïõ ÷ñçóéìïðïéïýíôáé ãéá ôçí ðåñéãñáöÞ ìßáò çìåñïìçíßáò ôçò ìïñöÞò: 4 Íïåìâñßïõ 1994. Ìßá äÞëùóç struct ïñßæåé Ýíáí ôýðï. Åôóé ôï äåîéü Üãêéóôñï ðïõ ôåñìáôßæåé ôç ëßóôá ôùí ìåëþí, ìðïñåß íá áêïëïõèåßôáé áðü ìßá ëßóôá ìåôáâëçôþí, üðùò Üëëùóôå óõìâáßíåé êáé ìå ôïõò âáóéêïýò ôýðïõò. ÄçëáäÞ, ç: struct date { int day; char mon_name[13]; int year; } a,b,c;
/* çìÝñá */ /* ìÞíáò */ /* Ýôïò */
åßíáé óõíôáêôéêÜ éóïäýíáìç ìå ôçí: int a,b,c;
ìå ôçí Ýííïéá üôé êáèåìéÜ áðü ôéò ðáñáðÜíù åíôïëÝò ïñßæåé ôá a, b, c ùò ìåôáâëçôÝò ôïõ êáôïíïìáæüìåíïõ ôýðïõ, ðñïêáëþíôáò äÝóìåõóç ìíÞìçò ãé'áõôÝò. Ìßá äÞëùóç äïìÞò ðïõ äåí áêïëïõèåßôáé áðü ëßóôá ìåôáâëçôþí, äå äåóìåýåé ÷þñï óôç ìíÞìç, áðëÜ ïñßæåé Ýíáí ôýðï. Ãéá íá äçëþóïõìå ìåôÜ ìåôáâëçôÝò áõôïý ôïõ ôýðïõ, ÷ñçóéìïðïéïýìå ôçí åôéêÝôá ôçò äïìÞò. Åôóé ãéá ðáñÜäåéãìá, ìå äåäïìÝíç ôçí ðáñáðÜíù äÞëùóç ôçò date, ç åíôïëÞ: struct date d1;
äçëþíåé ìßá ìåôáâëçôÞ d1 ôýðïõ struct åðáíáëçöèåß ç ëßóôá ôùí ìåëþí.
8.1.2
date ÷ùñßò íá ÷ñåéÜæåôáé íá
z¡zº ƒz ™ z ª § ª z™ ¢ ª ™
Ìðïñïýìå íá áíáöåñüìáóôå óå óõãêåêñéìÝíá ìÝëç ìßáò äïìÞò ÷ñçóéìïðïéþíôáò ôïí ôåëåóôÞ '.', ï ïðïßïò êáëåßôáé ôåëåóôÞò ôåëåßá, ùò åîÞò: áíáãíùñéóôéêü_äïìÞò.áíáãíùñéóôéêü_ìÝëïõò
Åôóé ç åíôïëÞ: d1.year=1994;
êáôá÷ùñåß óôï ìÝëïò year ôçò d1 ôçí ôéìÞ 1994. Óôï ðáñáêÜôù ðñüãñáììá ïñßæïõìå ôïí ôýðï äïìÞò person íá äéáèÝôåé äýï ìÝëç: name êáé salary. Áêïëïýèùò äçëþíïõìå äýï ìåôáâëçôÝò, person1 êáé person2, óôéò ïðïßåò êáôá÷ùñïýìå áðü ôï ðëçêôñïëüãéï ôá ïíüìáôá êáé ôïõò ìéóèïýò äýï õðáëëÞëùí. Óôç óõíÝ÷åéá åìöáíßæïõìå óôçí ïèüíç ôá óôïé÷åßá ôùí äýï õðáëëÞëùí êáé ôÝëïò âñßóêïõìå êáé ôõðþíïõìå ôï üíïìá ôïõ õðáëëÞëïõ ìå ôï ìåãáëýôåñï ìéóèü.
ÄïìÝò êáé Åíþóåéò
77
/* struct1.c */ /* ×ñÞóç äïìþí */ #include <stdlib.h> /* ãéá ÷ñÞóç ôçò óõíÜñôçóçò atof() */ #include <conio.h> main() { struct person /* ïñéóìüò ôýðïõ */ { char name[40]; float salary; }; struct person person1,person2; /* äÞëùóç ìåôáâëçôþí */ char numstr[10]; printf("Äþóå ôï üíïìá ôïõ 1ïõ õðáëëÞëïõ: "); gets(person1.name); printf("Äþóå ôï ìéóèü ôïõ 1ïõ õðáëëÞëïõ: "); gets(numstr); person1.salary=atof(numstr); printf("Äþóå ôï üíïìá ôïõ 2ïõ õðáëëÞëïõ: "); gets(person2.name); printf("Äþóå ôï ìéóèü ôïõ 2ïõ õðáëëÞëïõ: "); gets(numstr); person2.salary=atof(numstr); clrscr(); printf("1ïò: %s : %f äñ÷\n",person1.name,person1.salary); printf("2ïò: %s : %f äñ÷\n",person2.name,person2.salary); if(person1.salary>person2.salary) printf("Ôá ðåñéóóüôåñá ÷ñÞìáôá ðáßñíåé ï 1ïò\n"); else if(person2.salary>person1.salary) printf("Ôá ðåñéóóüôåñá ÷ñÞìáôá ðáßñíåé ï 2ïò\n"); else printf("Ðáßñíïõí ôïí ßäéï ìéóèü\n"); }
Óôï ðáñáðÜíù ðñüãñáììá ÷ñçóéìïðïéÞèçêáí ïé óõíáñôÞóåéò gets() êáé atof() ãéá íá äéáâáóôåß ï ìéóèüò ôùí õðáëëÞëùí (ðñáãìáôéêüò áñéèìüò) áðü ôï ðëçêôñïëüãéï. Ç óõíÜñôçóç atof() (ASCII to float) äÝ÷åôáé ùò üñéóìá Ýíá áëöáñéèìçôéêü êáé ôï ìåôáôñÝðåé óå áñéèìü êéíçôÞò õðïäéáóôïëÞò. Ôï áëöáñéèìçôéêü ðñÝðåé íá ðåñéÝ÷åé Ýãêõñï áñéèìü êéíçôÞò õðïäéáóôïëÞò. Áí äå óõìâáßíåé áõôü, ç óõíÜñôçóç åðéóôñÝöåé ìçäÝí. Åôóé ç åíôïëÞ: x=atof("1.23");
êáôá÷ùñåß óôç x (ðïõ ðñÝðåé íá åßíáé ôýðïõ float) ôçí ôéìÞ 1.23. Ó÷åôéêÞ óõíÜñôçóç åßíáé ç atoi() (ASCII to integer) ç ïðïßá ìåôáôñÝðåé ôï áëöáñéèìçôéêü ðïõ äÝ÷åôáé ùò üñéóìá, óå áêÝñáéï áñéèìü. ÐÜëé ôï áëöáñéèìçôéêü ðñÝðåé íá ðåñéÝ÷åé Ýãêõñï áêÝñáéï áñéèìü. Ôá ðñüôõðá áõôþí ôùí óõíáñôÞóåùí õðÜñ÷ïõí óôï áñ÷åßï-åðéêåöáëßäáò stdlib.h. Ï ëüãïò ðïõ ÷ñçóéìïðïéÞèçêå ï óõíäõáóìüò ôùí gets() êáé atof() áíôß ôçò scanf() ãéá íá äéáâáóôåß Ýíáò áñéèìüò float, åßíáé ìßá éäéïìïñößá ðïõ ðáñïõóéÜæåé ç scanf(). ÓõãêåêñéìÝíá üôáí ç scanf() äéáâÜæåé Ýíáí áñéèìü ðïõ ðëçêôñïëïãåß ï ÷ñÞóôçò ðáôþíôáò óôï ôÝëïò ôï ðëÞêôñï ENTER, áöáéñåß áðü ôï buffer ôïõ ðëçêôñïëïãßïõ ôïí áñéèìü, áëëÜ ü÷é êáé ôï ÷áñáêôÞñá íÝáò ãñáììÞò. Åôóé áí ìåôÜ ôçí scanf() áêïëïõèåß ìßá gets(), âñßóêåé óôï buffer ôï ÷áñáêôÞñá íÝáò ãñáììÞò êáé, öõóéêÜ, ôï äéáâÜæåé íïìßæïíôáò üôé ï ÷ñÞóôçò Ý÷åé åéóÜãåé Ýíá êåíü áëöáñéèìçôéêü. ÃåíéêÜ ç scanf() åßíáé ìßá ìÜëëïí ïãêþäçò óõíÜñôçóç, üóïí áöïñÜ ôï ðëÞèïò ôùí bytes ðïõ ðñïóèÝôåé óôï ìåôáãëùôôéóìÝíï ðñüãñáììÜ ìáò êé Ýôóé êáëü åßíáé íá áðïöåýãåôáé. Ç óõíÜñôçóç gets()
Áè. Å. Êïõôóïíéêüëáò
H Ãëþóóá Ðñïãñáììáôéóìïý C
78
ðñïôéìÜôáé ãéá ôá áëöáñéèìçôéêÜ êáé ï óõíäõáóìüò gets() êáé atoi() Þ atof() ãéá ôïõò áñéèìïýò. Åäþ íá óçìåéþóïõìå êáé ìßá äõíáôüôçôá ôçò Turbo C óå ó÷Ýóç ìå ôï ðñüôõðï ôçò C üðùò êáèïñßóôçêå áðü ôïõò K&R. Óôï ðñüôõðï, åßíáé áäýíáôï íá êáôá÷ùñçèïýí ïé ôéìÝò ôùí ìåëþí ìßáò äïìÞò óå ìßá Üëëç ìåôáâëçôÞ ôïõ ßäéïõ ôýðïõ äïìÞò, ìå ôç ÷ñÞóç ìßáò áðëÞò åíôïëÞò êáôá÷þñçóçò. Óôçí Turbo C áõôü åßíáé äõíáôü. ÄçëáäÞ áí ïé d1 êáé d2 åßíáé äïìÝò ôïõ ßäéïõ ôýðïõ, ìðïñåß íá ÷ñçóéìïðïéçèåß ç åíôïëÞ: d1=d2;
ç ïðïßá Ý÷åé ùò áðïôÝëåóìá ôá ìÝëç ôçò äïìÞò d1 íá ðÜñïõí ôéò ßäéåò ôéìÝò ìå áõôÜ ôçò d2.
8.1.3
¡£ ™ ¢ ª ™
Ïé äïìÝò ìðïñïýí íá ðåñéÝ÷ïõí ùò ìÝëç Üëëåò äïìÝò. Ãéá ðáñÜäåéãìá, áò èåùñÞóïõìå ôéò ðáñáêÜôù äçëþóåéò äïìþí, ðïõ ìðïñïýí íá ÷ñçóéìïðïéçèïýí ãéá áðïèÞêåõóç ôïõ ïíüìáôïò, ôçò çìåñïìçíßáò ãÝííçóçò êáé ôçò äéåýèõíóçò åíüò áôüìïõ: struct name { char fname[10]; char lname[20]; };
/* üíïìá */ /* åðþíõìï */
struct date { int day; /* çìÝñá */ char mon_name[13]; /* ìÞíáò */ int year; /* Ýôïò */ }; struct address { char street[15]; int number; };
/* ïäüò */ /* áñéèìüò */
struct person { struct name persname; struct date birth; struct address house; };
/* ïíïìáôåðþíõìï */ /* çìåñïìçíßá ãÝííçóçò */ /* äéåýèõíóç */
struct person fred;
Ôüôå ç åíôïëÞ: fred.birth.year=1966;
ÈÝôåé óôï ðåäßï ÷ñïíïëïãßáò ãÝííçóçò ôçò ìåôáâëçôÞò fred, ôçí ôéìÞ 1966.
ÄïìÝò êáé Åíþóåéò
8.1.4
79
z¶ ¢ ™ zƒÃ ø¡ ªø¡ ™ ¢ ª ™
Ïðùò êáé ïé ìåôáâëçôÝò ôùí âáóéêþí ôýðùí êáé ïé ðßíáêåò, Ýôóé êáé ïé ìåôáâëçôÝò äïìÞò ìðïñïýí íá ðÜñïõí áñ÷éêÝò ôéìÝò. Ç ãåíéêÞ ìïñöÞ ôçò åíôïëÞò áðüäïóçò áñ÷éêþí ôéìþí óå ìßá äïìÞ, åßíáé ðáñüìïéá ì'áõôÞ ðïõ ÷ñçóéìïðïéåßôáé ãéá ôïõò ðßíáêåò. ÊÜèå ìåôáâëçôÞ áêïëïõèåßôáé áðü ôï óçìåßï = êáé ìåôÜ ìßá ëßóôá áñ÷éêþí ôéìþí, êëåéóìÝíç óå áãêýëåò. ÊÜèå áñ÷éêÞ ôéìÞ ðñÝðåé íá åßíáé ôïõ ßäéïõ ôýðïõ ìå ôïí ôýðï ôïõ ìÝëïõò óôï ïðïßï áíôéóôïé÷åß. Åôóé ð.÷. ç ðáñáêÜôù åíôïëÞ: struct date d1={28,"Áðñéëßïõ",1989};
èÝôåé áñ÷éêÝò ôéìÝò óôá ìÝëç ôçò d1 ðïõ åßíáé ôýðïõ struct date ðïõ ïñßóáìå óôçí § 8.1.1.
8.1.5
¢ ª ™ ø™ ¶zƒzª ƒ ™ ™À¡zƒ ™ ™
Ïðùò ìåôáâéâÜæïõìå óå ìßá óõíÜñôçóç ôçí ôéìÞ ìßáò áðëÞò ìåôáâëçôÞò, ìå ôïí ßäéï ôñüðï ìðïñïýìå íá ìåôáâéâÜóïõìå ôçí ôéìÞ åíüò ìÝëïõò ìßáò äïìÞò Þ áêüìá êáé ôéò ôéìÝò üëùí ôùí ìåëþí ôçò (ïëüêëçñç ôç äïìÞ). Ùò ðáñÜäåéãìá èá îáíáãñÜøïõìå ôï ðñüãñáììá struct1.c ôçò § 8.1.2 þóôå íá ÷ñçóéìïðïéÞóïõìå óõíáñôÞóåéò ãéá ôçí åéóáãùãÞ äåäïìÝíùí áðü ôï ÷ñÞóôç, ôçí åìöÜíéóÞ ôïõò óôçí ïèüíç êáé ôçí åýñåóç áõôïý ìå ôï ìåãáëýôåñï ìéóèü. /* struct2.c */ /* ÄïìÝò ùò ðáñÜìåôñïé óõíáñôÞóåùí */ #include <stdlib.h> /* ãéá ÷ñÞóç ôçò óõíÜñôçóçò atof() */ #include <conio.h> struct person { char name[40]; float salary; }; struct person newname(int); void list(struct person,struct person); void maxim(float,float); main() { struct person person1,person2; clrscr(); person1=newname(1); person2=newname(2); list(person1,person2); maxim(person1.salary,person2.salary); } /* newname */ /* ÅéóÜãåé óôïé÷åßá ãéá Ýíáí õðÜëëçëï */ struct person newname(int x) { char numstr[10]; struct person p; printf("Äþóå ôï üíïìá ôïõ %dïõ õðáëëÞëïõ: ",x); gets(p.name); printf("Äþóå ôï ìéóèü ôïõ %dïõ õðáëëÞëïõ: ",x); gets(numstr); p.salary=atof(numstr); return(p); }
Áè. Å. Êïõôóïíéêüëáò
H Ãëþóóá Ðñïãñáììáôéóìïý C
80
/* list() */ /* Ôõðþíåé ôá óôïé÷åßá ôùí äýï õðáëëÞëùí */ void list(struct person p1,struct person p2) { clrscr(); printf("1ïò: %s : %f äñ÷\n",p1.name,p1.salary); printf("2ïò: %s : %f äñ÷\n",p2.name,p2.salary); } /* maxim() */ /* Âñßóêåé êáé ôõðþíåé ðïéïò ðáßñíåé ôï ìåãáëýôåñï ìéóèü */ void maxim(float p1s,float p2s) { if(p1s>p2s) printf("Ôá ðåñéóóüôåñá ÷ñÞìáôá ðáßñíåé ï 1ïò\n"); else if(p2s>p1s) printf("Ôá ðåñéóóüôåñá ÷ñÞìáôá ðáßñíåé ï 2ïò\n"); else printf("Ðáßñíïõí ôïí ßäéï ìéóèü\n"); }
8.1.6
¶ ¡z ™ ¢ ªø¡
Ìßá ìÝèïäïò åýêïëïõ ÷åéñéóìïý åíüò ìåãÜëïõ áñéèìïý äïìþí ôïõ ßäéïõ ôýðïõ, åßíáé ÷ñçóéìïðïéþíôáò Ýíáí ðßíáêá ìå óôïé÷åßá äïìÝò. ÊÜèå äïìÞ èá ìðïñåß íá ðñïóðåëáóôåß ìå ÷ñÞóç ôïõ äåßêôç-ðßíáêá. Ôï ðáñáêÜôù ðñüãñáììá ÷ñçóéìïðïéåß Ýíáí ðßíáêá éêáíü íá áðïèçêåýóåé 25 äïìÝò. ÊÜèå äïìÞ åßíáé ôýðïõ person. Ç åéóáãùãÞ óôïé÷åßùí êáèþò êáé ç åìöÜíéóç áõôþí óôçí ïèüíç, ðñáãìáôïðïéïýíôáé ìå âïÞèåéá åíüò menu åðéëïãþí: /* arstr.c */ /* Ðßíáêáò äïìþí */ #include <stdlib.h> #include <conio.h> struct person { char name[40]; float salary; }; struct person array[25]; int n=0; main() { char select; do { clrscr(); puts("1. ÅéóáãùãÞ óôïé÷åßùí õðáëëÞëïõ"); puts("2. ÅìöÜíéóç ëßóôáò õðáëëÞëùí"); puts("3. Åîïäïò"); printf("Äþóå åðéëïãÞ: "); select=getche(); switch(select) { case '1': newname(); break; case '2': list(); break; }
ÄïìÝò êáé Åíþóåéò
81
} while(select!='3'); } /* newname */ /* ÅéóÜãåé óôïé÷åßá ãéá Ýíáí õðÜëëçëï */ newname() { char numstr[10]; float temp; clrscr(); printf("Äþóå ôï üíïìá ôïõ %dïõ õðáëëÞëïõ: ",n+1); gets(array[n].name); printf("Äþóå ôï ìéóèü ôïõ %dïõ õðáëëÞëïõ: ",n+1); gets(numstr); array[n++].salary=atof(numstr); } /* list() */ /* Ôõðþíåé ôá óôïé÷åßá ôùí õðáëëÞëùí */ list() { int i; clrscr(); if(n<1) printf("Ç ëßóôá åßíáé Üäåéá"); for(i=0;i<n;i++) printf("%d %s %f\n",i+1,array[i].name,array[i].salary); getch(); }
8.2
¡ø™ ™
Ôá ìÝëç ìßáò äïìÞò âñßóêïíôáé áðïèçêåõìÝíá óôç ìíÞìç ôïõ Ç/Õ ôáõôü÷ñïíá. Ïìùò ìåñéêÝò öïñÝò áõôü äåí åßíáé áðáñáßôçôï äéüôé ç öýóç ôïõ ðñïâëÞìáôïò åßíáé ôÝôïéá, þóôå êÜèå ÷ñïíéêÞ óôéãìÞ ìüíï Ýíá áð'áõôÜ íá ðåñéÝ÷åé ÷ñÞóéìç ðëçñïöïñßá. ÄçëáäÞ èá èÝëáìå ï ßäéïò ÷þñïò ìíÞìçò íá ÷ñçóéìïðïéåßôáé óå äéáöïñåôéêÝò óôéãìÝò áðü ðïëëÝò äéáöïñåôéêÝò ìåôáâëçôÝò, ïé ïðïßåò ìðïñåß íá ìçí åßíáé êáí ôïõ ßäéïõ ôýðïõ. Áõôü åðéôõã÷Üíåôáé ìå ôç ÷ñçóéìïðïßçóç ôùí åíþóåùí (unions). Ïé åíþóåéò åßíáé áíÜëïãåò ìå ôéò ìåôáâáëëüìåíåò åããñáöÝò (variant records) ôçò Pascal. Ç ãåíéêÞ ìïñöÞ ôçò åíôïëÞò äÞëùóçò åíüò ôýðïõ Ýíùóçò åßíáé áíÜëïãç ìå áõôÞ ôçò äïìÞò: union áíáãíùñéóôéêü_ôýðïõ_Ýíùóçò { ôýðïò_ìÝëïõò1 áíáãíùñéóôéêü_ìÝëïõò1; ôýðïò_ìÝëïõò2 áíáãíùñéóôéêü_ìÝëïõò2; ... ôýðïò_ìÝëïõòn áíáãíùñéóôéêü_ìÝëïõòn; };
Ç äÞëùóç ìåôáâëçôþí ôýðïõ Ýíùóçò ãßíåôáé áêñéâþò ìå ôïí ßäéï ôñüðï üðùò ãéá ôéò äïìÝò. Ç áíáöïñÜ óôá ìÝëç ìßáò Ýíùóçò ãßíåôáé ìå ôïí ßäéï ôñüðï üðùò êáé óôéò äïìÝò. Ï ÷þñïò ìíÞìçò ðïõ êáôáëáìâÜíåé ìßá Ýíùóç åßíáé ôüóï ìåãÜëïò, þóôå
Áè. Å. Êïõôóïíéêüëáò
82
H Ãëþóóá Ðñïãñáììáôéóìïý C
íá ÷ùñÜåé ôï ìåãáëýôåñï áðü ôïõò ôýðïõò ôùí ìåëþí ôçò. Åßíáé åõèýíç ôïõ ðñïãñáììáôéóôÞ íá ðáñáêïëïõèåß ðïéïò ôýðïò åßíáé áðïèçêåõìÝíïò êÜèå ÷ñïíéêÞ óôéãìÞ óå ìßá ìåôáâëçôÞ ôýðïõ Ýíùóçò. Áí êÜôé áðïèçêåõôåß ìå êÜðïéï ôýðï êáé áíáêôçèåß ìå Üëëï, ôá áðïôåëÝóìáôá åßíáé áðñïóäéüñéóôá. Óôï ðáñáêÜôù ðáñÜäåéãìá äçëþíïõìå Ýíáí ôýðï Ýíùóçò (intfloat) êáé ìßá ìåôáâëçôÞ Ýíùóçò (x). ×ñçóéìïðïéåßôáé óôï ðñüãñáììá ï ìïíáäéêüò (unary) ôåëåóôÞò sizeof ï ïðïßïò åöáñìïæüìåíïò óå ìßá ìåôáâëçôÞ Þ óå Ýíáí ôýðï, äßíåé ôïí áñéèìü ôùí bytes ðïõ êáôáëáìâÜíïíôáé áðü ôç ìåôáâëçôÞ Þ áðü ôïí ôýðï. /* union.c */ /* ×ñÞóç åíþóåùí */ main() { union intfloat /* ïñéóìüò ôýðïõ */ { int intnum; float floatnum; }; union intfloat x; /* äÞëùóç ìåôáâëçôÞò */ printf("×þñïò ðïõ êáôáëáìâÜíåé ç Ýíùóç: %d bytes\n",sizeof(union intflo)); x.intnum=321; printf("x.intnum=%d\n",x.intnum); x.floatnum=123.456; printf("x.floatnum=%.3f\n",x.floatnum); }
Ç Ýîïäïò áõôïý ôïõ ðñïãñÜììáôïò åßíáé: ×þñïò ðïõ êáôáëáìâÜíåé ç Ýíùóç: 4 bytes x.intnum=321 x.floatnum=123.456
Ðáñüëï ðïõ ç Ýíùóç Ý÷åé ùò ìÝëç Ýíáí áêÝñáéï êáé Ýíáí ðñáãìáôéêü áñéèìü, ôï ìÝãåèüò ôçò åßíáé ìüíï 4 bytes. Åôóé åßíáé áñêåôÜ ìåãÜëç ãéá íá ÷ùñÝóåé ôï Ýíá Þ ôï Üëëï ìÝëïò, áëëÜ ü÷é êáé ôá äýï ôáõôü÷ñïíá.
8.3 1.
z™ ™ ™ Íá ãñáöåß ðñüãñáììá ðïõ íá äÝ÷åôáé áðü ôï ðëçêôñïëüãéï êáé íá êáôá÷ùñåß óôç ìíÞìç ôá óôïé÷åßá (ïíïìáôåðþíõìï, öýëï, âáèìü) 50 ìáèçôþí.
2. Íá ãñáöåß ìßá óõíÜñôçóç ãéá ôï ðñüãñáììá ôçò ðñïçãïýìåíçò Üóêçóçò, ç ïðïßá èá äÝ÷åôáé ùò ðáñÜìåôñï ôï ïíïìáôåðþíõìï åíüò ìáèçôÞ êáé èá ôõðþíåé ôá õðüëïéðá óôïé÷åßá ôïõ. 3. Íá ãñáöåß óõíÜñôçóç ãéá ôï ðñüãñáììá ôçò Áóêçóçò 1 ðïõ íá ôáîéíïìåß ôïõò ìáèçôÝò áíÜëïãá ìå ôï âáèìü ôïõò. 4. Ìßá äïìÞ ìå ìÝëç: Åôïò, ÌÞíáò, ÇìÝñá, ìðïñåß íá ÷ñçóéìïðïéçèåß ãéá ôçí êáôá÷þñéóç çìåñïìçíéþí. ÃñÜøôå Ýíá ðñüãñáììá ðïõ íá ÷ñçóéìïðïéåß ôÝôïéïõ åßäïõò äïìÝò êáé íá êÜíåé ôá åîÞò: íá äÝ÷åôáé ôç óçìåñéíÞ çìåñïìçíßá êáé ôçí
ร รฏรฌร รฒ รชรกรฉ ร รญรพรณรฅรฉรฒ
83
รงรฌรฅรฑรฏรฌรงรญร รก รฃร รญรญรงรณรงรฒ รชร รฐรฏรฉรฏรต รกรดรผรฌรฏรต รชรกรฉ รญรก รตรฐรฏรซรฏรฃร รฆรฅรฉ รชรกรฉ รฅรฌรถรกรญร รฆรฅรฉ รณรดรงรญ รฏรจรผรญรง รดรงรญ รงรซรฉรชร รก รดรฏรต. 5. ร รก รฃรฑรกรถรฅร รฐรฑรผรฃรฑรกรฌรฌรก รดรฏ รฏรฐรฏร รฏ รญรก รคร รทรฅรดรกรฉ ร รญรก รณรฝรญรฏรซรฏ รฏรญรฏรฌร รดรนรญ (รฐ.รท. 10) รฃรฉรก รดรฏ รชรกรจร รญรก รกรฐ'รดรก รฏรฐรฏร รก รตรฐร รฑรทรฅรฉ รฅรฐรฉรฐรซร รฏรญ รง รฐรซรงรฑรฏรถรฏรฑร รก รฃรฉรก รดรฏ รถรฝรซรฏ, รงรซรฉรชร รก รชรกรฉ รทรฑรพรฌรก รฌรกรซรซรฉรพรญ. ร รฏรจร รญรดรนรญ รดรฏรต รถรฝรซรซรฏรต, รดรฏรต รทรฑรพรฌรกรดรฏรฒ รฌรกรซรซรฉรพรญ รชรกรฉ รฌรฉรกรฒ รฐรฅรฑรฉรฏรทร รฒ รงรซรฉรชร รกรฒ, รดรฏ รฐรฑรผรฃรฑรกรฌรฌรก รญรก รดรตรฐรพรญรฅรฉ รดรก รฏรญรผรฌรกรดรก รกรตรดรพรญ รฐรฏรต รฐรซรงรฑรฏรฝรญ รดรฉรฒ รฐรฑรฏรปรฐรฏรจร รณรฅรฉรฒ. 6. ร รงรฌรฉรฏรตรฑรฃร รณรดรฅ ร รญรกรญ รชรกรดร รซรซรงรซรฏ รดรฝรฐรฏ รครฅรครฏรฌร รญรนรญ รฉรชรกรญรผ รญรก รกรฐรฏรจรงรชรฅรฝรฅรฉ ร รญรก รฌรฉรฃรกรครฉรชรผ รกรฑรฉรจรฌรผ (a+ib). ร รดรง รณรตรญร รทรฅรฉรก รฃรฑร รธรดรฅ รชรกรดร รซรซรงรซรฅรฒ รณรตรญรกรฑรดร รณรฅรฉรฒ รฏรฉ รฏรฐรฏร รฅรฒ รญรก รคร รทรฏรญรดรกรฉ รนรฒ รฐรกรฑรกรฌร รดรฑรฏรตรฒ รครฝรฏ รฌรฉรฃรกรครฉรชรฏรฝรฒ รกรฑรฉรจรฌรฏรฝรฒ รชรกรฉ รญรก รฅรฐรฉรณรดรฑร รถรฏรตรญ รดรก รกรฐรฏรดรฅรซร รณรฌรกรดรก รดรงรฒ รฐรฑรผรณรจรฅรณรงรฒ, รกรถรกร รฑรฅรณรงรฒ, รฐรฏรซรซรกรฐรซรกรณรฉรกรณรฌรฏรฝ รชรกรฉ รครฉรกร รฑรฅรณรงรฒ รกรตรดรพรญ, รผรฐรนรฒ รฅรฐร รณรงรฒ รชรกรฉ รดรฏ รกรฐรฏรดร รซรฅรณรฌรก รดรงรฒ รฝรธรนรณรงรฒ รณรฅ รฅรชรจร รดรง รฅรญรผรฒ รฌรฉรฃรกรครฉรชรฏรฝ: (a ib ) (c id ) ( a c ) i( b d ) (a ib ) (c id ) ( a c ) i( b d ) (a ib ) * (c id ) ( ac bd ) i(ad bc ) a ib ac bd bc ad รกรญc2 d2 z 0 i 2 c id c2 d 2 c d2 (a ib )n pn(cos nรจ i sin nรจ ) รผรฐรฏรตp a2 b2
7.
ร
รฅรฎร รณรนรณรง รฅรตรจรฅร รกรฒ P2(x2,y2)รฅร รญรกรฉ:
รฐรฏรต
y y1
รผรฐรฏรตm
m( x x1 )
รครฉร รฑรทรฅรดรกรฉ
รกรฐรผ
รครฝรฏ
รณรงรฌรฅร รก
รจ
tan 1( b / a )
P1(x1,y1)
รชรกรฉ
( y2 y1 ) / ( x2 x1 )
(รกรญ x1=x2 รดรผรดรฅ รง รฅรตรจรฅร รก รฅร รญรกรฉ รชร รจรฅรดรง รณรดรฏรญ ร รฎรฏรญรก Ox รชรกรฉ ร รทรฅรฉ รฅรฎร รณรนรณรง: x=x1). ร รฏ รฌร รชรฏรฒ รดรฏรต รฅรตรจรฝรฃรฑรกรฌรฌรฏรต รดรฌร รฌรกรดรฏรฒ P1 P2 รคร รญรฅรดรกรฉ รกรฐรผ รดรฏรญ รดรฝรฐรฏ: L
( x2 x1 )2 ( y2 y1 )2
ร รฑร รธรดรฅ ร รญรก รฐรฑรผรฃรฑรกรฌรฌรก รฐรฏรต รดรตรฐรพรญรฅรฉ รดรงรญ รฅรฎร รณรนรณรง รดรงรฒ รฅรตรจรฅร รกรฒ รชรกรจรพรฒ รชรกรฉ รดรฏ รฌร รชรฏรฒ รดรฏรต รฅรตรจรฝรฃรฑรกรฌรฌรฏรต รดรฌร รฌรกรดรฏรฒ รฐรฏรต รครฉร รฑรทรฅรดรกรฉ รกรฐรผ รดรก รณรงรฌรฅร รก P1 รชรกรฉ P2 , รผรฐรฏรต รฏรฉ รณรตรญรดรฅรดรกรฃรฌร รญรฅรฒ รกรตรดรพรญ รจรก รคร รญรฏรญรดรกรฉ รกรฐรผ รดรฏ รฐรซรงรชรดรฑรฏรซรผรฃรฉรฏ. 8. ร รก รฃรฑรกรถรฏรฝรญ รณรตรญรกรฑรดร รณรฅรฉรฒ รฐรฏรต รญรก รฌรฅรดรกรดรฑร รฐรฏรตรญ รดรฉรฒ รชรกรฑรดรฅรณรฉรกรญร รฒ รณรตรญรดรฅรดรกรฃรฌร รญรฅรฒ รณรฅ รฐรฏรซรฉรชร รฒ รชรกรฉ รกรญรดร รณรดรฑรฏรถรก. ร รฉ รดรฝรฐรฏรฉ รฌรฅรดรกรดรฑรฏรฐร รฒ รกรฐรผ รฐรฏรซรฉรชร รฒ รณรฅ รชรกรฑรดรฅรณรฉรกรญร รฒ รณรตรญรดรฅรดรกรฃรฌร รญรฅรฒ รฅร รญรกรฉ: x
r sin รจ,
r sin รจ
y
รชรกรฉ รฏรฉ รดรฝรฐรฏรฉ รฌรฅรดรกรดรฑรฏรฐร รฒ รกรฐรผ รชรกรฑรดรฅรณรฉรกรญร รฒ รณรฅ รฐรฏรซรฉรชร รฒ, รฅร รญรกรฉ: r
x2 y2
รชรกรฉ
รจtan 1( y / x )
รกรญx z 0
ร รดรง รณรตรญร รทรฅรฉรก รทรฑรงรณรฉรฌรฏรฐรฏรฉรฅร รณรดรฅ รกรตรดร รฒ รดรฉรฒ รณรตรญรกรฑรดร รณรฅรฉรฒ รณ'ร รญรก รฐรฑรผรฃรฑรกรฌรฌรก รฐรฏรต รญรก รคร รทรฅรดรกรฉ รดรฉรฒ รณรตรญรดรฅรดรกรฃรฌร รญรฅรฒ รฅรญรผรฒ รณรงรฌรฅร รฏรต รชรกรจรพรฒ รชรกรฉ ร รญรก รทรกรฑรกรชรดร รฑรก รฐรฏรต รครงรซรพรญรฅรฉ รดรฏ รฅร รครฏรฒ รดรฏรตรฒ (ร : รชรกรฑรดรฅรณรฉรกรญร รฒ, P: รฐรฏรซรฉรชร รฒ) รชรกรฉ รญรก รดรฉรฒ รฌรฅรดรกรดรฑร รฐรฅรฉ รกรฐรผ รชรกรฑรดรฅรณรฉรกรญร รฒ รณรฅ รฐรฏรซรฉรชร รฒ ร รกรญรดร รณรดรฑรฏรถรก.
ร รจ. ร . ร รฏรตรดรณรฏรญรฉรชรผรซรกรฒ
84
H Ãëþóóá Ðñïãñáììáôéóìïý C
9. Äçìéïõñãåßóôå Ýíáí ôýðï Ýíùóçò ãéá ôÝóóåñá ãåùìåôñéêÜ ó÷Þìáôá: êýêëï, ôåôñÜãùíï, ïñèïãþíéï êáé ôñßãùíï. Ãéá ôïí êýêëï ç Ýíùóç èá ðñÝðåé íá áðïèçêåýåé ôçí áêôßíá ôïõ, ãéá ôï ôåôñÜãùíï ôï ìÞêïò ôçò ðëåõñÜò ôïõ, ãéá ôï ïñèïãþíéï ôá ìÞêç ôùí äýï ðëåõñþí ôïõ êáé ãéá ôï ôñßãùíï ôá ìÞêç ôùí ôñéþí ðëåõñþí ôïõ. Óôç óõíÝ÷åéá ãñÜøôå ðñüãñáììá ôï ïðïßï: á) Íá äéáâÜæåé Ýíá áðü ôá ãñÜììáôá Ê (êýêëïò), Ô (ôåôñÜãùíï), Ï (ïñèïãþíéï), R (ôñßãùíï) êáé ôéò êáôÜëëçëåò áñéèìçôéêÝò ôéìÝò ãéá ôï åêÜóôïôå ó÷Þìá êáé â) Íá õðïëïãßæåé êáé ôõðþíåé ôï ìÞêïò ôçò ðåñéìÝôñïõ ôïõ ó÷Þìáôïò.
9.
¢ ™
Åíáò äåßêôçò (pointer) åßíáé ìßá ìåôáâëçôÞ ðïõ ðåñéÝ÷åé ìßá äéåýèõíóç ìíÞìçò. Óôéò ðåñéóóüôåñåò ðåñéðôþóåéò áõôÞ ç äéåýèõíóç åßíáé ç èÝóç ìíÞìçò ìßáò Üëëçò ìåôáâëçôÞò. Ïôáí ìßá ìåôáâëçôÞ ðåñéÝ÷åé ôç äéåýèõíóç ìßáò Üëëçò ìåôáâëçôÞò, ôüôå ëÝìå üôé ç ðñþôç ìåôáâëçôÞ äåß÷íåé ôç äåýôåñç. Ïé äåßêôåò ÷ñçóéìïðïéïýíôáé óôïí ðñïãñáììáôéóìü ãéá ðïëëïýò ëüãïõò. Ïé óçìáíôéêüôåñïé áð'áõôïýò åßíáé: x x x x x
Ãéá ôçí åðéóôñïöÞ ðåñéóóüôåñùí ôçò ìßáò ôéìþí áðü ìßá óõíÜñôçóç. Ãéá ôç ìåôáâßâáóç ðéíÜêùí êáé áëöáñéèìçôéêþí óå óõíáñôÞóåéò. Ãéá åýêïëï êáé ãñÞãïñï ÷åéñéóìü ðéíÜêùí. Ãéá ôç äçìéïõñãßá ðïëýðëïêùí äïìþí äåäïìÝíùí, üðùò óõíäåäåìÝíåò ëßóôåò êáé äÝíäñá. Ãéá Üìåóç ðñüóâáóç óå óõãêåêñéìÝíåò èÝóåéò ìíÞìçò.
Ïðùò êáôáëáâáßíïõìå áðü ôá ðáñáðÜíù, Þäç Ý÷ïõìå ÷ñçóéìïðïéÞóåé äåßêôåò óôá ðñïãñÜììáôá ðïõ Ý÷ïõìå ãñÜøåé Ýùò ôþñá. Óôï ÊåöÜëáéï 7, üôáí ÷ñçóéìïðïéïýóáìå ðßíáêåò ùò ðáñáìÝôñïõò óå óõíáñôÞóåéò, óôçí ïõóßá ìåôáâéâÜæáìå óôç óõíÜñôçóç ôç äéåýèõíóç ôïõ ðßíáêá. ÁõôÞ ç äéåýèõíóç åßíáé Ýíá ðáñÜäåéãìá ìßáò óôáèåñÜò äåßêôç. Ç óôáèåñÜ äåßêôç åßíáé ìßá äéåýèõíóç, ç ìåôáâëçôÞ äåßêôç åßíáé ìßá èÝóç ìíÞìçò ðïõ ÷ñçóéìïðïéåßôáé ãéá áðïèÞêåõóç äéåõèýíóåùí.
9.1
¢ §ø™ ª z~§ ™ ¢
Ïðùò êÜèå ìåôáâëçôÞ, ìßá ìåôáâëçôÞ äåßêôç ðñÝðåé íá äçëþíåôáé ðñéí ÷ñçóéìïðïéçèåß. Ç ãåíéêÞ ìïñöÞ ôçò åíôïëÞò äÞëùóçò ìßáò ìåôáâëçôÞò äåßêôç åßíáé: ôýðïò *áíáãíùñéóôéêü;
üðïõ ôýðïò åßíáé ï ôýðïò ôùí äåäïìÝíùí ðïõ èá äåß÷íåé ï äåßêôçò. Ìßá ìåôáâëçôÞ äåßêôç äåóìåýåé 2 bytes ìíÞìçò. Åíá ðáñÜäåéãìá äÞëùóçò äåéêôþí åßíáé: int *px, *py;
Ç äÞëùóç áõôÞ äåóìåýåé 2 bytes óôá ïðïßá ìðïñåß íá áðïèçêåõôåß ç äéåýèõíóç ìßáò ìåôáâëçôÞò áêåñáßïõ ôýðïõ êáé äßíåé ó'áõôÜ ôá 2 bytes ôï üíïìá px. Äåóìåýåé åðßóçò Üëëá 2 bytes ãéá áðïèÞêåõóç äéåýèõíóçò ìåôáâëçôÞò áêåñáßïõ ôýðïõ êáé äßíåé ó'áõôÜ ôï üíïìá py.
9.2
§ ™ ™ ¢ ø¡
Ç C ìáò ðáñÝ÷åé äýï ôåëåóôÝò ó÷åôéêïýò ìå ôïõò äåßêôåò, ôï ôåëåóôÞ & êáé ôïí *. Ï & ëÝãåôáé ôåëåóôÞò äéåýèõíóçò êáé åßíáé ï ìïíáäéêüò (unary) ôåëåóôÞò ðïõ
86
H Ãëþóóá Ðñïãñáììáôéóìïý C
åðéóôñÝöåé ôç äéåýèõíóç ôïõ ôåëåóôÝïõ ôïõ, üðùò Ý÷ïõìå äåé êáé óå ðñïçãïýìåíá êåöÜëáéá. Ãéá ðáñÜäåéãìá ç åíôïëÞ: px=&i;
(üðïõ õðïèÝôïõìå üôé ç ìåôáâëçôÞ i Ý÷åé äçëùèåß ùò áêåñáßïõ ôýðïõ) êáôá÷ùñåß óôçí px (ðïõ Ý÷åé äçëùèåß ðáñáðÜíù ùò äåßêôçò óå áêÝñáéï) ôç äéåýèõíóç ôçò ìåôáâëçôÞò i. Åôóé ç px "äåß÷íåé" ôçí i, Ó÷Þìá 9.1. px
pointer
i
int
Ó÷Þìá 9.1: Äåßêôçò óå áêÝñáéï
Ï äåýôåñïò ôåëåóôÞò, *, åßíáé êáé áõôüò ìïíáäéêüò êáé åßíáé óõìðëçñùìáôéêüò ôïõ &. ËÝãåôáé ôåëåóôÞò Ýììåóçò áíáöïñÜò Þ áíáêáôåýèõíóçò (indirection Þ dereference) êáé üôáí åöáñìüæåôáé óå ìßá ìåôáâëçôÞ äåßêôç, åðéóôñÝöåé ôçí ôéìÞ ôçò ìåôáâëçôÞò ðïõ äåß÷íåé ï äåßêôçò. Ãéá ðáñÜäåéãìá ç åíôïëÞ: j=*px;
êáôá÷ùñåß óôç ìåôáâëçôÞ j (ðïõ õðïèÝôïõìå üôé åßíáé áêåñáßïõ ôýðïõ) ôï ðåñéå÷üìåíï ôçò ìåôáâëçôÞò ðïõ äåß÷íåé ç px, äçëáäÞ ôçí ôéìÞ ôçò i. Äõóôõ÷þò, óôç C, ôï óýìâïëï ôïõ ðïëëáðëáóéáóìïý êáé ï äåýôåñïò ôåëåóôÞò åßíáé ßäéá. Ïìùò ôüóï ï * üóï êáé ï & Ý÷ïõí ìåãáëýôåñç ðñïôåñáéüôçôá áðü ôïõò áñéèìçôéêïýò ôåëåóôÝò åêôüò áðü ôï ìïíáäéêü ìåßïí, ìå ôï ïðïßï Ý÷ïõí ôçí ßäéá ðñïôåñáéüôçôá, (Ðßíáêáò 3.5). Åðßóçò ôï * ÷ñçóéìïðïéåßôáé óå åíôïëÝò äÞëùóçò ìåôáâëçôþí äåéêôþí: int *ptr;
üóï êáé óå Üëëåò åíôïëÝò: *ptr=3;
ìå äéáöïñåôéêÞ óçìáóßá óå êáèåìéÜ áð'áõôÝò ôéò äýï ïìÜäåò åíôïëþí. Ïôáí ôï * ÷ñçóéìïðïéåßôáé óå ìßá äÞëùóç ìåôáâëçôÞò óçìáßíåé "ìåôáâëçôÞ ôýðïõ äåßêôç óå...", åíþ óå Üëëåò åíôïëÝò óçìáßíåé "ôéìÞ ôçò ìåôáâëçôÞò ðïõ äåß÷íåôáé áðü ôï...". Ãéá íá ãßíïõí êáôáíïçôÜ ôá ðáñáðÜíù, áò äïýìå ôï ðáñáêÜôù ðñüãñáììá óå óõíäõáóìü ìå ôï Ó÷Þìá 9.2: main() { int x,y,*pint;
/*äçëþíïõìå ôïõò áêÝñáéïõò x,y êáé ôï äåßêôç óå áêÝñáéï pint*/ char str[7],*pchar; /*äçëþíïõìå ôïí ðßíáêá str êáé ôï äåßêôç óå ÷áñáêôÞñá pchar*/ /* Ó÷Þìá 9.2 á */ x=3; pint=&x;
/*äßíïõìå óôï x ôçí ôéìÞ 3*/ /*äßíïõìå óôï pint ôç äéåýèõíóç ôïõ x*/ /* Ó÷Þìá 9.2 â */
y=*pint;
/*ï y ðáßñíåé ôï ðåñéå÷üìåíï ôçò èÝóçò ìíÞìçò ðïõ äåß÷íåé ï pint*/ /* Ó÷Þìá 9.2 ã */
Äåßêôåò
*pint=10;
87
/*ç ìåôáâëçôÞ ðïõ äåß÷íåé ï pint, äçëáäÞ ï x, ðáßñíåé ôçí ôéìÞ 10*/ /* Ó÷Þìá 9.2 ä */
*pint+=20; /*ðñïóôßèåôáé 20 óôç ìåôáâëçôÞ ðïõ äåß÷íåé ï pint*/ pchar=str; /*o pchar äåß÷íåé ôï str*/ /* Ó÷Þìá 9.2 å */ strcpy(str,"ÁËÖÁ"); /*ôï str ðáßñíåé ôéìÞ ôï "ÁËÖÁ"*/ puts(str); /*ôï ïðïßï êáé ôõðþíåôáé*/ /* Ó÷Þìá 9.2 óô */ printf("%p",pint); printf("\n%d",x);
/*ôõðþíåôáé ç ôéìÞ ôïõ äåßêôç pint, äçëáäÞ ç äéåýèõíóç ôïõ x êáé ü÷é ç ôéìÞ ôïõ x*/ /*ôõðþíåôáé ç ôéìÞ ôïõ x, äçëáäÞ 30*/
}
100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (á)
x y pint
str
pchar
10
x
3
y
100 ? ? ? ? ? ? ? ? ? (ä)
pint
str
pchar
100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
3 ? ? 100 ? ? ? ? ? ? ? ? ? (â)
x y pint
str
pchar
30
x
3
y
100 ? ? ? ? ? ? ? 106 (å)
pint
str
pchar
100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
3
x
3
y
100 ? ? ? ? ? ? ? ? ? (ã)
pint
str
pchar
30
x
3
y
100
pint
Á Ë Ö Á \0 ? ?
str
106
pchar
(óô)
Ó÷Þìá 9.2: Ç êáôÜóôáóç óôç ìíÞìç êáôÜ ôç äéÜñêåéá åêôÝëåóçò ôïõ ðñïãñÜììáôïò
Áè. Å. Êïõôóïíéêüëáò
H Ãëþóóá Ðñïãñáììáôéóìïý C
88
9.3
¶zƒz™ z™ ™ - ¢ ™
Ïé ðáñáóôÜóåéò ðïõ ðåñéëáìâÜíïõí äåßêôåò, õðáêïýïõí óôïõò ßäéïõò êáíüíåò ìå áõôïýò ðïõ õðáêïýïõí üëåò ïé ðáñáóôÜóåéò ôçò C. Óôç óõíÝ÷åéá åîåôÜæïõìå ìåñéêÝò åéäéêÝò ðëåõñÝò ôùí ðáñáóôÜóåùí - äåéêôþí.
9.3.1
z¶ ¢ ™ ªø¡ ™ ¢ ™
Ïðùò êáé ìå ïðïéáäÞðïôå Üëëç ìåôáâëçôÞ, ìðïñïýìå íá áðïäþóïõìå ôçí ôéìÞ åíüò äåßêôç óå êÜðïéïí Üëëï äåßêôç, ìå ìßá ðáñÜóôáóç êáôá÷þñçóçò, ð.÷.: int x,*p1,*p2; p1=&x; /* ï p1 äåß÷íåé ôçí x */ p2=p1; /* ï p2 äåß÷íåé åêåß ðïõ äåß÷íåé êáé ï p1 */
9.3.2
zƒ £ª ¢ ø¡
Åöüóïí ïé äéåõèýíóåéò ðïõ ðåñéÝ÷ïíôáé óôïõò äåßêôåò åßíáé áêÝñáéåò ôéìÝò, ìðïñïýìå íá êÜíïõìå ì'áõôÝò ðñÜîåéò. Ïé ðñÜîåéò áõôÝò åßíáé ç áýîçóç êáé ç ìåßùóç êáôÜ Ýíá (++, --), ç ðñüóèåóç êáé ç áöáßñåóç (+, -). Ãéá íá êáôáëÜâïõìå ôé óõìâáßíåé óôçí áñéèìçôéêÞ ôùí äåéêôþí, áò èåùñÞóïõìå üôé ï ptr åßíáé Ýíáò äåßêôçò óå Ýíáí áêÝñáéï ìå ôñÝ÷ïõóá ôéìÞ 1000. ÌåôÜ ôçí åíôïëÞ: ptr++;
ç ôéìÞ ôïõ ptr äå èá åßíáé 1001 áëëÜ 1002 !. ÊÜèå öïñÜ ðïõ ï ptr õößóôáôáé ìßá ìïíáäéáßá áýîçóç Þ ìåßùóç, äåß÷íåé ôïí åðüìåíï Þ ôïí ðñïçãïýìåíï áêÝñáéï êáé åöüóïí ïé áêÝñáéïé êáôáëáìâÜíïõí 2 bytes ìíÞìçò, ç ôéìÞ ôïõ ptr èá áõîÜíåôáé Þ èá ìåéþíåôáé êáôÜ 2. Äåí ðåñéïñéæüìáóôå ìüíï óå ìïíáäéáßåò áõîÞóåéò Þ ìåéþóåéò. Ìðïñïýìå íá ðñïóèÝóïõìå Þ íá áöáéñÝóïõìå áêÝñáéïõò óå äåßêôåò. Åôóé ìåôÜ ôçí åíôïëÞ: ptr+=9;
ç ôéìÞ ôïõ ptr ãßíåôáé 1018. ÃåíéêÜ, ëïéðüí, áí ptr åßíáé äåßêôçò êáé i áêÝñáéïò, ôüôå ç ðñÜîç: ptr ± i
åßíáé éóïäýíáìç ìå ôçí: (char*)ptr ± sizeof(*ptr)*i
äçëáäÞ ìåôáôñïðÞ ôïõ äåßêôç óå äåßêôç-óå-÷áñáêôÞñá (1 byte) êáé ðñüóèåóç Þ áöáßñåóç i öïñÝò ôï ìÝãåèïò (óå bytes) ôçò ìåôáâëçôÞò ðïõ äåß÷íåé ï ptr. Ìðïñïýìå íá ðñïóèÝôïõìå äåßêôåò ìåôáîý ôïõò, êáèþò êáé íá áöáéñïýìå. ÅéäéêÜ ç áöáßñåóç äýï äåéêôþí, ðïõ äåß÷íïõí ìåôáâëçôÝò ôïõ ßäéïõ ôýðïõ, ÷ñçóéìïðïéåßôáé ãéá íá âñïýìå ôçí áðüóôáóç ôùí äýï ìåôáâëçôþí óôç ìíÞìç.
9.3.3
™À° ƒ ™ ¢ ø¡
Ìðïñïýìå íá óõãêñßíïõìå äýï äåßêôåò ÷ñçóéìïðïéþíôáò ôïõò óõó÷åôéóôéêïýò ôåëåóôÝò ôïõ Ðßíáêá 3.3. Ãéá ðáñÜäåéãìá, áí Ý÷ïõìå äýï äåßêôåò, ptr1 êáé ptr2, ç ðáñáêÜôù åíôïëÞ åßíáé áðïäåêôÞ: if(ptr1<ptr2) printf("Ï ptr1 äåß÷íåé óå ÷áìçëüôåñç äéåýèõíóç áðü ôïí ptr2");
Äåßêôåò
89
Ìßá åíäéáöÝñïõóá ÷ñÞóç ôùí äåéêôþí öáßíåôáé óôï ðáñáêÜôù ðáñÜäåéãìá, ôï ïðïßï åîåôÜæåé ôá ðåñéå÷üìåíá ôçò ìíÞìçò RAM ôïõ Ç/Õ ìáò. Ôï ðñüãñáììá äÝ÷åôáé áðü åìÜò ôçí áñ÷éêÞ äéåýèõíóç ìíÞìçò áð'üðïõ èÝëïõìå íá áñ÷ßóåé ôçí åîÝôáóç êáé óôç óõíÝ÷åéá åìöáíßæåé ôá ðåñéå÷üìåíá ôïõ êÜèå byte ôçò ìíÞìçò óå äåêáåîáäéêÞ ìïñöÞ. Óôï ðñüãñáììá âëÝðïõìå åðßóçò ôç ÷ñÞóç ôçò äåóìåõìÝíçò ëÝîçò far, ïðïßá åðéôñÝðåé óôïõò äåßêôåò íá áíáöÝñïíôáé óå èÝóåéò ðïõ äå âñßóêïíôáé óôï ßäéï ôìÞìá ìíÞìçò ðïõ âñßóêïíôáé êáé ïé äåßêôåò. /* dispmem.c */ /* Ðáñïõóßáóç ôùí ðåñéå÷ïìÝíùí ôçò ìíÞìçò, áñ÷ßæïíôáò áðü êÜðïéá äéåýèõíóç ðïõ äßíåé ï ÷ñÞóôçò */ main() { unsigned long int start; printf("Äþóå ôçí áñ÷éêÞ äéåýèõíóç: "); scanf("%U",&start); dump(start); } dump(unsigned long int st) { char far *p; int c,l; char ch; p=(char far *) st; do { for(l=1;l<24;l++) { for(c=1;c<=8;c++,p++) printf("%5x",*p); printf("\n"); } ch=getch(); } while(ch!='x'); }
9.4
¢ ™ z ™À¡zƒ ™ ™
Åßäáìå óôï ÊåöÜëáéï 6 üôé üôáí êáëïýìå ìßá óõíÜñôçóç ìå ðñáãìáôéêÝò ðáñáìÝôñïõò, ïé ôéìÝò ôùí ðñáãìáôéêþí áíôéãñÜöïíôáé óôéò áíôßóôïé÷åò ôõðéêÝò ðáñáìÝôñïõò ôçò óõíÜñôçóçò (êëÞóç êáô'áîßá: call by value). Åôóé ç óõíÜñôçóç äå ìðïñåß íá áëëÜîåé ôéò ôéìÝò ôùí ðñáãìáôéêþí ðáñáìÝôñùí êáé ìðïñåß íá åðéóôñÝøåé ìüíï ìßá ôéìÞ óôçí êáëïýóá óõíÜñôçóç. Ïìùò áí èÝëïõìå ìßá óõíÜñôçóç íá áëëÜæåé ôéò ôéìÝò êÜðïéùí ìåôáâëçôþí ôçò êáëïýóáò óõíÜñôçóçò, ôüôå áíôß íá ìåôáâéâÜóïõìå ôéò ìåôáâëçôÝò áõôÝò ùò ðñáãìáôéêÝò (óôçí ðåñßðôùóç áõôÞ ç óõíÜñôçóç äå ìðïñåß íá áëëÜîåé ôéò ôéìÝò ôïõò) ìåôáâéâÜæïõìå ôéò äéåõèýíóåéò áõôþí. Åôóé ç óõíÜñôçóç äå ìðïñåß íá áëëÜîåé ôéò äéåõèýíóåéò, ðñÜãìá ðïõ äåí Ý÷åé Üëëùóôå íüçìá, áëëÜ ìðïñåß íá ôéò
Áè. Å. Êïõôóïíéêüëáò
90
H Ãëþóóá Ðñïãñáììáôéóìïý C
÷ñçóéìïðïéÞóåé ãéá Ýììåóç ðñïóðÝëáóç óôéò ìåôáâëçôÝò êé Ýôóé íá áëëÜîåé ôéò ôéìÝò ôïõò. Ìå ôïí ôñüðï áõôü ç êáëïýìåíç óõíÜñôçóç åðéêïéíùíåß ìå ôçí êáëïýóá ìå ðåñéóóüôåñåò áðü ìßá ôéìÝò. Óôï ðáñáêÜôù ðñüãñáììá ÷ñçóéìïðïéåßôáé ìßá óõíÜñôçóç, swap(), ç ïðïßá äÝ÷åôáé ùò ðñáãìáôéêÝò ðáñáìÝôñïõò ôéò äéåõèýíóåéò äýï ìåôáâëçôþí êáé áëëÜæåé áìïéâáßá ôéò ôéìÝò ôïõò: /* swap.c */ /* Ìåôáâßâáóç äéåõèýíóåùí óå óõíÜñôçóç */ main() { int x,y; scanf("%d %d",&x,&y); swap(&x,&y); /* ìåôáâéâÜæïõìå óôç óõíÜñôçóç ôéò äéåõèýíóåéò ôùí x,y */ printf("x=%d, y=%d\n",x,y); } /* swap() */ /* åíáëëÜóóåé ôéò ôéìÝò äýï ìåôáâëçôþí */ swap(int *px, int *py) { int temp; temp=*px; *px=*py; *py=temp; }
9.5
¢ ™ z ¶ ¡z ™
Óôç ãëþóóá C õðÜñ÷åé ìßá éó÷õñÞ ó÷Ýóç ìåôáîý ôùí ðéíÜêùí êáé ôùí äåéêôþí. Ïðùò Þäç åßäáìå óôï ÊåöÜëáéï 7, ôï áíáãíùñéóôéêü åíüò ðßíáêá åßíáé ìßá äéåýèõíóç (ç äéåýèõíóç ôïõ ðñþôïõ óôïé÷åßïõ ôïõ ðßíáêá) ìå Üëëá ëüãéá Ýíáò äåßêôçò (pointer). Åôóé ç äÞëùóç: int a[10];
óçìáßíåé üôé ôï a åßíáé ç äéåýèõíóç ôçò ðñþôçò, áðü 10, ìåôáâëçôÞò ôýðïõ int. ÊáôÜ óõíÝðåéá, ìå ëßãç óêÝøç ðñïêýðôåé üôé: Ôï Ôï Ôï Ôï Ôï
a *a a+1 a+n a[n]
éóïäõíáìåß éóïäõíáìåß éóïäõíáìåß éóïäõíáìåß éóïäõíáìåß
ìå ìå ìå ìå ìå
ôï ôï ôï ôï ôï
&a[0] a[0] &a[1] &a[n] (üðïõ n: áêÝñáéïò) *(a+n) (üðïõ n: áêÝñáéïò)
Ìå âÜóç ôá ðáñáðÜíù, ôá äýï ðñïãñÜììáôá ðïõ áêïëïõèïýí êÜíïõí ôçí ßäéá äïõëåéÜ: ôõðþíïõí ôéò ôéìÝò åíüò ðßíáêá. Ôï ðñþôï ÷ñçóéìïðïéåß ôç ãíùóôÞ óå ìáò ìÝèïäï ðñïóðÝëáóçò óôá óôïé÷åßá åíüò ðßíáêá ìå ôç ÷ñÞóç ôïõ äåßêôç-ðßíáêá (subscript) åíþ ôï äåýôåñï ÷ñçóéìïðïéåß ôï ãåãïíüò üôé ôï áíáãíùñéóôéêü åíüò ðßíáêá åßíáé äåßêôçò (pointer):
Äåßêôåò
91
/* array.c */ /* Åêôýðùóç ôùí ôéìþí åíüò ðßíáêá */ main() { static int nums[]={10,13,8,7,15}; int i; for(i=0;i<5;i++) printf("%d ",nums[i]); } /* ************************************************************* */ /* parray.c */ /* Åêôýðùóç ôùí ôéìþí åíüò ðßíáêá, ìå ÷ñÞóç äåéêôþí (pointers) */ main() { static int nums[]={10,13,8,7,15}; int i; for(i=0;i<5;i++) printf("%d ",*(nums+i)); }
9.6
¢ ™ z z§ºzƒ £ª z
Áöïý ôá áëöáñéèìçôéêÜ åßíáé ðßíáêåò êáé ïé ðßíáêåò, üðùò åßäáìå, óõíäÝïíôáé óôåíÜ ìå ôïõò äåßêôåò, åßíáé öõóéêü êáé ôá áëöáñéèìçôéêÜ íá Ý÷ïõí ìßá óôåíÞ ó÷Ýóç ìå ôïõò äåßêôåò. Óôçí ïõóßá ôï üíïìá åíüò áëöáñéèìçôéêïý åßíáé äåßêôçò óå ÷áñáêôÞñá. Å÷ïõìå äåé óôçí § 7.2 ðþò ðáßñíïõí áñ÷éêÝò ôéìÝò ôá áëöáñéèìçôéêÜ ùò ðßíáêåò ÷áñáêôÞñùí, ð.÷. ç åíôïëÞ: static char message[]="string";
ïñßæåé Ýíá áëöáñéèìçôéêü ìå üíïìá message ùò ðßíáêá êáé ôïõ äßíåé áñ÷éêÞ ôéìÞ. Ïìùò åöüóïí ôï üíïìá åíüò áëöáñéèìçôéêïý åßíáé äåßêôçò óå ÷áñáêôÞñá, åîßóïõ êáëÜ ìðïñïýìå íá ïñßóïõìå Ýíá áëöáñéèìçôéêü êáé íá ôïõ äþóïõìå áñ÷éêÞ ôéìÞ ùò åîÞò: char *message="string";
ÏðïéáäÞðïôå áðü ôéò ðáñáðÜíù äýï ìïñöÝò êé áí ÷ñçóéìïðïéÞóïõìå ó'Ýíá ðñüãñáììá, ìßá åíôïëÞ: puts(message);
èá Ý÷åé ùò áðïôÝëåóìá íá ôõðùèåß óôçí ïèüíç ç ëÝîç "string". Ïìùò ïé äýï ìïñöÝò Ý÷ïõí ìßá ëåðôÞ äéáöïñÜ. Ç ìïñöÞ ôïõ ðßíáêá öõëÜåé óôç ìíÞìç Ýíáí ðßíáêá áñêåôÜ ìåãÜëï (óôçí ðåñßðôùóç áõôÞ 7 bytes) ãéá íá ôïðïèåôçèåß ç ëÝîç êáé ï ÷áñáêôÞñáò ôåñìáôéóìïý '\0'. Óôç äéåýèõíóç ôïõ ðñþôïõ ÷áñáêôÞñá, Ý÷åé äïèåß ùò üíïìá ôï üíïìá ôïõ ðßíáêá, message. Óôç ìïñöÞ ôïõ äåßêôç, öõëÜóóåôáé ìå ôïí ßäéï ôñüðï Ýíáò ðßíáêáò, ìüíï ðïõ öõëÜóóåôáé åðßóçò êáé ìßá ìåôáâëçôÞ äåßêôç, ç ìåôáâëçôÞ áõôÞ Ý÷åé ôï üíïìá message êáé äåß÷íåé óôïí ðßíáêá. Ôï Ó÷Þìá 9.3 äåß÷íåé ôéò äýï ðåñéðôþóåéò.
Áè. Å. Êïõôóïíéêüëáò
92
H Ãëþóóá Ðñïãñáììáôéóìïý C
Ïôáí èÝôïõìå áñ÷éêÝò ôéìÝò ìå ôç ìïñöÞ ðßíáêá ç message åßíáé óôáèåñÜ äåßêôç, äçëáäÞ ìßá äéåýèõíóç ðïõ äå ìðïñåß íá áëëá÷èåß. Óôç ìïñöÞ ôïõ äåßêôç üìùò, ç message åßíáé ìßá ìåôáâëçôÞ äåßêôç. Ãéá ðáñÜäåéãìá ç åíôïëÞ: puts(++message);
èá ôõðþóåé ôï áëöáñéèìçôéêü ðïõ áñ÷ßæåé áðü ôï äåýôåñï ÷áñáêôÞñá ôïõ áëöáñéèìçôéêïý: tring. ÁõôÞ ç åðéðëÝïí åõåëéîßá ðïõ Ý÷åé ç ðñïóÝããéóç ìå äåßêôç, ìðïñåß óõ÷íÜ íá áðïôåëÝóåé ðëåïíÝêôçìá, üðùò èá äïýìå.
¢
message
¢ ¢+1 ¢+2 ¢+3 ¢+4 ¢+5 ¢+6
char
s t r i n g \0
message
*message="string";
ç message åßíáé ìåôáâëçôÞ äåßêôç
¢ ¢+1 ¢+2 ¢+3 ¢+4 ¢+5 ¢+6
s t r i n g \0
static char message[ ]="string";
ç message åßíáé óôáèåñÜ äåßêôç
Ó÷Þìá 9.3: Áëöáñéèìçôéêü ùò äåßêôçò êáé ùò ðßíáêáò
Óôçí § 7.2.1 åßäáìå ìåñéêÝò óõíáñôÞóåéò âéâëéïèÞêçò ãéá áëöáñéèìçôéêÜ. Ôþñá ðïõ åßäáìå ôç ó÷Ýóç ôùí äåéêôþí êáé ôùí áëöáñéèìçôéêþí, èá ìðïñïýóáìå íá ãñÜøïõìå áõôÝò ôéò óõíáñôÞóåéò ìüíïé ìáò. Ãéá ðáñÜäåéãìá ç óõíÜñôçóç strlen() ðïõ õðïëïãßæåé ôï ìÞêïò åíüò áëöáñéèìçôéêïý èá ìðïñïýóå íá ãñáöåß ùò åîÞò: int strlen(char *s) { int i=0; while(*s++) i++; /* üóï äå âñßóêïõìå ôï ÷áñáêôÞñá ôåñìáôéóìïý... */ return(i); }
Ç strcpy() ðïõ áíôéãñÜöåé Ýíá áëöáñéèìçôéêü óå Ýíá Üëëï, èá ìðïñïýóå íá ãñáöåß: void strcpy(char *s1,char *s2) { while(*s1++=*s2++); }
Åíþ ç strcat() èá ìðïñïýóå íá Þôáí: void strcat(char *s1,char *s2) { while(*s1) s1++; /* âñßóêïõìå ôï ôÝëïò ôïõ s1 */ while(*s1++=*s2++); }
Êáé ç strcmp(): int strcmp(char *s1,char *s2)
Äåßêôåò
93
{ for( ;*s1==*s2;s1++,s2++) if(*s1=='\0') return(0); return(*s1-*s2); }
Ìßá áêüìç óõíÜñôçóç âéâëéïèÞêçò ôçò C ðïõ äïõëåýåé ìå áëöáñéèìçôéêÜ åßíáé ç strchr(). Ç êëÞóç ôçò óõíÜñôçóçò áõôÞò Ý÷åé ôç ìïñöÞ strchr(s,c) êáé åðéóôñÝöåé Ýíá äåßêôç óôçí ðñþôç åìöÜíéóç ôïõ ÷áñáêôÞñá c ìÝóá óôï áëöáñéèìçôéêü s. Áí ï ÷áñáêôÞñáò äå âñåèåß, ôüôå ï äåßêôçò ðáßñíåé ùò ôéìÞ ôï ìçäÝí. Óôç èÝóç ôïõ ìçäåíüò ÷ñçóéìïðïéåßôáé óõ÷íÜ ç óôáèåñÜ NULL ðïõ ïñßæåôáé óôï áñ÷åßï-åðéêåöáëßäáò stdio.h. Ôï ðáñáêÜôù ðñüãñáììá ÷ñçóéìïðïéåß ôç óõíÜñôçóç strchr(), æçôÜ áðü ôï ÷ñÞóôç íá ðëçêôñïëïãÞóåé ìßá ðñüôáóç êáé ôï ÷áñáêôÞñá ãéá ôïí ïðïßï èá øÜîåé. Óôç óõíÝ÷åéá ôõðþíåé ôç äéåýèõíóç ôçò áñ÷Þò ôçò ðñüôáóçò, ôç äéåýèõíóç ôïõ ÷áñáêôÞñá êáé ôç èÝóç ôïõ ÷áñáêôÞñá óå ó÷Ýóç ìå ôçí áñ÷Þ ôçò ðñüôáóçò. ÁõôÞ ó÷åôéêÞ èÝóç åßíáé áðëÜ ç äéáöïñÜ áíÜìåóá óôéò äýï äéåõèýíóåéò: /* search.c */ /* ÁíáæÞôçóç ÷áñáêôÞñá óå áëöáñéèìçôéêü */ #include <string.h> #include <stdio.h> main() { char ch, line[81], *ptr; puts("\nÄþóå ìéá ðñüôáóç"); gets(line); puts("Äþóå ôï ÷áñáêôÞñá ðïõ èÝëåéò íá øÜîù"); ch=getche(); ptr=strchr(line,ch); if(ptr!=NULL) { printf("\nÇ ðñüôáóç áñ÷ßæåé óôç äéåýèõíóç %p",line); printf("\nÐñþôç åìöÜíéóç ôïõ ÷áñáêôÞñá óôç äéåýèõíóç %p",ptr); printf("\nÁðüóôáóç ôïõ ÷áñáêôÞñá áðü ôçí áñ÷Þ %d",ptr-line); } else puts("\nÏ ÷áñáêôÞñáò äåí õðÜñ÷åé óôçí ðñüôáóç"); }
9.7
¶ ¡z ™ ¢ ø¡ z ¢ ™ ™ ¢ ™
Áöïý ïé äåßêôåò åßíáé ìåôáâëçôÝò, ìðïñïýí êé áõôïß íá áðïèçêåýïíôáé óå ðßíáêåò üðùò ïé Üëëåò ìåôáâëçôÝò. Ç äÞëùóç ð.÷. åíüò ðßíáêá 10 èÝóåùí ðïõ ðåñéÝ÷åé ùò óôïé÷åßá äåßêôåò óå áêåñáßïõò, ãßíåôáé ùò åîÞò: int *ar[10];
Ãéá íá êáôá÷ùñÞóïõìå ôç äéåýèõíóç ìßáò áêÝñáéáò ìåôáâëçôÞò ìå üíïìá var óôï ôñßôï óôïé÷åßï ôïõ ðßíáêá, èá ãñÜøïõìå: ar[2]=&var;
êáé ãéá íá âñïýìå ôçí ôéìÞ ôçò var èá ãñÜøïõìå: *ar[2]
Áè. Å. Êïõôóïíéêüëáò
94
H Ãëþóóá Ðñïãñáììáôéóìïý C
Ïé ðßíáêåò äåéêôþí ÷ñçóéìïðïéïýíôáé óõíÞèùò ãéá íá êñáôïýí äéåõèýíóåéò óå áëöáñéèìçôéêÜ. Ãéá íá ãßíåé êáôáíïçôü áõôü, áò èåùñÞóïõìå ôçí ðáñáêÜôù åíôïëÞ áðüäïóçò áñ÷éêþí ôéìþí ó'Ýíáí ðßíáêá áëöáñéèìçôéêþí: static char names[5][8]={"Ìáñßá", "ÃéÜííçò", "ÆùÞ", "Éùí", "Áííá"};
Ó'áõôÞ ôçí ðåñßðôùóç ô'áëöáñéèìçôéêÜ áðïèçêåýïíôáé óôç ìíÞìç ó'Ýíáí ðßíáêá ìå 5 ãñáììÝò êáé 8 óôÞëåò, üðùò öáßíåôáé óôï Ó÷Þìá 9.4 á. Èá ìðïñïýóáìå åîßóïõ êáëÜ íá èÝóïõìå áñ÷éêÝò ôéìÝò ó'Ýíáí ðßíáêá äåéêôþí óå áëöáñéèìçôéêÜ, ùò åîÞò: static char *names[]={"Ìáñßá", "ÃéÜííçò", "ÆùÞ", "Éùí", "Áííá"};
Ó'áõôÞ ôçí ðåñßðôùóç ô'áëöáñéèìçôéêÜ áðïèçêåýïíôáé óõíå÷üìåíá óôç ìíÞìç, äå ó÷çìáôßæïõí ðßíáêá êáé Ýôóé äåí õðÜñ÷åé ÷áìÝíïò ÷þñïò áíÜìåóÜ ôïõò. Å÷åé üìùò äçìéïõñãçèåß Ýíáò ðßíáêáò áðü äåßêôåò ó'áõôÜ ôá áëöáñéèìçôéêÜ, Ó÷Þìá 9.4 â.
Ðßíáêáò áëöáñéèìçôéêþí 0 1000 Ì
name[0] name[1] name[2] name[3] name[4]
1 á
2 ñ
3
4 ß á
1008 Ã
é Ü
í
í
1016 Æ 1024 É
ù Þ ù í
\0 \0
1032 Á í
í
5 6 \0
7
ç
\0
ò
(á) \0
á
1039 Ðßíáêáò äåéêôþí óå áëöáñéèìçôéêÜ name[0] name[1]
1000 1006
1000 Ì 1006 Ã
á
name[2] name[3]
1014
1014 Æ
ù
1018 1022
1018 É ù í 1022 Á í í
name[4]
ñ é Ü Þ
ß á í í
\0 ç ò
\0
\0 \0 á \0
(â) 1026
Ó÷Þìá 9.4: Ðßíáêáò áëöáñéèìçôéêþí êáé ðßíáêáò äåéêôþí óå áëöáñéèìçôéêÜ
Ïðùò âëÝðïõìå áðü ôï ó÷Þìá 9.4, ç ðåñßðôùóç áðüäïóçò áñ÷éêþí ôéìþí óå ðßíáêá äåéêôþí óå áëöáñéèìçôéêÜ êáôáëáìâÜíåé ëéãüôåñï ÷þñï óôç ìíÞìç. Åôóé Ýíáò áðü ôïõò ëüãïõò ðïõ èÝôïõìå áñ÷éêÝò ôéìÝò óôá áëöáñéèìçôéêÜ óáí äåßêôåò åßíáé ç áðïôåëåóìáôéêüôåñç ÷ñÞóç ôçò ìíÞìçò. Åíáò Üëëïò ëüãïò åßíáé ãéá íá
Äåßêôåò
95
áðïêôÞóïõìå ìåãáëýôåñç åõåëéîßá óôï ÷åéñéóìü ôùí áëöáñéèìçôéêþí óôïí ðßíáêá, üðùò èá öáíåß áðü ôï åðüìåíï ðáñÜäåéãìá. Óôçí § 7.1.6 ðáñïõóéÜóáìå Ýíá ðñüãñáììá ôáîéíüìçóçò (sortsel.c) ðïõ ìðïñïýóå íá ôáîéíïìåß Ýíáí ðßíáêá áêåñáßùí. Èá ÷ñçóéìïðïéÞóïõìå ôþñá ôïí ßäéï áëãüñéèìï ãéá íá ôáîéíïìÞóïõìå Ýíáí ðßíáêá áëöáñéèìçôéêþí. Ïìùò äåí ðñüêåéôáé íá ìåôáêéíÞóïõìå ôá ßäéá ôá áëöáñéèìçôéêÜ ìÝóá óôïí ðßíáêá, áëëÜ èá ôáîéíïìÞóïõìå Ýíáí ðßíáêá áðü äåßêôåò óå áëöáñéèìçôéêÜ, âëÝðå Ó÷Þìá 9.5. /* sortstr.c */ /* Ôáîéíüìçóç áëöáñéèìçôéêþí */ #define MAXNUM 30 #define MAXLEN 81 main() { char name[MAXNUM][MAXLEN]; /* ðßíáêáò áëöáñéèìçôéêþí */ char *ptr[MAXNUM]; /* ðßíáêáò äåéêôþí óå áëöáñéèìçôéêÜ */ int count=0; while(count<MAXNUM) { printf("%do áëöáñéèìçôéêü: ",count+1); gets(name[count]); if(strlen(name[count])==0) break; ptr[count++]=name[count]; } sort(ptr,count); display(ptr,count); } /* sort() */ /* ôáîéíïìåß ôïí ðßíáêá äåéêôþí */ sort(char *p[],int c) { int i,j,min; char *temp; for(i=0;i<c-1;i++) { min=i; for(j=i+1;j<c;j++) if(strcmp(p[min],p[j])>0) min=j; if(i!=min) { temp=p[i]; p[i]=p[min]; p[min]=temp; } } } /* display() */ /* åìöáíßæåé ôá áëöáñéèìçôéêÜ ôáîéíïìçìÝíá */ display(char *p[],int c) { int i; for(i=0;i<c;i++)printf("\n%do áëöáñéèìçôéêü: %s",i+1,p[i]); }
Áè. Å. Êïõôóïíéêüëáò
96
H Ãëþóóá Ðñïãñáììáôéóìïý C
Ì Æ Ã É Á
á ñ ù Þ é Ü ù í í í
ß \0 í \0 á
Ì Æ Ã É Á
á ñ ù Þ é Ü ù í í í
ß \0 í \0 á
á
\0
í
ç
ò
\0
ò
\0
\0
Ïé äåßêôåò ðñéí ôçí ôáîéíüìçóç á
\0
í
ç
\0
Ïé äåßêôåò ìåôÜ ôçí ôáîéíüìçóç
Ó÷Þìá 9.5: Ôáîéíüìçóç ðßíáêá äåéêôþí óå áëöáñéèìçôéêÜ
Óôï ðáñáðÜíù ðñüãñáììá ÷ñçóéìïðïéÞóáìå ôçí åíôïëÞ: ptr[count++]=name[count];
óôçí ïðïßá, áíáöåñüìåíïé óôïí ðßíáêá name ÷ñçóéìïðïéïýìå ìüíï Ýíá äåßêôçðßíáêá (subscript) ðáñüëï ðïõ ï ðßíáêáò áõôüò åßíáé äéäéÜóôáôïò. Ôé óçìáßíåé ëïéðüí ôï name[count], áí ï ðßíáêáò name åßíáé äéäéÜóôáôïò; Áò èõìçèïýìå üôé ìðïñïýìå íá áíôéëçöèïýìå Ýíá äéäéÜóôáôï ðßíáêá óáí Ýíá ìïíïäéÜóôáôï ðßíáêá áðü ìïíïäéÜóôáôïõò ðßíáêåò. Ó'áõôÞ ôçí ðåñßðôùóç ç äÞëùóç char name[MAXNUM][MAXLEN];
ìðïñåß íá åñìçíåõôåß ùò äÞëùóç ìïíïäéÜóôáôïõ ðßíáêá ìå MAXNUM óôïé÷åßá, ôï êáèÝíá åê ôùí ïðïßùí åßíáé Ýíáò ìïíïäéÜóôáôïò ðßíáêáò ÷áñáêôÞñùí, ìÞêïõò MAXLEN. Åôóé, áíáöåñüìåíïé óôá óôïé÷åßá ôïõ ðßíáêá name ìå Ýíá ìüíï äåßêôçðßíáêá (subscript) n, óôçí ïõóßá áíáöåñüìáóôå óôç äéåýèõíóç ôïõ n+1 áëöáñéèìçôéêïý, äçëáäÞ óôç äéåýèõíóç ôïõ ðñþôïõ ÷áñáêôÞñá ôïõ n+1 áëöáñéèìçôéêïý. Ç éêáíüôçôá ôçò ãëþóóáò C íá ÷åéñßæåôáé ôìÞìáôá åíüò ðßíáêá ùò ðßíáêåò, åßíáé óôçí ðñáãìáôéêüôçôá ìßá åéäéêÞ ìïñöÞ åíüò Üëëïõ èÝìáôïò ôçò C, ðïõ ëÝãåôáé ðïëëáðëÞ åììåóüôçôá Þ äéðëÞ áíáêáôåýèõíóç Þ "äåßêôåò óå äåßêôåò". Ãéá íá ãßíåé êáôáíïçôü áõôü áò äïýìå ðþò ìðïñïýìå íá áíáöåñèïýìå ìå Ýêöñáóç äåéêôþí (pointer) óå êÜðïéï óôïé÷åßï åíüò äéäéÜóôáôïõ ðßíáêá. Åóôù ï ðßíáêáò: int table[L][C]; /* ðßíáêáò ìå L ãñáììÝò êáé C óôÞëåò */
ôüôå ãéá íá áíáöåñèïýìå óôï óôïé÷åßï ðïõ âñßóêåôáé óôçí i ãñáììÞ êáé j óôÞëç áõôïý ôïõ ðßíáêá èá ãñÜøïõìå: table[i][j] (1) Ïìùò ï ðßíáêáò table ìðïñåß íá åñìçíåõôåß êáé ùò åîÞò: Åíáò ìïíïäéÜóôáôïò ðßíáêáò ìå L óôïé÷åßá, ôï êáèÝíá áð'ôá ïðïßá åßíáé Ýíáò ìïíïäéÜóôáôïò ðßíáêáò ìå C áêÝñáéïõò: ôýðïò table[L]; üðïõ ôýðïò: int list[C]
Ãéá íá áíáöåñèïýìå ôþñá ìå äåßêôç (pointer) óôï óôïé÷åßï i ôïõ ðßíáêá table, ãñÜöïõìå, üðùò Ý÷ïõìå äåé óôçí § 9.5: *(table+i)
Äåßêôåò
97
üìùò ôï óôïé÷åßï i ôïõ ðßíáêá table åßíáé Ýíáò ïëüêëçñïò ðßíáêáò ìå üíïìá ôç äéåýèõíóç ôïõ ðñþôïõ óôïé÷åßïõ ôïõ, äçëáäÞ: üíïìá==*(table+i). Ãéá íá áíáöåñèïýìå ôþñá óôï j óôïé÷åßï áõôïý ôïõ ðßíáêá ãñÜöïõìå: *(üíïìá+j), äçëáäÞ: *(*(table+i)+j) (2) üìùò áõôü åßíáé ôï óôïé÷åßï table[i][j]. Åôóé ïé ðáñáóôÜóåéò (1) êáé (2) åßíáé éóïäýíáìåò: table[i][j]==*(*(table+i)+j)
ðñÜãìá ðïõ ìáò ëÝåé üôé: Ýíá óôïé÷åßï åíüò äéäéÜóôáôïõ ðßíáêá ìðïñåß íá áíáöåñèåß ì'Ýíá äåßêôç ó'Ýíáí Üëëï äåßêôç. Åôóé ëïéðüí, âëÝðïõìå üôé õðÜñ÷ïõí äýï ôñüðïé ãéá íá áíáöåñèïýìå óôá óôïé÷åßá åíüò äéäéÜóôáôïõ ðßíáêá: (i)
Ìå ôç ÷ñÞóç ðáñÜóôáóçò ðßíáêá: table[i][j]
(ii) Ìå ôç ÷ñÞóç ðáñÜóôáóçò äåéêôþí (pointer): *(*(table+i)+j)
9.8
ƒ ™ªz z °ƒzªª ™ ¢ z z°ø¡
Ç main() åßíáé ìßá óõíÜñôçóç êáé ùò ôÝôïéá ìðïñåß íá äÝ÷åôáé ðáñáìÝôñïõò. Ïé ðñáãìáôéêÝò ðáñÜìåôñïé óôç óõíÜñôçóç main() äßíïíôáé üôáí åêôåëïýìå ôï ðñüãñáììÜ ìáò, áðü ôï ðåñéâÜëëïí ôïõ Ëåéôïõñãéêïý ÓõóôÞìáôïò. Ãéá íá ãßíåé áõôü, äçìéïõñãïýìå ðñþôá ôï åêôåëÝóéìï áñ÷åßï ôïõ ðñïãñÜììáôüò ìáò êáé óôç óõíÝ÷åéá, óå ðåñéâÜëëïí Ëåéôïõñãéêïý ÓõóôÞìáôïò ðëçêôñïëïãïýìå ôï üíïìá ôïõ ðñïãñÜììáôïò êáé, ÷ùñéóìÝíåò ìå êåíÜ, ôéò ðáñáìÝôñïõò ðïõ èÝëïõìå íá ìåôáâéâÜóïõìå óôç main(). ÁõôÝò ïé ðáñÜìåôñïé ëÝãïíôáé ïñßóìáôá ãñáììÞò äéáôáãþí. Ç main() äÝ÷åôáé äýï ðáñáìÝôñïõò, ðïõ óõíÞèùò ôïõò äßíïõìå ôá ðáñáêÜôù ïíüìáôá: argc ðïõ åßíáé ôýðïõ áêåñáßïõ êáé ó'áõôÞí áðïèçêåýåôáé ï áñéèìüò ôùí ïñéóìÜôùí
ôçò ãñáììÞò äéáôáãþí. Ç ôéìÞ ôçò èá åßíáé ðÜíôá ôïõëÜ÷éóôïí 1, ãéáôß ôï üíïìá ôïõ ðñïãñÜììáôïò åßíáé ôï ðñþôï üñéóìá. argv ðïõ åßíáé Ýíáò ðßíáêáò äåéêôþí óôá ïñßóìáôá ôçò ãñáììÞò äéáôáãþí, äçëáäÞ
Ýíáò ðßíáêáò äåéêôþí óå áëöáñéèìçôéêÜ, üðïõ êÜèå áëöáñéèìçôéêü åßíáé Ýíá üñéóìá. Ãéá íá ãßíïõí êáôáíïçôÜ ôá ðáñáðÜíù, áò èåùñÞóïõìå ôï ðáñáêÜôù ðñüãñáììá: /* name.c */ /* Ïñßóìáôá ãñáììÞò äéáôáãþí */ main(int argc,char *argv[]) { if(argc!=2) puts("ÎÝ÷áóåò íá äþóåéò ôï üíïìÜ óïõ"); else printf("Ãåéá óïõ %s",argv[1]); }
Áè. Å. Êïõôóïíéêüëáò
98
H Ãëþóóá Ðñïãñáììáôéóìïý C
Ãéá íá ôñÝîïõìå áõôü ôï ðñüãñáììá, ôï ìåôáãëùôôßæïõìå, ôï äéáóõíäÝïõìå êáé áðü ôï ðåñéâÜëëïí ôïõ Ëåéôïõñãéêïý ÓõóôÞìáôïò ôï ôñÝ÷ïõìå, äßíïíôáò óáí üñéóìá ôï üíïìÜ ìáò, ð.÷. name Íßêï
Ôï áðïôÝëåóìá ðïõ èá äïýìå åßíáé: Ãåéá óïõ Íßêï
ÐáñáêÜôù äßíïõìå Ýíá åíäéáöÝñïí êáé ÷ñÞóéìï ðñüãñáììá, ðïõ ÷ñçóéìïðïéåß ïñßóìáôá ãñáììÞò äéáôáãþí ãéá íá åêôåëåß äéáäï÷éêÜ äéÜöïñåò äéáôáãÝò ôïõ DOS. Ôï ðñüãñáììá êÜíåé ÷ñÞóç ôçò óõíÜñôçóçò system() ç ïðïßá äÝ÷åôáé ùò ðáñÜìåôñï Ýíá áëöáñéèìçôéêü êáé ôï ìåôáâéâÜæåé, óáí äéáôáãÞ, óôïí åðåîåñãáóôÞ äéáôáãþí ôïõ DOS. /* comline.c */ /* Äéáäï÷éêÞ åêôÝëåóç äéáôáãþí ôïõ DOS ðïõ äßíïíôáé óôç ãñáììÞ äéáôáãþí */ #include <stdio.h> main(int argc, char *argv[]) { int i; if(argc<2) puts("ÎÝ÷áóåò íá äþóåéò ïñßóìáôá"); else for(i=1;i<argc;i++) system(argv[i]); }
Áöïý äçìéïõñãÞóïõìå ôï åêôåëÝóéìï áñ÷åßï, äßíïõìå áðü ôï ðåñéâÜëëïí ôïõ Ëåéôïõñãéêïý ÓõóôÞìáôïò DOS, ôçí ðáñáêÜôù ãñáììÞ äéáôáãþí, ðïõ åêôåëåß ôéò äéáôáãÝò VER, CHKDSK êáé DIR ôïõ DOS ìå ôç óåéñÜ: comline ver chkdsk dir
9.9
¢ ™ z ¢ ª ™
Ç C åðéôñÝðåé äåßêôåò óå ôýðïõò äïìþí, üðùò åðéôñÝðåé äåßêôåò óå ïðïéïõäÞðïôå ôýðïõ äåäïìÝíá. Ç ãåíéêÞ ìïñöÞ ôçò åíôïëÞò äÞëùóçò åíüò äåßêôç óå äïìÞ åßíáé: struct áíáãíùñéóôéêü_ôýðïõ_äïìÞò *áíáãíùñéóôéêü;
üðïõ áíáãíùñéóôéêü åßíáé ôï áíáãíùñéóôéêü ôïõ äåßêôç. Ï ôýðïò ôçò äïìÞò ðñÝðåé íá Ý÷åé ïñéóôåß ðñïçãïõìÝíùò. Ãéá ðáñÜäåéãìá, áí Ý÷ïõìå ôéò ðáñáêÜôù äçëþóåéò: struct date { int day; char mon_name[13]; int year; }; struct date d1;
ôüôå ç åíôïëÞ: struct date *ptr;
äçëþíåé Ýíá äåßêôç ìå üíïìá ptr óå äïìÞ ôýðïõ struct date. Ç åíôïëÞ: ptr=&d1;
êáôá÷ùñåß óôï äåßêôç ptr ôç äéåýèõíóç ôçò ìåôáâëçôÞò äïìÞò d1. Ãéá íá áíáöåñèïýìå óôï ìÝëïò year ôçò ìåôáâëçôÞò d1 ìðïñïýìå íá ãñÜøïõìå:
Äåßêôåò
99
d1.year
üðùò îÝñïõìå, Þ (*ptr).year
óå Ýêöñáóç äåßêôç. Ïðïõ ïé ðáñåíèÝóåéò ãýñù áðü ôï äåßêôç åßíáé áðáñáßôçôåò ãéáôß ï ôåëåóôÞò ôåëåßá Ý÷åé ìåãáëýôåñç ðñïôåñáéüôçôá áðü ôïí ôåëåóôÞ * (âëÝðå Ðßíáêá 3.5). Åðßóçò ìðïñïýìå áíôß ôçò ôåëåõôáßáò ðáñÜóôáóçò, íá áíáöåñèïýìå óôï ìÝëïò year ùò åîÞò: ptr->year
üðïõ ÷ñçóéìïðïéïýìå ôïí ôåëåóôÞ ->, ðïõ ëÝãåôáé êáé ôåëåóôÞò-âÝëïò.
9.10 1.
z™ ™ ™
Äþóôå ôï áðïôÝëåóìá ôçò åêôÝëåóçò ôïõ ðáñáêÜôù ðñïãñÜììáôïò: main() { static int arr[]={4,5,6}; int j; for(j=0;j<3;j++) printf("%d",*arr+j); }
2. Äþóôå ôï áðïôÝëåóìá ôïõ ðáñáêÜôù ðñïãñÜììáôïò: main() { static int arr[]={4,5,6}; int j; for(j=0;j<3;j++) printf("%d",arr+j); }
3. Ðïéï åßíáé ôï áðïôÝëåóìá ôïõ ðáñáêÜôù ðñïãñÜììáôïò: main() { static int arr[]={4,5,6}; int j,*ptr; ptr=arr; for(j=0;j<3;j++) printf("%d",*ptr++); }
4. Óôï áñ÷åßï-åðéêåöáëßäáò dos.h äçëþíïíôáé ïé ðáñáêÜôù äïìÝò: struct date { int da_year; int da_mon; int da_day; } struct time { int ti_hour; int ti_min; int ti_sec;
Áè. Å. Êïõôóïíéêüëáò
/* Ýôïò /* ìÞíáò /* çìÝñá
*/ */ */
/* þñåò /* ëåðôÜ /* äåõôåñüëåðôá
*/ */ */
H Ãëþóóá Ðñïãñáììáôéóìïý C
100
int ti_hund;
/* åêáôïóôÜ ôïõ äåõôåñïëÝðôïõ */
}
Åðßóçò ïñßæïíôáé ïé óõíáñôÞóåéò getdate() êáé gettime() ùò åîÞò: void getdate(struct date *d) void gettime(struct time *t)
ïé ïðïßåò äÝ÷ïíôáé áðü ôï óýóôçìá ôçí çìåñïìçíßá êáé ôçí þñá êáé ôéò ôïðïèåôïýí óôéò äïìÝò ðïõ äåß÷íïíôáé áðü ôï d êáé ôï t áíôßóôïé÷á. Áêüìá, ïñßæïíôáé ïé óõíáñôÞóåéò setdate() êáé settime() ùò åîÞò: void setdate(struct date *d) void settime(struct time *t)
ïé ïðïßåò èÝôïõí ôçí çìåñïìçíßá êáé ôçí þñá ôïõ óõóôÞìáôïò, üðùò êáèïñßæïíôáé áðü ôéò äïìÝò ðïõ äåß÷íïíôáé áðü ôï d êáé ôï t áíôßóôïé÷á. ÃñÜøôå Ýíá ðñüãñáììá ðïõ íá åìöáíßæåé óôçí ïèüíç ôçí çìåñïìçíßá êáé ôçí þñá ôïõ óõóôÞìáôïò. Óôç óõíÝ÷åéá íá åðéôñÝðåé óôï ÷ñÞóôç (áí åðéèõìåß) íá áëëÜîåé ôçí çìåñïìçíßá êáé ôçí þñá.
10.
zƒÃ z
Ïôáí Ýíáò áñéèìüò äåäïìÝíùí áðáéôåßôáé íá äéáôçñçèåß ãéá ìåëëïíôéêÞ ÷ñÞóç áðü äéÜöïñá ðñïãñÜììáôá Þ åßíáé ìåãÜëïõ ìåãÝèïõò êáé áðáéôåß ìåãáëýôåñç ðïóüôçôá áðü ôç äéáèÝóéìç êýñéá ìíÞìç ôïõ Ç/Õ, ôüôå ãéá ôçí áðïèÞêåõóÞ ôïõò ÷ñçóéìïðïéåßôáé ç ðåñéöåñåéáêÞ ìíÞìç ôïõ Ç/Õ, ð.÷. äßóêïò. ÊÜèå ïñãáíùìÝíç óõëëïãÞ äåäïìÝíùí, ðïõ áðïèçêåýåôáé óå êÜðïéï ðåñéöåñåéáêü ìÝóï áðïèÞêåõóçò, ïíïìÜæåôáé áñ÷åßï (file). Ç C èåùñåß üëá ôá áñ÷åßá óáí óåéñÝò áðü bytes ÷ùñßò êáìßá äïìÞ. Åíá ðñüãñáììá üìùò, ìðïñåß íá èåùñåß üôé Ýíá áñ÷åßï Ý÷åé êÜðïéá ëïãéêÞ äïìÞ, ð.÷. üôé áðïôåëåßôáé áðü áëöáñéèìçôéêÜ Þ áðïôåëåßôáé áðü äïìÝò. Ç ðáñáðÜíù èåþñçóç üìùò, ãßíåôáé ìüíï óå åðßðåäï ëïãéêÞò ôïõ óõãêåêñéìÝíïõ ðñïãñÜììáôïò, ïé óõíáñôÞóåéò åéóüäïõ êáé åîüäïõ ôçò C ÷åéñßæïíôáé ìüíï óåéñÝò áðü bytes. Áõôü åßíáé ðïëý âïëéêü ãéáôß Ýôóé ïé ðëçñïöïñßåò ôïõ ßäéïõ áñ÷åßïõ ìðïñïýí íá ÷ñçóéìïðïéçèïýí áðü äéáöïñåôéêÜ ðñïãñÜììáôá -ôá ïðïßá äå ÷ñåéÜæåôáé íá ãíùñßæïõí ôç äïìÞ ôïõ áñ÷åßïõ- êáé ãéá äéáöïñåôéêïýò óêïðïýò êÜèå öïñÜ. ÃåíéêÜ äéáêñßíïõìå äýï åßäç áñ÷åßùí, ôá áñ÷åßá êåéìÝíïõ (text files) êáé ôá äõáäéêÜ áñ÷åßá (binary files). Ôá áñ÷åßá êåéìÝíïõ áðïôåëïýíôáé ìüíïí áðü ÷áñáêôÞñåò êáé Ýôóé åßíáé Üìåóá áíáãíþóéìá áðü ôïí Üíèñùðï. Ôá äåäïìÝíá åíüò áñ÷åßïõ êåéìÝíïõ ÷ùñßæïíôáé óå ãñáììÝò ìå ôç ÷ñÞóç ôïõ ÷áñáêôÞñá '\n'. Ôá äõáäéêÜ áñ÷åßá ðåñéÝ÷ïõí ôéìÝò óå äõáäéêÞ ìïñöÞ êáé êáôÜ óõíÝðåéá äåí åßíáé Üìåóá áíáãíþóéìá áðü ôïí Üíèñùðï. Ïé ÷áñáêôÞñåò ðïõ ðåñéÝ÷ïíôáé ó'Ýíá äõáäéêü áñ÷åßï áíáãíùñßæïíôáé, üðùò êáé óôï áñ÷åßï êåéìÝíïõ, ïé áñéèìïß üìùò áðïèçêåýïíôáé üðùò åßíáé óôçí êýñéá ìíÞìç: óå äõáäéêÞ ìïñöÞ. Åôóé ôá äõáäéêÜ áñ÷åßá åßíáé óõíÞèùò ìéêñüôåñá óå ìÝãåèïò áðü ôá áñ÷åßá êåéìÝíïõ, áöïý ãéá Ýíáí áêÝñáéï ð.÷. ôïí 12345 ÷ñåéÜæïíôáé ìüíï 2 bytes, áíôß 5 bytes ðïõ èá ÷ñåéÜæïíôáí ó'Ýíá áñ÷åßï êåéìÝíïõ (1 ÷áñáêôÞñáò = 1 byte).
10.1
z¡ °ªz z § ™ ª zƒÃ À
Ç ðñþôç åñãáóßá ðïõ ðñÝðåé íá ãßíåé êáôÜ ôï ÷åéñéóìü ôùí áñ÷åßùí, åßíáé ôï Üíïéãìá (opening). Ôï Üíïéãìá Ý÷åé ôçí Ýííïéá ôçò ðñïåôïéìáóßáò ôïõ áñ÷åßïõ ãéá åßóïäï êáé Ýîïäï óôïé÷åßùí. ÊáôÜ ôï Üíïéãìá, ôï áñ÷åßï ðïõ åßíáé ãíùóôü ìå Ýíá üíïìá óôï Ëåéôïõñãéêü Óýóôçìá, óõíäÝåôáé ìå ìßá ìåôáâëçôÞ ôïõ ðñïãñÜììáôïò (ðïõ óôç óõíÝ÷åéá èá ïíïìÜæïõìå äåßêôç-áñ÷åßïõ). Óôç óõíÝ÷åéá áõôÞ ç ìåôáâëçôÞ ÷ñçóéìïðïéåßôáé ùò üñéóìá óôéò óõíáñôÞóåéò ÷åéñéóìïý ôïõ áñ÷åßïõ. Ç ìåôáâëçôÞ áõôÞ ðñÝðåé íá åßíáé ôýðïõ äåßêôç óå FILE. Ï ôýðïò FILE ïñßæåôáé óôï áñ÷åßïåðéêåöáëßäáò stdio.h.
102
H Ãëþóóá Ðñïãñáììáôéóìïý C
Ôï Üíïéãìá åíüò áñ÷åßïõ ãßíåôáé ìå ôç óõíÜñôçóç fopen() ôçò ïðïßáò ôï ðñüôõðï õðÜñ÷åé óôï áñ÷åßï-åðéêåöáëßäáò stdio.h: FILE *fopen(char *path, char *mode);
üðïõ ôï path ðñïóäéïñßæåé ôï ðëÞñåò üíïìá ôïõ áñ÷åßïõ ðïõ èÝëïõìå íá áíïßîïõìå, üðùò áõôü åßíáé ãíùóôü óôï Ëåéôïõñãéêü Óýóôçìá êáé ôï mode êáèïñßæåé ôïí ôñüðï ìå ôïí ïðïßï èá áíïé÷ôåß ôï áñ÷åßï. Ç óõíÜñôçóç fopen() åðéóôñÝöåé ìßá ôéìÞ äåßêôç óå FILE, ç ïðïßá ðñÝðåé íá áðïèçêåõôåß óå Ýíá äåßêôçáñ÷åßïõ. Áí ãéá ïðïéïäÞðïôå ëüãï ôï áñ÷åßï äå ìðïñåß íá áíïé÷ôåß, ç fopen() åðéóôñÝöåé ôéìÞ ìçäÝí (êáèïñéóìÝíç óôï stdio.h ùò NULL). Ïé ðáñáêÜôù åíôïëÝò äçëþíïõí Ýíá äåßêôç-áñ÷åßïõ, ìå üíïìá fptr, êáé áíïßãïõí áñ÷åßï ìå üíïìá TEXTFILE.TXT ãéá åããñáöÞ (äçëþíåôáé ìå ôï "w"): FILE *fptr; fptr=fopen("textfile.txt","w");
Ï ôñüðïò ìå ôïí ïðïßï èá áíïé÷ôåß Ýíá áñ÷åßï ìðïñåß íá åßíáé ãéá áíÜãíùóç (read), ãéá åããñáöÞ (write), ãéá ðñïóèÞêç (append) ê.ë.ð. Áõôü êáèïñßæåôáé áðü ôçí ôéìÞ ôïõ äåýôåñïõ ïñßóìáôïò ôçò fopen(), ïé äõíáôÝò ôéìÝò öáßíïíôáé óôïí Ðßíáêá 10.1. ÔéìÞ
Óçìáóßá "r" Áíïéãìá áñ÷åßïõ êåéìÝíïõ ãéá áíÜãíùóç. Ôï áñ÷åßï ðñÝðåé íá ðñïûðÜñ÷åé. "w" Áíïéãìá áñ÷åßïõ êåéìÝíïõ ãéá åããñáöÞ. Áí ôï áñ÷åßï õðÜñ÷åé ôá ðåñéå÷üìåíÜ ôïõ êáôáóôñÝöïíôáé, áí äåí õðÜñ÷åé äçìéïõñãåßôáé. "a" Áíïéãìá áñ÷åßïõ êåéìÝíïõ ãéá ðñïóèÞêç óôï ôÝëïò ôïõ. Áí ôï áñ÷åßï äåí õðÜñ÷åé, äçìéïõñãåßôáé. "rb" Áíïéãìá äõáäéêïý áñ÷åßïõ ãéá áíÜãíùóç. Ôï áñ÷åßï ðñÝðåé íá ðñïûðÜñ÷åé. "wb" Áíïéãìá äõáäéêïý áñ÷åßïõ ãéá åããñáöÞ. Áí ôï áñ÷åßï õðÜñ÷åé ôá ðåñéå÷üìåíÜ ôïõ êáôáóôñÝöïíôáé, áí äåí õðÜñ÷åé äçìéïõñãåßôáé. "ab" Áíïéãìá äõáäéêïý áñ÷åßïõ ãéá ðñïóèÞêç óôï ôÝëïò ôïõ. Áí ôï áñ÷åßï äåí õðÜñ÷åé, äçìéïõñãåßôáé. "r+" Áíïéãìá áñ÷åßïõ êåéìÝíïõ ãéá áíÜãíùóç êáé åããñáöÞ. Ôï áñ÷åßï ðñÝðåé íá ðñïûðÜñ÷åé. "w+" Áíïéãìá áñ÷åßïõ êåéìÝíïõ ãéá åããñáöÞ êáé áíÜãíùóç. Áí ôï áñ÷åßï äåí õðÜñ÷åé, äçìéïõñãåßôáé. "a+" Áíïéãìá áñ÷åßïõ êåéìÝíïõ ãéá ðñïóèÞêç óôï ôÝëïò ôïõ êáé áíÜãíùóç. Áí ôï áñ÷åßï äåí õðÜñ÷åé, äçìéïõñãåßôáé. "r+b" Áíïéãìá äõáäéêïý áñ÷åßïõ ãéá áíÜãíùóç êáé åããñáöÞ. Ôï áñ÷åßï ðñÝðåé íá ðñïûðÜñ÷åé. "w+b" Áíïéãìá äõáäéêïý áñ÷åßïõ ãéá åããñáöÞ êáé áíÜãíùóç. Áí ôï áñ÷åßï äåí õðÜñ÷åé, äçìéïõñãåßôáé. "a+b" Áíïéãìá äõáäéêïý áñ÷åßïõ ãéá ðñïóèÞêç óôï ôÝëïò ôïõ êáé áíÜãíùóç. Áí ôï áñ÷åßï äåí õðÜñ÷åé, äçìéïõñãåßôáé. Ðßíáêáò 10.1: ÁðïäåêôÝò ôéìÝò ôïõ ôñüðïõ áíïßãìáôïò åíüò áñ÷åßïõ
Áñ÷åßá
103
Ïôáí ôåëåéþóåé ç ìåôáöïñÜ ôùí äåäïìÝíùí áðü êáé ðñïò ôï áñ÷åßï, ôüôå ôï áñ÷åßï ðñÝðåé íá êëåßóåé (close). Ôï êëåßóéìï Ý÷åé ôçí Ýííïéá ôïõ íá ïñéóôéêïðïéÞóåé (óþóåé) ôéò áëëáãÝò ðïõ Ýãéíáí óôï áñ÷åßï êáé íá áðïäåóìåýóåé ôï áñ÷åßï áðü ôï ðñüãñáììá. Ç óõíÜñôçóç ç ïðïßá êëåßíåé Ýíá áñ÷åßï åßíáé ç fclose(), ôï ðñüôõðï ôçò ïðïßáò åßíáé: int fclose(FILE *fptr);
üðïõ fptr åßíáé ï äåßêôçò-áñ÷åßïõ ðïõ åðéóôñÝöåôáé áðü ôçí êëÞóç ôçò fopen(). Ôï ìçäÝí ùò åðéóôñåöüìåíç ôéìÞ óçìáßíåé åðéôõ÷Ýò êëåßóéìï, ïðïéáäÞðïôå Üëëç ôéìÞ äçëþíåé ôçí ýðáñîç êÜðïéïõ ëÜèïõò (ð.÷. äåí õðÜñ÷åé áñêåôüò ÷þñïò óôï äßóêï).
10.2
¶ƒ ™¶ §z™ zƒÃ À
10.2.1
™ ¢ ™ z • ¢ ™ Ãzƒz ƒø¡
Ç óõíÜñôçóç putc() ÷ñçóéìïðïéåßôáé ãéá ôï ãñÜøéìï åíüò ÷áñáêôÞñá ó'Ýíá áñ÷åßï ôï ïðïßï Ý÷åé ðñïçãïõìÝíùò áíïé÷ôåß ãéá åããñáöÞ ìÝóù ôçò óõíÜñôçóçò fopen(). Ôï ðñüôõðï ôçò putc() åßíáé: int putc(int ch, FILE *fptr);
üðïõ fptr åßíáé ï äåßêôçò-áñ÷åßïõ ðïõ åðéóôñÝöåôáé áðü ôçí fopen(), êáé ch åßíáé ï ðñïò Ýîïäï ÷áñáêôÞñáò. Ï äåßêôçò-áñ÷åßïõ êáèïñßæåé óå ðïéï áñ÷åßï äßóêïõ èá ãßíåé ç åããñáöÞ. Áí ç putc() åßíáé åðéôõ÷Þò èá åðéóôñÝøåé ôï ÷áñáêôÞñá ðïõ ãñÜöôçêå. Áí áðïôý÷åé èá åðéóôñÝøåé ôçí ôéìÞ EOF (êáèïñßæåôáé óôï stdio.h ìå ôéìÞ -1 êáé áíôéðñïóùðåýåé ôï ôÝëïò áñ÷åßïõ - End Of File). Ôï ðáñáêÜôù ðñüãñáììá äçìéïõñãåß Ýíá áñ÷åßï ìå üíïìá CHARTEXT.TXT êáé ãñÜöåé ó'áõôü ÷áñáêôÞñåò ðïõ äßíïíôáé áðü ôï ðëçêôñïëüãéï, Ýùò üôïõ äþóïõìå ENTER: /* writec.c */ /* ÅããñáöÞ ÷áñáêôÞñùí óå áñ÷åßï */ #include <stdio.h> #include <stdlib.h> main() { FILE *fptr; char ch; if((fptr=fopen("chartext.txt","w"))==NULL) { puts("Äå ìðïñþ íá áíïßîù ôï áñ÷åßï CHARTEXT.TXT"); exit(0); } while((ch=getche())!='\r') putc(ch,fptr); fclose(fptr); }
ÊÜèå byte ìÝóá óå Ýíá áñ÷åßï áíôéóôïé÷åß óå ìßá èÝóç ç ïðïßá äåß÷íåôáé áðü Ýíá äåßêôç ðïõ ëÝãåôáé äåßêôçò-èÝóçò ôïõ áñ÷åßïõ. Ï äåßêôçò-èÝóçò äåß÷íåé óôï byte ôïõ áñ÷åßïõ üðïõ èá ãßíåé ç åðüìåíç ðñïóðÝëáóç. ÊÜèå öïñÜ ðïõ ãñÜöïõìå (Þ äéáâÜæïõìå) Ýíá áíôéêåßìåíï óå (Þ áðü) Ýíá áñ÷åßï, ï äåßêôçò-èÝóçò äåß÷íåé ìåôÜ
Áè. Å. Êïõôóïíéêüëáò
104
H Ãëþóóá Ðñïãñáììáôéóìïý C
ôï ôÝëïò áõôïý ôïõ áíôéêåéìÝíïõ, Ýôóé þóôå ç åðüìåíç åããñáöÞ Þ áíÜãíùóç íá óõíå÷éóôåß áðü åêåßíï ôï óçìåßï êáé ìåôÜ. Ïôáí áíïßãïõìå Ýíá áñ÷åßï ãéá åããñáöÞ Þ áíÜãíùóç, ï äåßêôçò-èÝóçò ôßèåôáé óôçí áñ÷Þ ôïõ áñ÷åßïõ. Ïôáí áíïßãïõìå Ýíá áñ÷åßï ãéá ðñïóèÞêç (append) ôüôå ï äåßêôçò-èÝóçò ôßèåôáé óôï ôÝëïò ôïõ áñ÷åßïõ. Ãéá íá äéáâÜóïõìå ÷áñáêôÞñåò áðü Ýíá áñ÷åßï ðïõ ðñïçãïõìÝíùò ôï Ý÷ïõìå áíïßîåé ãéá äéÜâáóìá ìÝóù ôçò fopen(), ÷ñçóéìïðïéïýìå ôç óõíÜñôçóç getc(), ôçò ïðïßáò ôï ðñüôõðï åßíáé: int getc(FILE *fptr);
üðïõ fptr åßíáé ï äåßêôçò-áñ÷åßïõ ðïõ åðéóôñÝöåôáé áðü ôçí fopen(). Ç getc() åðéóôñÝöåé ôïí åðüìåíï ÷áñáêôÞñá áðü ôï áñ÷åßï Þ EOF üôáí öôÜóåé óôï ôÝëïò ôïõ. Ôï ðáñáêÜôù ðñüãñáììá äéáâÜæåé áðü Ýíá áñ÷åßï, üëïõò ôïõò ÷áñáêôÞñåò êáé ôïõò åìöáíßæåé óôçí ïèüíç: /* readc.c */ /* ÁíÜãíùóç ÷áñáêôÞñùí áðü áñ÷åßï */ #include <stdio.h> #include <stdlib.h> main(int argc, char *argv[]) { FILE *fptr; char ch; if(argc<2) { puts("ÎÝ÷áóåò íá äþóåéò üíïìá áñ÷åßïõ"); exit(0); } if((fptr=fopen(argv[1],"r"))==NULL) { printf("Äå ìðïñþ íá áíïßîù ôï áñ÷åßï %s",argv[1]); exit(0); } while((ch=getc(fptr))!=EOF) printf("%c",ch); fclose(fptr); }
Óôï ðáñáðÜíù ðñüãñáììá ôï üíïìá ôïõ áñ÷åßïõ ôïõ ïðïßïõ ôá ðåñéå÷üìåíá èÝëïõìå íá äïýìå, äßíåôáé ùò üñéóìá óôç ãñáììÞ äéáôáãþí (§ 9.8). Åôóé áí ð.÷. èÝëïõìå íá äïýìå ôá ðåñéå÷üìåíá ôïõ áñ÷åßïõ CHARTEXT.TXT ðïõ äçìéïõñãÞóáìå ìå ôï ðñüãñáììá writec.c, ðñÝðåé áöïý ìåôáãëùôôßóïõìå êáé äéáóõíäÝóïõìå ôï readc.c, áðü ôï ðåñéâÜëëïí ôïõ Ëåéôïõñãéêïý ÓõóôÞìáôïò íá äþóïõìå: readc chartext.txt
Åôóé åßíáé ðñïöáíÝò üôé ôï ðñüãñáììá readc.c ðñïóïìïéÜæåé ôçí åíôïëÞ TYPE ôïõ DOS. Ïôáí áíïßãïõìå Ýíá áñ÷åßï ãéá äõáäéêÞ åßóïäï, åßíáé ðéèáíüí ç getc() íá äéáâÜóåé ìéáí áêÝñáéá ôéìÞ ßóç ìå ôï EOF (äçëáäÞ -1). Áí óõìâåß êÜôé ôÝôïéï ç getc() èá óôáìáôÞóåé ôï äéÜâáóìá íïìßæïíôáò üôé Ý÷åé öôÜóåé óôï ôÝëïò ôïõ áñ÷åßïõ. Ãéá íá ëýóåé áõôü ôï ðñüâëçìá ç C ðáñÝ÷åé ôç óõíÜñôçóç feof(), ç ïðïßá êáèïñßæåé ðïý âñßóêåôáé ôï óçìÜäé ôÝëïõò áñ÷åßïõ üôáí äéáâÜæïíôáé äõáäéêÜ
Áñ÷åßá
105
äåäïìÝíá. Ç óõíÜñôçóç feof() äÝ÷åôáé ùò üñéóìá Ýíá äåßêôç-áñ÷åßïõ êáé åðéóôñÝöåé 1 áí Ý÷ïõìå öôÜóåé óôï ôÝëïò ôïõ áñ÷åßïõ êáé 0 áí äåí Ý÷ïõìå öôÜóåé. Åôóé ç ðáñáêÜôù åíôïëÞ äéáâÜæåé Ýíá äõáäéêü áñ÷åßï ìÝ÷ñé ôï ôÝëïò ôïõ: while(!feof(fptr)) ch=getc(fptr);
Ç feof() ìðïñåß åðßóçò íá ÷ñçóéìïðïéçèåß êáé óå áñ÷åßá êåéìÝíïõ.
10.2.2
™ ¢ ™ z • ¢ ™ z§ºzƒ £ª ø¡
Ç åããñáöÞ êáé áíÜãíùóç áëöáñéèìçôéêþí óå áñ÷åßá åðéôõã÷Üíåôáé ìå ÷ñÞóç ôùí óõíáñôÞóåùí fputs() êáé fgets() áíôßóôïé÷á. Ôá ðñüôõðÜ ôïõò, ðïõ õðÜñ÷ïõí óôï áñ÷åßï-åðéêåöáëßäáò stdio.h, åßíáé: char *fputs(char *str, FILE *fptr); char *fgets(char *str, int n, FILE *fptr);
Ç óõíÜñôçóç fputs() äïõëåýåé áêñéâþò üðùò êáé ç ãíùóôÞ óõíÜñôçóç puts() (âëÝðå § 4.2), ìå ôç äéáöïñÜ üôé ç fputs() ãñÜöåé ôï áëöáñéèìçôéêü óôï áñ÷åßï ðïõ êáèïñßæåôáé áðü ôï fptr. Ç óõíÜñôçóç fputs(), üôáí åßíáé åðéôõ÷Þò åðéóôñÝöåé ôïí ôåëåõôáßï ÷áñáêôÞñá ôïõ áëöáñéèìçôéêïý ðïõ ãñÜöôçêå, åíþ üôáí áðïôõã÷Üíåé åðéóôñÝöåé EOF. Ç óõíÜñôçóç fgets() äéáâÜæåé Ýíá áëöáñéèìçôéêü áðü ôï êáèïñéæüìåíï áñ÷åßï ìÝ÷ñé íá äéáâÜóåé åßôå Ýíá ÷áñáêôÞñá íÝáò ãñáììÞò åßôå n-1 ÷áñáêôÞñåò êáé ôï ôïðïèåôåß óôïí ðßíáêá ÷áñáêôÞñùí ðïõ äåß÷íåôáé áðü ôï str. Áöïý äéáâáóôïýí ïé ÷áñáêôÞñåò, ôïðïèåôåßôáé óôïí ðßíáêá Ýíáò ÷áñáêôÞñáò ôåñìáôéóìïý '\0'. Ïôáí ç fgets() åßíáé åðéôõ÷Þò åðéóôñÝöåé ôï áëöáñéèìçôéêü str, åíþ üôáí áðïôõã÷Üíåé åðéóôñÝöåé ôéìÞ NULL. Ôá ðáñáêÜôù äýï ðñïãñÜììáôá writes.c êáé reads.c ãñÜöïõí êáé äéáâÜæïõí áëöáñéèìçôéêÜ óå áñ÷åßï, áíôßóôïé÷á: /* writes.c */ /* ÅããñáöÞ áëöáñéèìçôéêþí óå áñ÷åßï */ #include <stdio.h> #include <stdlib.h> main(int argc, char *argv[]) { FILE *fptr; char string[81]; if(argc<2) { puts("ÎÝ÷áóåò íá äþóåéò üíïìá áñ÷åßïõ"); exit(0); } if((fptr=fopen(argv[1],"w"))==NULL) { printf("Äå ìðïñþ íá áíïßîù ôï áñ÷åßï %s",argv[1]); exit(0); } while(strlen(gets(string))>0) { fputs(string,fptr); fputs("\n",fptr); } fclose(fptr); }
Áè. Å. Êïõôóïíéêüëáò
H Ãëþóóá Ðñïãñáììáôéóìïý C
106
/* reads.c */ /* ÁíÜãíùóç áëöáñéèìçôéêþí áðü áñ÷åßï */ #include <stdio.h> #include <stdlib.h> main(int argc, char *argv[]) { FILE *fptr; char string[81]; if(argc<2) { puts("ÎÝ÷áóåò íá äþóåéò üíïìá áñ÷åßïõ"); exit(0); } if((fptr=fopen(argv[1],"r"))==NULL) { printf("Äå ìðïñþ íá áíïßîù ôï áñ÷åßï %s",argv[1]); exit(0); } while(fgets(string,81,fptr)!=NULL) printf("%s",string); fclose(fptr); }
10.2.3
ª ƒº ¶ ª ¡ ™ ¢ ™ z • ¢ ™
Ïé áíôßóôïé÷åò óõíáñôÞóåéò ôùí printf() êáé scanf() ðïõ ÷ñçóéìïðïéïýíôáé ãéá åßóïäï êáé Ýîïäï êïíóüëáò (âëÝðå § 4.3), åßíáé ïé fprintf() êáé fscanf() ãéá åßóïäï êáé Ýîïäï áðü áñ÷åßï. Ïé fprintf() êáé fscanf() ëåéôïõñãïýí áêñéâþò üìïéá üðùò ïé printf() êáé scanf(), ìüíï ðïõ äÝ÷ïíôáé Ýíá åðéðëÝïí üñéóìá ðïõ åßíáé ï äåßêôçò-áñ÷åßïõ óôï ïðïßï èá ãñÜøïõìå Þ áðü ôï ïðïßï èá äéáâÜóïõìå: fprintf(fptr, áëöáñéèìçôéêü_åëÝã÷ïõ, ëßóôá_ïñéóìÜôùí) fscanf(fptr, áëöáñéèìçôéêü_åëÝã÷ïõ, ëßóôá_ïñéóìÜôùí)
Ôï ðáñáêÜôù ðñüãñáììá äÝ÷åôáé áðü ôï ðëçêôñïëüãéï ïíïìáôåðþíõìï êáé ìéóèü êáé ôá êáôá÷ùñåß óôï áñ÷åßï ôï üíïìá ôïõ ïðïßïõ äßíïõìå óôç ãñáììÞ äéáôáãþí. Ç åéóáãùãÞ óôïé÷åßùí óôáìáôÜåé áí äþóïõìå ùò üíïìá Ýíá êåíü áëöáñéèìçôéêü (áðëþò ENTER): /* writef.c */ /* ÅããñáöÞ ìïñöïðïéçìÝíùí äåäïìÝíùí óå áñ÷åßï */ #include <stdio.h> #include <stdlib.h> main(int argc, char *argv[]) { FILE *fptr; char name[40],numstr[10]; float salary; if(argc<2) { puts("ÎÝ÷áóåò íá äþóåéò üíïìá áñ÷åßïõ"); exit(0); } if((fptr=fopen(argv[1],"w"))==NULL) { printf("Äå ìðïñþ íá áíïßîù ôï áñ÷åßï %s",argv[1]); exit(0); }
Áñ÷åßá
107
do { printf("\nÏíïìá : "); gets(name); printf("Ìéóèüò: "); gets(numstr); salary=atof(numstr); if(strlen(name)>0) fprintf(fptr,"%s %f",name,salary); } while(strlen(name)>0); fclose(fptr); }
Ôï åðüìåíï ðñüãñáììá äéáâÜæåé ìïñöïðïéçìÝíá äåäïìÝíá áðü áñ÷åßï, ðïõ äçìéïõñãÞèçêå áðü ôï ðáñáðÜíù ðñüãñáììá êáé ôá åìöáíßæåé óôçí ïèüíç: /* readf.c */ /* ÁíÜãíùóç ìïñöïðïéçìÝíùí äåäïìÝíùí áðü áñ÷åßï */ #include <stdio.h> #include <stdlib.h> main(int argc, char *argv[]) { FILE *fptr; char name[40]; float salary; if(argc<2) { puts("ÎÝ÷áóåò íá äþóåéò üíïìá áñ÷åßïõ"); exit(0); } if((fptr=fopen(argv[1],"r"))==NULL) { printf("Äå ìðïñþ íá áíïßîù ôï áñ÷åßï %s",argv[1]); exit(0); } while(fscanf(fptr,"%s %f",&name,&salary)!=EOF) printf("%s %f\n",name,salary); fclose(fptr); }
10.2.4
™ ¢ ™ z • ¢ ™ ¢ ªø¡ ¢ ¢ ª ¡ø¡
ÕðÜñ÷ïõí äýï óõíáñôÞóåéò ïé ïðïßåò ìáò åðéôñÝðïõí íá ãñÜöïõìå êáé íá äéáâÜæïõìå êáôåõèåßáí ïëüêëçñåò äïìÝò äåäïìÝíùí (ð.÷. åããñáöÝò (äïìÝò), ðßíáêåò ê.ë.ð.). Ïé óõíáñôÞóåéò áõôÝò åßíáé ïé fwrite() êáé fread(), ôùí ïðïßùí ôá ðñüôõðá âñßóêïíôáé óôï stdio.h: int fwrite(void *buffer, int size, int n, FILE *fptr); int fread(void *buffer, int size, int n, FILE *fptr);
Óôçí ðåñßðôùóç ôçò fread(), ï buffer åßíáé Ýíáò äåßêôçò (pointer) óå ìßá ðåñéï÷Þ ôçò ìíÞìçò ç ïðïßá èá äå÷ôåß ôá äåäïìÝíá ðïõ äéáâÜæïíôáé áðü ôï áñ÷åßï. Óôçí fwrite(), ï buffer åßíáé Ýíáò äåßêôçò (pointer) óôéò ðëçñïöïñßåò ðïõ èá ãñáöôïýí óôï áñ÷åßï. Êáé óôéò äýï óõíáñôÞóåéò ôï size êáèïñßæåé ôïí áñéèìü ôùí bytes ðïõ èá äéáâáóôïýí Þ èá ãñáöôïýí. Ôï üñéóìá n êáèïñßæåé ôï ðëÞèïò ôùí óôïé÷åßùí (ôï êáèÝíá ìåãÝèïõò size) ðïõ èá äéáâáóôïýí Þ èá ãñáöôïýí. ÔÝëïò ôï fptr åßíáé Ýíáò äåßêôçò-áñ÷åßïõ ðïõ Þäç Ý÷åé áíïé÷ôåß. Ïé óõíáñôÞóåéò åðéóôñÝöïõí ôïí áñéèìü ôùí óôïé÷åßùí ðïõ ðñáãìáôéêÜ ãñÜöôçêáí Þ äéáâÜóôçêáí.
Áè. Å. Êïõôóïíéêüëáò
108
H Ãëþóóá Ðñïãñáììáôéóìïý C
Åôóé ð.÷. ôï ðáñáêÜôù ðñüãñáììá äçìéïõñãåß óôï äßóêï Ýíá áñ÷åßï óôï ïðïßï êáôá÷ùñïýíôáé áðü ôï ðëçêôñïëüãéï ïíïìáôåðþíõìï êáé ìéóèüò êÜðïéùí õðáëëÞëùí: /* writer.c */ /* ÃñÜøéìï åããñáöþí óå áñ÷åßï */ #include <stdio.h> #include <stdlib.h> main(int argc, char *argv[]) { struct record { char name[40]; float salary; } empl; char numstr[10]; FILE *fptr; char select; if(argc<2) { puts("ÎÝ÷áóåò íá äþóåéò üíïìá áñ÷åßïõ"); exit(0); } if((fptr=fopen(argv[1],"wb"))==NULL) { printf("Äå ìðïñþ íá áíïßîù ôï áñ÷åßï %s",argv[1]); exit(0); } do { printf("\nÄþóå üíïìá: "); gets(empl.name); printf("Äþóå ìéóèü: "); gets(numstr); empl.salary=atof(numstr); fwrite(&empl,sizeof(empl),1,fptr); printf("Èá äþóåéò Üëëïí õðÜëëçëï (Í/Ï)"); select=getche(); } while(select=='Í'||select=='í'||select=='N'||select=='n'); fclose(fptr); }
Ôï åðüìåíï ðñüãñáììá äéáâÜæåé ôá äåäïìÝíá áðü êÜðïéï áñ÷åßï åããñáöþí ðïõ äçìéïõñãÞèçêå ìå ôï ðñïçãïýìåíï ðñüãñáììá êáé ôá åìöáíßæåé óôçí ïèüíç: /* readr.c */ /* ÁíÜãíùóç åããñáöþí áðü áñ÷åßï */ #include <stdio.h> #include <stdlib.h> main(int argc, char *argv[]) { struct record { char name[40]; float salary; }; struct record empl; char numstr[10]; FILE *fptr; if(argc<2)
Áñ÷åßá
109
{ puts("ÎÝ÷áóåò íá äþóåéò üíïìá áñ÷åßïõ"); exit(0); } if((fptr=fopen(argv[1],"rb"))==NULL) { printf("Äå ìðïñþ íá áíïßîù ôï áñ÷åßï %s",argv[1]); exit(0); } while(fread(&empl,sizeof(empl),1,fptr)==1) printf("\nÏíïìá: %s Ìéóèüò: %f",empl.name,empl.salary); fclose(fptr); }
ÔÝëïò áò äïýìå Ýíá ðáñÜäåéãìá óôï ïðïßï Ýíáò ïëüêëçñïò ðßíáêáò ãñÜöåôáé ó'Ýíá áñ÷åßï: /* warray.c */ /* ÅããñáöÞ ðßíáêá óå áñ÷åßï */ #include <stdio.h> #include <stdlib.h> main(int argc, char *argv[]) { static table[]={1,2,3,4,5,6,7,8,9,10}; FILE *fptr; if(argc<2) { puts("ÎÝ÷áóåò íá äþóåéò üíïìá áñ÷åßïõ"); exit(0); } if((fptr=fopen(argv[1],"wb"))==NULL) { printf("Äå ìðïñþ íá áíïßîù ôï áñ÷åßï %s",argv[1]); exit(0); } fwrite(table,sizeof(table),1,fptr); fclose(fptr); }
10.3
z§§ ™ ™À¡zƒ ™ ™ à ƒ ™ª À zƒÃ ø¡
ÌåñéêÝò áêüìç óõíáñôÞóåéò ðïõ ÷ñçóéìïðïéïýíôáé ìå ôá áñ÷åßá, ðåñéãñÜöïíôáé ðáñáêÜôù. Ôá ðñüôõðÜ ôïõò âñßóêïíôáé óôï áñ÷åßï-åðéêåöáëßäáò stdio.h. fseek() ÌÝ÷ñé ôþñá üëåò ìáò ïé áíáãíþóåéò êáé åããñáöÝò óå áñ÷åßï, ãßíïíôáí óåéñéáêÜ. ÄçëáäÞ üôáí ãñÜöáìå óå Ýíá áñ÷åßï, ðáßñíáìå ìßá ïìÜäá áðü óôïé÷åßá ÷áñáêôÞñåò, áëöáñéèìçôéêÜ, äïìÝò ê.ë.ð.- êáé ôá ôïðïèåôïýóáìå áíÜ Ýíá êÜèå öïñÜ óå äéáäï÷éêÝò èÝóåéò åíôüò ôïõ áñ÷åßïõ. Áíôßóôïé÷á üôáí äéáâÜæáìå, áñ÷ßæáìå áðü ôçí áñ÷Þ ôïõ áñ÷åßïõ êáé óõíå÷ßæáìå ìÝ÷ñé íá öôÜóïõìå óôï ôÝëïò ôïõ. Åßíáé äõíáôüí åðßóçò íá ðñïóðåëÜóïõìå Üìåóá ïðïéïäÞðïôå óôïé÷åßï äåäïìÝíùí ôïõ áñ÷åßïõ, ïðïõäÞðïôå ìÝóá óôï áñ÷åßï êé áí âñßóêåôáé áõôü. Áõôü ãßíåôáé ôïðïèåôþíôáò êáôÜëëçëá ôï äåßêôç-èÝóçò ôïõ áñ÷åßïõ ÷ñçóéìïðïéþíôáò ôç óõíÜñôçóç fseek(). Ôï ðñüôõðï áõôÞò åßíáé: int fseek(FILE *fptr, long int offset, int whence);
Áè. Å. Êïõôóïíéêüëáò
H Ãëþóóá Ðñïãñáììáôéóìïý C
110
üðïõ fptr åßíáé Ýíáò äåßêôçò-áñ÷åßïõ ðïõ åðéóôñÝöåôáé ìå ìßá êëÞóç óôçí fopen(), offset åßíáé ï áñéèìüò ôùí bytes ðïõ äçëþíåé ôçí áðüóôáóç ôçò íÝáò èÝóçò ôïõ äåßêôç-èÝóçò áðü ôçí whence. H whence ìðïñåß íá åßíáé 0 ðïõ õðïäçëþíåé ôçí áñ÷Þ ôïõ áñ÷åßïõ, 1 ðïõ õðïäçëþíåé ôçí ôñÝ÷ïõóá èÝóç Þ 2 ðïõ õðïäçëþíåé ôï ôÝëïò ôïõ áñ÷åßïõ, Þ åíáëëáêôéêÜ Ýíá áðü ôá ïíüìáôá SEEK_SET, SEEK_CUR, SEEK_END áíôßóôïé÷á, êáèüóïí óôï stdio.h õðÜñ÷ïõí ïé áêüëïõèåò ïäçãßåò: #define SEEK_SET #define SEEK_CUR #define SEEK_END
0 1 2
ÔéìÞ åðéóôñïöÞò ìçäÝí óçìáßíåé üôé ç fseek() ðÝôõ÷å. Ìç-ìçäåíéêÞ ôéìÞ óçìáßíåé áðïôõ÷ßá. ftell() ÅðéóôñÝöåé ôçí ôñÝ÷ïõóá ôéìÞ ôïõ äåßêôç-èÝóçò áñ÷åßïõ (óå bytes ìåôñçìÝíá áð'ôçí áñ÷Þ ôïõ áñ÷åßïõ) ãéá ôï êáèïñéóìÝíï áñ÷åßï. Ïôáí óõìâåß êÜðïéï óöÜëìá åðéóôñÝöåé -1L. Ôï ðñüôõðü ôçò åßíáé: long ftell(FILE *fptr);
rewind() Ôïðïèåôåß ôï äåßêôç-èÝóçò ôïõ áñ÷åßïõ ðïõ äÝ÷åôáé ùò üñéóìá, óôçí áñ÷Þ ôïõ áñ÷åßïõ. Ôï ðñüôõðü ôçò åßíáé: void rewind(FILE *fptr);
remove() ÄéáãñÜöåé áðü ôï äßóêï ôï áñ÷åßï ðïõ äÝ÷åôáé ùò üñéóìá (name). Ôï ðñüôõðü ôçò åßíáé: int remove(char *name);
ÅðéóôñÝöåé 0 áí ôï áñ÷åßï äéáãñÜöôçêå ìå åðéôõ÷ßá êáé -1 áí Ý÷åé óõìâåß óöÜëìá. rename() ÌåôïíïìÜæåé Ýíá áñ÷åßï (ðáëáéü üíïìá old_name, íÝï üíïìá new_name). Ôï ðñüôõðü ôçò åßíáé: int rename(char *old_name, char *new_name);
ÅðéóôñÝöåé 0 üôáí åßíáé åðéôõ÷Þò êáé -1 áí Ý÷åé óõìâåß óöÜëìá.
10.4 1.
z™ ™ ™
Íá ãñáöåß ðñüãñáììá ðïõ íá ìåôñÜ ôá ãñÜììáôá, ôéò ëÝîåéò, ôéò ðñïôÜóåéò êáé ôç ìÝóç ôéìÞ ôùí ãñáììÜôùí áíÜ ëÝîç, ãéá Ýíá áñ÷åßï êåéìÝíïõ ôï üíïìá ôïõ ïðïßïõ èá äßíåôáé ùò üñéóìá óôç ãñáììÞ äéáôáãþí.
2. ÃñÜøôå ðñüãñáììá ðïõ íá ìåôñÜ ôç óõ÷íüôçôá ôùí ãñáììÜôùí ó'Ýíá áñ÷åßï êåéìÝíïõ, ôï üíïìá ôïõ ïðïßïõ èá äßíåôáé ùò üñéóìá óôç ãñáììÞ äéáôáãþí. Ðïéï åßíáé ôï ðåñéóóüôåñï ÷ñçóéìïðïéïýìåíï ãñÜììá óôá åëëçíéêÜ êåßìåíá êáé ðïéï óôá áããëéêÜ;
Áñ÷åßá
111
3. Áò õðïèÝóïõìå üôé ïñßæïõìå ôÝóóåñéò êáôçãïñßåò ëÝîåùí áíÜëïãá ìå ôï ìÞêïò ôïõò: á) Óôçí ðñþôç êáôçãïñßá áíÞêïõí ïé ëÝîåéò ðïõ Ý÷ïõí 1-3 ãñÜììáôá â) Óôç äåýôåñç, áõôÝò ðïõ Ý÷ïõí 4-6 ãñÜììáôá ã) Óôçí ôñßôç, áõôÝò ðïõ Ý÷ïõí 7-9 ãñÜììáôá ä) Óôçí ôÝôáñôç, ïé ëÝîåéò ðïõ Ý÷ïõí 10 êáé ðëÝïí ãñÜììáôá. Íá ãñáöåß ðñüãñáììá ðïõ íá äéáâÜæåé Ýíá áñ÷åßï êåéìÝíïõ êáé íá ìåôñÜ ôï ðëÞèïò ôùí ëÝîåùí ðïõ áíÞêïõí óå êÜèå êáôçãïñßá. 4. ÃñÜøôå Ýíá ðñüãñáììá ðïõ íá äéáâÜæåé áðü ôï äßóêï Ýíá áñ÷åßï ðçãáßïõ ðñïãñÜììáôïò ôçò C êáé íá åëÝã÷åé áí ôï ðëÞèïò ôùí áñéóôåñþí áãêßóôñùí ({) åßíáé ßóï ìå ôï ðëÞèïò ôùí äåîéþí áãêßóôñùí (}). Ôï üíïìá ôïõ áñ÷åßïõ ðçãáßïõ ðñïãñÜììáôïò íá äßíåôáé ùò üñéóìá óôç ãñáììÞ äéáôáãþí. 5. Íá ãñáöåß ðñüãñáììá ðïõ íá áíôéãñÜöåé Ýíá áñ÷åßï óå Ýíá Üëëï, äçëáäÞ íá ðñïóïìïéÜæåé ôç äéáôáãÞ COPY ôïõ DOS. Óôç óõíÝ÷åéá ôï ðñüãñáììá íá åëÝã÷åé áí ç áíôéãñáöÞ Ýãéíå óùóôÜ, äçëáäÞ íá ðñïóïìïéÜæåé ôç äéáôáãÞ COMP ôïõ DOS. 6. ÃñÜøôå ðñüãñáììá ðïõ íá äçìéïõñãåß Ýíá áñ÷åßï ðñáãìáôéêþí áñéèìþí ôïõò ïðïßïõò èá äÝ÷åôáé áðü ôï ðëçêôñïëüãéï. Ïé áñéèìïß ðïõ èá êáôá÷ùñïýíôáé íá åßíáé áõôïß ðïõ èá âñßóêïíôáé óôï äéÜóôçìá [0..10]. 7.
Íá ãñáöåß ðñüãñáììá ðïõ íá âñßóêåé ôç ìÝóç ôéìÞ ôùí áñéèìþí ðïõ õðÜñ÷ïõí óôï áñ÷åßï ðïõ äçìéïõñãÞèçêå áðü ôï ðñüãñáììá ôçò Áóêçóçò 6. Óôç óõíÝ÷åéá íá âñßóêåé ôï ðëÞèïò ôùí áñéèìþí ïé ïðïßïé åßíáé ìåãáëýôåñïé ôçò ìÝóçò ôéìÞò, êáèþò êáé áõôþí ðïõ åßíáé ìéêñüôåñïé áõôÞò.
8. Íá ãñáöåß ðñüãñáììá ãéá ôç óõíÝíùóç (merging) äýï áñ÷åßùí ôïõ ßäéïõ ôýðïõ. Ôá äýï áñ÷åßá íá äßíïíôáé ùò ïñßóìáôá óôç ãñáììÞ äéáôáãþí êáé íá äçìéïõñãåßôáé Ýíá ôñßôï áñ÷åßï ìå ôá óôïé÷åßá ôïõ ðñþôïõ êáé óôç óõíÝ÷åéá ôá óôïé÷åßá ôïõ äåýôåñïõ. 9. ÃñÜøôå ðñüãñáììá, ôï ïðïßï ìå ôç âïÞèåéá åíüò menu íá ìáò äßíåé ôç äõíáôüôçôá ãéá ôéò åîÞò åðéëïãÝò: á) Äçìéïõñãßá áñ÷åßïõ áêåñáßùí. â) Ôáîéíüìçóç êáôÜ áýîïõóá óåéñÜ, ôïõ áñ÷åßïõ áêåñáßùí. ã) Ðáñïõóßáóç ôùí äåäïìÝíùí, ôïõ áñ÷åßïõ áêåñáßùí óôçí ïèüíç. Ãéá ôçí ôáîéíüìçóç ôïõ áñ÷åßïõ ìðïñåßôå íá ÷ñçóéìïðïéÞóåôå ôç ìÝèïäï ôçò åðéëïãÞò, ðïõ Ý÷åé ðåñéãñáöåß óôçí § 7.1.6. 10. ÕðïèÝóôå üôé ìå ôçí Áóêçóç 9 äçìéïõñãÞóáìå êáé ôáîéíïìÞóáìå äýï áñ÷åßá áêåñáßùí. ÃñÜøôå Ýíá ðñüãñáììá ðïõ íá äçìéïõñãåß Ýíá ôñßôï áñ÷åßï áðü ôç óõíôáîéíüìçóç ôùí äýï ðñïçãïõìÝíùí. Óõíôáîéíüìçóç åßíáé ç äéáäéêáóßá ôçò óõíÝíùóçò äýï ôáîéíïìçìÝíùí áñ÷åßùí, ìå áðïôÝëåóìá Ýíá ôñßôï, åðßóçò ôáîéíïìçìÝíï, áñ÷åßï. 11. Åíá ãñáöåßï óõíïéêåóßùí Ý÷åé äçìéïõñãÞóåé Ýíá áñ÷åßï, ôï ïðïßï ðåñéÝ÷åé óôïé÷åßá ôùí õðïøÞöéùí ãáìðñþí êáé ôùí õðïøÞöéùí íõöþí. Ãéá êÜèå ðåëÜôç
Áè. Å. Êïõôóïíéêüëáò
112
H Ãëþóóá Ðñïãñáììáôéóìïý C
Ý÷åé êáôáãñáöåß ôï åðßèåôï, ôï üíïìá, ç äéåýèõíóç, ï áñéèìüò ôçëåöþíïõ, ôï öýëëï (Á Þ È), ç çëéêßá, ôï ýøïò, ôï âÜñïò, ôï ÷ñþìá ôùí ìáôéþí, ôï ÷ñþìá ôùí ìáëëéþí, ôï åðÜããåëìá, ç ðáëéÜ ïéêïãåíåéáêÞ êáôÜóôáóç, ôï êýñéï ÷üìðé, ïé áäõíáìßåò êáé ïé ðáñáîåíéÝò. Íá ãñáöåß ðñüãñáììá ðïõ íá äçìéïõñãåß êáé íá åíçìåñþíåé ôï áñ÷åßï. Åðßóçò íá äÝ÷åôáé ôéò ðñïôéìÞóåéò åíüò íÝïõ ðåëÜôç êáé íá äßíåé ìßá ëßóôá ðéèáíþí óõæýãùí.
¶zƒzƒ ªz z' ™À¡ § Ãzƒz ƒø¡ ASCII Äåêáäéêüò Äåêáåî/êüò ×áñáêôÞñáò 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
j i h k x
½ !! ¶ §
n p o m l Ʒ ͩ
ÐëÞêôñï Ctrl-2 Ctrl-A Ctrl-B Ctrl-C Ctrl-D Ctrl-E Ctrl-F Ctrl-G Ctrl-H Ctrl-I Ctrl-J Ctrl-K Ctrl-L Ctrl-M Ctrl-N Ctrl-O Ctrl-P Ctrl-Q Ctrl-R Ctrl-S Ctrl-T Ctrl-U Ctrl-V Ctrl-W Ctrl-X Ctrl-Y Ctrl-Z Ctrl-[ Ctrl-\ Ctrl-] Ctrl-6 Ctrl-_
×áñáêôÞñáò åëÝã÷ïõ NUL SOH STX ETX EOT ENQ ACK BEL BS HT LF VT FF CR SO SI DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US
Null Start Of Heading Start Of Text End Of Text End Of Transmission Enquiry Acknowledge Bell Backspace Horizontal Tabulation Line Feed Vertical Tabulation Form Feed Carriage Return Shift Out Shift In Data Link Escape Device Control 1 Device Control 2 Device Control 3 Device Control 4 Negative Acknowledge Synchronous Idle End of Transmission Block Cancel End Of Medium Substitute Escape File Separator Group Separator Record Separator Unit Separator
114
H Ãëþóóá Ðñïãñáììáôéóìïý C
Äåêáäéêüò Äåêáåî/êüò ×áñáêôÞñáò ÐëÞêôñï Äåêáäéêüò Äåêáåî/êüò ×áñáêôÞñáò ÐëÞêôñï 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51
! " # $ % & ' ( ) * + , . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q
Space ! " # $ % & ' ( ) * + , . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q
82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F 80 81 82 83
R S T U V W X Y Z [ \ ] ^ _ ` 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 { | } ~ ¨ Á Â Ã Ä
R S T U V W X Y Z [ \ ] ^ _ ` 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 { | } ~ Del Á Â Ã Ä
ÐáñÜñôçìá Á'
Äåêáäéêüò Äåêáåî/êüò ×áñáêôÞñáò ÐëÞêôñï Äåêáäéêüò Äåêáåî/êüò ×áñáêôÞñáò ÐëÞêôñï 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183
Áè. Å. Êïõôóïíéêüëáò
84 85 86 87 88 89 8A 9B 9C 9D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7
Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ó Ô Õ Ö × Ø Ù á â ã ä å æ ç è é ê ë ì í î ï ð ñ ó ò ô õ ö ÷ ø
Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ó Ô Õ Ö × Ø Ù á â ã ä å æ ç è é ê ë ì í î ï ð ñ ó ò ô õ ö ÷ ø Alt-176 Alt-177 Alt-178 Alt-179 Alt-180 Alt-181 Alt-182 Alt-183
184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235
B8 B9 BA BB BC BD BE BF C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB
ù Ü Ý Þ ú ß ü ý û þ ȍ
į
Alt-184 Alt-185 Alt-186 Alt-187 Alt-188 Alt-189 Alt-190 Alt-191 Alt-192 Alt-193 Alt-194 Alt-195 Alt-196 Alt-197 Alt-198 Alt-199 Alt-200 Alt-201 Alt-202 Alt-203 Alt-204 Alt-205 Alt-206 Alt-207 Alt-208 Alt-209 Alt-210 Alt-211 Alt-212 Alt-213 Alt-214 Alt-215 Alt-216 Alt-217 Alt-218 Alt-219 Alt-220 Alt-221 Alt-222 Alt-223 ù Alt-225 Alt-226 Alt-227 Alt-228 Alt-229 Alt-230 Alt-231 Alt-232 Alt-233 Alt-234 Alt-235
115
116
H Ãëþóóá Ðñïãñáììáôéóìïý C
Äåêáäéêüò Äåêáåî/êüò ×áñáêôÞñáò ÐëÞêôñï Äåêáäéêüò Äåêáåî/êüò ×áñáêôÞñáò ÐëÞêôñï 236 237 238 239 240 241 242 243 244 245
EC ED EE EF F0 F1 F2 F3 F4 F5
f
I { r t d ´ ¶
Alt-236 Alt-237 Alt-238 Alt-239 Alt-240 Alt-241 Alt-242 Alt-243 Alt-244 Alt-245
246 247 248 249 250 251 252 253 254 255
F6 F7 F8 F9 FA FB FC FD FE FF
y | q . .
n 2
͢
Alt-246 Alt-247 Alt-248 Alt-249 Alt-250 Alt-251 Alt-252 Alt-253 Alt-254 Alt-255
Âéâëéïãñáößá
117
~ ~§ °ƒzº z 1.
AMMERAAL LEENDERT, C for Programmers, John Wiley & Sons Ltd, 1986. Êáé óôá åëëçíéêÜ: Ðñïãñáììáôßæïíôáò óôç Ãëþóóá C, Åêäüóåéò Ãêéïýñäá, 1986.
2. ATTIKIOUZEL J. - JONES P.E., C for Electrical and Electronic Engineers, Prentice Hall of Australia Pty Ltd, 1991. 3. KERNIGHAN BRIAN - RITCHIE DENNIS, The C Programming Language (Second Edition), Prentice Hall Inc., 1988. Êáé óôá åëëçíéêÜ: Ç Ãëþóóá Ðñïãñáììáôéóìïý C, ÊëåéäÜñéèìïò, 1990. 4. LAFORE ROBERT, Turbo C Programming for PC, The Waite Group Inc., 1987. Êáé óôá åëëçíéêÜ: Turbo C Ðñïãñáììáôéóìüò ãéá PC, Åêäüóåéò Ãêéïýñäá, 1992. 5. SCHILD HERBERT, Turbo C: The Pocket Reference, McGraw-Hill, Inc., 1988. Êáé óôá åëëçíéêÜ: Turbo C: Ïäçãüò Áìåóçò ÁíáöïñÜò, ÊëåéäÜñéèìïò, 1990. 6. SCHILD HERBERT, Using Turbo C, McGraw-Hill, Inc., 1989. Êáé óôá åëëçíéêÜ: Åã÷åéñßäéï åêìÜèçóçò Turbo C, ÊëåéäÜñéèìïò, 1989. 7.
SCHILD HERBERT, ÌÜèåôå åýêïëá ôç Ãëþóóá C, ÐáñáôçñçôÞò, 1988.
8. WORTMAN L.A. - SIDEBOTTOM T.O., The C Programming Tutor, Prentice Hall Inc, London, 1984. 9. ËÉÂÁÄÁÓ ÊÙÍ/ÍÏÓ, ÅéóáãùãÞ óôç Ãëþóóá C, IF-THEN-ELSE, 1992.
Áè. Å. Êïõôóïíéêüëáò