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

  1.  
  2. ├ ╠ANGUAGE ╘UTORIAL 
  3. -------------------
  4. ╨ART 8 OF 11 
  5.  
  6.  
  7. ╬╧╘┼: ╙╒┬╙╘╔╘╒╘╔╧╬╙ ╞╧╥ ╙╨┼├╔┴╠ ├
  8. ╠┴╬╟╒┴╟┼ ├╚┴╥┴├╘┼╥╙:
  9.  
  10. ╠┼╞╘ ├╒╥╠┘ ┬╥┴├╦┼╘:   █
  11. ╥╔╟╚╘ ├╒╥╠┘ ┬╥┴├╦┼╘:  ▌
  12. ┬┴├╦ ╙╠┴╙╚:           \
  13. ╘╔╠─┼:                »
  14. ╓┼╥╘╔├┴╠ ┬┴╥:         ▀
  15. ╒╬─┼╥╙├╧╥┼:           ñ
  16.  
  17.  
  18. ╞╔╠┼╙ - 
  19.  
  20. ╫HEREAS GETCHAR() AND PRINTF() WILL 
  21. GET CHARACTERS FROM THE KEYBOARD AND 
  22. PRINT TO THE SCREEN (THE 'STANDARD' 
  23. INPUT/OUTPUT), WE CAN ASK OTHER 
  24. FUNCTIONS AVAILABLE IN THE ├-LIBRARY 
  25. (AND ONES WE WRITE OURSELVES) TO 
  26. COMMUNICATE WITH A FILE ON DISK. 
  27.  
  28. ├ONSIDER THE EXCERPT: 
  29.  
  30. 1  MAIN(NUMBER,NAME)
  31. 2  INT NUMBER;  
  32. 3  CHAR *NAME[];
  33. 4  █
  34. 5  ╞╔╠┼ *FP, *FOPEN();  
  35. 6  FP=FOPEN(NAME[1],"R");   
  36. 7  IF (FP == ╬╒╠╠) █
  37. 8  PRINTF("\N╙ORRY, CAN'T OPEN %S",
  38.       NAME[1]); 
  39. 9  EXIT(0); 
  40. 10 ▌... 
  41. 11 /*  REST OF PROGRAM GOES HERE */ 
  42.  
  43. ╘HE ABOVE PROGRAM IS EXPECTED TO READ 
  44. A FILE ON DISK. ╫E COMPILE/LINK THE 
  45. PROGRAM, GIVING IT THE NAME READ. 
  46. ╘HEN WE TYPE: READ LETTER. ╘HE 
  47. ARGUMENTS TO MAIN() ARE THE NUMBER 2 
  48. AND THE ┴╥╥┴┘ OF ╨╧╔╬╘┼╥╙ ( NAME[] ) 
  49. POINTING TO THE STRINGS: READ AND 
  50. LETTER. 
  51.  
  52. ╫E DECLARE THE TWO ARGUMENTS OF 
  53. MAIN() TO BE INT AND CHAR *. ╔N OUR 
  54. EXAMPLE, NUMBER WILL HAVE THE VALUE 2 
  55. AND NAME[0] WILL BE A POINTER TO THE 
  56. STRING READ AND NAME[1] WILL POINT TO 
  57. LETTER. ╬OW WE ARE READY TO BEGIN 
  58. OUR MAIN() PROGRAM .... 
  59.   
  60. ╘O OPEN A DISK FILE, WE USE ╞╔╠┼ 
  61. WHICH CALLS UPON THE ├-LIBRARY TO 
  62. LOOK AFTER THE MECHANICS OF 
  63. COMMUNICATING WITH THE OPERATING 
  64. SYSTEM IN ORDER TO ACCESS THE DISK. 
  65. ┴FTER ╞╔╠┼ COME TWO POINTERS (WE KNOW 
  66. THEY'RE POINTERS BECAUSE OF THE * 
  67. ..RIGHT?). 
  68.  
  69. ╧F COURSE, IF WE INTEND TO USE THE ├ 
  70. STANDARD INPUT-OUTPUT FUNCTIONS, WE 
  71. HAD BETTER #INCLUDE "STDIO.H". 
  72.  
  73. 0  #INCLUDE <STDIO.H>   
  74.  
  75. FP IS A POINTER VARIABLE WHICH POINTS 
  76. TO A ╞╔╠┼. FOPEN() IS A FUNCTION 
  77. WHICH RETURNS A POINTER TO A ╞╔╠┼. 
  78. ╙O, OF COURSE, T+VALUE RETURNED BY 
  79. FOPEN() IS ASSIGNED TO FP. ┴ FILE 
  80. POINTER IS SIMPLY THE NUMBER WHICH 
  81. YOUR COMPUTER'S OPERATING SYSTEM 
  82. ASSIGNS TO AN OPEN FILE. ╘HE 
  83. OPERATING SYSTEM USES THIS NUMBER IN 
  84. THE WAY THAT YOU USE A FILENAME IN 
  85. ACCESSING A FILE TO PERFORM READS AND 
  86. WRITES ON IT. 
  87.  
  88. 5  ╞╔╠┼ *FP, *FOPEN();  
  89. 6  FP=FOPEN(NAME[1],"R");   
  90.   
  91. ╘HIS CALLS UPON THE FOPEN() FUNCTION 
  92. TO OPEN A FILE. ╘HE POINTER TO THE 
  93. FILE ( WHICH IS RETURNED BY FOPEN() ) 
  94. IS ASSIGNED TO FP. ╘HE "R" MEANS THAT 
  95. ACCESS TO THE FILE IS FOR "R"EADING 
  96. ( AS OPPOSED TO "W"RITING OR 
  97. "A"PPENDING ). 
  98.   
  99. ╚OW DO WE TELL FOPEN() THE NAME OF 
  100. THE FILE WHICH WE WANT TO OPEN...? 
  101. NAME[] IS AN ┴╥╥┴┘ OF POINTERS, EACH 
  102. POINTING TO A STRING. 
  103.  
  104. ╫HEN WE TYPED READ LETTER, WE PASSED 
  105. TO OUR MAIN() PROGRAM THE TWO STRINGS 
  106. READ AND LETTER. ╬OW THE POINTER 
  107. NAME[0] POINTS TO READ AND NAME[1] 
  108. WILL POINT TO THE STRING LETTER ... 
  109.  
  110. ...SO WE GIVE THE NAME OF THE FILE TO 
  111. FOPEN(), NAMELY NAME[1]. 
  112.  
  113. 6  FP=FOPEN(NAME[1],"R");   
  114. 7  IF (FP == ╬╒╠╠) █
  115. 8  PRINTF("\N╙ORRY, CAN'T OPEN %S",
  116.      NAME[1]); 
  117. 9  EXIT(0); 
  118.  
  119. ╘HE FUNCTION FOPEN() IS CLEVER. ╔F IT 
  120. CAN'T OPEN THE FILE FOR SOME REASON 
  121. (FILE DOES NOT EXIST) IT RETURNS A 
  122. ╬╒╠╠ POINTER. ╬╒╠╠ IS THE STANDARD ├ 
  123. EXPRESSION FOR THE VALUE ZERO. (╬OTE 
  124. THIS IS NOT THE ┴╙├╔╔ CHARACTER '0' 
  125. BUT THE VALUE ZERO). ╫E CHECK, IN 
  126. ╠INE 7, ╔╞ FP IS ┼╤╒╔╓┴╠┼╬╘ ( == ) TO 
  127. ╬╒╠╠. ╔F SO, WE APOLOGIZE ( ╠INE 8 ) 
  128. AND EXIT THE PROGRAM ( ╠INE 9 ). 
  129.  
  130. ╔N ╠INE 8 WE PRINTF NAME[1] AS A 
  131. %STRING (OF COURSE). ╘HE EXIT(0) (IN 
  132. ╠INE 9 ) IS NEW. ╔T WILL EXIT OUR 
  133. MAIN() AND RETURN YOU TO THE 
  134. OPERATING SYSTEM (E.G. ─╧╙ ).
  135. ╔T ALSO CLOSES ANY OPEN FILES. 
  136.  
  137. ╬╧╘┼: ╫E GAVE TO FOPEN() THE STRING 
  138. WHICH NAME[1] POINTS TO, AND WE ALSO 
  139. GIVE IT TO PRINTF() (NAMELY LETTER, 
  140. IN THIS EXAMPLE). 
  141.  
  142. 1  MAIN(NUMBER,NAME) 2  INT NUMBER;  
  143. 3  CHAR *NAME[] 
  144. 4  █
  145. 5    ╞╔╠┼ *FP, *FOPEN();
  146. 6    FP=FOPEN(*NAME[1],"R");  
  147. 7    IF (FP == ╬╒╠╠) █     
  148. 8     PRINTF("\N╙ORRY, CAN'T OPEN 
  149.           %F",NAME[1]); 
  150. 9     EXIT(0); 
  151. 10   ▌ 
  152. 11  /* NOW WE READ FROM THE FILE */ 
  153. 12  CHAR C;  
  154. 13  WHILE ( (C=GETC(FP)) != ┼╧╞  )   
  155. 14  PRINTF("%C",C);  
  156. 15  ▌ /* END OF MAIN() */ 
  157.  
  158. ╬OW WE DECLARE A CHAR C ( ╠INE 12 ) 
  159. AND CONTINUALLY GETC() FROM THE FILE 
  160. WHICH WE OPENED ( IN ╠INE 6 ). 
  161. ╥EFERENCE TO THIS OPEN FILE IS VIA 
  162. ITS FILE POINTER FP ... HENCE WE USED 
  163. GETC(FP) TO TELL THE GETC() FUNCTION 
  164. WHICH FILE TO GET THE NEXT CHAR FROM. 
  165. ( GETC() IS IN STDIO.H ). 
  166.  
  167. ╫E (IN THIS EXAMPLE) PRINTF() THE 
  168. CHAR TO THE SCREEN, WHILE C IS ╬╧╘ 
  169. ┼╤╒╔╓┴╠┼╬╘ ( != ) TO THE ┼╧╞  
  170. CHARACTER (WHICH SHOULD INDICATE ┼ND 
  171. ╧F ╞ILE ...IF ALL GOES WELL). ╘HE 
  172. STANDARD ┼╧╞ CHARACTER IS -1. 
  173.  
  174. ╬╧╫... ╚OW MANY ERRORS IN THE ABOVE 
  175. PROGRAM? 
  176.  
  177. ╠INE 3 NEEDS A SEMI-COLON! 
  178.  
  179. 3  CHAR *NAME[] TCH! TCH!
  180.  
  181. ╠INE 6 SHOULD GIVE NAME[1] TO 
  182. FOPEN(), ╬╧╘ *NAME[1] 
  183.  
  184. 6  FP=FOPEN(*NAME[1],"R"); ╫╥╧╬╟! 
  185.  
  186. ╠INE 8 NEEDS A %STRING FORMAT, ╬╧╘ A 
  187. %FLOAT! 
  188.  
  189. 8  PRINTF("\N╙ORRY, CAN'T OPEN %F",
  190.       NAME[1]); ╫╥╧╬╟! 
  191.  
  192. ...AND WE NEED TO #INCLUDE <STDIO.H> 
  193.  AS ╠INE 0 
  194.  
  195. 0  #INCLUDE <STDIO.H>   
  196. 1  MAIN(NUMBER,NAME) 
  197. 2  INT NUMBER;  
  198. 3  CHAR *NAME[]; 
  199. 4  █
  200. 5  ╞╔╠┼ *FP, *FOPEN();  
  201. 6  FP=FOPEN(NAME[1],"R");   
  202. 7  IF (FP == ╬╒╠╠) █
  203. 8  PRINTF("\N╙ORRY, CAN'T OPEN 
  204.       %S",NAME[1]); 
  205. 9  EXIT(0); 
  206. 10 ▌
  207.  
  208.  
  209. ┴ ╒SEFUL ╙AMPLE PROGRAM -
  210.  
  211. ╠ET'S CONTINUE BY EXPANDING THE 
  212. PROGRAM INTO ONE WHICH WILL READ A 
  213. FILE ON DISK AND COUNT THE NUMBER OF 
  214. TIMES THE LETTERS 'A' THROUGH 'Z' 
  215. OCCUR. ╘HIS IS AN EXAMPLE OF THE TYPE 
  216. OF FEATURE WHICH WOULD BE INCLUDED AS 
  217. A PART OF A TEXT OR WORD PROCESSOR. 
  218. ╘HE NUMBER OF CHARACTERS TO BE 
  219. CHECKED IS ARBITRARILY LIMITED TO 
  220. 1000 BUT YOU COULD INCREASE IT.
  221. ╞OR SIMPLICITY'S SAKE WE WILL ONLY BE 
  222. COUNTING LOWER-CASE LETTERS BUT YOU 
  223. MAY WANT TO TRY INCLUDING AN UPPER-
  224. CASE COUNT LATER AS AN EXERCISE.
  225.  
  226. ╫E'LL COMPILE/LINK THE PROGRAM UNDER 
  227. THE NAME 'COUNT' AND WE WILL TYPE ON 
  228. THE COMMAND LINE:
  229.  
  230. COUNT FILENAME 
  231.  
  232. TO COUNT THE LETTERS 'A'-'Z' IN A 
  233. FILE. ╚ERE IS A PRELIMINARY VERSION 
  234. OF THE WHOLE PROGRAM:
  235.  
  236. #INCLUDE <STDIO.H>
  237.  
  238. MAIN(NUMBER,NAME) 
  239. INT NUMBER;  
  240. CHAR *NAME[]; 
  241.   ╞╔╠┼ *FP, *FOPEN();  
  242.  
  243.   FP=FOPEN(NAME[1],"R");  
  244.   IF (FP == ╬╒╠╠) █
  245.     PRINTF("\N╙ORRY, CAN'T OPEN 
  246.       %S",NAME[1]); 
  247.   EXIT(0); 
  248.   ▌
  249.   CHAR C; /* CHARACTERS FROM FILE */ 
  250.   INT N[26], I;   
  251.     /* COUNT FOR EACH LETTER*/ 
  252.   FOR (I=0;I<26;I++)
  253.     N[I]=0;  /* COUNT SET TO ZERO */ 
  254.   FOR (I=0;I<1000;I++) █
  255.     /* GO THRU 1000 CHARS */ 
  256.     C=GETC(FP); 
  257.     /* GET A CHAR FROM FILE */ 
  258.     IF (C>='A'&& C<='Z')   
  259.     /* IS IT BETWEEN A & Z? */ 
  260.       [C-'A']++; 
  261.     /* YES? THEN INCREMENT COUNT */ 
  262.   ▌ /* END OF FOR */ 
  263.   PRINTF("\N╔N THE FILE %S : 
  264.   ",NAME[1]);  
  265.   /* PRINT FILE NAME */ 
  266.   FOR (I=0;I<26;I+=2)
  267.   /* GO THRU ALPHABET */ 
  268.   PRINTF("\N%C%S%3D : %C%S%3D",  
  269.     'A'+I,  " COUNT = ",N[I], 
  270.     'A'+I+1," COUNT = ", N[I+1],); 
  271.    /* THE FORMAT STRING CAUSES EACH 
  272.       LETTER TO BE PRINTED FOLLOWED 
  273.       BY A COUNT OF HOW MANY TIMES 
  274.       THAT LETTER APPEARS, AND IT 
  275.       DOES THIS TWICE */ 
  276. ▌  /* END OF MAIN()*/ 
  277.  
  278.  
  279. ╠ET'S LOOK AT PARTS OF THE PROGRAM -
  280.  
  281. CHAR C; /* CHARACTERS FROM FILE */ 
  282.  
  283. ╘HIS VARIABLE WILL HOLD EACH 
  284. CHARACTER FROM THE FILE AS GETC() 
  285. READS IT.
  286.  
  287. INT N[26], I; 
  288. /* COUNT FOR EACH LETTER*/ 
  289.  
  290. ╚ERE WE DECLARE SOME STUFF, NOTABLY 
  291. THE ┴╥╥┴┘ N[26] WHICH WILL HOLD THE 
  292. NUMBER OF TIMES EACH OF THE 26 
  293. LETTERS FROM 'A' TO 'Z' OCCUR 
  294. ...HENCE IT'S AN INTEGER ┴╥╥┴┘. 
  295.  
  296. FOR (I=0;I<26;I++) 
  297.   N[I]=0;  
  298. /* COUNTS SET TO ZERO */ 
  299.   
  300. ╚ERE WE SET ALL THE INTEGERS IN THE 
  301. ┴╥╥┴┘ TO 0  ...YOU CAN NEVER TELL 
  302. WHAT GARBAGE MIGHT BE IN THOSE MEMORY 
  303. LOCATIONS SO THEY SHOULD ALWAYS BE 
  304. INITIALIZED TO ZERO. 
  305.  
  306. FOR (I=0;I<1000;I++) █
  307. /* GO THRU 1000 CHARS   */ 
  308.  
  309. C=GETC(FP); /* GET A 
  310. CHAR FROM FILE */ 
  311.  
  312. IF (C>='A'&& C<='Z')   
  313. /* IS IT BETWEEN A & Z? */ 
  314.   
  315. ╬OW WE GO THROUGH 1000 CHARACTERS IN 
  316. THE FILE AND GETC(FP) EACH CHARACTER, 
  317. GIVING THE FILE POINTER FP TO THE 
  318. LIBRARY FUNCTION GETC() AND GETTING 
  319. IN RETURN A CHARACTER C WHICH WE 
  320. CHECK TO SEE IF IT'S ╟╥┼┴╘┼╥ OR ┼╤╒┴╠ 
  321. TO THE CHARACTER 'A'  ┴╬─  ( && ) IF 
  322. IT'S ╠┼╙╙ OR ┼╤╒┴╠ TO THE CHARACTER 
  323. 'Z'. 
  324. (╥EMEMBER NOT CONFUSE &&, THE 
  325. LOGICAL ┴╬─ OPERATOR, WITH &, THE 
  326. BITWISE ┴╬─ OPERATOR).
  327.  
  328. IF (C>='A'&& C<='Z')   
  329. /* IS IT BETWEEN A & Z? */ 
  330.   [C-'A']++;
  331. /* YES? THEN INCREMENT COUNT */ 
  332.   
  333. IF WE GET A CHARACTER BETWEEN 'A' AND 
  334. 'Z' WE INCREMENT THE APPROPRIATE 
  335. MEMBER OF OUR ┴╥╥┴┘ N[] ...BUT HOW ?? 
  336.  
  337. ╬OW C IS A (SINGLE) BYTE IN MEMORY, 
  338. CONTAINING THE 'VALUE' OF THE 
  339. CHARACTER. ╘HIS 'VALUE' WOULD BE 65 
  340. FOR AN 'A' AND 66 FOR A 'B', ETC. (IN 
  341. ┴╙├╔╔). ╔F THE 'VALUE' OF THE 
  342. CHARACTER RETURNED BY GETC() WERE 69 
  343. (FOR EXAMPLE) THEN WE MUST HAVE AN 
  344. 'E'. ╙INCE 'E' IS THE FIFTH LETTER 
  345. IN THE ALPHABET WE WOULD WANT TO     
  346. INCREMENT N[4] WHICH IS THE FIFTH 
  347. ELEMENT IN OUR ARRAY (REMEMBER ├ 
  348. ARRAYS START WITH ELEMENT ZERO!).
  349. ┴RRAY ELEMENT N[4] HOLDS THE NUMBER 
  350. OF TIMES AN 'E' WAS FOUND. ┴╬─, THE 
  351. 'VALUE' OF C MINUS THE 'VALUE' OF 'A' 
  352. IS 69-65=4 ...THAT IS, C-'A' HAS THE 
  353. 'VALUE' 4 ... ╙╧ WE INCREMENT 
  354. N[C-'A'] (WHICH ╫╔╠╠ INCREMENT N[4] ). 
  355.   
  356.  
  357.    ▌  /* END OF FOR */ 
  358.   
  359.   
  360. ╬OW WE END THE IF AND THE FOR. ╘HE 
  361. NUMBERS IN THE ┴╥╥┴┘ N[] WILL GIVE US 
  362. WHAT WE WANT. 
  363.   
  364. PRINTF("\N╔N THE FILE %S : ",NAME[1]);
  365.      /* PRINT FILE NAME  */ 
  366.  
  367. ╬OW (JUST FOR KICKS) WE PRINT THE 
  368. NAME[1] OF THE FILE WE OPENED... 
  369.  
  370. FOR (I=0;I<26;I+=2) 
  371. /* GO THRU ALPHABET */ 
  372.   
  373. ╬OW WE GO THROUGH ALL 26 LETTERS (AND 
  374. ALL 26 'COUNTS' STORED IN THE ┴╥╥┴┘ 
  375. N[] ) AND, SINCE OUR FINAL PRINTF() 
  376. STATEMENT PRINTS TWO LETTERS EACH 
  377. TIME THROUGH, WE USE I+=2 WHICH 
  378. ADDS 2 TO I EACH TIME THROUGH THE FOR 
  379. LOOP. 
  380.  
  381. PRINTF("\N%C%S%3D : %C%S%3D",
  382. 'A'+I,  " COUNT =  ", N[I], 'A'+I+1,
  383. " COUNT =  ",N[I+1]);
  384.   
  385. ╬OW WE PRINT EACH LETTER AS A 
  386. %CHARACTER, GIVING TO PRINTF() THE 
  387. NUMBERS 'A'+0, THEN 'A'+1, THEN 
  388. 'A'+2, ETC. (MEANING, THE ┴╙├╔╔ 
  389. 'VALUES' 65 THEN 66 THEN 67 ETC.). 
  390. ╘HEN WE PRINT A CHARACTER %STRING.
  391. ╫E ALSO PRINT N[0], N[1], N[2] ETC. 
  392. WHICH ARE THE VARIOUS 'COUNTS' (FOR 
  393. AN 'A', 'B', 'C', ETC.)   
  394. ╬OTE THAT WE CHOSE TO SPECIFY A 
  395. FORMAT WHICH SAYS TO PRINT, FIRST A 
  396. %CHARACTER, THEN A %STRING, THEN A 
  397. %DECIMAL (FIELD WIDTH 3). 
  398. ...AND WE DO THIS ╘╫╔├┼ (BEFORE WE GO 
  399. TO A NEWLINE) WHICH IS WHY WE 
  400. INCREASED I BY 2 EACH TIME THROUGH 
  401. THE LOOP (AS IN I+=2). 
  402.  
  403. ╘HIS IS ONE OF THE ╘╫╧ PRINTOUTS ON 
  404. EACH LINE OF THE SCREEN: ╞IRST THE 
  405. %CHARACTER (AS 'A'+I) THEN THE 
  406. %STRING (" COUNT =  ") THEN THE 
  407. %DECIMAL ( N[I] ) WITH FIELD WIDTH 3, 
  408. THEN A SEMI-COLON TO DIVIDE THE TWO 
  409. COLUMNS, AND THEN THE 
  410. %CHARACTER%STRING%DECIMAL FORMAT IS 
  411. REPEATED ON THE SAME LINE.
  412. ..AND THIS (WOULD YOU BELIEVE) IS THE 
  413. END OF MAIN() 
  414.  
  415. ╒SING THE PROGRAM WE JUST WROTE 
  416. (CALLED COUNT.C, BEFORE IT WAS 
  417. COMPILED AND LINKED) AS A SAMPLE TEXT 
  418. FILE WE GET: 
  419.  
  420. COUNT COUNT.C 
  421.  
  422. ╔N THE FILE COUNT.C : 
  423. A COUNT =  18 : B COUNT =   3 
  424. C COUNT =  19 : D COUNT =   4  
  425. E COUNT =  32 : F COUNT =  22  
  426. G COUNT =   3 : H COUNT =   9  
  427. I COUNT =  25 : J COUNT =   0  
  428. K COUNT =   0 : L COUNT =   5  
  429. M COUNT =  11 : N COUNT =  31  
  430. O COUNT =  19 : P COUNT =   9  
  431. Q COUNT =   0 : R COUNT =  23  
  432. S COUNT =   9 : T COUNT =  22  
  433. U COUNT =   7 : V COUNT =   0  
  434. W COUNT =   1 : X COUNT =   1  
  435. Y COUNT =   2 : Z COUNT =   3  
  436.  
  437. ╬OTE: THE COUNTS FROM YOUR OWN FILE 
  438. MAY BE SLIGHTLY DIFFERENT.
  439.  
  440.  
  441. ┴ ┬ETTER WAY OF GETTING OUR OUTPUT -
  442.  
  443. ╧UR MECHANISM FOR PRINTING TWO-TO-A-
  444. LINE IS AWKWARD. ╫E REALLY WANT TO 
  445. LET I GO FROM 0 TO 25 AND, EACH TIME 
  446. I IS EXACTLY DIVISIBLE BY 2, PRINTF() 
  447. A NEWLINE. ╘HIS 'EXACT DIVISIBILITY' 
  448. CAN BE TESTED BY DIVIDING  BY 2 AND 
  449. CHECKING IF THE REMAINDER IS ZERO. 
  450.  
  451. ╘O GET THE REMAINDER, WHEN I IS 
  452. DIVIDED BY 2, WE USE: 
  453.  
  454. I%2  /* SOMETHING ╬┼╫ */
  455.  
  456. ╔T IS VERY IMPORTANT TO NOTICE THAT 
  457. THE SYMBOL '%' HAS TWO VERY DIFFERENT 
  458. USES AND MEANINGS IN THE ├ LANGUAGE. 
  459. ╫E HAVE ALREADY SEEN THAT IN PRINTF() 
  460. THE % IS USED AS A CONVERSION 
  461. CHARACTER TO TELL PRINTF() WHAT TYPE 
  462. OF VARIABLE TO EXPECT IN THE SECOND 
  463. SET OF ARGUMENTS.( % DOES THE SAME 
  464. THING IN THE FUNCTION SCANF() ).
  465. ╔N THE EXAMPLE WE ARE NOW LOOKING AT 
  466. THE '%' SYMBOL IS THE ┬╔╬┴╥┘ ═╧─╒╠╒╙ 
  467. OPERATOR. ╘HE EXAMPLE: I%2 MEANS WE 
  468. ARE PERFORMING MODULO DIVISION ON THE 
  469. VARIABLE 'I'. ═ODULO DIVISION YIELDS 
  470. THE REMAINDER OF A DIVIDE OPERATION 
  471. AS ITS RESULT.
  472.  
  473. ╬OW THE LAST PART OF OUR PROGRAM CAN 
  474. BE REWRITTEN AS:
  475.  
  476. FOR (I=0;I<26;I++) █
  477.   /* GO THRU ALPHABET */ 
  478.   IF (I%2==0)   
  479.     PRINTF("\N");
  480.     /* NEWLINE IF I%2==0 */ 
  481.   ELSE 
  482.     PRINTF(": ");
  483.   PRINTF("%C%S%3D",'A'+I, 
  484.     " COUNT =  ", N[I]);  
  485.     /* PRINT LETTER COUNT */ 
  486.  
  487. ╘HE 'IF' STATEMENT IN THE ABOVE WILL 
  488. ONLY ALLOW A NEWLINE TO BE PRINTED IF 
  489. THERE IS NO REMAINDER FROM A DIVISION 
  490. OF THE VARIABLE 'I' BY TWO. ╔N OTHER 
  491. WORDS, ONLY AFTER EVERY SECOND LETTER 
  492. OF THE ALPHABET. ╘HE 'ELSE' STATEMENT 
  493. WILL PRINT A ':' AFTER ALL OF THE 
  494. ODD-NUMBERED CHARACTERS TO DIVIDE THE 
  495. TWO COLUMNS OF LETTERS AND THEIR 
  496. COUNTS ...MUCH NICER CODE, SINCE WE 
  497. CAN EASILY PRINT 3 OR 4 TIMES ON A 
  498. LINE BY CHANGING THE NUMBER 2 IF OUR 
  499. CODE SHOULD EVER CALL FOR IT. 
  500.  
  501. ╚ERE IS A COMPLETE, UNCOMMENTED 
  502. LISTING OF THE FINAL VERSION OF OUR 
  503. PROGRAM:
  504.  
  505. /* ├╧╒╬╘.├ - COUNTS THE NUMBER OF 
  506. LOWER-CASE ALPHABETIC CHARACTERS IN A 
  507. FILE */
  508.  
  509. #INCLUDE <STDIO.H>
  510.  
  511. MAIN(NUMBER,NAME) 
  512. INT NUMBER;  
  513. CHAR *NAME[]; 
  514.   ╞╔╠┼ *FP, *FOPEN();  
  515.  
  516.   FP=FOPEN(NAME[1],"R");  
  517.   IF (FP == ╬╒╠╠) █
  518.     PRINTF("\N╙ORRY, CAN'T OPEN 
  519.       %S",NAME[1]); 
  520.   EXIT(0); 
  521.   ▌
  522.   CHAR C; 
  523.   INT N[26], I;   
  524.   FOR (I=0;I<26;I++) 
  525.     N[I]=0;  
  526.   FOR (I=0;I<1000;I++) █
  527.     C=GETC(FP); 
  528.     IF (C>='A'&& C<='Z')   
  529.       [C-'A']++; 
  530.      
  531.    
  532.   PRINTF("\N╔N THE FILE %S : 
  533.   ",NAME[1]);  
  534.   FOR (I=0;I<26;I++) 
  535.     IF (I%2==0)   
  536.     PRINTF("\N");
  537.     ELSE 
  538.       PRINTF(": ");
  539.     PRINTF("%C%S%3D",'A'+I, 
  540.     " COUNT =  ", N[I]);
  541.   ▌
  542.  
  543. [┼ND OF ╨ART 8 OF 11]
  544.