加载中…
个人资料
林老师的LOGO_PYTHON_C语言之家
林老师的LOGO_P
YTHON_C语言之家
  • 博客等级:
  • 博客积分:0
  • 博客访问:45,449
  • 关注人气:563
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

LOGO字表处理我们位于先进行列

(2023-03-16 07:27:34)
标签:

林老师

pclogo

mswlogo

fmslogo

c

分类: WinXP~7~8~10运行Logo语言
LOGO字表处理我们位于先进行列
LOGO字表处理我们位于先进行列
     LOGO编程除了能够画图外,搞“字表处理”也是LOGO编程的重要功能。1980年代输入中国的洋教材中LOGO编程的字表处理计算只能搞简单的“人机对话”,例如:“您叫什么名字?”“我的名字叫小王。”这样的字表处理编程水平,今天怎么看都显得“初级”、“小儿科”。在洋人的教材上LOGO字表处理再也没有更为精彩的内容了。
        但是这些年来国内的小学LOGO编程教育工作者发现并挖掘出LOGO编程中字表处理功能的巨大潜能,演绎出许多纷繁复杂的演算功能,简直就达到了“出神入化”的境界。在国内一些地区每年一度的小学生LOGO语言竞赛笔试试卷上充斥着必须使用递归才能计算的思维逻辑非常复杂的字表处理命题。其编程思考难度一点都不比小学生的C++、PYTHON试卷差。
      遍观国外所有能够找得到的最新潮的LOGO编程专业网站、以及LOGO编程这方面的书籍,除了那些画图之外(这些画图编程有不少国内的教学、教材水平已经比洋人展示出来的更为精彩),鲜见洋人在这方面有什么更高档的建树或研究。可以非常慎重地说,在LOGO语言教学中使用LOGO编程语言的“字表处理”功能方面,国人已经走在非常先进的行列。国人在教学、学术、科研方面的水平逐渐逼近、甚至超越国际先进水平,这是国人多年来辛勤劳动的成果及必然趋势。
       下面举例的都是在国内LOGO语言教材、各地的试卷中随手擷取的LOGO字表处理编程的精彩案例(在林老师编著的LOGO教材中可以找到几百个这样精妙的字表处理编程实例)。

案例一:编制OP递归过程求解数值表中各元素的平均值。
参考答案: 
TO PJS :DATA :N :S
      ;DATA是纯数值的表 :N是元素个数计数器初值为0 :S是累加器初值为0
  IF EMPTY? :DATA[OP :S/:N]     ;如果所有的元素都处理过了就输出平均值
  OP PJS BF :DATA :N+1 :S+FIRST :DATA 
      ;递归调用中新的:DATA值是经BF :DATA去掉首元素的:DATA 
       ;通过 :N+1计数使得元素个数计数器的值增加1
      ;元素和的累加器:S的值加上FIRST :DATA,即加上首元素的值
END

执行范例:
PR PJS [10 20] 0 0
15
PR PJS [75 100 26] 0 0
67

案例二:编制e68.lgo求解:a除以:b的商及余数。  
B36. 参考答案:   分值系数:8分
to e68 :a :b ;求解商及余数的递归
  if :a<:b[op se 0 :a]
  op se 1+first e68 :a-:b :b last e68 :a-:b :b
end
分析:用连减替代除法,每减1次、商增加1。

执行范例:
SHOW E68 82 7
[11 5]
SHOW E68 101 9
[11 2]
SHOW E68 394 58
[6 46]

案例三:编制OP递归过程能够将任意的复表转换成单表
  复表:[1 [2 3 [4]] 5 [[6] 7] 8 9]
  单表:[1 2 3 4 5 6 7 8 9]

B52. 参考答案:  分值系数:20分
TO DB :L ;将任意复表转换成单表
  IF EMPTY? :L[OP []]  ;当表:L为空表时输出为空
  IF LIST? FIRST :L [OP DB SE FIRST :L BF :L] 
     ;如果表:L的首元素还是表,就用SE命令在重新连接成新表时将首元素脱表
  OP SE FIRST :L DB BF :L  
;否则继续对除了首元素外的后面的元素进行处理
END

