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

  1.  
  2.                                                     Chapter 11
  3.  
  4.                                                        RECORDS
  5.  
  6.  
  7.  
  8. PREREQUISITES FOR THIS MATERIAL
  9. ______________________________________________________________
  10.  
  11. In order to do a profitable study of this material, you will
  12. need a good understanding of all of the material in Part I.
  13. The material concerning the scalar type from chapter 11 is
  14. also needed.
  15.  
  16. We come to the grandaddy of all data          ================
  17. structures in Modula-2, the record.  A          SMALLREC.MOD
  18. record is composed of a number of             ================
  19. variables any of which can be of any
  20. predefined data type, including other records.  Rather than
  21. spend time trying to define a record in detail, lets go right
  22. to the first example program, SMALLREC.MOD.  This is a program
  23. using nonsense data that will illustrate the use of a record.
  24.  
  25.  
  26. A VERY SIMPLE RECORD
  27. ______________________________________________________________
  28.  
  29. There is only one entry in the type declaration part of the
  30. program, namely the record identified by Description.  The
  31. record is composed of three fields, the Year, Model, and
  32. Engine variables.  Notice that the three fields are each of
  33. a different type, indicating that the record can be of mixed
  34. types.  You have a complete example of the way a record type
  35. is defined before you.  It is composed of the identifier
  36. Description, the reserved word RECORD, the list of elements,
  37. and followed by END;.  Notice that this only defines a type,
  38. it does not define any variables.  That is done in the var
  39. declaration where the variable Truck is defined as a record
  40. variable of type Description.  The variable Truck has three
  41. components, Year, Model, and Engine, and any or all of these
  42. components can be used to store data pertaining to the
  43. variable named Truck.
  44.  
  45. An array of 10 Cars is also defined in line 13 for later use.
  46.  
  47. In order to assign values to the various fields, the variable
  48. name is followed by the sub-field with a separating period.
  49. Keep in mind that Truck is a complete record containing three
  50. variables, and to assign or use one of the variables, you must
  51. designate which sub-field you are interested in.  Examine the
  52. program where the three fields are assigned meaningless data
  53. for illustration in lines 18 through 20.  Notice that each of
  54. the components is treated as a simple variable and each
  55. component is assigned some nonsense data for illustration.
  56. Study the dot notation carefully here because it will be used
  57. frequently in Modula-2 programs.
  58.  
  59.                                                           11-1
  60.  
  61.                                           Chapter 11 - Records
  62.  
  63. The loop in lines 22 through 26 is used to assign nonsense
  64. data to all of the fields of the array of record variables
  65. named Cars.  The Year field is assigned an integer number
  66. varying with the subscript, all Model fields are assigned the
  67. name Duesenburg, and all Engine variables are assigned the
  68. value V8.  In order to further illustrate that there are
  69. actually 30 variables in use here, a few are changed at random
  70. in the next few statements, being very careful to maintain the
  71. required types as defined in the type declaration part of the
  72. program.
  73.  
  74. The Truck variable is printed out for illustration and
  75. finally, all ten composite variables named Cars, consisting
  76. of 30 actual variables in a logical grouping are printed out
  77. using the same "var.subfield" notation described above.  If
  78. the preceding description of a record is not clear in your
  79. mind, review it very carefully.  It's a very important concept
  80. in Modula-2, and you won't have a hope of a chance of
  81. understanding the next example until this one is clear.  Keep
  82. in mind that a record is used to group some number of possibly
  83. different types of data that are related to each other in some
  84. way.
  85.  
  86.  
  87. A SUPER RECORD
  88. ______________________________________________________________
  89.  
  90. Examine the example file BIGREC.MOD for a     ================
  91. very interesting record.  First we have a        BIGREC.MOD
  92. constant defined.  Ignore it for the          ================
  93. moment, we will come back to it later.
  94. Within the type declaration we have three records defined, and
  95. upon close examination, you will notice that the first two
  96. records are included as part of the definition of the third
  97. record.  The record identified as Person actually contains 8
  98. variable definitions, three within the FullName record, two
  99. of its own, and three within the Date record.  Once again,
  100. this is a type declaration and does not actually define any
  101. variables.  The actual variables will be defined in the var
  102. part of the program.
  103.  
  104. The var part of the program defines some variables beginning
  105. with the array of Friend containing 50 (because of the
  106. constant definition in the const part) records of Person.
  107. Since Person defines 8 fields, we have now defined 8 times 50
  108. = 400 separate and distinct variables.  Each of the 400
  109. separate variables has its own type associated with it, and
  110. the compiler will generate an error if you try to assign any
  111. of those variables the wrong type of data.  Since Person is
  112. a type definition, it can be used to define more than one
  113. variable, and in fact it is used again to define three more
  114. records, Self, Mother, and Father.  These three records are
  115. each composed of 8 variables, so we have 24 more variables
  116.  
  117.                                                           11-2
  118.  
  119.                                           Chapter 11 - Records
  120.  
  121. which we can manipulate within the program.  Finally we have
  122. the variable Index defined as a simple cardinal type variable.
  123. Notice that if we desired, we could also define a variable of
  124. type FullName composed of 3 simple variables.
  125.  
  126.  
  127. HOW TO MANIPULATE ALL OF THAT DATA
  128. ______________________________________________________________
  129.  
  130. In the program we begin by assigning data to all of the fields
  131. of Self in lines 30 through 42.  Examining the first three
  132. statements of the main program, we see the construction we
  133. learned in the last example program being used, namely the
  134. period between descriptor fields.  The main record is named
  135. Self, and we are interested in the first part of it, namely
  136. the Name part of the person record.  Since the Name part of
  137. the person record is itself composed of three parts, we must
  138. designate which part of it we are interested in.  The name
  139. Self.Name.FirstName is the complete description of the first
  140. name of Self and is the first assignment statement which is
  141. assigned the name of Charley.  The next two fields are handled
  142. in the same way and should be self explanatory.
  143.  
  144.  
  145. WHAT IS THE WITH STATEMENT?
  146. ______________________________________________________________
  147.  
  148. Continuing on to the fourth field, the City, there are only
  149. two levels required because City is not another record
  150. definition.  The fourth field is therefore completely defined
  151. by Self.City.  Notice the "WITH Self DO" statement.  This is
  152. a shorthand notation used with record definitions to simplify
  153. coding used in the same manner as in Pascal.  From the next
  154. statement to the matching end statement in line 42, any
  155. variables within the Self record are used as though they had
  156. a Self. in front of them.  It greatly simplifies coding to be
  157. able to omit the leading identifier within the with section
  158. of code.  You will see that City, and State, are easily
  159. assigned values without further reference to the Self
  160. variable.  When we get to the Day part of the birthday, we are
  161. back to three levels and the complete definition is
  162. Self.Birthday.Day but once again, the Self part is taken care
  163. of automatically because we are still within the "WITH Self
  164. DO" area.
  165.  
  166. To illustrate the with statement further, another is
  167. introduced, "WITH Birthday DO", which takes effect until the
  168. end statement.  Within this area both leading identifiers are
  169. handled automatically to simplify coding, and Month is
  170. equivalent to writing Self.Birthday.Month if both with
  171. statements were removed.  You may be wondering how many levels
  172. of nesting are allowed in record definitions.  There doesn't
  173. appear to be a limit according to the Modula-2 definition, but
  174. we do get a hint at how far it is possible to go.  In most
  175.  
  176.                                                           11-3
  177.  
  178.                                           Chapter 11 - Records
  179.  
  180. implementations of Modula-2, you are allowed to have with
  181. statements nested to nine levels, and it would be worthless
  182. to nest with statements deeper than the level of record
  183. nesting.  Any program requiring more levels than nine is
  184. probably far beyond the scope of your programming ability, and
  185. mine, for a long time.
  186.  
  187. After assigning a value to the year, the entire record of Self
  188. is defined, all eight variables.
  189.  
  190.  
  191.  
  192. SUPER-ASSIGNMENT STATEMENTS
  193. ______________________________________________________________
  194.  
  195. The next statement, Mother := Self; is very interesting.
  196. Since both of these are records, both are the same type of
  197. record, and both therefore contain 8 variables, Modula-2 is
  198. smart enough to recognize that, and assign all eight values
  199. contained in Self to the corresponding variables of Mother.
  200. So after one statement, Mother is completely defined.  The
  201. next statement assigns the same values to the eight respective
  202. fields of Father, and the loop in lines 47 through 50 assigns
  203. all 50 Friend variables the same data.  We have therefore
  204. generated 400 + 24 = 424 separate pieces of data so far in
  205. this program.  We could print it all out, but since it is
  206. nonsense data, it would only waste time and paper.  Lines 51
  207. through 56 write out three sample pieces of the data for your
  208. inspection.
  209.  
  210.  
  211.  
  212. WHAT GOOD IS ALL OF THIS
  213. ______________________________________________________________
  214.  
  215. It should be obvious to you that what this program does, even
  216. though the data is nonsense, appears to be the beginning of
  217. a database management program, which indeed it is.  It is a
  218. crude beginning, and has a long way to go to be useful, but
  219. you should see a seed for a useful program.
  220.  
  221. Now to go back to the const as promised.  The number of
  222. friends was defined as 50 and used for the size of the array
  223. and in the assignment loop near the end of the program.  You
  224. can now edit this number and see how big this database can
  225. become on your computer.  Your compiler should be capable of
  226. storing about 1000 records even within the smallest model
  227. available on any compiler.  If your compiler uses a larger
  228. memory model, you will be able to store significantly more
  229. records.  See how big you can make the number of friends
  230. before you get the memory overflow message.  Keep the number
  231. in mind because when we get to the chapter on Pointers and
  232. Dynamic Allocation, you should see a marked increase in
  233. allowable size, especially if you have a large amount of RAM
  234.  
  235.                                                           11-4
  236.  
  237.                                           Chapter 11 - Records
  238.  
  239. installed in your computer.  If your compiler uses a large
  240. memory model, you won't see an increase in size but it will
  241. be an interesting exercise anyway.
  242.  
  243.  
  244. A VARIANT RECORD
  245. ______________________________________________________________
  246.  
  247. If any part of this chapter is still unclear, it would be good
  248. for you to go back and review it at this time.  The next
  249. example will really tax your mind to completely understand it,
  250. especially if the prior material is not clear.
  251.  
  252. Examine the program VARREC.MOD for an         ================
  253. example of a program with a variant record       VARREC.MOD
  254. definition.  In this example, we first        ================
  255. define a scalar type, namely KindOfVehicle
  256. for use within the record.  Then we have a record defining
  257. Vehicle, intended to define several different types of
  258. vehicles, each with different kinds of data.  It would be
  259. possible to define all variables for all types of vehicles,
  260. but it would be a waste of storage space to define the number
  261. of tires for a boat, or the number of propeller blades used
  262. on a car or truck.  The variant record lets us define the data
  263. precisely for each vehicle without wasting data storage space.
  264.  
  265.  
  266. WHAT IS A TAG-FIELD?
  267. ______________________________________________________________
  268.  
  269. In the record definition we have the usual record header
  270. followed by three variables defined in the same manner as the
  271. records in the last two example programs.  Then we come to the
  272. case statement.  Following this statement, the record is
  273. different for each of the four types defined in the associated
  274. scalar definition.  The variable WhatKind is called the
  275. tag-field and must be defined as a scalar type prior to the
  276. record definition.  The tag-field selects the variant used,
  277. when the program uses one of the variables with this record
  278. type.  The tag-field is followed by a colon and its type
  279. definition, then the reserved word OF.  A list of the variants
  280. is then given, with each of the variants having the variables
  281. for its particular case defined.  The list of variables for
  282. one variant is called the field list.
  283.  
  284. A few rules are in order at this point.  The variants do not
  285. have to have the same number of variables in each field list,
  286. and in fact, one or more of the variants may have no variables
  287. at all in its variant part.  If a variant has no variables,
  288. it must still be defined with a blank followed by a
  289. semi-colon.  All variables in the entire variant part must
  290. have unique names.  The three variables, Wheels, Tires, and
  291. Tyres, all mean the same thing to the user, but they must be
  292. different for the compiler.  You may use the same identifiers
  293.  
  294.                                                           11-5
  295.  
  296.                                           Chapter 11 - Records
  297.  
  298. again in other records and for simple variables anywhere else
  299. in the program.  The Modula-2 compiler can tell which variable
  300. you mean by its context.  Using the same variable name should
  301. be discouraged as bad programming practice because it may
  302. confuse you or another person trying to understand your
  303. program at a later date.
  304.  
  305.  
  306. USING THE VARIANT RECORD
  307. ______________________________________________________________
  308.  
  309. We properly define four variables with the record type Vehicle
  310. and go on to examine the program itself.
  311.  
  312. We begin by defining one of our variables of type Vehicle,
  313. namely the variable named Ford.  The seven lines assigning
  314. values to Ford are similar to the prior examples with the
  315. exception of the fourth line.  In the fourth line the
  316. tag-field which selects the particular variant used is set
  317. equal to the value Truck, which is a scalar definition, not
  318. a variable.  This means that the variables named Motor, Tires,
  319. and Payload are available for use with the record Ford, but
  320. the variables named Wheels, Engine, Tyres, etc. are not
  321. available in the record named Ford.
  322.  
  323. Next, let's define the record Sunfish as a boat, and define
  324. all of its variables.  All of sunfish's variables are defined
  325. but in a rather random order to illustrate that they need not
  326. be defined in a particular order.  Recall the use of with from
  327. the last example program.
  328.  
  329. To go even further in randomly assigning the variables to a
  330. record, we redefine Ford as having an Engine which it can only
  331. have if it is a car.  This is one of the fine points of the
  332. record.  If you assign any of the variant variables, the
  333. record is changed to that variant, but it is the programmers
  334. responsibility to assign the correct tag-field to the record,
  335. not the Modula-2 compiler's.  Good programming practice would
  336. be to assign the tag-field before assigning any of the variant
  337. variables.  The remainder of the Ford variables are assigned
  338. to complete that record, the non-variant part remaining from
  339. the last assignment.
  340.  
  341. The variable named Mac is now assigned the value of the
  342. variable Sunfish.  All variables within the record are copied
  343. to Mac including the tag-field, making Mac a boat.
  344.  
  345.  
  346. NOW TO SEE WHAT WE HAVE IN THE RECORDS
  347. ______________________________________________________________
  348.  
  349. We have assigned Ford to be a car, and two boats exist, namely
  350. Sunfish and Mac.  Since Schwinn was never defined, it has no
  351. data in it, and is at this point useless.  The Ford tag-field
  352.  
  353.                                                           11-6
  354.  
  355.                                           Chapter 11 - Records
  356.  
  357. has been defined as a car, so it should be true in the if
  358. statement in line 54, and the first message should print.  The
  359. Sunfish is not a bicycle, so the statement in line 63 will not
  360. print.  The Mac has been defined as a boat in the single
  361. assignment statement, so it will print a message with an
  362. indication that all of the data in the record was transferred
  363. to its variables.
  364.  
  365. Even though we can make assignment statements with records,
  366. they cannot be used in any mathematical operations such as
  367. addition, or multiplication.  They are simply used for data
  368. storage.  It is true however, that the individual elements in
  369. a record can be used in any mathematical statements legal for
  370. their respective types.
  371.  
  372. One other point should be mentioned.  The tag-field can be
  373. completely eliminated resulting in a "free union" variant
  374. record.  This is possible because Modula-2, as you may
  375. remember from above, will automatically assign the variant
  376. required when you assign data to one of the variables within
  377. a variant.  This is the reason that all variables within any
  378. of the variants must have unique names.  The free union record
  379. should be avoided in your early programming efforts because
  380. you cannot test a record to see what variant it has been
  381. assigned to.
  382.  
  383.  
  384. A NOTE TO PASCAL PROGRAMMERS
  385. ______________________________________________________________
  386.  
  387. A record with a free union variant is commonly used in Pascal
  388. to do type transfers, but this should be discouraged in
  389. Modula-2 since it has a complete set of carefully defined type
  390. transfer functions for that purpose.  In addition, the method
  391. of data storage is not specified as a part of the language and
  392. a free union would not operate the same way with different
  393. compilers if used for the purpose of type transfer.
  394.  
  395.  
  396. PROGRAMMING EXERCISE
  397. ______________________________________________________________
  398.  
  399.  
  400. 1.   Write a simple program with a record to store the names
  401.      of five of your friends and display the names.
  402.  
  403.  
  404.  
  405.  
  406.  
  407.  
  408.  
  409.  
  410.                                                           11-7
  411.  
  412.