home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / forth / compiler / fpc / tutor / l4p060 < prev    next >
Text File  |  1990-07-15  |  5KB  |  114 lines

  1.        ╔════════════════════════════════════════════════════╗
  2.        ║ Lesson 4 Part 060  F-PC 3.5 Tutorial by Jack Brown ║
  3.        ╚════════════════════════════════════════════════════╝
  4.  
  5.                     ┌───────────────────┐
  6.                     │  Forth CONSTANTs. │
  7.                     └───────────────────┘
  8.  
  9. In Forth a constant is used to represent a value which will not change
  10. during the operation of the program.  When a constant is created in
  11. Forth both its name and its value must be specified. When a constant is
  12. created its initial value must be on the stack.
  13.  
  14. CONSTANT <name> ( n -- )  Create a constant  <name> whose value is  n.
  15.  
  16. When a constant is executed its initial value will be recovered from
  17. its storage location and be placed on the parameter stack.
  18.   <name>            ( --    n )  Leave value of <name> on stack.
  19.  
  20. \ Examples:
  21.  24  CONSTANT  HOURS/DAY       \ Hours per day.
  22.   7  CONSTANT  DAYS/WEEK       \ Days per week.
  23.  52  CONSTANT  WEEKS/YEAR      \ Weeks per year.
  24.  12  CONSTANT  MONTHS/YEAR     \ Months per year.
  25.  
  26. : HOURS/WEEK  ( -- hours )  HOURS/DAY  DAYS/WEEK *  ;
  27. : HOURS/YEAR  ( -- hours )  HOURS/WEEK  WEEKS/YEAR * ;
  28.  
  29. ╓─────────────╖
  30. ║ Problem 4.7 ║
  31. ╙─────────────╜
  32. Create the constants  SECONDS/MINUTE and MINUTES/HOUR and then use these
  33. words to calculate the number of seconds and minutes in a Day and a
  34. week.  What are you going to do if the answers to any of these should
  35. happen to exceed 65535?
  36.  
  37.                      ┌────────────────┐
  38.                      │  The */ Scalar │
  39.                      └────────────────┘
  40.  
  41. Let's take take a look at the */ operator that has crept into a few of
  42. our examples.  One place it was used was in our random number generator.
  43.  
  44.  */  ( a b c -- a*b/c)
  45.  
  46. This operator multiplies a and b and then divides by c, however it is
  47. not exactly the same as  the phrase " a b *  c /  ". This is because
  48. when */ is used the product a*b is retained as a double precision
  49. intermediate or 32bit value until the division has been completed.  This
  50. retention of extra accuracy in the product before the division makes
  51. this word useful in scaling or multiplying by fractions.
  52.  
  53. We like to look at the */  which is often pronounced "star-slash" as the
  54. multiply by a fraction operator.
  55.  
  56.   */  ( a b c --  a*(b/c)  )
  57.  
  58. Here is an example of using */ in this way to multiply  by pi
  59.  
  60.  31416 CONSTANT PI
  61. : *PI   ( n -- n*pi )    PI 10000 */ ;
  62. : CIRC  ( r -- circ )    2 * *PI     ;
  63. : AREA  ( r    area )    DUP * *PI   ;
  64.  
  65. ╓─────────────╖
  66. ║ Problem 4.8 ║
  67. ╙─────────────╜
  68. Research project:  Find the */ scalar in Brodie's Starting Forth and
  69. report back to the rest of us on the various rational fraction
  70. approximations to some of the common constants used in practical
  71. mathematical calculations.  Make up some useful words to illustrate the
  72. use of the */ scalar operator and these rational approximations to
  73. pi, e, sqrt(2)  etc.
  74.  
  75.                    ┌──────────────────────┐
  76.                    │  Pythagorean triples │
  77.                    └──────────────────────┘
  78.  
  79. Here is a little program that looks for pythagorean triples.  A
  80. pythagorean triple, is a set of three integers that can represent the
  81. sides of a right angled triangle.  You must surely recall the old 3 4 5
  82. right triangle used in geometry.   The program below doesn't look
  83. particularly exciting and certainly isn't  very efficient.  It just uses
  84. brute force to test all every possibility.
  85.  
  86. \ Pythagorean Triples.
  87.   VARIABLE A    VARIABLE B      VARIABLE C      VARIABLE N
  88.   VARIABLE AA   VARIABLE BB     VARIABLE CC
  89. : .ABC  ( -- )
  90.         CR A @ 12 .R  B @ 12 .R  C @ 12 .R ;
  91. : TRIPLES ( -- )
  92.          25 1 DO   I A !  I DUP *  AA !
  93.                25 1 DO  I B ! I DUP *  BB !
  94.                      38 1 DO I C ! I DUP *  CC !
  95.                              AA @ BB @ + CC @ =
  96.                              IF .ABC THEN
  97.                     LOOP  LOOP
  98.   KEY?  ?LEAVE   ( any key escape )  LOOP ;
  99.  
  100. ╓─────────────╖
  101. ║ Problem 4.9 ║
  102. ╙─────────────╜
  103. Modify the above program so it will find all triples up to 100.  Can you
  104. make the program run faster, using SQRT ? , without using variables?
  105. Modify so that triples are counted.  Is it possible to modify the
  106. program so that 3 4 5  and 4 3 5 are not both reported and counted as
  107. they are rally both the same triangle.  The triple 6 8 10 is really
  108. just a multiple of the triple 3 4 5 , is it possible to modify the
  109. program so that only unique triples are reported?
  110.  
  111. ┌────────────────────────────────────┐
  112. │  Please move to Lesson 4 Part 070  │
  113. └────────────────────────────────────┘
  114.