执行范例:
SHOW DB [1 [2 [3]] 9567 [8 9 [A]]]
[1 2 3 9567 8 9 A]
SHOW DB [1 3 5 7 [8]]
[1 3 5 7 8]

范例四:编写递归程序,能够找出输入的字、表中最大的数字元素。需要特别指出的是:一般情况下如果将递归过程中的>号换成<号,或是<号换成>号,那么“找最大”就变成“找最小”了。
参考答案有多个,仅仅例举一个 : 
TO ZD1 :X ;可以处理字或表,找出其中最大数的递归
  IF EMPTY? BF :X [PR :X STOP]  ;如果检测到剩下1个元素就是最大的 输出最大数
IFELSE (FIRST :X)>(LAST :X)[ZD1 BL :X][ZD1 BF :X]
    ;如果首元素大于末元素就去掉末元素继续递归
     ;如果末元素大于首元素就去掉首元素继续递归 最终剩下的是最大的元素
END

执行范例:
ZD1 "13987426              ;可处理字数据
9
ZD1 [-12 999 123 65 579]   ;可处理表数据
999

范例五:编写OP递归过程,将一个数字表重排序后以降序输出。
参考答案: 分值系数:12分
TO JXA :B :K ;将数字表:B以降序输出 :K是装输出数据的空表 只能处理表数据
  IF EMPTY? :B [OP :K]   ;如果表:B为空说明数据都已经处理过了就输出答案:K
  MAKE "K J2 :K FIRST :B  ;将经过J2递归处理过的值装入:K表中
  OP JXA BF :B :K  ;已经处理过首元素的表:B继续处理剩余的部分
END
TO J2 :B :N  ;:N是先前取出来的表:B的首元素
  IF EMPTY? :B [OP SE :N :B] ;全部使用SE命令输出的数据只能是表
  TEST :N>FIRST :B   ;:N如果大于后续表的首元素(说明现在已经是降序)
  IFT [OP SE :N :B ]  ;既然已经是降序那就保持原结构
  IFF [OP SE FIRST :B J2 BF :B :N] ;若非降序就要把后续首元素往前调动
END

执行范例:
SHOW JXA[9 4 1 8 3 7 5 20][]
[20 9 8 7 5 4 3 1]
SHOW JXA[35 16 58 331 976 2][]
[976 331 58 35 16 2]

范例六:高精度正整数加法
to jiafa ;高精度加法主程序
  make "a rw  make "b rw   ;从对话框键盘输入加数:a和:b
  make "he "  make "j 0    ; 一开始和:he是空字符串,进位:j是0
  jia :he :a :b :j         ;调用递归加法运算
end
to jia :he :a :b :j              ;递归求和子程序
  if (and empty? :a empty? :b :j=0)[pr :he stop]
                                 ;当加数皆为空串且进位为0时输出结果
  make "ab (wei :a)+(wei :b)+:j  ;截取两个加数的末位加上进位为和
  ifelse :ab>9 [make "j 1 make "ab :ab-10][make "j 0] 
;判断当前加法是否有进位
  make "he word :ab :he           ;把当前位的和叠加在已有和的前面
  if (and empty? :a 0=wei :a) [make "a "0] 
;位数少的加数剪成空字时按0处理
  if (and empty? :b 0=wei :b) [make "b "0]
  jia :he (bl :a) (bl :b) :j      ;去掉两个加数的末位继续计算
end
to wei :nn   ;剪取尾字符子程序 当加数不是空字时剪取末位
  ifelse (empty? :nn) [op "0] [op last :nn]
end

Jiafa
327600007687230000176329869         ;通过rw对话框输入:a超过15位
8760023762487667200054318700000    ;通过rw对话框输入:b超过15位
8760351362495354430054495029869

    小学生学习LOGO编程的意义在哪里?其实LOGO语言只是一种容易上手入门的教学语言。但是它的理念已经非常先进了。用LOGO编程打好基础,将来升级C++、PYTHON编程就变得非常容易了。

如果上面的范例你都还看不懂
这全都是历年小学生考试竞赛用过的真题呀
你可得找几本林老师编著的教科书看一看了

LOGO字表处理我们位于先进行列

LOGO字表处理我们位于先进行列


0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有