Fortran学习笔记目录

书接上回:Fortran学习笔记:02 流控制语句

数组(Array)

定义数组

一维数组

  1. program main
  2. implicit none
  3. integer :: i
  4. integer :: a(10)
  5. do i=1,10,1
  6. a(i)=i*i;
  7. end do
  8. do i=1,10,1
  9. write(*,*) "i=",i,"i*i=",a(i)
  10. end do
  11. end

数组申明格式:

  1. Datatype name(size)

注意,size必须为常数,数组索引默认从1开始

多维数组

最多可以声明7维数组,声明格式

  1. integer :: a(D1,D2,D3,...,Dn) !n维数组

其他数组声明方式

没有特别赋值的情况下,数组的默认索引是从1开始的,例如

  1. integer :: a(3) !包含a(1),a(2),a(3)

自定义范围声明

  1. integer :: a(0:2) !一维数组包含a(0),a(1),a(2)
  2. integer :: b(2:3,-1:1) !二维数组b(2~3,-1~1)都可以使用

赋初值

直接赋初值

  1. integer :: a(row,col)=0
  1. program main
  2. implicit none
  3. integer ,parameter:: row=10
  4. integer ,parameter:: col=10
  5. integer :: a(row,col)=0
  6. integer :: i,j
  7. do i=1,row,1
  8. do j=1,col,1
  9. write(*,*) a(i,j)
  10. end do
  11. end do
  12. end

对数组的操作

Fortran 95拥有强大的数组操作方法,简化许多for循环操作

等号赋值

  1. integer :: a(10),b(10)
  2. !!数组赋值!!
  3. a=10
  4. !等效于
  5. do i=1,10,1
  6. a(i)=10
  7. end do
  8. !!数组复制!!
  9. b=a
  10. !等效于
  11. do i=1,10,1
  12. b(i)=a(i)
  13. end do

矩阵基本运算

\(+,-,*,/\)基本四则运算与Matlab中点乘、点除方法相同,均为数组对应元素进行四则运算

数组操作 意义
\(a=b+c\) \(a(i,j)=b(i,j)+c(i,j)\)矩阵对应位置数值相加
\(a=b-c\) \(a(i,j)=b(i,j)-c(i,j)\)矩阵对应位置数值相减
\(a=b*c\) \(a(i,j)=b(i,j)*c(i,j)\)矩阵对应位置数值相乘
\(a=b/c\) \(a(i,j)=b(i,j)/c(i,j)\)矩阵对应位置数值相除以
  1. program main
  2. implicit none
  3. integer ,parameter:: row=10
  4. integer ,parameter:: col=10
  5. integer :: a(row,col)
  6. real :: b(row,col),c(row,col)
  7. integer :: i,j
  8. a=10
  9. b=.5
  10. c=a*b
  11. do i=1,row,1
  12. do j=1,col,1
  13. write(*,*) c(i,j)
  14. end do
  15. end do
  16. end

矩阵切片运算

可以通过对矩阵中部分数据进行赋值操作,Matlab中矩阵切片方式继承了Fortran语言这一形式。

  1. a(3,5)=5 !a(3),a(4),a(5)数值设置为5
  2. a(3:)=5 !a(3)之后的数值设置为5
  3. a(3:5)=(/3,4,5/) !a(3),a(4),a(5)数值分别设为3,4,5
  4. a(1:3)=b(4:6) !a,b赋值
  5. a(1:5:2)=3 !a(1),a(3),a(5)赋值为31~5增量为2
  6. a(1:10)=a(10:1:-1) !翻转a
  7. integer :: a(5),b(5,5)
  8. a(:)=b(:,2) !b中第二列赋值给a
  9. integer :: a(5,5),b(5,5,5)
  10. a(:,:)=b(:,:,1)

注意在进行数组操作时,需要保证两边数组数目一致

WHERE 语句

where是Fortran95添加的功能,可以通过逻辑判断,对数组部分元素进行操作。例如以下例子,可以将a中<3的数组元素赋值给b

  1. program main
  2. implicit none
  3. integer :: i
  4. integer :: a(5)=(/(i,i=1,5)/)
  5. integer :: b(5)=0
  6. where(a<3)
  7. b=a
  8. end where
  9. write(*,*) "a=",a
  10. write(*,*) "b=",b
  11. stop
  12. end
  1. !输出
  2. a= 1 2 3 4 5
  3. b= 1 2 0 0 0

where也可以作嵌套,elsewhere(逻辑判断)

  1. program main
  2. implicit none
  3. integer :: i
  4. integer :: a(5)=(/(i,i=1,5)/)
  5. integer :: b(5)=0
  6. where(a<3)
  7. b=1
  8. elsewhere(a>4)
  9. b=2
  10. elsewhere
  11. b=3
  12. end where
  13. write(*,*) "a=",a
  14. write(*,*) "b=",b
  15. end
  1. !输出
  2. a= 1 2 3 4 5
  3. b= 1 1 3 3 2

