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跑到内层了
为了避免,可以改造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)
效果再改造操作
write(*,"(i5)")(a(i,1),i=1,9)
效果
现在不禁对数组隐循环使用有了更深刻的认识
1可以用()来代表一气呵成的do,里面传统的[,i=下界,上界,步长]
2也可以在array()
的()
中用 类隐循环(切片遍历)a(i,1:3:1)
,甚至定一个值不循环a(i,1)
1,2可以结合用,内外层照旧