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

  1.        ╔════════════════════════════════════════════════════╗
  2.        ║ Lesson 4 Part 160  F-PC 3.5 Tutorial by Jack Brown ║
  3.        ╚════════════════════════════════════════════════════╝
  4.  
  5. \ This is the program that calculates the area of a polygon in terms
  6. \ of its verticies.  You should study the program and note how it
  7. \ uses variables and arrays that have been discussed in lesson 4.
  8.  
  9. \ This should be replaced by the bullet proof version of #IN given
  10. \ in Lesson 3.
  11. : #IN ( --  n )
  12.       QUERY  INTERPRET ;
  13.  
  14. CREATE X  102 ALLOT     \ Array for x coordinates
  15. CREATE Y  102 ALLOT     \ Array for y coordinates
  16.  
  17. VARIABLE  #POINTS       \ Number of points in polygon
  18. VARIABLE  AREA          \ Sum of the x(i)y(i-1) - x(i-1)y(i)
  19.  
  20. \ Array fetching and storing words.
  21. \ Fetch ith x component.
  22. : X@  ( i     x{i} ) 2* X + @ ;
  23.  
  24. \ Fetch ith y component.
  25. : Y@  ( i     y{i} ) 2* Y + @ ;
  26.  
  27. \ Store ith x component.
  28. : X!  ( x i     -- ) 2* X + ! ;
  29.  
  30. \ Store ith y component.
  31. : Y!  ( y i     -- ) 2* Y + ! ;
  32.  
  33. \ Move to the next tab stop.
  34. : TAB ( -- )
  35.          BEGIN  #OUT @ 8 MOD
  36.                IF SPACE ELSE EXIT THEN
  37.         AGAIN ;
  38.  
  39. \ Get number from keyboard with prompt symbol.
  40. : GET#  ( --  n )
  41.          ASCII >  EMIT SPACE  #IN ;
  42.  
  43. \ Prompt and fetch number of data points.
  44. : GET_#POINTS  ( -- )
  45.         BEGIN
  46.         CR ." Enter number of data points. "
  47.         GET#  DUP 3 <
  48.         WHILE  CR ." You need at least 3 data points!"
  49.         REPEAT  50 MIN #POINTS ! ;
  50.  
  51.  
  52. \ Prompt and fetch all data points.
  53. : GET_DATA      ( -- )
  54.         CR CR ." Point " TAB ."   X" TAB ."   Y"
  55.         #POINTS @ 1+ 1
  56.         DO   CR I 3 .R  TAB GET# I X!
  57.              TAB GET# I Y! LOOP
  58.         #POINTS @ DUP X@ 0 X! Y@ 0 Y! ;  \ Store last point in 0th slot
  59.  
  60. \ Sum data points.
  61. : FIND_AREA   ( -- )
  62.         0 AREA !
  63.         #POINTS @ 1+  1         ( n+1 so we loop n times )
  64.         DO I    X@ I 1- Y@ *    ( X{i}*Y{i-1} )
  65.            I 1- X@ I    Y@ *    ( X{i-1}*Y{i} )
  66.            - AREA +!
  67.         LOOP  ;
  68.  
  69.  
  70. \ Display computed area.
  71. : PUT_AREA      ( -- )
  72.         AREA @ 2 /MOD
  73.         CR ." AREA = " 6 .R  ASCII . EMIT
  74.         IF ASCII 5 EMIT ELSE ASCII 0 EMIT THEN SPACE ;
  75.  
  76. \ Compute area of polygon.
  77. : POLY     ( -- )
  78.         GET_#POINTS
  79.         GET_DATA
  80.         FIND_AREA
  81.         PUT_AREA ;
  82.  
  83. \ ╓──────────────╖
  84. \ ║ Problem 4.24 ║
  85. \ ╙──────────────╜
  86. \ Implement and Test the POLY program.
  87. \ POLY is the name of the end user program.  Type POLY and use the test
  88. \ data that is provided in the examples of lesson 4 part 15 and then
  89. \ make up some test data of your own.
  90.  
  91. \ Your next problem is going to be to modify the above program so that
  92. \ it also computes the perimeter of the polygon.  You can begin thinking
  93. \ about how this might be done.  Some suggestion on how to proceed will
  94. \ be provided in part 170 of lesson 4 which follows.
  95.  
  96.