【转】Seraph 从零开始学编程 第三节 循环(一)

来源:互联网   编辑:思良  发表时间:2015-07-13  关注度:389  

 第二节 补充

在说本节前先来补充一下上节课丢的一些内容
这个就是表达式中的 "not" "and" "or" 的讲解
根据单词的字面意思
not "不"
and "和","并且"
or     "或者"

1 not
我们举例说明
例子
dim a,b
function main
a=1
b=1
if not a=b then          #这里 a=b是成立的,在前面加个not 就不成立了,
print("相等")
else
print("不相等") #很显然这里才是正确的输出结果
end if
end function
这里的not a=b 我们可以这么理解
not(a=b) 就是 not(ture) ,这里就不成立了,那不成立就是false了
显然 如果
if true then 执行后面的语句
那 if false then 就是执行 else后面的语句了~

2 and   "和","并且"的意思
这个很好理解

dim a,b
function main
a=1
b=1
if   a=1 and b=1 then    #这里用 and 连接的2个表达式都成立,整个表达式才成立
print("相等")
else
print("不相等")
end if
end function
这里的 (a=1) and (b=1) 就是 (true)and(true) ,就是true了

3 or 或者
dim a,b
function main
a=1
b=1
if   a=1 or b=1 then    #这里用 or 连接的2个表达式只要其中一个成立,整个表达式就成立
print("相等")
else
print("不相等")
end if
end function

用or和and 可以连接多个表达式
象 if a=1 or b=1 or c=1 or d=1 then #简单理解,用or只要有一个表达式成立这个判断就成立

和 if a=1 and b=1 and c=1 and d=1 then #简单理解,用and只要有一个表达式不成立这个判断就不成立

最后一个逻辑异或(XOR),新手就先不要看了


                                              第三节 循环(一)

了解一下编程中的循环
  在不少实际问题中有许多具有规律性的重复操作,因此在程序中就需要重复执行某些语句。
一组被重复执行的语句称之为循环体,能否继续重复,决定循环的终止条件。循环语句是
由循环体及循环的终止条件两部分组成的。
  要使用循环语句时,必须要确定循环体及条件(布尔表达式)两个重要因素,亦即首要考虑的是:我要重   复执行哪些语句,我要重复到什么时候为止!

1.1单循环
for to next
首先我们看这么一个题
输出1,1,1,三个数
有的人就写了
function main
print(1)
print(1)
print(1)
end function
很好,那我把3个变成10个呢,你说我会复制10行
那好,要是要求输出10000个呢,难道你要嘴里一边念着"只要主义真,铁杵磨成针",一边
Ctrl+C,Ctrl+v回车,Ctrl+v回车......,Ctrl+v回车...一万次吗?
就是因为有这样的问题出现才出现了循环
就象上面的题我们只用几行代码就可以实现了
function main
for i=1 to 10000    #这里就是循环10000次了
print(1)    
next                #返回循环标志
end function
好,我们看下他的格式
FOR <计数变量> = <初始值> TO <终止值> [STEP <增值>]
代码
NEXT

现在我用一个简单的例子来说下 for循环是如何运作的

function main
for i=1 to 3  
print(1)
next
end function
当程序运行到for就开始循环了,这个I是记数变量,我们习惯用i,j,k来做记数变量
那么初值就是1 ,终值就是3,后面还应该有个Step,这个step是"增值""步长"的意思,就是每次循环要增加的数
之所以这里没有写,是因为如果这个step的值是1的话,这个step就可以省略
这样我们就开始了循环操作,i=1后执行了for to 下面的代码一次,当程序运行到next的时候就
返回到for 进行下一次循环,当进行下一次循环的时候i所被赋的值是要和step后面的数值进行
加法运算的,然后在和终值进行判断是否要继续循环下去
这里的step没有写,那就是1,那么计算机实际上执行了下面的操作
i=i+1                    #把step后面的值进行累加
if i>3 then              #判断是否大于终值,大于就终值循环,不大于就继续循环
退出循环
else
不退出循环,继续循环
end if
所以这个时候i的值是1+1=2 不大于3,所以就继续循环,执行代码print(1)
执行到next 后又返回到for 进行计算判断
i=i+1 那么i 就2+1=3了,进行判断 3>3 这个不成立,那么就继续循环,执行代码print(1)
又执行到next了,返回到for进行计算判断
i=i+1 那么i就是3+1=4了,进行判断 4>3 成立,所以就退出循环,这个时候就
不执行代码print(1)了,而是直接跳到next的下一行继续执行后面的代码

