程序控制时任何编程语言比不可少的重要部分。本博客主要讲解IDL语言中的循环语句、条件语句、跳转语句。
IDL条件语句有三种:If、Case 和 Switch。本节针对这三种条件语句进行具体的讲解。
If语句的功能是用来判断是某满足条件(为“真”),若满足则执行。语法为:
第一类语法(单行命令):
IF expression THEN statement [ ELSE statement ]
第二类语法(多行命令):
IF expression THEN BEGIN
statements
ENDIF [ ELSE BEGIN
statements
ENDELSE ]
第一类 if 语句实例:
- >>IF 4 Gt 2 THEN Print,'4大于2'
- 4大于2
- >>IF 1 Gt 2 THEN Print,'真:运行' Else Print,'假:运行'
- 假:运行
第二类 If 语句实例:
注:由于是多行语句,且彼此关联,因此无法使用IDL控制台运行,需要建立一个Pro文件来编译运行,下面丢一个为Pro文件,第二个为运行结果。
- PRO Test02
- IF (4 GT 2) THEN BEGIN
- Print,'4大于2'
- Print,'条件为真'
- ENDIF
-
- IF ~(4 GT 2) THEN BEGIN
- Print,'4大于2'
- Print,'条件为真'
- ENDIF ELSE BEGIN
- Print,'4大于2'
- Print,'条件为假'
- ENDELSE
- END
- >>.compile -v 'D:\Code\IDL\My_Program\Test\test02.pro'
- % Compiled module: TEST02.
- >>test02
- % Compiled module: TEST02.
- 4大于2
- 条件为真
- 4大于2
- 条件为假
Case 条件语句的功能是运行满足表达式的现有条件
CASE 表达式 OF
情况1: statement(s)
...
情况n: statement(s)
[ ELSE: statement(s) ]
ENDCASE
注:statement(s)可以是语句,也可语句块。当时语句块的是否,需要用Begin和End。
情况n: Begin
语句块
End
例子1:
- PRO Test02
- ;Print,'请输入一个省,例如江西省'
- A = '江西省'
-
- CASE (A) OF
- '江西省': Print,'输入的是江西省'
- '福建省': Print,'输入的是福建省'
- '台湾省': Print,'输入的是台湾省'
- ELSE: BEGIN
- END
- ENDCASE
- END
注:ELSE不能省略!很多人为了便捷,常常会省略ELSE,也因此造成运行错误(编译不出错),例如:
- PRO Test02
- ;Print,'请输入一个省,例如江西省'
- A = 'Aa省'
-
- CASE (A) OF
- '江西省': Print,'输入的是江西省'
- '福建省': Print,'输入的是福建省'
- '台湾省': Print,'输入的是台湾省'
- ENDCASE
- END

错误原因是:案例声明未找到匹配项。Case代码中由于没有可以满足表达式的情况,同时也没有Else,因此会报错!
例子2:
- PRO Test02
- ;Print,'请输入一个省,例如江西省'
- A = '某某省'
- CASE (A) OF
- '江西省': BEGIN
- Print,'江西省……'
- Print,'江西位于……'
- END
-
- '福建省': BEGIN
- Print,'福建省……'
- Print,'福建位于……'
- END
-
- '台湾省': BEGIN
- Print,'台湾省……'
- Print,'台湾位于……'
- END
-
- ELSE: BEGIN
- Print,'祖国'
- Print,'我爱我的祖国'
- END
- ENDCASE
- END

Switch语句类似于Case语句,不同的是,Switch是从满足表达式的那个条件开始运行,一直到最后。语法如下:
Switch 表达式 OF
情况1: statement(s)
...
情况n: statement(s)
[ ELSE: statement(s) ]
ENDSwitch
注:statement(s)可以是语句,也可语句块。当时语句块的是否,需要用Begin和End。
情况n: Begin
语句块
End
- PRO Test02
- ;Print,'请输入一个省,例如江西省'
- A = '福建省'
- Switch (A) OF
- '江西省': BEGIN
- Print,'江西省……'
- Print,'江西位于……'
- END
-
- '福建省': BEGIN
- Print,'福建省……'
- Print,'福建位于……'
- END
-
- '台湾省': BEGIN
- Print,'台湾省……'
- Print,'台湾位于……'
- END
-
- ELSE: BEGIN
- Print,'祖国'
- Print,'我爱我的祖国'
- END
- ENDSwitch
- END
运行结果为:

