能源与动力工程学院 结构化编程 结构化程序设计 循环 循环结构 确定性循环 非确定性循环 I=1 sum=sum+i I = I +1 陈 斌 I>100 Yes No 目录 求和 :1+2+3++100 第四节循环的应用 PROGRAM GAUSS INTEGER I, SUM 计数器 SUM = 0 DO I = 1, 100, 1 SUM = SUM + I print*, I, SUM DO 10 I = 1, 100, 1 SUM = SUM + I 10 print*, I, SUM WRITE(*,'(I5, "1+2+3+...+100 =", I5)')I, SUM 1
DO 循环的构造形式 : [name:]do 循环变量 = 表达式 1, 表达式 2[, 表达式 3] 语句块 [name] 表达式 2- 表达式 1+ 表达式 3 MAX,0 表达式 3 意义如下 : 循环变量用来控制循环次数 ; 表达式 1 代表循环变量的初值 ; 表达式 2 代表循环变量的终值 ; 表达式 3 代表循环变量的步长, 如果步长为 1, 表达式 3 可省略 步长既可为正, 也可为负 DO I = A, B, C a) C>0, A<B 执行循环 循环变量从 A 开始, 第二次循环以后, 每次增加一个步长 C, 直到循环变量的终值超过 B b) C>0, A>B 不执行循环 c) C<0, A>B 执行循环 循环变量从 A 开始, 第二次循环以后, 每次减小一个步长的绝对值, 直到循环变量的终值小于 B d) C<0, A<B 不执行循环 DO I = 2, 7, 2 DO I = 5, 4 DO I = 5, 1, -1 DO I = 1, 6, -2 用来作为计数器的变量, 在循环的程序模块中不能再使用命令去改变它的数值, 不然在编译时会发生错误 DO I=1, 10 I = I + 1! 编译时会出现错误 可以使用变量设置循环变量的初值 终值和步长的数值, 不过这些变量的值, 只会在进入循环之前被读取一次, 在循环中改变这些变量不会发生作用 S=1; E=10; INC=1 DO I = S, E, INC S = 5 E = 1 INC = -1 WRITE (*,*) I 2
DO 循环的嵌套 DO I = 1, 10 ( 第 1 层循环开始 ) DO J = 1, 10 ( 第 2 层循环开始 ) DO K = 1, 10 ( 第 3 层循环开始 ) ( 第 3 层循环结束 ) ( 第 2 层循环结束 ) ( 第 1 层循环结束 ) 总循环次数? 多重循环嵌套 PROGRAM multiplication INTEGER I,J DO I= 1, 9 DO J = 1, 9 PRINT*,I,'*',J,'=',I*J!WRITE(*, 10, ADVANCE='NO') I,J,I*J PRINT* 10 format (I1,"*",I1,"=",I2," ") PROGRAM 循环不一定要由循环变量的增 减来决定是否该结束循环, 它可改由逻辑运算来做决定, 这就是 DO-WHILE 的功能 DO WHILE ( 逻辑运算 )! 逻辑运算成立时, 会一直重复执行循环 例 5-5 DO WHILE 循环 PROGRAM EX0505 REAL, PARAMETER :: WEIGHT = 45.0! 答案 REAL, PARAMETER :: E = 0.1! 误差 REAL :: GUESS = 0.0! 猜测值 DO WHILE ( ABS( GUESS - WEIGHT ) > E ) WRITE (*,*) WEIGHT : READ (*,*) GUESS WRITE (*,*) YOU RE RIGHT 3
DO WHILE 循环的等价形式 PROGRAM EX0505 REAL, PARAMETER :: WEIGHT = 45.0! 答案 REAL, PARAMETER :: E = 0.1! 误差 REAL :: GUESS = 0.0! 猜测值 DO IF ( ABS( GUESS - WEIGHT ) <= E ) EXIT WRITE (*,*) WEIGHT : READ (*,*) GUESS WRITE (*,*) YOU RE RIGHT PROGRAM Guess INTEGER,PARAMETER INTEGER ::Weight=45! 答案 ::Guess! 猜测值 DO WHILE(Guess /= Weight) WRITE(*,'("Your guess:")',advance='no') READ*,Guess IF (Guess > Weight) THEN PRINT*,'Too high. Try again' ELSE IF (Guess < Weight) THEN PRINT*,'Too low. Try again' ELSE PRINT*,"You are right!!!" IF PROGRAM CYCLE 略过循环体 CYCLE 命令后面的所有程序代码, 直接跳回循环的开头来进行下一次循环 假设某百货公司共有 9 层楼, 但电梯在 4 层不停, 试写一个程序来显示百货公司电梯所有能够经过的楼层例 5-6 CYCLE PROGRAM EX0506 INTEGER :: DEST = 9 INTEGER FLOOR DO FLOOR = 1, DEST IF ( FLOOR==4 ) CYCLE! 如果只停单层或双层? WRITE (*,*) FLOOR EXIT 跳出循环 PROGRAM ExitExample integer i, j do i = 1, 9 do j = 1, 9 if (mod(j, 2) == 0) exit print*, I, "*", J, "=", I*J print* 4
第四节循环的应用 例 5-9 署名循环与 Exit 语句 PROGRAM EX0509 INTEGER :: I, J LOOP1: DO I = 1, 3 LOOP2: DO J = 1, 3 IF (I == 3) EXIT LOOP1! 跳离 LOOP1 循环 IF (J == 2) CYCLE LOOP2! 重做 LOOP2 循环 WRITE ( *, I 2,,, I 2) I, J LOOP2 LOOP1 例 5-12 加密程序 program lock integer i, strlen integer, parameter :: key = 2 character(len=20) :: string write(*,*) 'Input String:' read(*,'(a20)') string strlen = len_trim(string)! 字串实际长度 do i = 1, strlen string(i:i)=char(ichar(string(i:i))+key) write(*,"('encoded:',a20)") string end 第四节循环的应用 作业 例 5-12 解密程序 program unlock integer i,strlen integer, parameter :: key = 2 character(len=20) :: string write(*,*) "Encoded string:" read(*,*) string strlen = len_trim(string) do i = 1, strlen string(i:i) = char( ichar(string(i:i)) - key ) write(*,"('string:',a20)") string stop end 上机作业 03 5