上面就是for循环的整个流程,大家一定要明白计算机是怎么运作的,而我们解读别人程序的
代码时也是这么个思路

下面我们说下个例

function main
for i=3 to 1
print(1)
next
end function
当初值大于终值时将不循环直接退出
那我们如果要让上面的例子进行循环的话,我们可以在后面加入step -1

function main
for i=3 to 1 step -1
print(1)
next
end function
这个时候循环体就循环2次,执行2次 print(1)了
当step 后面的数值是负数的情况下,变量进行累加后和终值进行的判断就把大于变成小于了
i=i+(-1)就是 3-1=2 然后判断 2<1(这里的符号就改变了) 成立就退出,不成立就继续循环

step后面可以是正数,是负数,是小数,是变量,可以是表达式,还可以是函数,但其结果必须是数值 
而for 的初值和终值也可以是上面提到的类型

dim a
function main
       a=-0.01
for i=0.31 to 0.1 step a*10
print(1)
next
end function

1.2
双重循环和多重循环
1.2.1
双重循环
function main
for i=1 to 10
for j=1 to 10
print(1)
next
next
end function
上面就是一个双重循环,里面print(1)的执行次数是2个循环体循环次数的乘积
那上面的例子中print(1)就被执行了10*10=100次

下面看例题
题目:用双重循环输出99乘法表,格式如下:
1X1=1
1X2=2 2X2=4
1X3=3 2X3=6 3X3=9
........
1X9=9 2X9=18 3X9=27 4X9=36 5X9=45 6X9=54 7X9=63 8X9=72 9X9=81 
看程序代码
dim a=""
function main
for i=1 to 9
for j=1 to i
a=a & j & "X" & i & "=" & j*i & "   "  
next
print(a)
a=""
next
end function
下面自己做下题
输出下面的图形
题1                   题2
*                         *                                              
**                          ***                                                 
***                      *****                                                 
****                   *******                                                    
*****                    *********                                                       
******                ***********                                                       
*******             *************                                                          
********              *************** 
                                                      
1.2.2
多重循环:就是3个以上的循环嵌套一起.

function main
for i=1 to 10
for j=1 to 10
for k=1 to 10
for m=1 to 10
print(1)
next 
next
next
next
end function
代码print(1)的执行次数就是每个循环次数的乘积,也就是10*10*10*10=10000次

好,讲完for循环我们就可以回到第一节,来讲一下在第一节变量中没有提到一个内容
那就是"数组"
1.3.1 
数组
在许多场合,使用数组可以缩短和简化程序,因为可以利用索引值设计一个循环,高效处理多种情况。数组有上界和下界,数组的元素在上下界内是连续的

上面提到了 "循环"和"连续" ,这就是我为什么在讲完for循环后在讲数组的原因了,在大多数情况下
使用数组都要用到循环
1.3.2
什么是数组
数组在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称为数组
1.3.3
数组如何定义
上面提到,数组其实就是变量,那变量就要定义啊~~,那如何定义呢,和变量一样要用dim

dim a[50]
这里就定义了一个数组a,后面用[]括起来的50是下标(元素个数),实际上这一行代码就定义了50个变量

***************************************************
在SP中下标不允许为0,也就是dim a[0] 这个定义是错误的
大家记住就行了
但是在其他的语言里,象VB如果这么定义 dim a(50) 实际
上是定义了51一个变量,因为有a(0)
***************************************************
那我们在使用数组的时候下标不能超过定义的下标

dim a[10]
那我们在后面如果用到a[11]的话,程序就会出现"数组的元素序号超出了数组的定义范围"的错误
1.3.4
数组的维数
数组有一维数组,二维数组和多维数组
dim a[10]              #一维数组 (必须熟练掌握)
dim b[10][10]       #二维数组 (能理解会用就行)    
dim c[10][10][10][10]   #多维数组 (了解就行)
上面说的了解程度是对新手来说
有兴趣的还可以去看看tto的参差数组的帖子
http://www.seraphzone.com/newbbs ... hlight=%CA%FD%D7%E9

下面我出道用一维数组练习的题
dim a[10]
function main
for j=1 to 10
a[j]=j*j
print(a[j])
next
end function
这个程序输出的结果是
1 4 9 16 25 36 49 64 81 100 (我这里为了省地方就横着写了,实际结果是每行一个数字,共10行)


在上节课中我们用判断语句写一个判断3个数大小的程序,大家还有印象吧~~
那现在我们还做那道题,不过把题目改一下,改成
生成10个0到100的随机数并输出,然后从大到小再输出这10个数
我们看程序

