fortran95数组输出练习感悟

数组输出例一

program main
implicit none 
integer::a(9,9),i,j 
forall(i=1:9,j=1:9)
a(i,j)=i*10+j 
​
end forall
write(*,"(9i5)")a(9,8)
read*,
end 

输出98

program main
implicit none 
integer::a(9,9),i,j 
forall(i=1:9,j=1:9)
a(i,j)=i*10+j 
a=tanspose(a)
!要转置可以换为a(i,j)=a(j,i)
!或者a(j,i)=a(i,j)
!或者直接一开始就a(j,i)=i*10+j 
end forall
write(*,"(9i5)")a(9,8)
read*,
end 

输出89

心中要明确构造数组时是按位置严格构造的,只是默认输出时按低维先循环列出,比较别扭,如果像后者一样就已经转置了

program main
implicit none 
integer::a(9,9),i,j 
forall(i=1:9,j=1:9)
a(i,j)=i*10+j 
end forall
do i=1,9
    do j=1,9
    write(*,"(9i5)")a(i,j)
    end do 
end do 
read*,
end 

效果是执行一次write,光标就会下移一行

格式说明也没用,这是write语句的规矩

虽然do循环在输出顺序上做了手脚,一反常态,高维j跑到内层了

fortran95数组输出练习感悟_第1张图片

 

为了避免,可以改造write语句([,advance="no"])

program main
implicit none 
integer::a(9,9),i,j 
forall(i=1:9,j=1:9)
a(i,j)=i*10+j 
end forall
do i=1,9
    do j=1,9
    write(*,"(9i5)",advance="no")a(i,j)
    if (mod(j,9)==0)write(*,*)
    end do 
end do 
read*,
end 

write(*,"(9i5)",advance="no")a(i,j)意味输出但光标不下移,

if (mod(j,9)==0)write(*,*)代表输出第 9的整数倍 时,输出一个空格,换行(因为此时的write为未改造的)

其实本例中j在1-9之间循环,可以更精确

直接if (j==9)write(*,*)

总之,就是不换行,加换行提醒,

或者也可这样提醒(就是思考输出9个时有什么标志事件发生,同时该事件要可描述,)

(该题可卡位置点控制,可卡参数变化)

program main
implicit none 
integer::a(9,9),i,j 
forall(i=1:9,j=1:9)
a(i,j)=i*10+j 
end forall
do i=1,9
    do j=1,9
    write(*,"(9i5)",advance="no")a(i,j)
    end do 
    write(*,*)   !妙,9次后必经这里
end do 
read*,
end 

9次后就 end 一个 j 层的 do

使用隐循环结合do循环

program main
implicit none 
integer::a(9,9),i,j 
forall(i=1:9,j=1:9)
a(i,j)=i*10+j 
end forall
do i=1,9
    write(*,"(9i5)",advance="no")a(i,:)
end do 
read*,
end 

这样i仍然是外循环,展示的还是习惯的行列a(i,:)代表j隐藏了

使用纯粹的隐循环

program main
implicit none 
integer::a(9,9),i,j 
forall(i=1:9,j=1:9)
a(i,j)=i*10+j 
end forall
write(*,"(9i5)")((a(i,j),j=1,9),i=1,9)
read*,
end 

write(*,"(9i5)")((a(i,j),j=1,9),i=1,9)注意先内后外循环,同时格式上array()前有几个括号,也就是这句话有几套括号,就代表有几层循环

原理上和两层do循环一样,但是实现上该write只执行一次连续输出

这样在输出换行问题上排除了write自身的干扰,只看格式描述符有9个,那么用完就换行重用,实现了效果

格式上注意隐循环的写法!!!

隐循环输出部分元素也可以,例

write(*,*) (a(i),i=1,100,2) 添加了步长描述

阉割版隐循环write(*,"(9i5)")(a(i,:),i=1,9)

再改造操作write(*,"(3i5)")(a(i,1:3:1),i=1,9)效果

fortran95数组输出练习感悟_第2张图片

再改造操作write(*,"(i5)")(a(i,1),i=1,9)效果

 

现在不禁对数组隐循环使用有了更深刻的认识

1可以用()来代表一气呵成的do,里面传统的[,i=下界,上界,步长]

2也可以在array()()中用 类隐循环(切片遍历)a(i,1:3:1),甚至定一个值不循环a(i,1)

1,2可以结合用,内外层照旧

 

 

你可能感兴趣的:(笔记,fortran)