home *** CD-ROM | disk | FTP | other *** search
/ 8bitfiles.net/archives / archives.tar / archives / genie-commodore-file-library / Information / C.TUTOR.2.SFX / lesson9 < prev    next >
Encoding:
Text File  |  1991-03-07  |  20.0 KB  |  860 lines

  1.  
  2. ├ ╠ANGUAGE ╘UTORIAL
  3. -------------------
  4. ╨ART 9 OF 11
  5.  
  6.  
  7. ╬╧╘┼: ╙╒┬╙╘╔╘╒╘╔╧╬╙ ╞╧╥ ╙╨┼├╔┴╠ ├
  8. ╠┴╬╟╒┴╟┼ ├╚┴╥┴├╘┼╥╙:
  9.  
  10. ╠┼╞╘ ├╒╥╠┘ ┬╥┴├╦┼╘:   █
  11. ╥╔╟╚╘ ├╒╥╠┘ ┬╥┴├╦┼╘:  ▌
  12. ┬┴├╦ ╙╠┴╙╚:           \
  13. ╘╔╠─┼:                »
  14. ╓┼╥╘╔├┴╠ ┬┴╥:         ▀
  15. ╒╬─┼╥╙├╧╥┼:           ñ
  16.  
  17.  
  18. ╘HE ╙╫╔╘├╚ -
  19.  
  20. ┘OU MAY RECALL, FROM AN EARLIER 
  21. LESSON, THAT WE CHECKED VARIOUS CASES 
  22. BY USING THE 'IF, ELSE IF, ELSE'
  23. CONSTRUCTION: 
  24.  
  25. 1  IF ( SUCH-AND-SUCH) 
  26. 2   ----DO THIS-----
  27. 3  
  28. 4  ELSE IF (THIS-OR-THAT)  
  29. 5   ----DO THIS-----
  30. 6  
  31. 7  ELSE IF ( WHATEVER )    
  32. 8   ----DO THIS-----
  33. 9  
  34. 10 ELSE    
  35. 11  ----DO THIS-----
  36. 12 
  37. 13 ----CONTINUATION OF PROGRAM  
  38.  
  39. ╥EALIZE THAT ONLY ONE OF THE 
  40. STATEMENTS 2, 5, 8, 11 WILL BE 
  41. EXECUTED, DEPENDING UPON WHICH OF THE 
  42. CONDITIONS 1, 4, 7, 10 IS SATISFIED 
  43. FIRST. (╔F NONE OF 1,4 OR 7 ARE 
  44. SATISFIED, THEN 10 ╔╙ SATISFIED AND 
  45. 11 WILL BE EXECUTED). ╫E CAN THINK OF 
  46. CONDITION 10 AS A DEFAULT CONDITION.
  47.  
  48. ┼VEN IF THE CONDITIONS 1 AND 4 AND 7 
  49. ARE ALL SATISFIED, ONLY STATEMENT(S) 
  50. 2 WILL BE EXECUTED, THEN THE PROGRAM 
  51. WILL CONTINUE WITH STATEMENT 13, ETC. 
  52.  
  53. (╘HERE'S A ═╧╥┴╠ HERE. ╘O SPEED UP 
  54. EXECUTION, PUT THE MOST PROBABLE 
  55. CONDITION FIRST ... THEN THE PROGRAM 
  56. WON'T HAVE TO DO SO MUCH CHECKING). 
  57.  
  58. ┬UT THERE'S ANOTHER (MORE NATURAL) 
  59. WAY OF CHECKING A NUMBER OF CASES IN
  60. ├ CALLED A ╙╫╔╘├╚:
  61.  
  62. SWITCH (X) █
  63. /* ┬EGIN ╙╫╔╘├╚ ON THE INTEGER X */  
  64.   CASE 1: 
  65. /* ╔F X IS THE INTEGER 1, THEN  */  
  66.     DO THIS;   
  67. /* EXECUTE THIS STATEMENT... */  
  68.     AND THIS;  
  69. /* AND THIS TOO */  
  70.   CASE 2: 
  71. /* ╔F X IS THE INTEGER 2, THEN  */  
  72.     DO THIS;   
  73. /* EXECUTE THIS STATEMENT... */  
  74.     AND THIS;  
  75. /* AND THIS TOO */  
  76.   CASE 3: 
  77. /* ╔F X IS THE INTEGER 3, THEN  */  
  78.     DO THIS;   
  79. /* EXECUTE THIS STATEMENT... */  
  80.     AND THIS;  
  81. /* AND THIS TOO */  
  82.     AND THIS;  
  83. /* AND THIS TOO */  
  84.     AND THIS;  
  85. /* AND THIS TOO */  
  86.   CASE 4: 
  87. /* ╔F X IS THE INTEGER 4, THEN  */  
  88.     DO THIS;   
  89. /* EXECUTE THIS STATEMENT... */  
  90.   DEFAULT:
  91. /* ╔F X IS NONE OF THE ABOVE,THEN */  
  92.     DO THIS;   
  93. /* EXECUTE THIS STATEMENT... */  
  94.    /* END OF SWITCH */ 
  95. ╬OTICE THE OPENING AND CLOSING 
  96. BRACKETS FOR THE ╙╫╔╘├╚! 
  97.  
  98.  SWITCH (X) █
  99. /* ...CASES AND DEFAULT HERE... */
  100.  
  101.  
  102. AND HERE'S A VARIATION ...
  103.  
  104. 1  SWITCH (X) █     
  105. /* ┬EGIN ╙╫╔╘├╚ ON THE INTEGER X */  
  106. 2  CASE 1: 
  107. /* ╔F X IS THE INTEGER 1, THEN  */  
  108. 3  CASE 2: 
  109. /* ╔F X IS THE INTEGER 2, THEN  */  
  110. 4  CASE 3: 
  111. /* ╔F X IS THE INTEGER 3, THEN  */  
  112. 5    DO THIS;   
  113. /* EXECUTE THIS STATEMENT ... */  
  114. 6    AND THIS;  
  115. /* AND THIS TOO.  */  
  116. 7    AND THIS;  
  117. /* AND THIS TOO.  */  
  118. 8    AND THIS;  
  119. /* AND THIS TOO.  */  
  120. 9  CASE 4: 
  121. /* ╔F X IS THE INTEGER 4, THEN */  
  122. 10   DO THIS;   
  123. /* EXECUTE THIS STATEMENT ... */  
  124. 11 DEFAULT:
  125. /* ╔F X IS NONE OF THE ABOVE,THEN */
  126. 12   DO THIS;   
  127. /* EXECUTE THIS STATEMENT ... */  
  128. 13 ▌
  129.  
  130. ╔F THE INTEGER X IS EQUAL TO 1 OR 2 
  131. OR 3 THEN STATEMENTS 5 TO 8 WILL BE 
  132. EXECUTED! (...SO THE ╙╫╔╘├╚ WILL ╬╧╘ 
  133. ╙╘╧╨ WITH THE FIRST CASE THAT IS 
  134. SATISFIED, BUT WILL CHECK ┴╠╠ 
  135. ╙╒┬╙┼╤╒┼╬╘ ├┴╙┼╙!) ╔F YOU DON'T WANT 
  136. THAT TO HAPPEN, THEN YOU MAY 
  137. TERMINATE A CASE WITH A ┬╥┼┴╦.
  138.  
  139. 1  SWITCH (X) █
  140. /* ┬EGIN ╙╫╔╘├╚ ON THE INTEGER X */  
  141. 2    CASE 1: 
  142. /* ╔F X IS THE INTEGER 1, THEN  */  
  143. 3    CASE 2: 
  144. /* ╔F X IS THE INTEGER 2, THEN  */  
  145. 4    CASE 3: 
  146. /* ╔F X IS THE INTEGER 3, THEN  */  
  147. 5      DO THIS;   
  148. /* EXECUTE THIS STATEMENT ... */  
  149. 6      AND THIS;  
  150. /* AND THIS TOO.  */  
  151. 7      AND THIS;  
  152. /* AND THIS TOO.  */  
  153. 8      AND THIS;  
  154. /* AND THIS TOO.  */  
  155. 9      BREAK; 
  156. /* AND NOW ┬╥┼┴╦ ╧╒╘ ╧╞ ╘╚┼ ╙╫╔╘├╚ */
  157. 10   CASE 4: 
  158. /* ╔F X IS THE INTEGER 4, THEN */  
  159. 11     DO THIS;   
  160. /* EXECUTE THIS STATEMENT... */  
  161. 12   DEFAULT:
  162. /* ╔F X IS NONE OF THE ABOVE, THEN */  
  163. 13     DO THIS;   
  164. /* EXECUTE THIS STATEMENT... */  
  165. 14 ▌ /* END OF SWITCH */
  166.  
  167. ╬OW, IF X IS A 1 OR 2 OR 3, THE 
  168. STATEMENTS 5 TO 8 WILL BE EXECUTED 
  169. AND (BECAUSE OF THE BREAK; IN LINE 9) 
  170. WE LEAVE THE ╙╫╔╘├╚ AND CONTINUE 
  171. BEYOND LINE 14. ╔F, HOWEVER X IS A 4, 
  172. THEN ONLY THE STATEMENT(S) FOR THIS 
  173. CASE ARE EXECUTED (LINE 11, IN THIS 
  174. EXAMPLE). ╧NLY IF ALL CASES FAIL WILL 
  175. THE DEFAULT STATEMENT(S) BE EXECUTED 
  176. (FOR EXAMPLE, IF X IS A 6 THEN 
  177. STATEMENT 13 IS EXECUTED). 
  178.  
  179. ╟OOD PROGRAMMING PRACTICE IS TO PLACE 
  180. A BREAK AT THE END OF EACH CASE 
  181. ╒╬╠┼╙╙ YOU ╙╨┼├╔╞╔├┴╠╠┘ ╫┴╬╘ CASE-
  182. CHECKING TO FALL THROUGH TO 
  183. SUBSEQUENT CASES. ╘HIS IS A BIT OF 
  184. DEFENSIVE PROGRAMMING WHICH CAN SAVE 
  185. YOU FROM HAVING TO DO DIFFICULT 
  186. DEBUGGING LATER ON.
  187.  
  188.  
  189.  
  190. ═ORE ╙╫╔╘├╚ING -
  191.  
  192. ┘OU MAY SWITCH ON ANY TYPE OF 
  193. VARIABLE (NOT JUST INTEGERS). ╞OR 
  194. EXAMPLE YOU MAY HAVE DECLARED X TO BE 
  195. A CHAR, SO ... 
  196.  
  197. 1  SWITCH (X) █
  198. /* ┬EGIN ╙╫╔╘├╚ ON THE CHAR X */  
  199. 2    CASE '┴':   
  200. /* ╔F X IS THE CHARACTER '┴',THEN */ 
  201. 3    CASE 'U':   
  202. /* ╔F X IS THE CHARACTER 'U',THEN */  
  203. 4    CASE '#':   
  204. /* ╔F X IS THE CHARACTER '#',THEN */  
  205. 5      DO THIS;   
  206. /* EXECUTE THIS STATEMENT... */  
  207. 6      AND THIS;  
  208. /* AND THIS TOO */
  209. 7      AND THIS;  
  210. /* AND THIS TOO */  
  211. 8      AND THIS;  
  212. /* AND THIS TOO */  
  213. 9      BREAK; 
  214. /* NOW ┬╥┼┴╦ ╧╒╘ ╧╞ ╘╚┼ ╙╫╔╘├╚ */
  215.  
  216. ╬OTE THAT THE CASE COMPARISON MUST BE 
  217. CONSISTENT WITH THE VARIABLE TYPE. 
  218.  
  219. ╔F X IS AN INT   
  220. THEN YOU MAY USE CASE 7:
  221.  
  222. ╔F X IS A  CHAR  
  223. THEN YOU MAY USE CASE '+':
  224.  
  225. ╔F X IS A  FLOAT 
  226. THEN YOU MAY USE CASE -1.234:
  227.  
  228. ╘HINK OF THE CASE COMPARISONS AS 
  229. BEING EQUIVALENT TO: 
  230.  
  231. IF (X==7)  OR  IF (X=='+')  OR   
  232.   IF (X==-1.234)  ETC.
  233.  
  234. ┘OU MAY LEAVE OUT THE DEFAULT IF YOU 
  235. WISH BUT THIS IS ╬╧╘ ADVISABLE. 
  236. ╨UTTING A DEFAULT OPTION AT THE END 
  237. OF A SWITCH WILL SAVE YOU FROM 
  238. UNFORSEEN PROGRAMMING ERRORS OR 
  239. CONDITIONS WHICH YOU DID NOT 
  240. ANTICIPATE. ╔T IS GOOD PROGRAMMING 
  241. PRACTICE AND STYLE TO PUT A DEFAULT 
  242. AT THE END OF EVERY SWITCH. 
  243.  
  244.  
  245.  
  246. ├┴╠╠ ┬┘ ╓┴╠╒┼ AND ├┴╠╠ ┬┘ ╥┼╞┼╥┼╬├┼ -
  247.  
  248. ╬OTE: WHERE YOU HAVE SOMETHING LIKE  
  249. THE FOLLOWING -
  250.  
  251. GETVAL()
  252.   INT A, B, C;
  253.  
  254.   C = AVERAGE(A,B);
  255.   
  256.   ...ETC.
  257.  
  258. AVERAGE(X,Y)
  259. INT X, Y;
  260.   INT M;
  261.  
  262.   ...ETC.
  263.  
  264.   RETURN(M);
  265. ...IN THIS CASE GETVAL() IS THE 
  266. ├┴╠╠╔╬╟ FUNCTION AND AVERAGE() IS THE 
  267. ├┴╠╠┼─ FUNCTION.
  268.  
  269. ╫E MENTIONED IN AN EARLIER LESSON 
  270. THAT A FUNCTION CALL, IN WHICH YOU 
  271. PASS CERTAIN PARAMETERS ( LIKE 
  272. AVERAGE(A,B) ), GIVES TO THE CALLED 
  273. FUNCTION COPIES OF THE PARAMETERS. 
  274. ╥EMEMBER THAT THESE ARE ONLY COPIES 
  275. WHICH ARE PASSED TO THE CALLED 
  276. FUNCTION. ╘HESE COPIES ARE KNOWN AS 
  277. ╘┼═╨╧╥┴╥┘ ╓┴╥╔┴┬╠┼╙. ╘HE CALLED 
  278. FUNCTION MAY CHANGE, OR WORK WITH, 
  279. ITS TEMPORARY VARIABLES BUT THE 
  280. "ORIGINALS" OF THE CALLING FUNCTION 
  281. WON'T BE CHANGED. ╒NLESS YOU EXERCISE 
  282. CERTAIN SPECIFIC OPTIONS IN WRITING 
  283. YOUR PROGRAM THE VALUES CREATED BY A 
  284. CALLED FUNCTION SIMPLY DISAPPEAR WHEN 
  285. THE CALLED FUNCTION IS FINISHED 
  286. EXECUTING. ╘HIS IS ├┴╠╠ ┬┘ ╓┴╠╒┼. 
  287.  
  288. ╧N FIRST SIGHT, CALL BY VALUE MAY 
  289. SEEM LIKE AN INCONVENIENCE AND AN 
  290. OBSTACLE. ╚OWEVER, YOU SHOULD 
  291. CONSIDER THAT CALL BY VALUE ( A MAJOR 
  292. FEATURE OF THE ├ LANGUAGE ) PREVENTS 
  293. FUNCTIONS FROM CHANGING VARIABLE 
  294. VALUES UNLESS YOU ╙╨┼├╔╞╔├┴╠╠┘ ─┼├╔─┼ 
  295. THAT YOU WANT TO HAVE THOSE VALUES 
  296. CHANGED. ╚OW DO YOU GET A CALLED 
  297. FUNCTION TO CHANGE VARIABLE VALUES IN 
  298. THE CALLING FUNCTION?
  299.  
  300. ╘O HAVE A FUNCTION CHANGE THE 
  301. "ORIGINALS" YOU MUST TELL THE 
  302. FUNCTION WHERE, IN MEMORY, THE 
  303. "ORIGINALS" LIVE. ╘O DO THIS YOU MAY 
  304. PASS THE ADDRESSES OF THE PARAMETERS 
  305. TO THE CALLED FUNCTION. ╘HIS MEANS 
  306. THAT YOU PASS ╨╧╔╬╘┼╥╙ TO THE CALLED 
  307. FUNCTION. ╘HIS IS ├┴╠╠ ┬┘ ╥┼╞┼╥┼╬├┼. 
  308. ╘HE CALLING FUNCTION MUST TELL THE 
  309. CALLED FUNCTION WHERE IN MEMORY ITS 
  310. "ORIGINAL" VARIABLES LIVE. ╘O DO THIS 
  311. THE CALLING FUNCTION PASSES THE 
  312. CALLED FUNCTION A POINTER TO THE 
  313. PARAMETER THAT IT IS PASSING. 
  314. ╥EMEMBER THAT A POINTER IS A VARIABLE 
  315. THAT CONTAINS THE ADDRESS OF ANOTHER 
  316. VARIABLE. ╫HEN A CALLED FUNCTION IS 
  317. GIVEN THE ADDRESS OF A VARIABLE IT IS 
  318. ABLE TO ╥┼╞┼╥ TO THAT VARIABLE BY 
  319. MEANS OF THE POINTER WHICH THE 
  320. CALLING FUNCTION HAS PASSED TO IT. 
  321. ╘HIS IS THE MEANING OF ├┴╠╠ ┬┘ 
  322. ╥┼╞┼╥┼╬├┼. 
  323.  
  324.  
  325.  
  326.  
  327. ╔╬─╔╥┼├╘╔╧╬ -
  328.  
  329. ╦NOWING WHERE THE "ORIGINAL" 
  330. PARAMETERS ARE, IN MEMORY, A FUNCTION 
  331. MAY NOW MODIFY THEM. ╙UPPOSE YOU WANT 
  332. TO EXCHANGE() THE VALUES OF TWO 
  333. FLOATING POINT NUMBERS, SAY X AND Y, 
  334. BY CALLING UPON A FUNCTION 
  335. EXCHANGE(): 
  336.  
  337. EXCHANGE(&X,&Y);  
  338. /* CALL THE FUNCTION, AND
  339. GIVE IT ADDRESSES OF X,Y*/
  340.  
  341. ╘HE EXCHANGE FUNTION MAY LOOK LIKE:
  342.  
  343. 1  EXCHANGE(U,V)
  344. /* FUNCTION EXCHANGES TWO "FLOATS" */
  345.  
  346. 2  FLOAT *U, *V;
  347. /* DECLARE U AND V AS POINTERS 
  348.    TO "FLOATS".*/
  349.    █
  350. 3   /* THE OPENING BRACKET FOR 
  351.      EXCHANGE() */
  352.  
  353. 4    FLOAT TEMP;  
  354. /* DECLARE A TEMPORARY FLOAT */
  355.  
  356. 5    TEMP=*U; 
  357. /* MAKE IT EQUAL TO 
  358.    "WHAT U POINTS TO" */
  359.  
  360. 6    *U=*V;   
  361. /* PLACE THE CONTENTS OF V INTO U */
  362.  
  363. 7    *V=TEMP; 
  364. /* PLACE THE "TEMP"ORARY FLOAT 
  365.    INTO V */
  366.  
  367. 8  ▌ /* FLOATS HAVE BEEN EXCHANGED */
  368.  
  369. ╙OMETHING ╓┼╥┘ ╔═╨╧╥╘┴╬╘ IS HAPPENING 
  370. ABOVE IN LINES 5, 6, & 7. ╫HEN A 
  371. CALLED FUNCTION WANTS TO USE POINTERS 
  372. PASSED FROM A CALLING FUNCTION TO 
  373. ALTER THE "ORIGINALS" IN THE CALLING 
  374. FUNCTION IT MUST USE A PROCESS KNOWN 
  375. AS ╔╬─╔╥┼├╘╔╧╬. 
  376. ╫HENEVER YOU ACCESS THE 
  377. CONTENTS OF A VARIABLE BY WAY OF A 
  378. POINTER TO THAT VARIABLE YOU ARE 
  379. USING THE PROCESS CALLED INDIRECTION. 
  380. ╘O SPECIFY THAT YOU WANT THE POINTER 
  381. TO ACCESS WHAT IT IS POINTING TO YOU 
  382. MUST USE THE ASTERISK (*) OPERATOR IN 
  383. THE APPROPRIATE STATEMENTS IN YOUR 
  384. FUNCTION. ╘HIS IS ─╔╞╞┼╥┼╬╘ FROM 
  385. USING THE ASTERISK (*) TO DECLARE A 
  386. POINTER VARIABLE AND THE ASTERISK (*) 
  387. HAS A DIFFERENT MEANING IN THIS CASE. 
  388. ╔N LINES 5, 6, & 7 ABOVE WE HAVE USED 
  389. INDIRECTION TO ACCESS WHAT THE 
  390. POINTER VARIABLES ( U AND V ) POINT 
  391. TO. ╫HAT THIS MEANS IS THAT IF YOU 
  392. DECLARE A POINTER VARIABLE AND ASSIGN 
  393. IT TO POINT TO A VARIABLE OF THE SAME 
  394. TYPE THEN, WHEN YOU USE INDIRECTION, 
  395. BOTH THE POINTER AND THE VARIABLE 
  396. REPRESENT EXACTLY THE SAME THING. 
  397. ╠OOK AT THE FOLLOWING:
  398.  
  399. REPF()
  400.   INT NUMBER, *PTR_NUM, X;
  401.  
  402.   PTR_NUM = &NUMBER;
  403.  
  404. ...HAVING DONE THIS MUCH, WE CAN SEE 
  405. THAT THE POINTER VARIABLE 'PTR_NUM' 
  406. NOW POINTS TO THE VARIABLE 'NUMBER'. 
  407. ╔N MOST CASES, IF WE WANTED VARIABLE 
  408. 'X' TO EQUAL 'NUMBER' WE WOULD SAY:
  409.  
  410. X = NUMBER;
  411.  
  412. ...BUT NOW WE CAN USE INDIRECTION 
  413. ( REMEMBER THE ASTERISK MEANS 
  414. SOMETHING ELSE NOW ) AND WE CAN SAY:
  415.  
  416. X = *PTR_NUM;
  417.  
  418. ┬ECAUSE 'PTR_NUM' WAS DECLARED AS A 
  419. POINTER-TO-INT IT CAN BE ASSIGNED TO 
  420. POINT TO THE INTEGER 'NUMBER' AND 
  421. FROM THEN ON WE CAN USE INDIRECTION 
  422. TO USE 'PTR_NUM' ANYWHERE THAT WE 
  423. WOULD USE 'NUMBER'. ╔F THE ASTERISK 
  424. HAD BEEN LEFT OUT IN THE ABOVE 
  425. STATEMENT AND WE HAD SAID:
  426.  
  427. X = PTR_NUM;
  428.  
  429. ...THEN 'X' WOULD HAVE BEEN EQUAL TO 
  430. THE ADDRESS OF 'NUMBER' AND ╬╧╘ TO 
  431. THE VALUE OF 'NUMBER'. ╔T WOULD HAVE 
  432. BEEN A STRAIGHT ASSIGNMENT STATEMENT 
  433. WITHOUT INDIRECTION.
  434.  
  435. ╘HE USE OF ╨╧╔╬╘┼╥╙ AND ╔╬─╔╥┼├╘╔╧╬ 
  436. CAN BE A DIFFICULT TOPIC FOR THE 
  437. NEWCOMER TO THE ├ LANGUAGE BUT IF YOU 
  438. STUDY IT A BIT AND PRACTICE BY 
  439. WRITING AND COMPILING SIMPLE EXAMPLES 
  440. OF YOUR OWN YOU WILL GET THE HANG OF 
  441. IT AND SOON DISCOVER HOW VALUABLE 
  442. THEY ARE TO ALL OF YOUR PROGRAMMING. 
  443.  
  444. ╚ERE IS A COMPLETE PROGRAM WITH WHICH 
  445. TO TRY OUT ├┴╠╠ ┬┘ ╥┼╞┼╥┼╬├┼ AND 
  446. ╔╬─╔╥┼├╘╔╧╬:
  447.  
  448. MAIN()
  449.   FLOAT X=1.23, Y=4.56; 
  450. /* DECLARE AND DEFINE TWO FLOATS */
  451.   PRINTF("\NX=%F, Y=%F",X,Y);   
  452. /* PRINTF THEIR VALUES */
  453.   EXCHANGE(&X,&Y);  
  454. /* CALL THE EXCHANGE PROGRAM */
  455.   PRINTF("\NX=%F, Y=%F",X,Y);   
  456. /* PRINTF THEIR VALUES AGAIN!*/
  457. ▌ /* THAT'S THE END OF MAIN() */
  458.  
  459. EXCHANGE(U,V)
  460. /* THIS FUNCTION EXCHANGES TWO 
  461.    "FLOATS" */
  462. FLOAT *U, *V;
  463. /* DECLARE U AND V AS POINTERS TO 
  464.    "FLOATS" */
  465. █ /* THE OPENING BRACKET FOR 
  466.      EXCHANGE() */
  467.   FLOAT TEMP;  
  468. /* DECLARE A TEMPORARY FLOAT */
  469.   TEMP=*U; 
  470. /* MAKE TEMP EQUAL TO 
  471.    "WHAT U POINTS TO" USING
  472.    INDIRECTION */
  473.   *U=*V;   
  474. /* PLACE THE CONTENTS OF V INTO U 
  475.    USING INDIRECTION */
  476.   *V=TEMP; 
  477. /* PLACE "TEMP" INTO V USING
  478.    INDIRECTION */
  479. /* FLOATS HAVE BEEN EXCHANGED AND 
  480.    EXECUTION RETURNS TO THE CALLING 
  481.    FUNCTION MAIN() */
  482.  
  483. ╬OW EXIT THE TEXT EDITOR, SAVING THE 
  484. ABOVE WITH THE NAME SAM.C, THEN 
  485. COMPILE USING CC SAM, THEN LINK USING 
  486. LINK SAM, THEN EXECUTE VIA: 
  487.  
  488. SAM 
  489.  
  490. AND GET:
  491.  
  492. X=1.230000, Y=4.560000
  493. X=4.560000, Y=1.230000
  494.  
  495.  
  496. ╚ERE'S ANOTHER VARIATION OF 
  497. EXCHANGE(), LOOK FOR DIFFERENCES FROM 
  498. THE FIRST VERSION: 
  499.  
  500. 1 EXCHANGE(U,V)
  501. /* THIS FUNCTION EXCHANGES TWO 
  502.    "FLOATS" */
  503. 2 FLOAT *U, *V;
  504. /* DECLARE U AND V AS POINTERS TO 
  505.    "FLOATS" */
  506. 3█  /* OPENING BRACKET FOR 
  507.       EXCHANGE() */
  508. 4   FLOAT *TEMP; 
  509. /* DECLARE A TEMPORARY POINTER */
  510. 5   TEMP=U;  
  511. /* MAKE IT EQUAL TO POINTER "U" */
  512. 6   U=V; 
  513. /* MAKE "U" POINT TO WHAT "V" POINTS 
  514.    TO */
  515. 7   V=TEMP;  
  516. /* MAKE "V" POINT TO WHAT "TEMP" 
  517.    POINTS TO */
  518. 9▌  /* FLOATS HAVE NOT BEEN 
  519.        EXCHANGED? */
  520.  
  521. ╫HY WON'T THE ABOVE FUNCTION WORK?
  522.  
  523. ╔N THIS VARIATION, THE POINTERS U AND 
  524. V ARE COPIES AND ALTHOUGH THIS 
  525. FUNCTION DOES CHANGE THESE COPIES OF 
  526. THE POINTERS THESE VALUES DISAPPEAR 
  527. WHEN EXCHANGE() IS FINISHED 
  528. EXECUTING. ╬O REFERENCE WAS MADE TO 
  529. THE "ORIGINALS" HELD IN MAIN(). ╫E 
  530. FORGOT TO USE INDIRECTION AND SO THE 
  531. FLOATS NEVER DO GET EXCHANGED! 
  532. ┬┼╫┴╥┼! 
  533.  
  534. ╔F YOU'RE STILL HAVING TROUBLE WITH
  535. THE DIFFERENCE BETWEEN A VARIABLE AND
  536. ITS ADDRESS TRY THINKING OF THE ╨╧╦┼
  537. STATEMENT USED IN ┬┴╙╔├. ╘O CHANGE A
  538. VALUE IN MEMORY YOU SUPPLY BOTH THE
  539. ADDRESS AND THE NEW VALUE WHICH IT IS
  540. TO CONTAIN. ╞OR EXAMPLE: ╨╧╦┼ 51764,77
  541. ╘HIS ┬┴╙╔├ STATEMENT STORES THE VALUE
  542. 77 AT THE ADDRESS 51764. ╔N THE ├
  543. LANGUAGE YOU CAN DO THE SAME THING 
  544. WITH A POINTER AND YOU DON'T HAVE TO
  545. KNOW WHAT THE EXACT ADDRESS IS. ╠OOK
  546. AT THE FOLLOWING EXAMPLE:
  547.  
  548. 1 MAIN()
  549. 2 █
  550. 3  INT I, *PI; /* WE DECLARE BOTH AN
  551.                   INT AND A POINTER
  552.                   TO AN INT */
  553. 4  I = 0;
  554. 5  PI = I;
  555. 6  *PI = 77;
  556. 7 ▌
  557.  
  558. ╔N LINE 4 WE SET THE VARIABLE I EQUAL
  559. TO 0. ╘HIS MEANS THAT WHEREVER IN
  560. MEMORY I IS LOCATED A VALUE OF 0 IS
  561. STORED. ╔N LINE 5 WE SET THE POINTER
  562. PI TO POINT TO I. ╫HAT THIS MEANS IS
  563. THAT THE ADDRESS, OR PLACE IN MEMORY,
  564. WHERE PI IS STORED CONTAINS THE VALUE
  565. OF THE ADDRESS, OR PLACE OF STORAGE, 
  566. OF I. ╘HIS IS HOW PI 'POINTS' TO I.
  567. ╨╧╔╬╘┼╥╙ ┴╥┼ ╓┴╥╔┴┬╠┼╙ ╫╚╔├╚ ├╧╬╘┴╔╬
  568. ╘╚┼ ┴──╥┼╙╙┼╙ ╧╞ ╧╘╚┼╥ ╓┴╥╔┴┬╠┼╙.
  569. ╔N LINE 6 WE USE INDIRECTION WHICH
  570. ALLOWS THE POINTER PI TO BE USED JUST
  571. AS IF IT ACTUALLY WERE THE INT I AND
  572. SO STORE THE VALUE 77 AT THE MEMORY
  573. LOCATION OF I. ╔N EFFECT WE HAVE USED
  574. THE POINTER PI, AND THE PROCESS OF
  575. INDIRECTION, TO 'POKE' 77 INTO WHERE
  576. I IS LOCATED IN MEMORY.
  577.  
  578.  
  579.  
  580. ╨ASSING ╞╒╬├╘╔╧╬╙ TO ╞╒╬├╘╔╧╬╙ -
  581.  
  582. ╔N AN EARLIER LESSON WE COMPUTED THE 
  583. ROOTS OF SOME EQUATION X=F(X), WITH 
  584. F(X)=2*SIN(X). 
  585.  
  586. 1 DOUBLE X=1.0, Y, E;   
  587.   /* DECLARE DOUBLE PRECISION */ 
  588. 2 DO █
  589.   /* START OF THE DO-WHILE LOOP*/ 
  590. 3 Y=2.0*SIN(X); 
  591.   /* CALCULATE Y */ 
  592. 4 E=FABS(Y-X);  
  593.   /* CALCULATE ERROR */ 
  594. 5 X=Y;  
  595.   /* CHANGE X TO Y   */ 
  596. 6 ▌ WHILE (E>.0000005);   
  597.   /* END CONDITION */ 
  598. 7 PRINTF("X-2SIN(X)=%F WHEN X=%F",E,X);   
  599.  
  600. ╬OTE THAT IN THE ABOVE SIN() AND 
  601. FABS() ARE ├ LIBRARY STANDARD 
  602. FUNCTIONS WHICH YOU DO NOT HAVE TO 
  603. WRITE. ╘HEY WILL BE PUT INTO YOUR 
  604. PROGRAM AT THE LINK STAGE OF 
  605. COMPILATION. SIN() RETURNS THE 
  606. TRIGONOMETRIC SINE OF A NUMBER AND 
  607. FABS() RETURNS THE ABSOLUTE VALUE OF 
  608. A FLOATING POINT NUMBER. ╔F YOU 
  609. AREN'T FAMILIAR WITH THE MATHEMATICS 
  610. HERE DON'T BE TOO CONCERNED AS IT 
  611. ISN'T CRUCIAL TO UNDERSTANDING THE 
  612. EXAMPLE. ╔N LINE 3 'X' IS PASSED TO 
  613. SIN() AND Y IS ASSIGNED TO TWICE THE 
  614. VALUE RETURNED FROM SIN(). ╔N LINE 4 
  615. WE PASS THE DIFFERENCE BETWEEN 'X' 
  616. AND 'Y' TO FABS() AND ASSIGN THE 
  617. RETURN VALUE TO 'E'. ╔N LINE 5 'X' IS 
  618. ASSIGNED THE VALUE OF 'Y'. ╠INE 6 
  619. CHECKS TO SEE IF 'E' IS GREATER THAN 
  620. .0000005 AND IF IT IS THE DO-WHILE 
  621. LOOP IS RE-EXECUTED UNTIL 'E' BECOMES 
  622. LESS-THAN-OR-EQUAL-TO .0000005. ╔N 
  623. GENERAL, THE FUNCTION GETS AN 
  624. APPROXIMATE ROOT OF 'X' AND THE DO-
  625. WHILE LOOP KEEPS EXECUTING UNTIL THE 
  626. ROOT THAT IS FOUND IS WITHIN THE 
  627. SPECIFIED ERROR FACTOR (.0000005) OF 
  628. BEING THE EXACT ROOT OF 'X'.
  629.  
  630. ╬OW SUPPOSE WE TURN THIS PIECE OF 
  631. CODE INTO A FUNCTION, SOLVE() WHICH 
  632. WE CALL VIA: 
  633.  
  634. ROOT = SOLVE(F,X,E);
  635.  
  636. WHERE WE PASS TO SOLVE() THE FUNCTION 
  637. F(X), AND SOME INITIAL GUESS OF THE 
  638. ROOT, NAMELY X, AND AN ERROR 
  639. SPECIFICATION E. ╫E EXPECT 
  640. SOLVE(F,X,E) TO RETURN A ROOT (WHICH, 
  641. NATURALLY, WE CALL ROOT!). 
  642.  
  643. ╫E MAY WRITE SOLVE() LIKE SO:
  644.  
  645. 1 FLOAT SOLVE(FCN,X,ERROR)  
  646.   /* RETURNS A ╞╠╧┴╘!*/ 
  647. 2 FLOAT (*FCN)();
  648.   /* SOMETHING ╬┼╫ */ 
  649. 3 FLOAT X, ERROR;   
  650.   /* X-VALUE & ERROR ARE FLOATS */ 
  651. 4 █
  652. 5 FLOAT Y, E;   
  653.   /* DECLARES 2 FLOATS */ 
  654. 6 DO    /* START OF THE DO-LOOP */ 
  655. 7 Y=(*FCN)(X);  
  656.   /* CALCULATES Y */ 
  657. 8 E=FABS(Y-X);  
  658.   /* CALCULATE ABSOLUTE VALUE OF Y-X */ 
  659. 9 X=Y;  
  660.   /* CHANGE X TO Y */ 
  661. 10  WHILE (E>ERROR);  
  662.    /* CHECK ERROR IF E IS TOO LARGE */ 
  663. 11 RETURN(X);
  664.    /* RETURN X=ROOT IF E<=ERROR */ 
  665. 12 ▌
  666.  
  667. ╠INE 1 DECLARES THE FUNCTION SOLVE() 
  668. TO BE OF THE TYPE 'FLOAT'. ╘HIS KIND 
  669. OF DECLARATION IS NECESSARY IF A 
  670. CALLED FUNCTION IS GOING TO RETURN A 
  671. VALUE TO ITS CALLING FUNCTION. 
  672. ╙TRICTLY SPEAKING YOU DON'T HAVE TO 
  673. DECLARE A FUNCTION OF THE TYPE 'INT' 
  674. IF IT IS RETURNING AN INTEGER BECAUSE 
  675. THE COMPILER WILL ┴╠╫┴┘╙ ASSUME THAT 
  676. ┴╠╠ FUNCTIONS ARE OF ╘┘╨┼ ╔╬╘ UNLESS 
  677. YOU TELL IT OTHERWISE BUT IT IS GOOD 
  678. PROGRAMMING PRACTICE TO MAKE A TYPE 
  679. DECLARATION FOR ANY FUNCTION WHICH IS 
  680. EXPECTED TO RETURN A VALUE TO ANOTHER 
  681. FUNCTION. 
  682.  
  683. ╠INE 2 HAS THE CURIOUS DECLARATION OF 
  684. FCN() AS A FUNCTION POINTER. ╘HE  
  685. (*FCN)  SAYS IT'S A POINTER, AND THE 
  686. () SAYS IT POINTS TO A FUNCTION AND 
  687. THE FLOAT SAYS THIS FCN RETURNS A 
  688. FLOAT! ╬OTE TOO, IN LINE 7, THAT 
  689. WHEREAS FCN IS A POINTER, *FCN ╔╙ THE 
  690. FUNCTION BECAUSE IN LINE 7 WE ARE 
  691. USING INDIRECTION! ( THE PARENTHESES 
  692. ARE NECESSARY TO ENSURE THE PROPER 
  693. ORDER OF OPERATIONS ). ╥EMEMBER, 
  694. THROUGH INDIRECTION A POINTER IS MADE 
  695. TO BE WHAT IT POINTS TO. 
  696.  
  697.  
  698. MAIN()
  699.  FLOAT F1(), F2(), F3(), SOLVE();
  700. /* DECLARE FUNCTIONS USED */
  701.  
  702.  PRINTF("\N┴ ROOT OF X=F1(X) IS %F", 
  703. /* PRINTF THE ROOT ...*/
  704.  
  705.  SOLVE(F1,1,.00005));
  706. /* SOLVE X=F1(X) */
  707.  
  708.  PRINTF("\N┴ ROOT OF X=F2(X) IS %F", 
  709. /* PRINTF THE ROOT ...*/
  710.  
  711.  SOLVE(F2,-1,.00005));   
  712. /* SOLVE X=F2(X) */
  713.  
  714.  PRINTF("\N┴ ROOT OF X=F3(X) IS %F", 
  715. /* PRINTF THE ROOT ...*/
  716.  
  717.  SOLVE(F3,2,.00005));
  718. /* SOLVE X=F3(X) */
  719.  
  720. ▌ /* END OF MAIN() */
  721.  
  722. FLOAT SOLVE(FCN,X,ERROR)  
  723.   /* RETURNS A ╞╠╧┴╘!*/ 
  724. FLOAT (*FCN)();
  725.   /* SOMETHING ╬┼╫ */ 
  726. FLOAT X, ERROR;   
  727.   /* X-VALUE & ERROR ARE FLOATS */ 
  728.   FLOAT Y, E;   
  729.   /* DECLARES 2 FLOATS */ 
  730.   DO    /* START OF THE DO-LOOP */ 
  731.     Y=(*FCN)(X);  
  732.   /* CALCULATES Y */ 
  733.     E=FABS(Y-X);  
  734.   /* CALCULATE ABSOLUTE VALUE OF Y-X */ 
  735.     X=Y;  
  736.   /* CHANGE X TO Y */ 
  737.    WHILE (E>ERROR);  
  738.    /* CHECK ERROR IF E IS TOO LARGE */ 
  739.   RETURN(X);
  740.    /* RETURN X=ROOT IF E<=ERROR */ 
  741.  
  742. FLOAT F1(X)  
  743. FLOAT X; 
  744.   RETURN(2.*SIN(X)); 
  745. /* F1(X) = 2 SIN(X)   */
  746.  
  747. FLOAT F2(X)  
  748. FLOAT X; 
  749. RETURN(2.-X/2.); 
  750. /* F2(X) = 2-X/2  */
  751.  
  752. FLOAT F3(X)  
  753. FLOAT X; 
  754. RETURN(1.+1./X); 
  755. /* F3(X) = 1+1/X  */
  756.  
  757. ╔T IS NOT NECESSARY THAT YOU 
  758. UNDERSTAND EXACTLY WHAT IS 
  759. MATHEMATICALLY OCCURRING IN THE ABOVE 
  760. PROGRAM. ┘OU SHOULD CONCENTRATE ON 
  761. STUDYING HOW POINTERS TO FUNCTIONS 
  762. CAN BE PASSED JUST LIKE POINTERS TO 
  763. VARIABLES AND HOW THESE FUNCTIONS MAY 
  764. THEN BE ACCESSED USING INDIRECTION.
  765.  
  766.  
  767. ╚ERE ARE SOME COMMENTS ON PARTS OF 
  768. THE ABOVE PROGRAM:
  769.  
  770. FLOAT F1(), F2(), F3(), SOLVE();
  771. /* DECLARE TYPES OF FUNCTIONS USED */
  772.  
  773. ╚ERE WE DECLARE ALL THE FUNCTIONS WE 
  774. USE ( THEY ALL RETURN A FLOAT). 
  775.  
  776. PRINTF("\N┴ ROOT OF X=F1(X) IS %F", 
  777. /* PRINTF THE ROOT...*/
  778. SOLVE(F1,1,.00005));
  779. /* SOLVE X=F1(X) */
  780.  
  781. ╚ERE WE PRINT (AFTER A NEWLINE) ┴ 
  782. ROOT OF X=F1(X) IS FOLLOWED BY THE 
  783. %FLOAT RETURNED BY 
  784. SOLVE(F1,1,.00005).
  785. ╬OTE THAT WE PASS THE POINTER  F1, 
  786. A STARTING VALUE 1 AND AN ERROR 
  787. SPECIFICATION OF .00005  
  788. ...THEN WE CONTINUE WITH TWO MORE 
  789. FUNCTIONS F2(X) AND F3(X), EACH TIME   
  790. SPECIFYING NOT ONLY THE POINTER TO 
  791. THE FUNCTION BUT ALSO A STARTING 
  792. VALUE AND ERROR SPECIFICATION. 
  793.  
  794. ╔F YOU TRY COMPILING AND RUNNING THE 
  795. ABOVE PROGRAM YOU WILL GET OUTPUT 
  796. SOMETHING LIKE THE FOLLOWING, THOUGH 
  797. LIMITATIONS OF COMPUTER ARCHITECTURE 
  798. MAY GENERATE DIFFERENT RESULTS:
  799.  
  800. ┴ ROOT OF X=F1(X) IS 1.895475 
  801. ┴ ROOT OF X=F2(X) IS 1.333324 
  802. ┴ ROOT OF X=F3(X) IS 1.618026 
  803.  
  804. AND (BECAUSE WE USE ONLY FLOAT AND 
  805. NOT DOUBLE, AND WE GAVE AN ERROR 
  806. SPECIFICATION OF .00005) WE GET 
  807. (ROUGHLY) 4 DECIMAL PLACE ACCURACY. 
  808.  
  809. ╫ELL, THE PROGRAMMING AIN'T TOO SEXY 
  810. ( HOW USEFUL ARE THESE 3 BUILT-IN 
  811. FUNCTIONS, F1(X), F2(X) AND F3(X) ? ) 
  812. AND THE MATHEMATICS IS EVEN WORSE 
  813. (YOU CAN'T GUARANTEE THAT THE PROGRAM 
  814. WON'T GET STUCK IN THE SOLVE() 
  815. FUNCTION ... FOREVER TRYING TO REDUCE 
  816. A GROWING ERROR!), ┬╒╘ ...WE GET THE 
  817. IDEA ...RIGHT? 
  818.  
  819.   
  820. ╥┼═┼═┬┼╥: ╘O PASS THE FUNCTION 
  821. SAM(A,B,C) AS AN ARGUMENT TO ANOTHER 
  822. FUNCTION YOU WOULD USE:
  823.  
  824. GEORGE(SAM,X,Y);
  825.  
  826. ...THEN WITHIN THE BODY OF THE 
  827. FUNCTION GEORGE() YOU WOULD MAKE 
  828. THE DECLARATION:
  829.  
  830. FLOAT (*SAM)();
  831.  
  832. AND USE IT WITHIN THE FUNCTION
  833. GEORGE() AS: 
  834.  
  835. (*SAM)(A,B,C); 
  836.  
  837. ╔F SAM() RETURNS AN INT OR CHAR THEN 
  838. (OF COURSE) IT SHOULD BE DECLARED AS 
  839. INT (*SAM)() OR CHAR (*SAM)()! 
  840.  
  841.  
  842.  
  843. [┼ND OF PART 9 OF 11]
  844.