dim a[10],b="",c
function main
Randomize()                      #保证每次随即数不一样
for j=1 to 10                       #循环10次
a[j]=int(rnd()*100)       #用数组 a 保存10个0-100的随机数
b=b & a[j] & "   "          
next
print(b)                         #输出10个随机数
b=""                                #清空变量b
for j=1 to 10                   
for k=j+1 to 10
if a[j]<a[k] then #从数组中第一个数开始,和后面的所有数进行判断
c=a[j]    #将较大的数放在下标小(元素号小)的数组变量中
a[j]=a[k] 
a[k]=c
end if
next
next
for j=1 to 10
b=b & a[j] & "   "
next
print(b) 
end function
请仔细的分析下程序,看程序是如何将10个数按大小输出的
如果要求从小到大输出呢,那程序如何改动?请大家自己动手改下!

下面说下二维数组的实际应用


假如我们现在写个游戏的脚本,脚本中我们需要城里一些重要的NPC的信息
如NPC的名称,NPC坐标X,NPC坐标Y,这些信息我们保存到一个文件,文件名为
npc.txt,内容如下:

仓库管理员,120,140
药店,100,50
衣服店,200,150
......

这个文件就相当于NPC的配置文件,我们要在脚本一开始就把这些内容调入变量中,以便脚本中随时用到
我们看下程序

dim ecc,npc[10][3]                            #定义一个二维数组
function main
ecc=ReadLinesFromFile("npc.txt", npcinfo) #将npc.txt内容存到数组npcinfo中,ecc返回文件中的行数
for j=1 to ecc                
temp=Split(npcinfo[j],",")              #将npc.txt中每行信息以","分割,保存到临时数组temp中
for k=1 to ArrayLen(temp,1)          #ArrayLen(temp,1)返回数组temp的长度(最大元素号)
   npc[j][k]=temp[k]                    #将npc信息保存到二维数组npc中
   print(j & " " & k & " " & npc[j][k])
next
next
end function

在实际操作中我们要在 ecc=ReadLinesFromFile("npc.txt", npcinfo) 下面加个判断
if ecc=-1 then
print("读取npc.txt文件失败....")
exit script                   #终止脚本运行    
end if
加这个判断的意义就是防止文件丢失对脚本的影响
大家如果觉得很难理解,我们也可以将二维数组转化为一维数组以便于我们理解
程序如下
dim ecc,npcname[10],npcx[10],npcy[10]
function main
ecc=ReadLinesFromFile("npc.txt", npcinfo)
for j=1 to ecc 
temp=Split(npcinfo[j],",")
npcname[j]=temp[1]
npcx[j]=temp[2]
npcy[j]=temp[3]
print(npcname[j] & " " & npcx[j] & " " & npcy[j])
next
end function
如果后面我们要找"药店"npc的坐标就可以这样
function findnpc
for j=1 to 10
if npcname[j]="药店" then
print("找到药店,坐标是:" & npcx[j] & "," & npcy[j])  
end if
next
end function

最后注意 在增加数组的维数时,数组所占的存储空间会大幅度增加,所以要慎用多维数组.

今天就讲这么,下一节再讲其他的循环.

课后题,有兴趣的可以写下程序
题目:输出九宫格,使“横”“竖”“斜”所有数的和相等。
他有一个口诀“一居上行正中央,依次斜填切莫忘;上出框时向下放,
右出框时向左放;排重便在下格填,右上排重一个样。” 

这口诀不仅适用于九宫,奇数九宫,如五五图,七七图等等.
下面是九宫三三图和九宫五五图

8 1 6             17   24   1 8 15                         
3 5 7             23   5 7 14   16                   
4 9 2             4 6 13   20   22                   
                  10   12   19   21   3                               
                  11   18   25   2 9

    支付宝扫码领红包,不用多说,用过的人都知道,双赢的,你得红包,我得到同等推广红包,比如你扫到1元,我也得1元,大家得到的红包可以去实体店消费!新用户至少10元以上哦,每天都有!希望大家每天来本站扫码!感谢感谢!

    把打赏改成扫码红包了!支持本站就扫码下!


下一篇:【转】Seraph 从零开始学编程 第二节 条件判断


上一篇:【转】新手教新手教程(一),手把手教你做自动加血蓝脚本


小提示:按 回车[Enter]键 返回,按 ←键 返回上一页, 按 →键 进入下一页。

网友评论(0条评论)

选择头像
新闻评论(共有 0 条评论)

手机访问

本站APP

联系我

加我微信