加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

第二章:IDL语法基础(中篇:字符串与表达式)

(2018-03-15 10:47:53)
标签:

idl开发

idl语言基础

字符串

表达式

运算符

分类: IDL开发

2.3 字符串

1、创建字符串

    将变量内容用单引号(’’)或者双引号(””)括起来。

IDL> a='I am a student'

IDL> help,a

A               STRING    = 'I am a student'

IDL> b="I am a student"

IDL> help,b

B               STRING    = 'I am a student'

注:如果字符串中包含双引号或者单引号,则需要交替使用,例:

IDL> c="I am a 'student'"

IDL> c

I am a 'student'

IDL> d='I am a "student"'

IDL> d

I am a "student"

另:可以通过直接赋值或者函数strarr创建字符串数组。

IDL> a=['abc','123']

IDL> a

abc

123

IDL> help,a

A               STRING    = Array[2]

2、字符串连接

通过加号(+)将多个字符串连接称为一个字符串。

IDL> a='I'+'am'+'a'+'student'

IDL> a

Iamastudent

IDL> help,a

A               STRING    = 'Iamastudent'

小技巧:可以利用字符串的连接功能生成一组有规律的字符串,如创建一组文件名,格式为“Day_001.txtDay_045.txtDay_225.txt”。

思路:首先生成一个days数组,从1225,间隔为15.

     然后利用string函数将其转换为字符串类型‘001’、‘045’、225’(注意format关键字的使用)。

     最后运用连接符“+”将变化的日期数组与不变的前缀“Day_”极其文件格式后缀“.txt”连接成完整的文件名。

IDL> days=indgen(16)*15

IDL> fns='Day_'+string(days,format='(i3.3)')+'.txt'

IDL> fns

Day_000.txt

Day_015.txt

Day_030.txt

Day_045.txt

Day_060.txt

Day_075.txt

Day_090.txt

Day_105.txt

Day_120.txt

Day_135.txt

Day_150.txt

Day_165.txt

Day_180.txt

Day_195.txt

Day_210.txt

Day_225.txt

注:strjoin()用于将一个字符串数组连接称为一个字符串。

Result=strjoin(string[,delimiter]),可选参数用于设置连接字符。

IDL> a=['I','am','a','student']

IDL> help,strjoin(a)

    STRING    = 'Iamastudent'

IDL> help,strjoin(a,' ')

    STRING    = 'I am a student'

IDL> help,strjoin(a,'-')

    STRING    = 'I-am-a-student'

3、字符串操作函数

1)字符串长度:strlen()

IDL> a= 'I am a student'

IDL> strlen(a)

          14

IDL> help,strlen(a)

    LONG      =           14

2)字符串大小写:

strupcase( )将所有的英文字母改写为大写;

strlowcase( )将所有的英文字母改写为小写;

IDL> a= 'I am a student'

IDL> b=strupcase(a)

IDL> b

I AM A STUDENT

IDL> help,b

B               STRING    = 'I AM A STUDENT'

IDL> c=strlowcase(b)

IDL> c

i am a student

IDL> help,c

C               STRING    = 'i am a student'

3)字符串移除空格:strcompress( )用于移除字符串变量中的空格。

IDL> a='0   1  2  3   4   5'

IDL> a

0   1  2  3   4   5

IDL> b=strcompress(a)

IDL> b

0 1 2 3 4 5

IDL> c=strcompress(a,/remove_all)

IDL> c

012345

注意:默认情况将连续的空格压缩为一个空格,设置/remove_all关键字后删除字符串中的所有空格。

另:strtrim(str,flag)函数用于移除字符串变量中两端的空格;参数flag用于设置移除哪些空格,0表示移除右端,1表示移除左端,2表示移除两端。

IDL> a='   0   1  2  3   4   5   '

IDL> help,a

A               STRING    = '   0   1  2  3   4   5   '

IDL> help,strtrim(a,0)

    STRING    = '   0   1  2  3   4   5'

IDL> help,strtrim(a,1)

    STRING    = '0   1  2  3   4   5   '

IDL> help,strtrim(a,2)

    STRING    = '0   1  2  3   4   5'

4)字符串比较:strcmp(str1,str2 [,n],/fold_case)用于对两个字符串进行比较,相同返回1,否则返回0n表示比较的前几位,/fold_case表示不区分大小写。

IDL> strcmp('abcdef','abc123',3)

   1

IDL> strcmp('abcdef','abc123')

   0

IDL> strcmp('abcdef','Abc123')

   0

IDL> strcmp('abcdef','Abc123',/fold_case)

   0

5)字符串查找:strpos()用于查找一个字符串(子串)在另一个字符串(母串)中的位置。母串在前,子串在后,查询后返回起始位置下标值,否则返回-1/reverse_search关键字用于设置从尾端向前查。

IDL> help,strpos('abcdabcd','cd')

    LONG      =            2

