home *** CD-ROM | disk | FTP | other *** search
/ Shareware Overload / ShartewareOverload.cdr / progm / m2t-1.zip / CHAP06.TXT < prev    next >
Text File  |  1989-01-18  |  26KB  |  587 lines

  1.  
  2.                                                      Chapter 6
  3.  
  4.                                     ARRAYS, TYPES, & CONSTANTS
  5.  
  6.  
  7.  
  8. BEGINNING WITH ARRAYS
  9. ______________________________________________________________
  10.  
  11. Examine the program named ARRAYS.MOD and      ================
  12. we will go right to our first example of         ARRAYS.MOD
  13. an array.  An array is a list made up of      ================
  14. two or more of the same type of element.
  15. This construct is usually called a vector by a mathematician,
  16. and it is sometimes called a table.  Notice the var definition
  17. in the sample program and specifically the variable named
  18. Automobiles.  The reserved word ARRAY followed by the square
  19. brackets with a range of numbers contained within them is the
  20. proper way to define an array of, in this case, cardinal type
  21. variables because of the reserved words OF CARDINAL at the end
  22. of the statement.  This defines 12 different cardinal type
  23. variables, each of which is capable of storing one cardinal
  24. number.  The names of the twelve variables are given by
  25. Automobiles[1], Automobiles[2], ... Automobiles[12].  The
  26. variable name is Automobiles and the array subscripts are the
  27. numbers 1 through 12.  The variables are true cardinal type
  28. variables and can be assigned values, or they can be used in
  29. calculations or in nearly anyplace in a program where it is
  30. legal to use a cardinal type variable.  One place they cannot
  31. be used is as the index for a for loop since a simple variable
  32. type is required there.
  33.  
  34.  
  35. WHAT GOOD ARE ARRAYS?
  36. ______________________________________________________________
  37.  
  38. Notice lines 10 through 12 of the program.  In these lines,
  39. each of the 12 variables is assigned a value.  When Index is
  40. 1, then Automobiles[1] is assigned 11, then when Index is 2,
  41. Automobiles[2] is assigned 12, etc.
  42.  
  43. If the 12 variables were defined as 12 separate variables of
  44. whatever names we chose for them, we could not assign them
  45. values in a loop but would have to assign each one
  46. independently.  In this instance, we are generating nonsense
  47. data but in a real program, this loop could be reading in a
  48. series of data from a file such as would be done with a
  49. database.  The advantage of the array should be very clear,
  50. especially if we were to change the array limits to several
  51. thousand elements.
  52.  
  53. The statement in line 13 assigns a value to one of the
  54. elements at random to illustrate the method.  In this
  55. particular case, the 7th element of the array named
  56. Automobiles is assigned the value of 54.  The address of this
  57. data is therefore the variable name Automobiles[7] and the
  58.  
  59.                                                            6-1
  60.  
  61.                       Chapter 6 - Arrays, Types, and Constants
  62.  
  63. data stored in that address is 54 following execution of line
  64. 13.  We have therefore assigned values to the 12 variables by
  65. a nonsensical but known scheme, and now we can use the 12
  66. variables in any way that is legal within Modula-2.
  67.  
  68. The loop in lines 18 through 24 causes the 12 values to be
  69. displayed on the monitor in a neat orderly fashion.  In line
  70. 20 we display the index of the variable in question, and in
  71. line 22, we display the actual variable.  Keep in mind that
  72. the array subscript could have been of type integer and still
  73. be used to display an array of type cardinal provided we
  74. defined Index as an integer type variable and always used it
  75. as such.  Spend enough time with this program so that you
  76. thoroughly understand it, then compile and run it.
  77.  
  78.  
  79. WHAT ABOUT AN ILLEGAL SUBSCRIPT?
  80. ______________________________________________________________
  81.  
  82. Modula-2 does strong type checking and limit checking.  If,
  83. in the above program, you tried to assign a value to
  84. Automobiles[13], which doesn't exist, a run time error would
  85. be generated and the program execution would be aborted after
  86. giving you an error indication on the monitor.  This is one
  87. of the advantages of Modula-2 over some of the older
  88. programming languages.  Some compilers give you the ability
  89. to enable or disable this feature.
  90.  
  91.  
  92. MULTIPLY DIMENSIONED ARRAYS
  93. ______________________________________________________________
  94.  
  95. Examine the file named ARRAYS2.MOD for an      ===============
  96. example of a program with two-dimensional        ARRAYS2.MOD
  97. arrays.  In this program, the var section      ===============
  98. contains the variable named Checkerboard
  99. which is defined as an 8 element array in which each element
  100. is an 8 element array, therefore being an 8 by 8 square array.
  101. Each element is capable of storing one cardinal type variable.
  102. The variable named Value is defined the same way except that
  103. the method of definition is slightly different.  The two
  104. methods result in the same type and number of variables.
  105.  
  106. In lines 11 through 16 we have two nested for loops.  The
  107. outer loop causes Index to count from 1 to 8 and for each
  108. value of Index, the variable Count counts through the values
  109. 1 to 8 also.  The net result is that we evaluate the
  110. assignments in lines 13 and 14 once for each possible
  111. combination of Index and Count.  For each combination, we
  112. assign some nonsense data to one element of the array variable
  113. named Checkerboard then use the result of that calculation to
  114. assign some nonsense data to the variable named Value.  The
  115. purpose here is to illustrate the method of using the double
  116. subscripted variables.  Next, we display the entire matrix of
  117.  
  118.                                                            6-2
  119.  
  120.                       Chapter 6 - Arrays, Types, and Constants
  121.  
  122. Checkerboard in lines 18 through 25.  The loops cause 8 values
  123. to be displayed on one line so that the entire matrix is
  124. displayed on only 8 lines.  You should study this logic
  125. because you will find output sequences like this to be very
  126. valuable.
  127.  
  128.  
  129. CHANGING A FEW OF THE VALUES
  130. ______________________________________________________________
  131.  
  132. In line 27 and following, we change a few of the values at
  133. random for illustrative purposes.  Since Value[3,6] is
  134. assigned the value of 3, it can be used as one of the
  135. subscripts of the next line and in fact it is.  This would be
  136. a rather sloppy programming style but it is a good
  137. illustration of what can be done.  Finally using the same
  138. technique as that for Checkerboard, the array variable named
  139. Value is displayed.
  140.  
  141.  
  142. HOW MANY SUBSCRIPTS CAN BE USED?
  143. ______________________________________________________________
  144.  
  145. There is no limit as to how many subscripts can be used in
  146. Modula-2 by definition, but there is a practical limit of
  147. somewhere in the range of 3 or 4.  If you use too many, you
  148. will very quickly get confused and lose control of what the
  149. program is supposed to be doing.  I have never seen more than
  150. 3 subscripts used in any programming language, and very few
  151. instances of more than two.  Let the problem definition be
  152. your guide.
  153.  
  154. This program was pretty straightforward, and if you understand
  155. it, it is time for you to compile and execute it.
  156.  
  157.  
  158. THE TYPE DECLARATION
  159. ______________________________________________________________
  160.  
  161. Examine the program named TYPES.MOD for a      ===============
  162. new topic that you will use often,                TYPES.MOD
  163. especially in large programs.  Beginning       ===============
  164. in line 4, we have a group of type
  165. declarations which starts with the reserved word TYPE.  The
  166. first line defines ArrayDef as a new type that can be used in
  167. the same way you would use INTEGER or any of the other simple
  168. type definitions.  In line 12, the variable named Stuff is
  169. defined as a variable of type ArrayDef, and since ArrayDef is
  170. a type defining a 14 element array of integer, then Stuff is
  171. a 14 element array of integer type variables.  It seems like
  172. we didn't save anything and in fact we added a few keystrokes
  173. to the program in order to do this but there is good reason
  174. to define and use a new type.  If you look at line 13 you will
  175. see that we have also defined Stuff2 as the same type of
  176.  
  177.                                                            6-3
  178.  
  179.                       Chapter 6 - Arrays, Types, and Constants
  180.  
  181. array.  We have, in fact, defined them to be type compatible
  182. which will be very important when we get to the program
  183. itself.
  184.  
  185. Continuing down the list of type declarations (once we use the
  186. reserved word TYPE, we can define as many types as desired),
  187. we define a type with 28 characters, then a type with 60 real
  188. variables, and another with 6 boolean variables.  The next
  189. type definition consists of 12 variables of type DogFood which
  190. is itself a type of 6 booleans, resulting in a type consisting
  191. of 6 times 12 = 72 boolean type variables.  It is possible to
  192. continue building up type definitions like this indefinitely,
  193. and as you build up applications, you will find yourself
  194. building up rather complex type declarations and having a
  195. clear picture of how they go together because it is your
  196. solution to a problem.  The last type to be defined is that
  197. named Boat which has exactly the same size and characteristics
  198. as type Airplane.  We will see shortly that there is a
  199. difference in these two definitions.
  200.  
  201.  
  202. MORE TERMINOLOGY
  203. ______________________________________________________________
  204.  
  205. This is a fine point, but it may help you understand the topic
  206. of types better.  Lines 4 through 9 are "named types", and
  207. line 14 is an "anonymous type".  Occasionally in Modula-2, you
  208. will find a case where you must have a name for a type and
  209. cannot therefore use the anonymous type.  Such a case is when
  210. you must do a type transformation, or when you are passing
  211. data of some type to a procedure.  We will make use of this
  212. terminology later in this tutorial.
  213.  
  214.  
  215.  
  216. HOW DO WE USE ALL OF THIS?
  217. ______________________________________________________________
  218.  
  219. In the var part of the definition part of the program, we
  220. declare some variables, two simple types and some of the types
  221. we defined above.  In the program part, we assign some values
  222. to the 72 variables making up the Puppies matrix and the 72
  223. variables making up the Kitties matrix.  All of the elements
  224. of Stuff are then assigned nonsense values.  The really
  225. interesting statement comes in line 30 where we say "Stuff2
  226. := Stuff;".  In this simple statement, all 14 values stored
  227. in Stuff are copied into the 14 corresponding elements of
  228. Stuff2 without using a loop.  This is possible because the two
  229. variables are type compatible, they have the same type
  230. definition and the same type name.  If you study the
  231. definitions above, you will see that Stuff3 is of the same
  232. number and range of elements and is composed of the same type
  233. of elements as Stuff, namely integer, but they are not type
  234. compatible because were not defined with the same type
  235.  
  236.                                                            6-4
  237.  
  238.                       Chapter 6 - Arrays, Types, and Constants
  239.  
  240. definition statement.  In like manner, even though Puppies and
  241. Kitties are identical in type, they are not type compatible.
  242.  
  243. The only operations that can be performed on all of the
  244. elements of an array at one time are array assignment, and
  245. array parameter passing.
  246.  
  247. You have the ability, through careful assignment of variables,
  248. to avoid certain kinds of programming errors.  If certain
  249. variables should never be assigned to each other, a careful
  250. selection of types can prevent it.  Suppose for example that
  251. you have a program working with peaches and books.  You would
  252. never want to copy a matrix of peaches to one defining books,
  253. it just wouldn't make sense.  Those two matrices should be
  254. defined with different type declarations even though they may
  255. be identical in size.  Compile and run this program, even
  256. though it will result in no output, then move the comment
  257. delimiter in line 31 to a position following the assignment
  258. statement and see if it does give you a type incompatibility
  259. error.
  260.  
  261.  
  262. DEFINING A CONSTANT
  263. ______________________________________________________________
  264.  
  265. Examine the program named CONSTANT.MOD for    ================
  266. a definition of the constant as used in         CONSTANT.MOD
  267. Modula-2.  We will finally keep the           ================
  268. promise made when we studied LOOPDEMO.MOD
  269. in chapter 4.  The new reserved word CONST is used to define
  270. a constant for use in the program.  The constant MaxSize can
  271. be used anywhere in the program that it is desired to use the
  272. number 12, because it is a synonym for the value 12.  It can
  273. be used as an integer or cardinal number because it is
  274. compatible with both types.  In fact, it is compatible with
  275. the corresponding long types if they are available on your
  276. system.  Two additional constant values are defined for
  277. illustrative purposes only.  In the type declaration section
  278. we use the constant MaxSize to define two types, then use them
  279. to define several variables.
  280.  
  281. In the program there is one for loop using the same constant
  282. MaxSize as the upper limit.  It doesn't seem to be too useful
  283. yet, but suppose your boss came to you and said to change the
  284. program so that it handled 142 cases instead of 12.  The way
  285. the program is written, you would only have to change the
  286. value of the constant, recompile, and you would be done.  If
  287. you had used the number 12 everywhere, you would have to
  288. replace every 12 with the new number, 142, being careful not
  289. to change the one in line 21 which is a different kind of 12.
  290. Of course even that would not be too difficult in such a
  291. simple program, but in a program with 5000 lines of code, one
  292. simple change could take a week.
  293.  
  294.                                                            6-5
  295.  
  296.                       Chapter 6 - Arrays, Types, and Constants
  297.  
  298. Note that a constant must be initialized, but a variable
  299. cannot be initialized in Modula-2.  Be sure to compile and
  300. execute this program.
  301.  
  302.  
  303. THE OPEN ARRAY IN A PROCEDURE
  304. ______________________________________________________________
  305.  
  306. Examine the program named ARAYPASS.MOD for    ================
  307. an example of a program with arrays being       ARAYPASS.MOD
  308. passed to a procedure.  Notice how the        ================
  309. procedures are formatted.  The rows of
  310. asterisks make them really stand out and easy to find.  You
  311. should begin now to develop your own personal style of
  312. formatting in a way that is clear and easy to for you to
  313. follow.
  314.  
  315. The two procedures in this program are identical except for
  316. the way the arrays are passed to them.  In the first procedure
  317. named AddNumbers, the formal parameter named Donkey is passed
  318. the array from the actual parameter by using the same type
  319. which was used to define one of the arrays.  The procedure
  320. merely adds the values of the elements of the array passed to
  321. it and writes the result out to the monitor.  The way it is
  322. written, it is only capable of adding arrays that are indexed
  323. from 10 to 15.  Any other array will cause a type
  324. incompatibility error.  This is simply called passing an array
  325. to the procedure.
  326.  
  327. The second procedure named GenAddNumbers has its input array,
  328. better known as the formal parameter, defined as an ARRAY OF
  329. CARDINAL with no limits stated.  This procedure can add all
  330. of the variables in any cardinal array regardless of the range
  331. of its subscripts.  The lower subscript will always be defined
  332. as zero within this type of procedure, and the upper limit of
  333. the array can be found with the predefined function procedure
  334. named HIGH.  It is used as shown in the example.  The first
  335. time this procedure is called in the main program, it is
  336. called with the variable SizeOne.  In the procedure, the array
  337. subscripts for Donkey will be 0 through 5.  When the variable
  338. named SizeTwo is the array sent to the procedure, then the
  339. formal parameter named Donkey will have the limits of 0 and
  340. 218.  The second procedure definition method is therefore more
  341. general.  This is called passing an open array to the
  342. procedure.
  343.  
  344.  
  345. WHICH ONE SHOULD I USE?
  346. ______________________________________________________________
  347.  
  348. There will be times when you wish to use the general case for
  349. passing a parameter, the open array.  A good example is the
  350. procedure named WriteString that we have been using in this
  351. tutorial.  It would be a bit cumbersome if we were only
  352.  
  353.                                                            6-6
  354.  
  355.                       Chapter 6 - Arrays, Types, and Constants
  356.  
  357. allowed to pass, for example, a 10 character string to it each
  358. time.  Since it can accept a string of any length, it is
  359. evidently defined with an ARRAY OF CHAR as the formal
  360. parameter type in its header.  (We will see in a later chapter
  361. that this particular procedure is exactly that, a procedure
  362. that someone has thoughtfully programmed for you.  You only
  363. need to tell the system where it can be found using the IMPORT
  364. statement.)
  365.  
  366. There will likewise be times when you will desire to use the
  367. more specific method of definition.  If you are using a lot
  368. of arrays and have a specific operation that needs to be done
  369. to only a few arrays that have a common definition, you would
  370. be wise to use this method.  The computer could then tell you
  371. if you tried to use the procedure on an array that it was not
  372. intended for.  This is making wise use of the type checking
  373. available in the computer.
  374.  
  375. Note that open arrays are not assignment compatible and are
  376. limited to a singly dimensioned array.
  377.  
  378.  
  379. HANDLING STRINGS IN MODULA-2
  380. ______________________________________________________________
  381.  
  382. Examine the last example program for this     ================
  383. chapter, STRINGEX.MOD, for an example of        STRINGEX.MOD
  384. using strings in Modula-2.  This program      ================
  385. is the first program to deviate from the
  386. standard library as defined by Niklaus Wirth.  When he defined
  387. the language, he suggested several library procedures that
  388. should be available in every Modula-2 compiler and most
  389. compiler writers have followed his suggestions quite closely.
  390. He failed to define a standard library for the string handling
  391. procedures.  There is therefore some freedom for each compiler
  392. writer to define the string handling routines in any way he
  393. pleases.  Most however, have followed at least a resemblance
  394. to a standard, so the procedure calls are very similar from
  395. compiler to compiler.  It may be necessary for you to modify
  396. this file to suit your particular compiler.  Check your
  397. compiler documentation for complete information on how strings
  398. are implemented with your compiler.  A complete description
  399. of the Modula-2 libraries and what they are will be given in
  400. chapter 8.
  401.  
  402.  
  403. BACK TO THE STRINGEX.MOD PROGRAM
  404. ______________________________________________________________
  405.  
  406. The first thing that is different here is the addition of
  407. another IMPORT statement in line 10, this one importing
  408. procedures from the module named Strings.  This is the module
  409. containing the procedures which we will need in this program.
  410. A string is an array of type char, each element of the array
  411.  
  412.                                                            6-7
  413.  
  414.                       Chapter 6 - Arrays, Types, and Constants
  415.  
  416. being capable of storing one character.  Thus an array of char
  417. type elements is capable of storing a word, a sentence, a
  418. paragraph, or even a whole chapter, depending on how big the
  419. array is.  Using the example given in this program, we will
  420. learn how to manipulate text data.
  421.  
  422. One additional feature of the example program will be found
  423. on line 24.  In this line the WriteString procedure is used
  424. in a way we have not seen as yet.  Instead of having an
  425. expression in quotes, it has the name of a variable within its
  426. parentheses.  It will display whatever characters are stored
  427. in the string named Stuff defined by the ARRAY OF CHAR.  So
  428. if we learn how to get a string of characters stored in a
  429. variable of type string, we can display anything on the
  430. monitor that we can generate internal to the computer.
  431.  
  432. According to the definition of Modula-2, a string is an array
  433. of char type variables.  We will get more familiar with
  434. strings as we continue our study.
  435.  
  436.  
  437. SOME NEW STRING PROCEDURES
  438. ______________________________________________________________
  439.  
  440. The first line of the program itself, line 34, contains a
  441. string assignment.  In this case, we are telling the system
  442. to copy the constant ABCDEFGHIJKL into the variable named
  443. Horse.  The array into which you are copying must begin at
  444. index 0 in order for this to work because all character
  445. constants start at zero by definition.  The variable Horse,
  446. which only contains room for 12 characters will only receive
  447. the first 12 characters of the constant.  The procedure
  448. Display is called with Horse as the actual parameter and the
  449. parameter is displayed between parentheses for clarity of
  450. understanding, and the 12 characters of the variable are
  451. displayed in their ASCII equivalent.  When you finally run
  452. this program, compare some of the values to the ASCII table
  453. that is included with the DOS documentation that came with
  454. your computer.
  455.  
  456. In line 37 of the program, the constant 12345 is assigned to
  457. the variable named Cow.  In the next line, the variable Cow
  458. is assigned to the variable Horse, and the display procedure
  459. is called again.  This time, the variable Cow is shorter than
  460. the destination, so the system has to compensate for the
  461. difference.  After it transfers the 5 characters to Horse, it
  462. will place a 0 (zero) in the next position to indicate the end
  463. of the string.  The definition of the string still has 12
  464. places, but there are only 5 places of interest, so the system
  465. will consider all places past the 5th as undefined.  This time
  466. the system only prints out 5 characters in the procedure.
  467. The list of ASCII equivalents shows that the other values are
  468. still there, the output routine simply stopped when it came
  469. to the zero in the sixth position.
  470.  
  471.                                                            6-8
  472.  
  473.                       Chapter 6 - Arrays, Types, and Constants
  474.  
  475. A little refinement of our definition is in order.  If a
  476. string is full, that means if all character positions are
  477. used, a terminating zero is not required.  If a string is not
  478. full, meaning that less characters are actually used than are
  479. defined for the string, a terminating zero is used to indicate
  480. the desired length of the string.
  481.  
  482. According to the definition of Modula-2, a char type object
  483. is considered to be a string of length 1 and can therefore be
  484. handled in any way that it is legal to handle a string.
  485.  
  486. Note that the Assign statement may be different for different
  487. compilers because it is not a part of the Modula-2 definition
  488. by Niklaus Wirth.
  489.  
  490.  
  491. CONCATENATION
  492. ______________________________________________________________
  493.  
  494. Concatenation is simply putting two strings together to make
  495. up one bigger string.  Beginning in line 41, two new string
  496. variables are assigned string values, S1 and S2, then the two
  497. new variables are concatenated together and assigned to our
  498. old favorite variable named Horse.  The variable named Horse
  499. should now contain the silly expression NeatThings, and when
  500. you run the program, you will find that it does.  It also has
  501. a zero in character position 11, to indicate the end of the
  502. string.  Line 47 concatenates Horse to Cow and stores the
  503. result in Horse, but since the expression is now too long,
  504. part of it will get truncated and simply thrown away.
  505. Finally, Cow is concatenated to Horse, and the result stored
  506. back into Horse.  This has the effect of shifting the prior
  507. contents of Horse right and adding the characters stored in
  508. Cow to the beginning.  Line 45 is an example of a string
  509. assignment.  This is only possible because they are of the
  510. same type which means they were defined with the same type
  511. name.  The variable Cow has a different type so can't be
  512. assigned to either of these two variables.  Note that the type
  513. does not have to start at zero for string assignment to work.
  514.  
  515. Note that even though Horse was the only variable used in the
  516. calls to Display, any of the other strings could have been
  517. used also.  This is the topic of the fourth programming
  518. exercise below.
  519.  
  520. Compile and run the program and see if it really does do all
  521. that it should do as described above, keeping in mind that you
  522. may have to modify the file to accommodate your particular
  523. compiler.
  524.  
  525.  
  526.  
  527.  
  528.                                                            6-9
  529.  
  530.                       Chapter 6 - Arrays, Types, and Constants
  531.  
  532. PROGRAMMING EXERCISES
  533. ______________________________________________________________
  534.  
  535. 1.   Write a program to store the cardinal values 201 to 212
  536.      in an array then display them on the monitor.
  537.  
  538. 2.   Write a program to store a 10 by 10 array containing the
  539.      products of the indices, therefore a multiplication
  540.      table.  Display the matrix on the monitor in a neat and
  541.      readable format.
  542.  
  543. 3.   Modify the program in 2 above to include a constant so
  544.      that by simply changing the constant, the size of the
  545.      matrix and the range of the table will be changed.
  546.  
  547. 4.   Modify the program named STRINGEX.MOD to include calls
  548.      to Display with each of the string variables at the end
  549.      of the program.
  550.  
  551.  
  552.  
  553.  
  554.  
  555.  
  556.  
  557.  
  558.  
  559.  
  560.  
  561.  
  562.  
  563.  
  564.  
  565.  
  566.  
  567.  
  568.  
  569.  
  570.  
  571.  
  572.  
  573.  
  574.  
  575.  
  576.  
  577.  
  578.  
  579.  
  580.  
  581.  
  582.  
  583.  
  584.  
  585.                                                           6-10
  586.  
  587.