从最简单的一维数组到二维数组再到多维数组,数组是最基础的数据结构,也是最重要的数据结构,在控制流的配合之下,我们可以用很精简的程序来处理大量的数据
datatype name(size)
! datatype是数组的类型,出了四种基本的数据类型意外,datatype还可以用自定义数据类型
! name 数组名称
! size 数组大小
比如声明一个数组:
integer :: arrary(5)
!or
integer ArraySize
ArraySize=5
!or
!parameter(ArraySize=5)只是这样的话,ArraySize就是一个常量了
integer:: array(ArraySize)
data array / data /
!可以像上面一样直接给数组赋值,但是也可以ArraySize(index)=number来一个一个的赋值
非常重要的一点:fortran的数组和c++、Java、python的数组是不一样的,第一个元素就是array(1),而不是array(0),而且,不用[index],而是要使用(index)
简单的练一个最基础的吧,一个数组十个数,来一个冒泡排序:
program array
implicit none
integer ::A(10)
data A/2,5,3,7,14,16,12,17,9,1/
integer i,j,temp
do i=1,10
do j=i+1,10
if(A(i)>A(j))then
temp=A(i)
A(i)=A(j)
A(j)=temp
end if
end do
end do
do i=1,10
write(*,*)A(i)
end do
end program array
easy啊
可以了,进阶到二维乃至多维数组,其实声明也很简单:
DataType Array_name(D1,D2,D3,...)
!声明数组的时候,Di代表数组的维度,假如一个三维数组,就可以根据坐标系想象为:D1:x轴,D2:y轴,D3:z轴
!多维度的想像不来也没关系,人本身就只能观察到三维嘛
做一个2*2的矩阵来实现矩阵的输入和输出:
program array
implicit none
integer::A(2,2)
integer r,c,i,j
do r=1,2
do c=1,2
write(*,"('Number',I2,'of Martix' I2)")r,c
read(*,*)A(r,c)
end do
end do
do i=1,2
do j=1,2
write(*,*)A(i,j)
end do
end do
end program array
书上也讲了一些很另类的数组声明方式:
比如,当你用惯了index从0开头的数组的时候,就可以这样子来声明一个长度也是5的数组:
eg.integer array_name(0:4)
!这个时候数组的下标就会从0开始,分别是
!array_name(0)array_name(1)array_name2)array_name(3)array_name(4)
!甚至可以这样子:
eg.integer array_name(-3,3)
!现在数组的下标就会从-3开始
多维数组也是这个样子的,eg.integer array_name(0:4,0:4,0:4)
对一个三维矩阵Matrix(r,c,m)来说,
Matrix(r,c,m)代表的是第m个矩阵的(r,c)
eg.Matrix(*,*,1)代表第1个矩阵,第二第三个矩阵亦是如此,按照书上的来一个三维数组写入和相加:
program Matrix
implicit none
integer r,c
parameter(r=2)
parameter(c=2)1
integer::m(r,c,3)
integer i,j,k
do i=1,2
write(*,"('Matrix',I1)")i
do j=1,r
do k=1,c
write(*,"('(',I1,',',I1,')=')")j,k
read(*,*)m(j,k,i)
end do
end do
end do
! Matrix3=matrix1+matrix2
write(*,*) "Matrix1+Matrix2="
! if ( ios /= 0 ) stop "Write error in file unit iounit"
do i=1,r
do j=1,c
m(i,j,3)=m(i,j,1)+m(i,j,2)
write(*,"('(',I1,',',I1,')=',I3)") i,j,m(i,j,3)
! if ( ios /= 0 ) stop "Write error in file unit iounit"
end do
end do
stop "over"
end program Matrix
刚才在看多维数组的隐含赋值:
data(A(I),I=lowerbound,upperbound)/num1,num2,num3,..../
!赋值结果如下:
!A(lowerbound)=num1,A(lowerbound+1)=num2,....A(upperbound=num3)
这种隐含的循环,其实际作用是省略了do循环,除了在声明里使用以外,还可以用在输出上:
write(*,*)(a(i),i=lowerbound,upperbound)
!输出a(lowerbound),a(lowerbound+1),...a(upperbound)
试一试吧:
program program_name
implicit none
integer::A(10)
integer index
data(A(index),index=0,9)/1,2,3,4,5,6,7,8,9,10/
write(*,*)(A(index),index=0,9)
end program program_name
!!!!!!!!!!!!
Warning: Array reference at (1) out of bounds (0 < 1) in loop beginning at (2)
我用了0:9,报错了,试试就逝世。。。再来一遍,1:10:
program program_name
implicit none
integer::A(10)
integer index
data(A(index),index=1,10)/1,2,3,4,5,6,7,8,9,10/
write(*,*)(A(index),index=1,10)
stop "over"
end program program_name
great,好像明白怎么样在一行输出了
当然隐含循环是可以多层嵌套的,这我就不试了,没啥大意思,放上代码段和注解,有需要的直接复制去,改一改就ok:
!让我们使用隐含赋值形式对一个二维数组进行赋值:
data ((array_name(i,j),i=lowerbound1,upperbound2),j=lowerbound2,upperbound2)/numq,num2,num3,.../
注意!
!如果没有赋值语句/num1,num2,.../的话,系统会默认缺省值为1,
!如果你想改变缺省值,直接将(i=lowerbound,upperbound)改成(i=lowerbound,upperbound,num)
!现在,赋值的缺省值就是num了
!可以试试这一个代码段:
integer::array_name(5,5)
data((array_name(i,j),i=1:5)j=1:5)
!然后输出一下:
write(*,"(I1,I1/I1,I1)")((array_name(i,j),i=1:5),j=1:5)
!很无语,老是出现这个报错:
learn9.f90:77:5:
锛01;31m1
Error: Invalid character 0xEF at (1)
!查了查,是编译问题,好吧,编译原理80分飘过的我,只能说看不懂,不会
!哈哈哈,搞定了
!原因灰常简单:!然后输出一下这句,中文输入法的的感叹号,编译器识别不了
!把这句话ctrl+/给注释掉,编译顺利完成
ok,今天就到这里吧,感受良多,除了数组声明、赋值以外,明白了什么叫小细节决定成败
,明天十一国庆,反正没啥事,继续开工