FORALL语句

forall是Fortran95中添加的功能

  1. program main
  2. implicit none
  3. integer :: i
  4. integer :: a(5)=0
  5. forall(i=1:5:2) !1~5,增量为2
  6. a(i)=5
  7. end forall
  8. write(*,*) "a=",a
  9. forall(i=1:5)
  10. a(i)=i
  11. end forall
  12. write(*,*) "a=",a
  13. stop
  14. end
  1. !输出
  2. a= 5 0 5 0 5
  3. a= 1 2 3 4 5

对于二维数组,有相同的操作

  1. program main
  2. implicit none
  3. integer :: i,j
  4. integer :: a(5,5)=0
  5. forall(i=1:5:1,j=1:5:1)
  6. a(i,j)=i+j
  7. end forall
  8. do i=1,5,1
  9. write(*,*) a(:,i)
  10. end do
  11. stop
  12. end
  1. !输出
  2. 2 3 4 5 6
  3. 3 4 5 6 7
  4. 4 5 6 7 8
  5. 5 6 7 8 9
  6. 6 7 8 9 10

还可以在forall中添加条件判断,语法为

  1. forall(索引1,索引2,逻辑判断)
  1. program main
  2. implicit none
  3. integer :: i,j
  4. integer,parameter :: N = 5
  5. integer :: a(N,N)=0
  6. forall(i=1:N,j=1:N,i>j) a(i,j)=1 !上三角
  7. forall(i=1:N,j=1:N,i==j) a(i,j)=2 !对角线
  8. forall(i=1:N,j=1:N,i<j) a(i,j)=3 !下三角
  9. write(*,"(5(5I5,/))") a
  10. stop
  11. end
  1. !输出
  2. 2 1 1 1 1
  3. 3 2 1 1 1
  4. 3 3 2 1 1
  5. 3 3 3 2 1
  6. 3 3 3 3 2

forall可以嵌套多层,forall中可以使用where,但是where中不能使用forall,例如

  1. program main
  2. implicit none
  3. integer :: i,j
  4. integer,parameter :: N = 5
  5. integer :: a(N,N)=0
  6. forall(i=1:N)
  7. forall(j=1:N)
  8. a(i,j)=i+j
  9. end forall
  10. end forall
  11. write(*,"(5(5I5,/))") a
  12. forall(i=1:N)
  13. where(a(i,:)/=6)
  14. a(i,:)=0
  15. end where
  16. end forall
  17. write(*,"(5(5I5,/))") a
  18. stop
  19. end
  1. !输出
  2. 2 3 4 5 6
  3. 3 4 5 6 7
  4. 4 5 6 7 8
  5. 5 6 7 8 9
  6. 6 7 8 9 10
  7. 0 0 0 0 6
  8. 0 0 0 6 0
  9. 0 0 6 0 0
  10. 0 6 0 0 0
  11. 6 0 0 0 0

数组的存储规则

可变大小的数组

利用allocate与deallocate分配与释放内存

  1. program main
  2. implicit none
  3. integer :: students
  4. integer,allocatable :: a(:)
  5. integer :: i
  6. write(*,*) "How many students:"
  7. read(*,*) students
  8. allocate(a(students)) !分配内存
  9. write(*,*) "size of array = ",size(a)
  10. deallocate(a) !释放内存
  11. stop
  12. end

测试程序(测试当前计算机所能分配的最大内存)

  1. program main
  2. implicit none
  3. integer :: size_N=0,error=0
  4. integer,parameter :: one_mb=1024*1024
  5. character,allocatable :: a(:)
  6. do while(.true.)
  7. size_N=size_N+one_mb
  8. allocate(a(size_N),stat=error) !分配内存
  9. if(error/=0) then
  10. exit
  11. end if
  12. write(*,"('Allocate ',I10,'bytes')") size_N
  13. write(*,"(F10.2,'MB used')") real(size_N)/one_mb
  14. deallocate(a) !释放内存
  15. end do
  16. stop
  17. end

数组应用实例

冒泡排序

  1. program main
  2. implicit none
  3. integer :: a(5)=(/10,2,5,4,6/)
  4. integer :: i,j,temp
  5. write(*,"(5(I5))") a
  6. do i=1,5
  7. do j=i+1,5
  8. if(a(i)>a(j)) then
  9. temp=a(i)
  10. a(i)=a(j)
  11. a(j)=temp
  12. end if
  13. end do
  14. end do
  15. write(*,"(5(I5))") a
  16. stop
  17. end program
  1. !输出
  2. 10 2 5 4 6
  3. 2 4 5 6 10

