KPL青少年电脑编程语言--一步一步学KPL【6】:如何随机产生不重复的26个英文字母?

[KPL学习指南]一步一步学KPL【6】:如何随机产生不重复的26个英文字母?
kpl 发布于 2007-8-7 22:20:00


 上次我们演示了如何随机产生26个英文字母。现在我们来解决一个遗留问题:如何使产生的字母不重复。

 我们需要找到一个办法,来表明产生了的字母已经被使用。

 这样,跟字母的相关属性,我们就有了两个要求:一是要知道字母是什么,二是要知道该字母是否已经使用。说不定以后,我们还有一些跟字母相关的属性需要增加。

 在这些属性中,有些属性是用于显示的,有些是用于判断的。但他们都是一组相关的属性集合。

 所以,我们可以用自定义数据类型的方式,使它们看起来象是一体的。


 因此,我们首先新增一个自定义函数在程序的开始部分:

 //自定义数据结构
 Structure EnglishChar
  index As Int  //序号
  name As String  //字母
  using As Bool  //是否已被使用
 End Structure

 如果是这样的话,我们上次的代码就要做一些调整:我们要声明新的变量,该变量使用我们自定义的数据类型。

 下面的代码保留:

  // 初始化26个英文字母
  //Var CharArray As String[]={"a","b","c"}
  Var EnglishCharStr As String="a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z"
  Var CharArray As String[]=Split(EnglishCharStr,",")

 然后,我们申明新的变量:

 Var EnglishCharArray As EnglishChar[MaxCharNum]

 为了便于整个程序范围内都可以访问,我们把MaxCharNum放在了程序的函数或方法外。

 Var MaxCharNum As Int=26

 接下来,我们初始化新的变量数组:

   
  For CharNum=1 To MaxCharNum
   EnglishCharArray[CharNum].index=CharNum
   EnglishCharArray[CharNum].name=CharArray[CharNum]
   EnglishCharArray[CharNum].using=False
   
   //调试语句
   Trace("indx:"+EnglishCharArray[CharNum].index)
   Trace("name:"+EnglishCharArray[CharNum].name)
   Trace("using:"+EnglishCharArray[CharNum].using) 
   Trace("---------------------------------------")
  Next 

 请大家仔细看看循环内的前三条代码,是如何访问字母数组的各个属性的。


 有了.using标志,我们就可以在原来随机选取的基础上判断:

  //保存随机字母顺序的数组
  Var CurIndexArray As Int[MaxCharNum]
  
  
  Var CurNum As Int=1
  Var CurIndex As Int
  
  While CurNum<=MaxCharNum
   //随机抽取
   CurIndex=Random(1,MaxCharNum)
   
   //以下代码保证字母抽取不重复
   If EnglishCharArray[CurIndex].using=False Then
    EnglishCharArray[CurIndex].using=True
    CurIndexArray[CurNum]=CurIndex
    
    CurNum=CurNum+1
    
    Trace("CurIndexArray["+CurNum+"]:"+EnglishCharArray[CurIndex].name+"---CurIndex:"+CurIndex)
   End If
   
   
  End While


 在上面的代码中,大家要注意循环的方法由原来的for循环,变成了while循环。从这个例子,可以看出两者使用的不同:

 【1】当循环的次数是确定的,两种循环都可以用;

 【2】当已知一种边界条件,而不知要循环多少次的时候,使用while循环;


 通过上面的代码调整,我们已经可以不重复地抽取26个英文字母了。


 一些题外话,在程序中,要合理地使用循环,如果循环用错,可能程序一直执行不完。其次,循环在程序中,一般是比较耗时的。所以,减少循环次数,也是优化程序效率的一种方法。

 循环对编程语言的设计者也是挑战,现在的计算机已经进入了多核时代,如何用简单的方法编程,而编译器就可以用多个CPU进行并行运算,从而充分利用好表现优异的硬件。

 可以想像,总有一天,我们每个人都可能拥有现在不可想像的超级计算的能力。我不知道,那时的编程会成为什么样子,但相信这一天一定会在不远的将来就会来到。让我们拭目以待。

