ckedemo.ksc
上传用户:dufan58
上传日期:2007-01-05
资源大小:3407k
文件大小:8k
源码类别:

通讯/手机编程

开发平台:

Windows_Unix

  1. #!/usr/local/bin/kermit
  2. ; UNIX: Change previous line to contain full pathname of C-Kermit 7.0 binary.
  3. COMMENT - File CKEDEMO.KSC
  4. ;
  5. ; Exercises Kermit's programming constructs.
  6. ; Converted to block-structured format, March 1996.
  7. ; Updated to C-Kermit 7.0, April 1999.
  8. ;
  9. echo If you don't see the message "Proceeding..."
  10. echo on the next line, C-Kermit was not configured for script programming.
  11. check if
  12. echo Proceeding...
  13. echo
  14. switch v(program) {
  15.   :C-Kermit,
  16.     if ( < v(version) 70000 ) stop 1 Version 7.0 or later required...
  17.     echo C-Kermit Programming-Constructs Test
  18.     break
  19.   :default
  20.     stop 1 Sorry - this demo only works with C-Kermit 7.0 or later.
  21. }
  22. echo
  23. echo Defining macros:
  24. COMMENT - SPELLNUM macro.
  25. ;
  26. echo { SPELLNUM}
  27. define SPELLNUM {
  28.   local %x &a[]
  29.   dcl &a[9] = one two three four five six seven eight nine
  30.   .&a[0] = zero
  31.   if ( not def %1 ) end 1
  32.   .%1 ::= %1
  33.   if ( < %1 0 ) {
  34.      .%x = { minus}
  35.      .%1 ::= 0-%1
  36.   }
  37.   if ( > %1 9 ) end 1 { Sorry, too hard}
  38.   echo %x &a[%1]
  39. }
  40. COMMENT - CALC macro.  "Pocket calculator".  No arguments.
  41. ;
  42. echo { CALC}
  43. define CALC {
  44.     echo Press Return to exit ; Say how to exit.
  45.     while 1 { ; Loop until they want to exit
  46. ask %1 { expression: } ; Ask for an expression
  47.         if ( not def %1 ) break
  48. echo flpad(feval(%1),10) ; Evaluate and print answer
  49.     }
  50.     echo Back to... ; All done
  51. }
  52. echo { ADDINGMACHINE}
  53. define ADDINGMACHINE {
  54.     local total %s %x
  55.     echo Type numbers (one per line) or press Return to quit...
  56.     assign total 0 ; Initialize the sum
  57.     while true { ; Loop till done
  58. askq %s ; Wait for a number
  59. if ( not def %s ) break ; Return quits loop
  60. .%x ::= %s
  61.         if ( not def %x ) { echo "%s" invalid - try again, continue }
  62. increment total %x ; Add it to the sum
  63. if fail { echo Can't add "%s", continue }
  64. xecho flpad(%s,10)flpad(m(total),10) ; Print number and subtotal
  65.     }
  66.     echo Totalflpad(m(total),15,.)
  67. }
  68. COMMENT - SMALLEST macro, recursive.  Arguments:
  69. ; 1 = a number or expression
  70. ; 2 = a number or expression
  71. ; 3 = a number or expression
  72. ; Prints the smallest of the three.
  73. ;
  74. echo { SMALLEST}
  75. def SMALLEST {
  76.     local %a %i &a[]
  77.     dcl &a[3]
  78.     if ( != v(argc) 4 ) end 1 { Sorry - three numbers required.}
  79.     for %i 1 3 1 {
  80.         .&a[%i] ::= &_[%i]
  81.         if not numeric &a[%i] end 1 { Bad number or expression }
  82.     }
  83.     if ( < &a[1] &a[2] ) { ; Compare first two arguments
  84. echo &a[1] is less than &a[2] ; The first one is smaller
  85. if ( < &a[1] &a[3] ) { ; Compare it with the third
  86.        echo &a[1] is less than &a[3] ; The first one is smaller
  87.     .%a := &a[1] ; Copy it to %a
  88. } else {                        ; The third is smaller
  89.     echo &a[1] is not less than &a[3]
  90.     .%a := &a[3] ; Copy it to %a
  91.         }
  92.     } else { ; Otherwise
  93. echo &a[1] is not less than &a[2] ; The second is smaller
  94. if ( < &a[2] &a[3] ) { ; Compare it with the third
  95.     echo &a[2] is less than &a[3] ; The second is smaller
  96.     .%a := &a[2] ; Copy it to %a
  97. } else {                        ; The third is smaller
  98.     echo &a[2] is not less than &a[3]
  99.     .%a := &a[3] ; Copy it to %a
  100. }
  101.     }
  102.     echo So the smallest is %a. ; Announce the winner
  103. }
  104. ec Spelling some numbers...
  105. for %i -5 9 1 { spellnum %i }
  106. echo Calculator demo...
  107. calc
  108. echo Adding machine demo - Enter an empty line to quit...
  109. addingmachine
  110. COMMENT - SUM macro, recursive.  Argument:
  111. ; 1 = limit of sum, a positive number.
  112. ; Returns sum of 1 through the number.
  113. ;
  114. echo { SUM}
  115. def SUM {
  116.     if not def %1 return ; Make sure there is an argument
  117.     if not numeric %1 return ; Make sure argument is numeric
  118.     if not > %1 0 return ; Make sure argument is positive
  119.     if = %1 1 return 1 ; If argument is 1, the sum is 1
  120.     else return feval(%1+fexecute(sum,feval(%1-1)))
  121. }
  122. COMMENT - ADDEMUP macro, for calling SUM.
  123. ;
  124. echo { ADDEMUP}
  125. def ADDEMUP {
  126.     local total
  127.     assign total fexec(sum,%1)
  128.     if def total echo SUM(%1) = m(total)
  129.     else echo SUM doesn't work for %1
  130. }
  131. addemup 1
  132. addemup 2
  133. addemup 3
  134. addemup 4
  135. addemup 5
  136. addemup 10
  137. addemup 20
  138. :SMALLEST
  139. while true {
  140.     ask %x { Type 3 numbers separated by spaces or an empty line to quit:  }
  141.     if not def %x break
  142.     smallest %x
  143. }
  144. echo WHILE-LOOP TEST...
  145. echo You should see:
  146. echo { 0 1 2 3 4}
  147. def %a 0
  148. while < %a 5 { xecho { %a}, incr %a }
  149. echo
  150. echo NESTED WHILE-LOOP TEST...
  151. echo You should see:
  152. echo { 0:0 0:1 0:2 1:0 1:1 1:2 2:0 2:1 2:2}
  153. def %a 0
  154. while ( < %a 3 ) {
  155.     def %b 0
  156.     while ( < %b 3 ) {
  157.       xecho { %a:%b}
  158.       incr %b
  159.     }
  160.     incr %a
  161. }
  162. echo
  163. echo FOR-LOOP INSIDE WHILE-LOOP
  164. echo You should see:
  165. echo { 1:1 1:2 1:3 2:1 2:2 2:3 3:1 3:2 3:3}
  166. def %a 1
  167. while ( < %a 4 ) {
  168.     for %i 1 3 1 { xecho { %a:%i} }
  169.     inc %a
  170. }
  171. echo
  172. echo WHILE-LOOP INSIDE FOR-LOOP
  173. echo You should see:
  174. echo { 1:1 1:2 1:3 2:1 2:2 2:3 3:1 3:2 3:3}
  175. for %i 1 3 1 {
  176.   .%a = 1
  177.   while < %a 4 {
  178.       xecho { %i:%a}
  179.       incr %a
  180.   }
  181. }
  182. echo
  183. echo NESTED FOR LOOP TEST
  184. echo You should see:
  185. echo { 1:1 1:2 1:3 2:2 2:3 3:3}
  186. for %i 1 3 1 {
  187.     for %j %i 3 1 {
  188.         xecho { %i:%j}
  189.     }
  190. }
  191. echo
  192. echo NESTED FOR/WHILE/BREAK/CONTINUE TEST
  193. echo You should see:
  194. echo { 1:1 1:3 3:1 3:3}
  195. for %i 1 4 1 {
  196.     if = %i 2 continue
  197.     else if = %i 4 break
  198.     asg %j 0
  199.     while < %j 4 {
  200. incr %j
  201. if = %j 2 continue
  202. else if = %j 4 break
  203. xecho { %i:%j}
  204.     }
  205. }
  206. echo
  207. echo END from inside nested FOR loops
  208. echo You should see:
  209. echo { 1:1 1:2 1:3 2:1 2:2 2:3 3:1}
  210. define xx {
  211.     for %i 1 3 1 {
  212. for %j 1 3 1 {
  213.             xecho { %i:%j}
  214.     if = %i 3 if = %j 1 end
  215. }
  216.     }
  217. }
  218. do xx
  219. echo
  220. echo RETURN from inside nested FOR loops
  221. echo You should see "IT WORKS":
  222. define xx {
  223.     local %i %j
  224.     for %i 1 3 1 {
  225. for %j 1 3 1 {
  226.     if = %i 3 if = %j 1 return IT %1
  227. }
  228.     }
  229.     echo YOU SHOULD NOT SEE THIS
  230. }
  231. echo "fexec(xx WORKS)"
  232. :IFENDTEST
  233. echo END message from inside IF
  234. echo You should see "IT WORKS"
  235. def xx if = 1 1 { end 0 "IT %1"}
  236. xx WORKS
  237. echo Grouping of words in IF EQUAL
  238. echo You should see "IT WORKS":
  239. def %a one two three
  240. if equal {%a} {one two three} echo "IT WORKS"
  241. else echo It doesn't work, foo.
  242. ec
  243. echo Use of expressions and braces in FOR-loop variables
  244. echo You should see "1 2 3":
  245. def %a 2
  246. for %i 1 { 1 + %a } 1 { xecho {%i } }
  247. echo
  248. echo A macro that echoes its arguments
  249. def XX {
  250.   local %i
  251.     for %i 1 { v(argc) - 1 } 1 {
  252.       echo %i. "&_[%i]"
  253.     }
  254. }
  255. while true {
  256.     ask %a {Type some words (or just carriage return to quit): }
  257.     if not def %a break
  258.     xx %a
  259. }
  260. echo
  261. if not eq {v(connection)} {remote} forward arrays
  262. ec MINPUT test...
  263. ec Please type one of the following (without the number):
  264. ec {  1. ab cd}
  265. ec {  2. abcd}
  266. ec {  3. xyz}
  267. ec You have 10 seconds...
  268. minput 10 {ab cd} abcd xyz
  269. if success { echo, echo You typed Number v(minput).}
  270. else { echo, echo You did not type any of them within the time limit.}
  271. echo
  272. :ARRAYS
  273. echo ARRAY TEST I (SLOW)...
  274. ; Note that there are much better ways to do this.
  275. ; Here we're just testing subscript evaluation, looping, etc.
  276. ;
  277. declare &a[26]
  278. local %i %j %t                    ; Local variables
  279. assign %i 1
  280. asg &a[%i] zebra
  281. incr %i
  282. asg &a[%i] x-ray
  283. incr %i 1
  284. asg &a[%i] baker
  285. incr %i 3-2
  286. asg &a[%i] able
  287. decr %i -1
  288. asg &a[%i] charlie
  289. asg &a[%i+1] easy
  290. asg &a[%i+2] george
  291. asg &a[%i+3] dog
  292. asg %n %i+2+8/4
  293. asg &a[%n] fox
  294. echo Sorting ...
  295. for %i 1 (%n)-1 1 {                ; Outer loop: i from 1 to n-1
  296.     for %j %i %n 1 {              ; Inner loop: j from i to n
  297. if lgt &a[%i] &a[%j] {   ; Compare array elements
  298.     asg %t &a[%i]         ; If out of order,
  299.     asg &a[%i] &a[%j]    ; exchange them
  300.     asg &a[%j] %t
  301. }
  302.     }
  303. }
  304. echo You should see feval(%n) words in alphabetical order:
  305. for %i 1 %n 1 { echo {  %i. &a[%i]} }    ; All sorted - print them
  306. echo
  307. echo ARRAY TEST II (FAST)...
  308. ;
  309. ; Same thing again the easy (and fast) way...
  310. ;
  311. declare &a[] = alpha beta gamma delta epsilon zeta eta theta iota
  312. echo Sorting ...
  313. sort a
  314. echo You should see fdimension(&a) words in alphabetical order:
  315. show array a
  316. echo
  317. exit 0 End of v(cmdfile)