IDL> help,strpos('abcdabcd','cd',/reverse_search)

    LONG      =            6

6)字符串取子串:strmid(母串,起始位置,长度)

IDL> a='abcdefghijklmn'

IDL> a

abcdefghijklmn

IDL> b=strmid(a,3,4)

IDL> b

defg

7)字符串拆分:strsplit()用于将某个字符串拆分为诺干个字符串,返回子串的起始位置或子串构成的字符串数组。

IDL> a='a,b,c,d,e,f,g'

IDL> b=strsplit(a,',')

IDL> b

           0           2           4           6           8          10          12

IDL> help,b

B               LONG      = Array[7]

IDL> c=strsplit(a,',',/extract)

IDL> c

a

b

c

d

e

f

g

IDL> help,c

C               STRING    = Array[7]

4、字符串与数值的相互转换

1)数值型转换为字符串string()

IDL> a=string(12345)

IDL> help,a

A               STRING    = '   12345'

IDL> b=string(123,456,789)

IDL> help,b

B               STRING    = '     123     456     789'

IDL> help,string(123,format='(i3.3)')

    STRING    = '123'

2)将字符串转换为字节型byte()、整型fix()、长整型long()、浮点型float()

注意:函数byte将字符串变量中各个字符转换为对应的ASCII码值。

IDL> help,fix('12345')

    INT       =    12345

IDL> help,long('12345')

    LONG      =        12345

IDL> help,float('12345')

    FLOAT     =       12345.0

IDL> help,byte('12345')

    BYTE      = Array[5]

IDL> byte('12345')

  49  50  51  52  53

5、字符串读取

    Reads()用于从字符串变量中按照指定的格式读取数据。

IDL> str='1 2 3, 4  5'

IDL> reads,str,v1,v2,v3,v4,v5

IDL> help,v1,v2,v3,v4,v5

V1              FLOAT     =       1.00000

V2              FLOAT     =       2.00000

V3              FLOAT     =       3.00000

V4              FLOAT     =       4.00000

V5              FLOAT     =       5.00000

注意:如果reads过程后的变量没有预先定义,默认为浮点型;若想输入器类型的数据,必须事先创建该变量。

当需要按照规定的格式读入数据时,需要用到format关键字。下面以读取一行数据为例:

数据中的值依次为纬度、精度、日期和时间。

IDL> .RESET_SESSION

IDL> data='42.9105 85.9456 7/2/2013 22:45:56'

IDL> lat=0.0$lon=0.0&date=''&time=''

IDL> reads,data,lat,lon,date,time,format='(f9.5,f10.5,a9,a8)'

2.4表达式

1、数值型表达式

    数值型运算(10)+-*/^(乘方)、MOD(取余)、<</span>(求最小)、>(求最大)、++(自增)、--(自减)。

IDL> 3<1<7<2<5

       1

IDL> 1>5>3>4>7

       7

IDL> 3>(-1)

       3

IDL> 5 mod 3

       2

IDL> 1.0 mod 0.1

     0.099999987

IDL> 2 mod 0

       0

% Program caused arithmetic error: Integer divide by 0

注意:

1)表达式包含多种类型变量时,计算结果取决于精度最高的类型变量。

IDL> help,3+2b+4.0+3D

    DOUBLE    =        12.000000

2)如果表达式左边变量是子数组或者结构体的域,表达式右边计算结果会转换为右边变量的数据类型。

IDL> arr=intarr(6)

IDL> arr=5.4-2.6

IDL> help,arr

ARR             FLOAT     =       2.80000

IDL> arr=intarr(6)

IDL> arr[1]=5.4-2.6

IDL> help,arr

ARR             INT       = Array[6]

3)相除运算中,如果两个数都是整数,则运算结果也是整数,小数部分会被舍弃。

IDL> 5/2

       2

IDL> 5.0/2

       2.5000000

2、字符型表达式

    字符型表达式是指由字符型运算符把字符型常量、变量等连接起来的,其结果仍然为字符型数据。

IDL> 'I'+'am'+'a'+'student'

Iamastudent

IDL> 'I'+' '+'am'+' '+'a'+' '+'student'

I am a student

IDL>

3、关系型表达式

    由关系运算符连接起来的表达式称为关系型表达式,返回结果为逻辑值:真(1B)或假(0B)。

    IDL的关系运算符:EQ(等于)、NE(不等于)、GT(大于)、LT(小于)、GE(大等于)、LE(小等于)。

IDL> a=5

IDL> b=3

IDL> help,a gt b

    BYTE      =    1

IDL> help,a lt b

    BYTE      =    0

    关系运算符也可以作用于数组变量,来屏蔽数组中的某些值。

例如将数组中小于0的元素替换为0:

IDL> arr=[1.2,-3.6,5.8,-4.2,9.8,-2.5,7.3]