附本节代码:

Program Demo

 //自定义数据结构
 Structure EnglishChar
  index As Int  //序号
  name As String  //字母
  using As Bool  //是否已被使用
 End Structure

 //最大字母数
 Var MaxCharNum As Int=26
 
 Method Main()

  // 初始化26个英文字母
  //Var CharArray As String[]={"a","b","c"}
  Var EnglishCharStr As String="a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z"
  Var CharArray As String[]=Split(EnglishCharStr,",")
  
  //初始化字母数组
  Var EnglishCharArray As EnglishChar[MaxCharNum]  
  
  Var CharNum As Int
  
  For CharNum=1 To MaxCharNum
   EnglishCharArray[CharNum].index=CharNum
   EnglishCharArray[CharNum].name=CharArray[CharNum]
   EnglishCharArray[CharNum].using=False
   
   //调试语句
   Trace("indx:"+EnglishCharArray[CharNum].index)
   Trace("name:"+EnglishCharArray[CharNum].name)
   Trace("using:"+EnglishCharArray[CharNum].using) 
   Trace("---------------------------------------")
  Next
  
  
  //保存随机字母顺序的数组
  Var CurIndexArray As Int[MaxCharNum]
  
  
  Var CurNum As Int=1
  Var CurIndex As Int
  
  While CurNum<=MaxCharNum
   //随机抽取
   CurIndex=Random(1,MaxCharNum)
   
   //以下代码保证字母抽取不重复
   If EnglishCharArray[CurIndex].using=False Then
    EnglishCharArray[CurIndex].using=True
    CurIndexArray[CurNum]=CurIndex
    
    CurNum=CurNum+1
    
    Trace("CurIndexArray["+CurNum+"]:"+EnglishCharArray[CurIndex].name+"---CurIndex:"+CurIndex)
   End If
   
   
  End While
  
 End Method

End Program

转发到新浪微博

 

网上书店:当当图书  卓越亚马逊  新华书店  中国图书网  蔚蓝书店

  |  KPL QQ 群:39562753 
 




KPL QQ 群:39562753 

  验证申请请输入:KPL

  公告

敏捷培训视频培训教程,版权所有,未经授权,禁止转载

     现在国内无法访问KPL官方网站,喷嚏网(www.dapenti.com)提供的KPL资料为国内首份公开的KPL汉化资料。

该资料转载并注明作者和译者出处。如:来源:喷嚏网-www.dapenti.com

欢迎从事中小学信息技术的教师转载和引用,论坛或媒体须经书面许可

欢迎媒体合作!


邮箱:dapenti2006@gmail.com


  我的分类(专题)
  最近日志
程序员怎样学数学:半路出家也能让编程
汉语编程-汉芯之后的中国软件界大骗局
一步一步学KPL【9】:如何对按键进
一步一步学KPL【8】:如何让字母精
一步一步学KPL【7】:如何在屏幕上
一步一步学KPL【6】:如何随机产生
一步一步学KPL【5】:如何随机产生
一步一步学KPL【4】:如何编写一个
KPL开发环境中的一个bug
一步一步学KPL【3】:如何调试KP
一步一步学KPL[2]:编码的习惯和
structure有什么用?
为什么编程要用英文?
如何用任意的图形来画线?
一步一步学KPL[1]:初学者入门
吴文虎:别让“程序设计”成第二门“英
如何使用系统函数?
版权和转载申明
孩子什么时候学编程比较合适?
《KPL游戏示例代码讲解》电子书在线

  最新评论

  留言板
 

  链接

  Blog AD
 



|站点首页 | 联系我们 | 博客登陆
蜀ICP备11003155号 公安部备案号:51019002000333

特别声明:本站不提供任何视听上传服务,所有视频内容均来自视频分享站点所提供的公开引用资源

Powered by oBlog 2.52 © Copyright 2004. All rights reserved.