Fortran学习4:数组1

本文详细介绍了Fortran语言中的数组,包括一维、二维及多维数组的声明和赋值方法。通过实例展示了冒泡排序、矩阵输入输出以及三维数组的运算。还探讨了数组的隐含赋值和输出技巧,强调了数组下标的特性和边界处理。
摘要由CSDN通过智能技术生成

从最简单的一维数组到二维数组再到多维数组,数组是最基础的数据结构,也是最重要的数据结构,在控制流的配合之下,我们可以用很精简的程序来处理大量的数据

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,今天就到这里吧,感受良多,除了数组声明、赋值以外,明白了什么叫小细节决定成败

,明天十一国庆,反正没啥事,继续开工

 

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值