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

  1.  
  2. ├ ╠ANGUAGE ╘UTORIAL
  3. -------------------
  4. ╠ESSON 3 OF 11
  5.  
  6.  
  7. ╬OTE: SUBSTITUTIONS FOR SPECIAL C
  8. LANGUAGE CHARACTERS:
  9.  
  10. LEFT CURLY BRACKET:   █
  11. RIGHT CURLY BRACKET:  ▌
  12. BACKSLASH:            \
  13. TILDE:                »
  14. VERTICAL BAR:         ▀
  15. UNDERSCORE:           ñ
  16.  
  17.  
  18.  
  19. ╞UNCTIONS() -
  20.  
  21. ╫HEN WE BEGIN OUR C PROGRAM WITH 
  22. MAIN() WE ARE DEFINING A FUNCTION. 
  23. ┼XECUTION OF OUR C PROGRAM WILL BEGIN 
  24. AT THE STATEMENTS WHICH MAKE UP THIS 
  25. FUNCTION (AND IT IS THIS PROPERTY 
  26. WHICH MAKES THE NAME MAIN SPECIAL).  
  27.  
  28. MAIN() 
  29. FLOAT X,Y,A;
  30. PRINTF("\N ENTER TWO NUMBERS 
  31.        (SEPARATED BY A SPACE) : ");
  32. SCANF("%F%F",X,Y);
  33. A=AVERAGE(X,Y);
  34. PRINTF("\N THE AVERAGE OF %F AND %F
  35.        IS %F",X,Y,A);
  36.  
  37. ╚ERE WE DEFINE THREE FLOAT VARIABLES 
  38. CALLED X, Y AND A.THEN WE PRINTF 
  39. INSTRUCTIONS ASKING FOR INPUT (NOTE: 
  40. IT IS SCANF() WHICH ACTUALLY WAITS 
  41. FOR AND GETS THE INPUT).  ╘HE USER 
  42. MUST ENTER A SPACE TO SEPARATE THE 
  43. TWO NUMBERS.  (PRESSING THE TAB KEY 
  44. BETWEEN NUMBERS WILL ALSO 'SEPARATE' 
  45. THEM). ╬OTICE THAT PRINTF() IS A 
  46. FUNCTION, JUST LIKE MAIN(). ╫HEN WE 
  47. INVOKE THIS FUNCTION WE PASS TO IT A 
  48. FORMAT STRING (BETWEEN QUOTES) AND 
  49. (SOMETIMES BUT NOT IN THIS CASE) A 
  50. LIST OF VARIABLES TO BE PRINTED. ╔N 
  51. THIS EXAMPLE THERE IS ONLY THE FORMAT 
  52. STRING (WHICH PRINTS A NEWLINE 
  53. FIRST): 
  54.  
  55. "\N ENTER TWO NUMBERS (SEPARATED BY
  56.        A SPACE) : "
  57.  
  58. ╬OW WE USE THE FUNCTION SCANF() TO 
  59. INPUT THE TWO NUMBERS X AND Y. ╬OTE 
  60. THAT SCANF() ALSO REQUIRES A FORMAT  
  61. STRING (NAMELY "%F%F") AND A VARIABLE 
  62. LIST X,Y.  
  63.  
  64. FLOAT X,Y,A;
  65. PRINTF("\N ENTER TWO NUMBERS 
  66.        (SEPARATED BY A SPACE) : ");
  67. SCANF("%F%F",X,Y);
  68.    
  69. ├AN YOU PICK OUT THE ERROR IN THIS 
  70. STATEMENT?  
  71.  
  72. ╘HE FUNCTION SCANF() REQUIRES THAT WE 
  73. PASS TO IT THE  ADDRESSES OF X AND Y 
  74. BY USING &X AND &Y...REMEMBER?   
  75.  
  76. ╘HEREFORE:
  77.  
  78. SCANF("%F%F",X,Y);
  79.  
  80. ╙HOULD BE:
  81. SCANF("%F%F",&X,&Y);
  82.  
  83. ╥EMEMBER!!
  84.  
  85. ╚ERE WE SEE ANOTHER FUNCTION CALLED 
  86. AVERAGE(). WE PASS TO THIS FUNCTION 
  87. THE VALUES OF TWO VARIABLES, X AND Y.  
  88.  
  89. SCANF("%F%F",&X,&Y);
  90. A=AVERAGE(X,Y);
  91.  
  92. ╘HE C LANGUAGE RECOGNIZES A FUNCTION 
  93. BY THE FACT THAT IT IS GIVEN A NAME 
  94. (LIKE MAIN, SCANF, PRINTF OR AVERAGE) 
  95. FOLLOWED IMMEDIATELY BY PARENTHESES 
  96. (....). WITHIN THE ( AND THE ) IS 
  97. INFORMATION WHICH IS PASSED TO THE 
  98. FUNCTION.  ╒NLIKE SCANF() AND 
  99. PRINTF() (WHICH ARE INCLUDED IN THE C 
  100. LIBRARY OF FUNCTIONS AND ARE 
  101. AVAILABLE FOR OUR USE), THE FUNCTION 
  102. WHICH WE ARE CALLING AVERAGE() IS ONE 
  103. WHICH WE MUST WRITE OURSELVES.  
  104.  
  105. MAIN()
  106. FLOAT X,Y,A;
  107. PRINTF("\N ENTER TWO NUMBERS 
  108.        (SEPARATED BY A SPACE) : ");
  109. SCANF("%F%F",&X,&Y);
  110. /* NOTE: WE'VE CHANGED TO &X,&Y */
  111. A=AVERAGE(X,Y);
  112. PRINTF("\N THE AVERAGE OF %F AND %F
  113.        IS %F",X,Y,A);
  114.  
  115. ╘HE FUNCTIONS SCANF() AND PRINTF() 
  116. PERFORM THEIR TASK AND RETURN 
  117. NOTHING, BUT OUR FUNCTION AVERAGE() 
  118. IS EXPECTED TO RETURN THE AVERAGE OF 
  119. THE TWO VARIABLE VALUES WE PASSED TO 
  120. IT.  
  121.  
  122. ╔N OUR PROGRAM ABOVE WE ASSIGN THIS 
  123. 'RETURNED AVERAGE' TO THE FLOAT 
  124. VARIABLE WE ARE CALLING 'A'....AND 
  125. PASS TO PRINTF() A FORMAT STRING,
  126. "\NTHE AVERAGE OF %F AND %F IS %F", 
  127. INDICATING THAT WE WANT CERTAIN TEXT 
  128. PRINTED (AFTER A NEWLINE) AS WELL AS 
  129. 3 %FLOAT NUMBERS.  
  130.  
  131. ╘HE VARIABLE LIST WHICH WE PASS TO 
  132. PRINTF() (NAMELY X,Y,A) TELLS 
  133. PRINTF() WHICH 3 %FLOAT VALUES ARE TO 
  134. REPLACE THE 3 %F WHICH OCCUR IN THE 
  135. 'FORMAT' INFORMATION.  
  136.  
  137. ╫RITING THE FUNCTION AVERAGE() -
  138.  
  139. ╠IKE THE FUNCTION MAIN(), WE BEGIN 
  140. WITH AVERAGE() AND AN OPENING █. ┬UT, 
  141. UNLIKE MAIN(), THE FUNCTION AVERAGE 
  142. IS TO RECEIVE TWO VARIABLES....SO, 
  143. BEFORE OUR OPENING █, WE WRITE: 
  144.  
  145. AVERAGE(X,Y)
  146. FLOAT X,Y;
  147. █  /* THE OPENING  OCCURS AFTER THE
  148.       DECLARATION FLOAT X,Y */
  149.  
  150.  
  151. ╘HE FIRST STATEMENT IN A FUNCTION  
  152. EVEN BEFORE THE █ MUST BE A 
  153. DECLARATION OF THE ARGUMENT TYPES!  
  154. ╔F THE BRACKETS () FOLLOWING A 
  155. FUNCTION NAME CONTAINS ONE OR MORE 
  156. VARIABLES THEN THAT FUNCTION HAS ONE 
  157. OR MORE ARGUMENTS.  
  158.  
  159. ╠ET'S CONTINUE WRITING OUR AVERAGE() 
  160. FUNCTION: 
  161.  
  162. AVERAGE(X,Y)
  163. FLOAT X,Y;
  164. █  
  165. FLOAT Z;
  166. Z=(X+Y)/2;
  167. RETURN(Z);
  168.  
  169. ╘HE FLOAT Z; (WITHIN THE BODY OF OUR 
  170. FUNCTION) DECLARES THE VARIABLE Z TO 
  171. BE A FLOAT.  
  172.  
  173. FLOAT Z;
  174. Z=(X+Y)/2;
  175.  
  176. ╘HE 'Z=(X+Y)/2' ASSIGNS TO Z THE 
  177. AVERAGE OF X AND Y.  
  178.  
  179. Z=(X+Y)/2;
  180. RETURN(Z);
  181.  
  182. ╘HE 'RETURN(Z);' WILL RETURN THE 
  183. VALUE OF Z (SO IT CAN BE USED IN OUR 
  184. MAIN() PROGRAM.  
  185.  
  186. ╘HE WHOLE THING, INCLUDING MAIN(), IS 
  187. NOW: 
  188.  
  189. MAIN() 
  190. FLOAT X,Y,A;
  191. PRINTF("\N ENTER TWO NUMBERS 
  192.        (SEPARATED BY A SPACE) : ");
  193. SCANF("%F%F",&X,&Y);   
  194. A=AVERAGE(X,Y);
  195. PRINTF("\N THE AVERAGE OF %F AND %F
  196.        IS %F",X,Y,A);
  197. ▌ /* NOTICE THAT MAIN() ENDS HERE */
  198.  
  199. AVERAGE(X,Y)
  200. FLOAT X,Y;
  201. █  
  202. FLOAT Z;
  203. Z=(X+Y)/2;
  204. RETURN(Z);
  205.  
  206. ┴CTUALLY, THIS PROGRAM WON'T (QUITE) 
  207. WORK...BUT LET'S SEE HOW TO GET IT TO 
  208. COMPILE AND RUN.  
  209.  
  210. ╚OW TO COMPILE -
  211.  
  212. ╫E SAVE OUR PROGRAM ON DISK AND LEAVE 
  213. OUR WORD PROCESSOR, GIVING OUR 
  214. PROGRAM A NAME: PROGRAM1.C ( NOTE THE 
  215. NECESSARY '.C' ).  
  216.  
  217. ╘HEN WE WOULD ASK THE C-COMPILER TO 
  218. COMPILE IT, WITH THE COMMAND: 
  219.  
  220. CC PROGRAM1.C
  221.  
  222. ╬OTE: THE COMPILER COMMAND 'CC' MAY 
  223. BE DIFFERENT FOR YOUR OWN COMPILER. 
  224.  
  225. ╔F YOU ARE USING ├ ╨OWER AND YOU ARE
  226. EITHER USING TWO DRIVES, OR, HAVE PUT
  227. THE COMPILER PROGRAM PLUS THE HEADER
  228. FILES AND YOUR SOURCE CODE ALL ON ONE
  229. DISK, THEN YOU CAN USE THE COMMAND:
  230. CC -P PROGRAM1.C
  231. AND YOU WON'T BE PROMPTED TO SWAP
  232. DISKS DURING COMPILATION.
  233.  
  234. ╫ITH THIS COMMAND THE COMPILER LOOKS 
  235. FOR A FILE ON THE DISK WITH THE NAME 
  236. PROGRAM1.C AND GENERATES A FILE 
  237. CALLED PROGRAM1.O ( AN OBJECT FILE).  
  238.  
  239. ┴FTER THE COMPILER HAS DONE ITS THING 
  240. IT'S OUR TURN AGAIN.  
  241.  
  242. ╫E ASK TO LINK THE OBJECT FILE BY 
  243. ISSUING THE COMMAND: 
  244.  
  245. LINK PROGRAM1.O
  246.  
  247. ╔F YOU ARE USING ├ ╨OWER AND YOU 
  248. WISH TO RUN THE PROGRAM OUTSIDE OF
  249. THE SHELL YOUR COMMAND LINE SHOULD
  250. BE: LINK -S PROGRAM1.O
  251.  
  252. ╘HE LINKER WORKS ON THE PROGRAM1.O 
  253. FILE AND GENERATES AN EXECUTABLE 
  254. PROGRAM CALLED:  PROGRAM1.COM 
  255.  
  256. ╞INALLY, WE MAY ISSUE THE COMMAND: 
  257.  
  258. PROGRAM1 
  259.  
  260. TO RUN OUR PROGRAM.  
  261.  
  262. ╬OTE: THE  COMMANDS  NECESSARY  TO  
  263. COMPILE  AND  LINK,  AND THE EVENTUAL 
  264. NAME OF THE EXECUTABLE PROGRAM, MAY 
  265. VARY FROM ONE C-COMPILER TO ANOTHER.  
  266.  
  267. ╘HE REASON FOR THE 2-STEP PROCESS OF 
  268. COMPILE THEN LINK IS THAT WE MAY 
  269. WRITE (FOR EXAMPLE) THE AVERAGE() 
  270. FUNCTION SEPARATELY, AND COMPILE IT 
  271. SEPARATELY (GENERATING AN OBJECT 
  272. FILE, SAY AVERAGE.O, THEN LINK THE 
  273. MAIN() FUNCTION TO THE AVERAGE()
  274. FUNCTION BY ISSUING THE COMMAND: 
  275.  
  276. LINK PROGRAM1 AVERAGE 
  277.  
  278. (WHERE WE HAVE CALLED THE MAIN() 
  279. FUNCTION PROGRAM1.C WHEN WE SAVED IT 
  280. TO DISK BEFORE LEAVING THE WORD 
  281. PROCESSOR/TEXT EDITOR).  
  282.  
  283. ╬OW SUPPOSE WE HAVE (SUCCESSFULLY) 
  284. COMPILED AND LINKED PROGRAM1
  285. (OUR PROGRAM WILL ACTUALLY COMPILE 
  286. WITHOUT ANY ERROR MESSAGES). 
  287.  
  288. ╫E HAVE ON DISK PROGRAM1.COM WHICH WE 
  289. EXECUTE BY ISSUING THE COMMAND: 
  290.  
  291. PROGRAM1  
  292.  
  293. ╘HE PROGRAM WILL PRINT:
  294.  
  295. (FIRST CURSOR WAITS FOR 2 NUMBERS)
  296. ENTER TWO NUMBERS (SEPARATED BY A 
  297. SPACE) :
  298.  
  299. ╫E TYPE:  
  300.  
  301. 21 22  (LEAVING A SPACE BETWEEN).
  302.  
  303. ╘HEN PRESS THE ENTER (OR RETURN) KEY 
  304. AND EXPECT TO GET: 
  305.  
  306. THE AVERAGE OF 21.000000 AND 
  307. 22.000000 IS 21.500000 
  308.  
  309. ╧UR PROGRAM STATEMENT WAS:
  310.  
  311. PRINTF("\N THE AVERAGE OF %F AND %F 
  312.        IS %F",X,Y,A); 
  313.  
  314. (AND THE %F GIVES 6 DECIMAL 
  315. PLACES...BY DEFAULT ).  
  316.  
  317. ┴LAS, WHAT WE GET IS:
  318.  
  319. THE AVERAGE OF 21.000000 AND 
  320. 22.000000 IS 21.000000 
  321.  
  322. ╠ET'S LOOK AT THE FUNCTION AVERAGE() 
  323. AGAIN: 
  324.  
  325. AVERAGE(X,Y)
  326. FLOAT X,Y;
  327. █  
  328. FLOAT Z;
  329. Z=(X+Y)/2;
  330. RETURN(Z);
  331.  
  332. ╥EMEMBER THIS:
  333.    
  334. ┴LL FUNCTIONS WILL RETURN AN INTEGER 
  335. UNLESS YOU SAY OTHERWISE!  
  336.    
  337.  
  338. ╙O, THE VALUE OF Z WHICH AVERAGE() 
  339. RETURNED WAS CHANGED FROM 21.5 ( THE 
  340. FLOATING POINT AVERAGE OF THE TWO 
  341. FLOATING POINT NUMBERS 21 AND 22 ) TO 
  342. 21. ╘HE FRACTIONAL PART WAS TRUNCATED 
  343. SINCE ( UNLESS WE SAY OTHERWISE ) OUR 
  344. FUNCTION RETURNS AN INTEGER!  
  345.  
  346. ┴ND HOW DO WE TELL THE C-COMPILER 
  347. THAT AVERAGE() IS TO RETURN A 
  348. FLOATING POINT NUMBER?  
  349.  
  350. ╫E WRITE THE AVERAGE() FUNCTION WITH 
  351. A TYPE DECLARATION BUILT INTO ITS 
  352. NAME!  
  353.  
  354. FLOAT AVERAGE(X,Y)  
  355. /* NOTE THE FLOAT */
  356. FLOAT X,Y;
  357. █  
  358. FLOAT Z;
  359. Z=(X+Y)/2;
  360. RETURN(Z);  
  361. /* NOW RETURN(Z) GIVES A FLOAT */
  362.  
  363. ╞UNCTIONS HAVE A PRIVATE COPY OF 
  364. THEIR ARGUMENTS -
  365.  
  366. MAIN() 
  367. FLOAT X,Y,A;
  368. PRINTF("\N ENTER TWO NUMBERS 
  369.        (SEPARATED BY A SPACE) : ");
  370. SCANF("%F%F",&X,&Y);   
  371. A=AVERAGE(X,Y);
  372. PRINTF("\N THE AVERAGE OF %F AND %F
  373.        IS %F",X,Y,A);
  374. FLOAT AVERAGE(X,Y);
  375. FLOAT X,Y;
  376. █  
  377. FLOAT Z;
  378. Z=(X+Y)/2;
  379. RETURN(Z);
  380.  
  381. ┴LTHOUGH WE CALLED THE TWO ARGUMENTS 
  382. OF AVERAGE()  X  AND  Y (JUST AS 
  383. MAIN() DID), THIS IS NOT NECESSARY!  
  384. ╘HE FUNCTION AVERAGE() ONLY GETS A 
  385. COPY OF THE VARIABLES WHICH APPEAR IN 
  386. ITS ARGUMENT LIST AND MAY GIVE THESE 
  387. COPIES ANY NAME IT LIKES  (THEY ARE 
  388. NOT THE ORIGINAL  X  AND  Y  WHICH 
  389. MAIN() USES!). 
  390.  
  391. ╘HE ABOVE PROGRAM MIGHT BE CHANGED TO 
  392. READ: 
  393.  
  394. MAIN() 
  395. FLOAT X,Y,A;
  396. PRINTF("\N ENTER TWO NUMBERS 
  397.        (SEPARATED BY A SPACE) : ");
  398. SCANF("%F%F",&X,&Y);   
  399. A=AVERAGE(X,Y);
  400. PRINTF("\N THE AVERAGE OF %F AND %F
  401.        IS %F",X,Y,A);
  402. FLOAT AVERAGE(SAM,SALLY)
  403. FLOAT SAM, SALLY;   
  404. █ 
  405. FLOAT GEORGE;   
  406. GEORGE=(SAM+SALLY)/2;   
  407. RETURN(GEORGE); 
  408. ▌   
  409.  
  410. ╙INCE COPIES OF CHAR AND INT AND 
  411. FLOAT VARIABLES ARE PASSED TO A 
  412. FUNCTION, THE FUNCTION MAY MANIPULATE 
  413. THESE VARIABLES AS IT SEES FIT. ╘HE 
  414. ORIGINAL VALUES REMAIN  UNCHANGED.  
  415. ╘HIS  MECHANISM  FOR CALLING A 
  416. FUNCTION AND PASSING VARIABLES IS 
  417. CALLED : CALL BY VALUE.  
  418.  
  419. ╘HE EXCEPTION OCCURS WHEN WE PASS A 
  420. STRING VARIABLE TO A FUNCTION. ╔N 
  421. THIS CASE, SINCE A STRING MAY BE 
  422. ARBITRARILY LONG (!), IT SEEMS 
  423. INEFFICIENT TO PROVIDE A COPY OF THE 
  424. STRING ... SO C WILL PASS THE ADDRESS 
  425. IN MEMORY WHERE THE STRING BEGINS. 
  426. THIS IS CALLED : CALL BY REFERENCE.  
  427.  
  428. ├ALL BY VALUE IS A MIXED BLESSING. ╫E 
  429. CANNOT (FOR EXAMPLE) CALL UPON AN 
  430. EXCHANGE(X,Y) FUNCTION TO EXCHANGE 
  431. THE VALUES OF INT VARIABLES X AND Y: 
  432.  
  433. EXCHANGE(X,Y)
  434. INT X, Y;
  435. █ 
  436. INT TEMP;
  437. TEMP=X; 
  438. X=Y; 
  439. Y=TEMP; 
  440. RETURN;
  441.  
  442. ╚ERE, THE VALUES OF X AND Y ARE ONLY 
  443. EXCHANGED IN EXCHANGE(), NOT IN 
  444. MAIN().  ┬UT DON'T DESPAIR, THERE ARE 
  445. WAYS AROUND THIS AS WE WILL SEE IN 
  446. THE FOLLOWING LESSONS.  
  447.  
  448.  
  449. [END OF LESSON 3 OF 11]
  450.