IDL> arr

       1.2000000      -3.5999999       5.8000002      -4.1999998       9.8000002      -2.5000000       7.3000002

IDL> mask=arr gt 0

IDL> mask

   1   0   1   0   1   0   1

IDL> mask*arr

       1.2000000     -0.00000000       5.8000002     -0.00000000       9.8000002     -0.00000000       7.3000002

IDL> arr>0

       1.2000000      0.00000000       5.8000002      0.00000000       9.8000002      0.00000000       7.3000002

4、逻辑型表达式

    逻辑运算符:

&&(逻辑与):全真则为真;

‖(逻辑或):至少有一为真则为真

~(逻辑非):真则假,假则真。

IDL> a=1

IDL> b=0

IDL> a&&b

   0

IDL> a||b

   1

IDL> ~a

   0

IDL> ~b

   1

注:实际工作中,逻辑运算符常和关系运算符联合起来使用。例:

IDL> a=1

IDL> b=0

IDL> if (a gt 0) && (b lt 1) then print,'1' else print,'0'

1

5、条件表达式

    条件表达式由条件运算符构成,并常用条件表达式构成一个赋值语句。语法为:

    expr1?expr2:expr3expr1为一个条件表达式,为真则参数为expr2,否则参数为expr3

IDL> a=3

IDL> b=5

IDL> c=a gt b ? a : b

IDL> c

       5

IDL> d=a lt b ? a : b

IDL> d

       3

6、位运算

    位运算符实现字节中的逐位运算操作,针对字节型、整型、无符号型、长整型等整数变量或者常量进行操作。IDL提供了4中位运算符:

    and(位与):参与运算的两个数据值对应位1时,结果变量中该位值才为1,否则为0

    or(位或):参与运算的两个数据值对应位至少有一个1时,结果变量中该位值才为1,否则为0

 

xor(位异或):参与运算的两个数据值对应位不同变时,结果变量中该位值才为1,否则为0

not(位非):将参与运算的数据值各位的值取反,即从0变为1或从1变为0.

IDL> a=10b

IDL> b=6b

IDL> a and b

   2

IDL> a or b

  14

IDL> a xor b

  12

IDL> not a

 245

IDL> not b

 249

其中,字节变量a的值为10,二进制表达为00001010;字节b的值为6,二进制表达为00000010

7、数组运算

    1IDL运算符同样可以作用于数组,且和作用于标量一样,运算原则是数组对应元素之间的运算

IDL> a=[2,3,8,6]

IDL> b=[5,4,2,9]

IDL> a + b

       7       7      10      15

IDL> a * b

      10      12      16      54

IDL> a / b

       0       0       4       0

IDL> float(a) / b

      0.40000001      0.75000000       4.0000000      0.66666669

    2)如果表达式中有一个变量是数组,那么结果也是数组。IDL数组与标量运算的原则是数组的每个元素都与数组进行运算

IDL> a=[5,4,2,9]

IDL> b=3

IDL> a + b

       8       7       5      12

IDL> a * b

      15      12       6      27

IDL> a / b

       1       1       0       3

IDL> float(a) / b

       1.6666666       1.3333334      0.66666669       3.0000000

IDL> help,a * b

    INT       = Array[4]

    3)如果表达式左边是一个子数组,右边是一个标量,那么该子数组中所有的元素将直接被赋予该标量的值

IDL> a=indgen(5)

IDL> a

       0       1       2       3       4

IDL> a[0:2]=2.3

IDL> a

       2       2       2       3       4

    4)如果参与运算的数组其元素数目不相同,结果数组的元素数目与参与运算的数组中最少元素数目相同

IDL> a=[5,4,2,9]

IDL> b=[3,1,2,6,4]

IDL> a + b

       8       5       4      15

IDL> a * b

      15       4       4      54

IDL> float(a) / b

       1.6666666       4.0000000       1.0000000       1.5000000

    5IDL提供了两种乘法运算:

    1#(列乘):前列乘后行(要求:前行数=后列数)

    2##(行乘):前行乘后列(要求:前列数=后行数)

IDL> a=[1,2,3]

IDL> b=[[4],[5],[6]]

IDL> a

       1       2       3

IDL> b

       4

       5

       6

IDL> a # b

           4           8          12

           5          10          15

           6          12          18

IDL> a ## b

          32

IDL> b # a

          32

IDL> b ## a

           4           8          12

           5          10          15

           6          12          18

8、运算符的优先级

http://s5/bmiddle/0070Uystzy7iUlDcRb6f4&690

http://s13/bmiddle/0070Uystzy7iUlDVHaY5c&690

9、常用的数学运算函数

 http://s14/bmiddle/0070Uystzy7iUlFsOXX5d&690


 转载请注明博文地址: http://blog.sina.com.cn/gser2017  

 博主邮箱:zhangguoshunshzu@sina.com


0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有