Qbasic 教程 

第五章 循环结构程序设计

一、概述                                                          
   循环结构                           
(1)、WHILE循环                           
(2)、FOR循环                           
(3)、DO循环                            

循环体——反复执行的一组语句                            

例:求s=1+2+3+...+100                            

编写如下程序:                           
s=0                           
for i=1 to 100                          
  s=s+i     反复执行100次                           
next i                           
print "1+2+3+...+100=";s                           
end                                               

二、WHILE循环结构               WHILE  <条件>                           
     <循环体>                           
     WEND                            

注: <条件>是终止循环的逻辑表达式,<条件>应随循环的执行而变化,最终退出循环。                            

如: s=0                           
   i=1                           
   WHILE  i<=100
   s=s+i                           
   WEND                            

构成“死循环”——无终止的循环。这时可用Ctrl+Break终止其程序运行。                            

例1(P152例7.5): 如果我国工农业生产每年以12%速度增长,问多少年后产值翻一番:基值设为100。

(逐年计算产值,看是否达到200)

    p=100
    r=.12
    n=0                           
    WHILE p<200
      p=p*(1+r)
      n=n+1
    WEND
    PRINT n; "years","p=";p
    END                            

例2 (P152例7.6) : 给出两个正整数,求它们的最大公约数。                            

算法:(辗转相除法)                              

(1)、以大数m作被除数,小的数n作为除数,相除后余数为r。                            

(2)、如果r=0,则n就是最大公约数。否则将n=>m, r=>n, 重复(1)。                         
程序及框图 :                           

    INPUT "m,n=";m,n
    r=m MOD n 
    WHILE  r < >0 
      m=n 
      n=r
      r= m MOD n              
    WEND
    PRINT "最大公约数为:",n 
    END                            

例3 (P153例7.7):给一个整数n(>2),判别它是否素数(质数)。                            

算法:判别n是否素数,只要将n被1~(n-1)各数轮流作除数除,若都不被整除,则为素数。                         
  若n不是素数,则n=n1*n2,而n1和n2中必然有一个大于或等于n的开方根,另一个小于或等于n的开方根。
即若n是非素数,则必然有一个因子小于或等于n开方根。                        
程序及框图:                         
INPUT  "n="; n
k=INT(SQR(n))
i=2                           
flag=0                          
WHILE i<=k AND flag=0 
 if n MOD i=0 THEN flag=1 ELSE i=i+1
WEND                          
IF flag=0 THEN
 PRINT n;"是素数!"
ELSE                           
 PRINT n;"不是素数!" 
END IF                           
END                           
二、FOX循环结构

 1、格式                     
  FOR <变量>=<初值> TO <终值> STEP <增量>
   循环体
  WEXT <变量>
  如: for i=1 to 10 step 2
      print i,
     next i                         

  2、说明                        
 (1)FOR与NEXT必须配对;                        
 (2)FOR必须在NEXT的前面;                        
 (3)FOR中的循环变量与NEXT的变量一致;                        
 (4)步长为1时“ STEP 1”可省略;                        
 (5)循环终止的条件是循环变量赋值超过终值,而不是等于终值。                        
 (6)循环次数的计算                        
    次数=(终值一初值)/步长+1                        
 (7)循环变量尽量用整型变量;                        
 (8)循环变量初值和终值、步长值均可以是正值、负值或零,也可是整数或小数;                         

终止条件:当步长>0时,循环变量>终值                        
     当步长<0时,循环变量<终值                        
     当步长=0时,永不终止                        
 (9)循环变量主要用来控制循环、可在循环体内引用,也可不在循环体出现。                        
for i=1 to 100            
print "a"            
next i             

for i=1 to 100            
print i,            
next i             

  注意:在循环体内可对循环变量赋值,但这将改变循环次数。                        

for i=1 to 100            
print i,            
i=i+1            
next i            
  3、exit for 语句 
    提前终止循环                         

   for i=1 to 100
     s = s + i * i
   if s > = 100 then exit for
   next i                        
   print s                        
   end                         

  4、应用举例                         

  判别n是否素数。    input "n=";n
   k = int(SQR(n))
   f = 0                        
   for i% = 2 to k
    if n mod i% = 0 then
     f = 1
     exit for
    endif
   next i%
   if f = 0 then
    print n ; "是素数"
   else                        
    print n ; "不是素数"
   endif                        
   end                         

  斐波那契数列                         

     f(n)=1       (n<=2)                    
     f(n)=f(n-1)+f(n-2) (n>2)                        
                      

     f1=1                     
     f2=1
     f3=f2+f1=2
     f4=f3+f2=3
     f5=f4+f3=5                        
     ......                      