Fortran学习笔记:03 数组(Array)的更多相关文章

  1. [学习笔记]JS 数组Array push相关问题

    前言: 今天用写了一个二维数组,都赋值为零,然后更新其中一个值,结果和预期是不一样,会整列的相同位置都是同一个值. 1.用Chrome的控制台样例如下: arrs[2][2] =1的赋值,竟然是三个数 ...

  2. Java学习笔记 03 数组

    一.数组的创建和使用 数组的创建和使用 >>创建方法1:先声明,再用new关键字分配内存(使用new关键字分配内存,整形数组中各个元素的初始值都为0) String str[]; str= ...

  3. PHP学习笔记之数组篇

    摘要:其实PHP中的数组和JavaScript中的数组很相似,就是一系列键值对的集合.... 转载请注明来源:PHP学习笔记之数组篇   一.如何定义数组:在PHP中创建数组主要有两种方式,下面就让我 ...

  4. (目录)Fortran学习笔记:开坑!!!

    前言:因为某些原因,需要使用Fortran编写程序,记录下Fortran语法学习过程中的部分笔记.在此开坑记录,立下Flag,"希望年末能够更新完" Fortran 学习笔记 陈橙 ...

  5. JavaScript学习笔记之数组(二)

    JavaScript学习笔记之数组(二) 1.['1','2','3'].map(parseInt) 输出什么,为什么? ['1','2','3'].map(parseInt)//[1,NaN,NaN ...

  6. Fortran学习笔记4(循环语句)

    Fortran学习笔记4 Fortran学习笔记4 逻辑运算 循环 Do语句 Do-While循环 循环控制 循环应用实例 逻辑运算 if命令需要和逻辑运算表达式搭配才能起到很好的效果.下面分别列出F ...

  7. SaToken学习笔记-03

    SaToken学习笔记-03 如果排版有问题,请点击:传送门 核心思想 所谓权限验证,验证的核心就是一个账号是否拥有一个权限码 有,就让你通过.没有?那么禁止访问! 再往底了说,就是每个账号都会拥有一 ...

  8. Fortran学习笔记:01 基本格式与变量声明

    Fortran学习笔记目录 01 基本格式与变量声明 格式 固定格式(Fixed Format):Fortran77 程序需要满足一种特定的格式要求,具体形式参考教材 自由格式(Free Format ...

  9. 机器学习实战(Machine Learning in Action)学习笔记————03.决策树原理、源码解析及测试

    机器学习实战(Machine Learning in Action)学习笔记————03.决策树原理.源码解析及测试 关键字:决策树.python.源码解析.测试作者:米仓山下时间:2018-10-2 ...

随机推荐

  1. 五:HttpServletResponse对象

    一.HttpServletResponse对象介绍 HttpServletResponse对象代表服务器的响应.这个对象中封装了向客户端发送数据.发送响应头,发送响应状态码的方法.查看HttpServ ...

  2. C++泛型编程之类模板

    泛型语义 泛型(Generic Programming),即是指具有在多种数据类型上皆可操作的含意.泛型编程的代表作品 STL 是一种高效.泛型.可交互操作的软件组件. 泛型编程最初诞生于 C++中, ...

  3. Javascript - Vue - webpack中的组件、路由和动画

    引入vue.js 1.cnpm i vue -S 2.在mian.js中引入vue文件 import Vue from "vue"//在main.js中使用这种方式引用vue文件时 ...

  4. form表单中id与name的区别

    以前经常写form表单时,不写id和name,总觉得没有什么用.后来一看后台套完的页面发现,他们都补上name,不知道所以然,就查了一下资料,吓我一跳,要是照我那样写根本不会有数据传到服务器.原来表单 ...

  5. 运行uni-app到微信开发者工具

    1.工具及环境 HBuilder X 微信开发者工具 Node.js,测试:node -v(node安装) 和 npm -v(自带的npm也安装成功) 2.创建uni-app项目: 在点击工具栏里的文 ...

  6. TypeScript 中枚举类型的理解?应用场景?

    一.是什么 枚举是一个被命名的整型常数的集合,用于声明一组命名的常数,当一个变量有几种可能的取值时,可以将它定义为枚举类型 通俗来说,枚举就是一个对象的所有可能取值的集合 在日常生活中也很常见,例如表 ...

  7. 使用selenium模拟登录12306网站

    1 import yh 2 from selenium import webdriver 3 from PIL import Image 4 # from selenium.webdriver imp ...

  8. 存储系统管理(三)——磁盘配额及lvm逻辑卷管理

    Linux是一个多用户的操作系统,系统有很多用户,就必须限制每个用户的保存空间,配额就是来管理用户空间的,配额只是针对与设备而言. 1.新建一个分区 2.格式化分区为xfs文件系统 3.将其以配额的方 ...

  9. proto buffer

    protobuf是一种高效的数据格式,平台无关.语言无关.可扩展,可用于 RPC 系统和持续数据存储系统. protobuf介绍 Protobuf是Protocol Buffer的简称,它是Googl ...

  10. 微前端框架single-spa初探

    前言 最近入职的一家公司采用single-spa这个微前端框架,所以自学了此框架. single-spa这个微前端框架虽然有中文文档,但是有些零散和晦涩. 所以我想在学习之余,写篇博客拉平一下这个学习 ...