IDL循环语句有四种:For循环、ForEach循环、While循环以及Repeat循环。
For循环是任何编程语言比不可少的程序控制,是最常见的循环方式。
FOR variable = init, limit [, Increment] DO statement
或
FOR variable = init, limit [, Increment] DO BEGIN
statements
ENDFOR
注:Increment表示步长,可以不写,则默认为1
例如:循环计算1+2+……+8。
- PRO Test02
- StartNum = 0 ; 开始值
- EndNum = 8 ; 结束值
- Step = 1 ; 步长(可以不写,默认为1)
- Sum = 0
- FOR index = StartNum, EndNum,Step DO BEGIN
- Sum = Sum + index
- ENDFOR
- Print,Sum
- END

例如:循环计算1~8中奇数的和,只需改变步长即可。
- PRO Test02
- StartNum = 0 ; 开始值
- EndNum = 8 ; 结束值
- Step = 2 ; 步长(可以不写,默认为1)
- Sum = 0
- FOR index = StartNum, EndNum,Step DO BEGIN
- Sum = Sum + index
- ENDFOR
- Print,Sum
- END

IDL8.0版本之后才有的,也是十分便捷的。FOREACH 语句为输入集(可以是数组、列表或哈希表)的每个元素执行一个或多个语句。 在 FOREACH 循环中,元素的值和(可选)元素对应的索引或键是可用的。
FOREACH Element, Variable [, Index] DO Statement
或
FOREACH Element, Variable [, Index] DO BEGIN
statements
ENDFOREACH
注:如果 Variable 是数组或列表 ,则可选 Index 设置为与当前循环索引对应的整数。 如果 Variable 是哈希表 ,则 Index 设置为当前键值对对应的键。
下面三段代码都来自官方教程,Variable 分别是数组、列表、哈希表。
- >>array = [1, 3, 5, 7, 9, 11, 13, 15]
- >>
- >>FOREACH element, array, index DO PRINT, 'Index ', index, ' Value = ', element
- Index 0 Value = 1
- Index 1 Value = 3
- Index 2 Value = 5
- Index 3 Value = 7
- Index 4 Value = 9
- Index 5 Value = 11
- Index 6 Value = 13
- Index 7 Value = 15
- PRO Test02
- list = List(77.97, 'Galactic', [2, 7, 1, 8, 2])
- FOREACH element, List DO BEGIN
- Print, 'Value = ', element
- ENDFOREACH
- END
运行结果为:

- PRO Test02
- planets = Hash('Mercury', 0.3e24, 'Venus', 5e24, $
- 'Earth', 6e24, 'Mars', 0.65e24, 'Jupiter', 1900e24, $
- 'Saturn', 570e24, 'Uranus', 87e24, 'Neptune', 100e24, $
- 'Pluto', 0.7e24)
-
- FOREACH mass, planets, key DO Print, key, mass
- END

While 循环是任何编程语言比不可少的程序控制,是最常见的循环方式。
WHILE expression DO statement
或
WHILE expression DO BEGIN
statements
ENDWHILE
注:While循环时,容易陷入死循环(判别式一直为真),使用时,需注意!
- PRO Test02
- A = 5
- WHILE A Gt 0 DO BEGIN
- A = A-1
- Print,A
- ENDWHILE
- END

Repeat循环需要一直运行,直到满足条件采退出循环,常用于计算时结果需要达到某一种精度才符合要求,结束循环。
REPEAT statement UNTIL expression
或
REPEAT BEGIN
statements
ENDREP UNTIL expression
例如:从1一直往上加,直到结果大于100才停止。
- PRO Test02
- Sum = 0
- i = 0
- REPEAT BEGIN
- i = i+1
- Sum = Sum+i
- ENDREP UNTIL (Sum GT 100)
- Print,'当加到',i,'时,结果为',Sum,'大于100'
- END

跳转语句的功能是当执行时跳转至某一位置处。IDL语言中共有三种跳转语句:Break、Continue、GoTo。
Break 表示结束循环。即当运行至这里时,就会马上结束循环。
- PRO Test02
- FOR i = 0L, 8 DO BEGIN
- IF (i EQ 4) THEN BEGIN
- BREAK
- ENDIF
- Print,i
- ENDFOR
- END

Continue表示结束本次循环,进入下一次循环。
- PRO Test02
- FOR i = 0L, 8 DO BEGIN
- IF (i EQ 4) THEN BEGIN
- CONTINUE
- ENDIF
- Print,i
- ENDFOR
- END

直接跳转到程序特定的一个位置(有具体的标签处), 语法如下:
Goto,标签
……
标签:语句
- PRO Test02
- FOR i = 0L, 8 DO BEGIN
- IF (i EQ 4) THEN BEGIN
- Goto,MyLable
- ENDIF
- Print,i
- ENDFOR
- MyLable:Print,'Goto跳转至这里'
- END
