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

  1.        ╔════════════════════════════════════════════════════╗
  2.        ║ Lesson 3 Part 090  F-PC 3.5 Tutorial by Jack Brown ║
  3.        ╚════════════════════════════════════════════════════╝
  4.  
  5.  
  6. We continue our discussion of  IF ... ELSE .... THEN
  7.  
  8. If you would like to know more about D-Charts check out Starting Forth
  9. 2nd edition chapter 11 page 281 "Introduction to Forth Flowcharts".
  10.  
  11. ╓──────────────╖
  12. ║ Problem 3.18 ║
  13. ╙──────────────╜
  14. Construct the D-Chart for your solution to problem 3.13
  15.  
  16. ╓──────────────╖
  17. ║ Problem 3.19 ║
  18. ╙──────────────╜
  19. Construct the D-Chart for the word PCKEY whose definition was
  20. given in lesson 3 part 7.
  21.  
  22. Consider the following scenario:
  23. We are writing a program for the Super-F Radar Gun  (used for checking
  24. the speed of motor vehicles).  We word that will take the vehicle speed
  25. as a stack input and print one of the following messages when the speed
  26. limit is 50 kmph.
  27.  
  28.             Message                              Speed range kmph
  29.  
  30. " issue ticket,    impeding traffic flow."           0   -  15
  31. " issue warning,   impeding traffic flow."          16   -  30
  32. " no action,       safe speed."                      31   -  55
  33. " issue warning,   exceeding speed limit."           56   -  65
  34. " issue ticket,    exceeding speed limit."           66   - 100
  35. " arrest motorist, dangerous driving."              100   -
  36.  
  37. By the way... we are going to use kilometers per hour to measure the
  38. speed.  Do all our Forth Friends in the good old US of A realize that if
  39. the Canada - US Free Trade Deal goes through that they will have to
  40. switch to the metric system for all weights and measures??
  41. Note:  30 kmph = 18 mph, 50 kmph = 30 mph,  100 kmph = 60 mph  etc.
  42.  
  43. Let's see how should we proceed....  Oh..  Let's use our interval testing
  44. words..  Remember  [IN] and the rest of the family?
  45.  
  46. \ Leave true flag is speed is very slow  0 - 15 kmph
  47. : VERY_SLOW? ( speed -- flag)  0 15 [IN] ;
  48.  
  49. \ Leave true flag if speed is slow  16 - 30 kmph
  50. : SLOW? ( speed -- flag )      16 30 [IN] ;
  51.  
  52. \ Leave true flag if speed is normal  31 - 55 kmph
  53. : NORMAL? ( speed -- flag )    31 55 [IN] ;
  54.  
  55. \ Leave true flag if speed is fast    56 - 65 kmph
  56. : FAST? ( speed -- flag )      56 65 [IN] ;
  57.  
  58. \ Leave true flag if speed is very fast  66- 99 kmph
  59. : VERY_FAST? ( speed -- flag ) 66 99 [IN] ;
  60.  
  61. \ Leave true flag if speed is dangerous   100 kmph and over.
  62. : DANGEROUS? ( speed -- flag ) 99 > ;
  63.  
  64. \ Check speed and print appropriate message.
  65. : SPEED_CHECK ( speed -- )
  66.     DUP VERY_SLOW?
  67.     IF   ." Issue ticket,    impeding traffic flow." DROP
  68.     ELSE DUP SLOW?
  69.         IF   ." Issue warning,   impeding traffic flow." DROP
  70.         ELSE  DUP NORMAL?
  71.             IF   ." No action,       safe speed." DROP
  72.             ELSE DUP FAST?
  73.                 IF   ." Issue warning,   exceeding speed limit." DROP
  74.                 ELSE DUP VERY_FAST?
  75.                     IF   ." Issue ticket,    exceeding speed limit." DROP
  76.                     ELSE DANGEROUS?
  77.                         IF   ." Arrest motorist, dangerous driving."
  78.                          THEN
  79.                     THEN
  80.                 THEN
  81.             THEN
  82.         THEN
  83.     THEN ;
  84.  
  85. Example of the execution of speed_check.
  86.  
  87.  10 SPEED_CHECK <enter> Issue ticket,    impeding traffic flow. ok
  88.  20 SPEED_CHECK <enter> Issue warning,   impeding traffic flow. ok
  89.  40 SPEED_CHECK <enter> No action,       safe speed. ok
  90.  60 SPEED_CHECK <enter> Issue warning,   exceeding speed limit. ok
  91.  70 SPEED_CHECK <enter> Issue ticket,    exceeding speed limit. ok
  92. 200 SPEED_CHECK <enter> Arrest motorist, dangerous driving. ok
  93.  -1 SPEED_CHECK <enter>  ok
  94.  
  95. ╓───────────────╖
  96. ║ Problem 3.20  ║
  97. ╙───────────────╜
  98. Make a word called BROKEN? that leaves a true flag if the speed is
  99. negative and then modify the SPEED_CHECK to print the appropriate
  100. message for this case.  Let's also make SPEED_CHECK to recognize
  101. impossibly high rates of speed and issue an appropriate message.
  102.  
  103. ╓───────────────╖
  104. ║ Problem 3.21  ║
  105. ╙───────────────╜
  106. Rewrite SPEED_CHECK without using the words [IN] ...(IN).  It should be
  107. possible to write a more efficient version because it should not be
  108. necessary to check both ends of all the speed intervals.
  109.  
  110. ╓───────────────╖
  111. ║ Problem 3.22  ║
  112. ╙───────────────╜
  113. Rewrite SPEED_CHECK so that the most common occurrences are tested first
  114. and the least common last.  For example check for NORMAL? speed first
  115. and BROKEN? last.
  116.  
  117. ┌────────────────────────────────────┐
  118. │  Please move to Lesson 3 Part 100  │
  119. └────────────────────────────────────┘
  120.