程序如下:                     
  f1=1                        
  f2=1                        
  print f1,f2,
  for i% = 3 to 20
  f3 = f1+f2
   print f3,
   f1=f2                        
   f2=f3                        
  next i%                        
  print                        
  end                         

 猴子吃桃:每次吃掉一半多一个,直到第10天只剩一个,第一天共摘了多少个桃子?         

        
            
   x10 =1         
程序如下:          
  x =1                        
  for n%=10 to 2 step -1                   
    x=(x+1)*2                   
  next n%                       
  print " 桃子的数量为:";x             
  end                         

思考:for n%=10 to 1 step -1      或for n%=1 to 9                         

三、DO 循环语句                         

   1、简单DO循环                        
    DO
     <循环体>
    loop                         

终止循环可用: exit do                         

  计算三门课程的平均成绩                         

do                        
input"a,b,c, =";a,b,c               
if a=0 and b=0 and c=o then exit do
s=(a+b+c)/3
print "平均成绩:';s
loop                        
end                       
  2、带while子句的DO循环语句               
                   
格式一:do while <条件>                   

      <循环体>                  
   loop                  

格式二:do                    
      <循环体>                  
     loop while <条件>                      
作用:当指定条件为真是继续循环,否则结束循环。`                         

格式一为前测试与while...wend相同。格式二为后测试,至少应执行循环体一次。                         

 :求1+1/2+1/3+.......1/n   直到前后两项之差小于是1e-3为止。s=0                        
n=1                        
t=1/n
do                         
  t1=t
  s=s+t1
  n=n+1
  t=1/n
loop while t1-t>=1e(-3)  print s
end             

思考:(1)用do while...loop 改写程序;                         

  (2)两种格式do 循环的区别?                         

3、带until子句的do循环语句                      

格式一:do until <条件>              <循环体>            
           loop                         

格式二:do                        
             <循环体>.            
    loop until <条件>                          

作用:当条件为真时终止循环                           

 求2000~2050年之间的所有闰年。                        
闰年的条件是:                        
(1)能被4整除,但不能被100整除的年份都是闰年;                       
(2)能被100整除,又能被400整除的年份是闰年;                        
程序如下:         
y=2000      
do while y>2050      
if y mod 4=0 and y mod 100<>0 then
l=1      
elseif y mod 100=0 and y mod 400=0 then l=1      
else      
l=0      
endif      
if l=1 then  print y,      
y=y+1      
loop      
end                         

思考: 条件可写成:             (1)if (y mod 4=0 and y mod 100<>0) or (y mod 100=0 and y mod 400=0) then l=1 else l=0                         

(2) if y mod 4=0 then               if (y mod 100)<>0 then          l=1      
  elseif (y mod 400)=0 then            l=1      
  else      
     l=0      
  endif                         

人口增长平均1.5%,设现人口12.3 亿,问多少年后人口达到或超过15亿。      p=1.23e+0.9           r=0.015             n=0               do until  p>=1.5e+0.9     p=p*(1+r)            n=n+1              loop              print n;"年","人口";p     end                    

问题(1)比较下面两例:    
f=1      f=1    
n=6      n=6    
do until n>5  do    
 f=f*n     f=f*n    
 n=n+1     n=n+1    
loop      loop until n>5    
print f    print f    
end      end     

(2)凡是用do until循环可以解决的问题,全部可用do while解决,只需把“<条件>”取成“<反条件>” p=1.23e+0.9           r=0.015             n=0               do while p<1.5e+0.9     p=p*(1+r)            n=n+1              loop              print n;"年","人口";p     end                   

四、循环的嵌套

一个循环体内包含另一个循环        

找出100-200间的全部素数。          for n=101 to 200 step 2 k=int(SQR(n))         i=2               f=0               while i<=k and f = 0      if n mod i=0 then f=1 else i=i+1   
wend              if f=0 then print n,      next n             end                         

打印乘法九九表  

for i=1 to 9          for j=1 to 9   
p = i*j   
print p,   
next j   
print                 
next i   
end               打印表格(P175)        

print TAB(5);"|"   
for j=1to 9   
print tab(j*8);j;   
next j   
print   
for n=1 to 75   
print "-";   
next n             print tab(5);"|";           
print   
for i=1 to 9   
print i;"|";   
for j=1 to 9   
p=i*j   
print TAB(j*8); p;   
next j   
print   
next i   
for n=1 to 75   
print "-";   
next n   
end   

注:1)内外循环不应交叉  
  2)内外循环的变量名不应相同