Fortran 编程笔记

4 篇文章 2 订阅

更新时间:2020/3/1

PART I 一些细节及快捷使用

!EASY USING
//字符型数组使用:
1.字符运算符只有一个,就是字符连接符'//'其作用是将两个字符型数据连接起来, 成为一个字符型数据。例如:'HE'//'LLO!'的值为 'HELLO!' 。
2.用于字符处理的内在函数
​     1LEN(String)       //返回变量的内存长度2LEN_TRIM(String)  //返回变量的实际已利用的长度(除去尾部空格)3TRIM(String)      //去除字符串尾部空格,返回处理过的字符串
     4LGE(String1, String2) //字符串比较函数, 若String1≥ String2,其函数结果值为“真”,否则为 “假”。 5INDEX(String1, String2) //计算子串位置函数,若String2是 String1的子串,其函数值是一个正整数 ,该数表示String2在String1中最左边的子串的起始位置;若String2不是 String1的子串,其函数值为0。 例如, INDEX(‘fortran’,’an’)的值为6。

1、每行可以编写132个字符;一行程序代码的最后如果是符号“&”,代表下一行程序会与这一行链接。如果一行程序代码的开头是符号“&”,代表它会和上一行程序连接

2、fortran90不区分大小写,函数或变量命名时,前缀必须是字母!!

3、数据类型
integer(kind=?)  -整型
real(kind=?)     -实型 缺省4byte
complex(kind=?)  -复数 缺省8byte
character(kind=?)-字符
logical(kind=?)  -逻辑型
byte     -1个字节的整型
double precision -双精度实型
Type(??)         -派生类型

4、类型说明语句最优先, IMPLICIT 语句次之,“I-N规则”的隐含约定级别最低
5KIND(X)  -返回变元x的种别参数值,即x所占的字节数
6、数组不给下界,默认从1开始,默认按列存储,默认初值都为0

7、整型(integer)、实型(real)、逻辑型(logical)默认是4 个字节3、以i,j,k,l,m,n开头的变量默认情况下都是整型,其他为实型(IN规则)除非在开头加: IMPLICIT NONE

8、可以用 IMPLICIT 语句将某一字母开头的全部变量指定为所需的类型
IMPLICIT INTERGER(A,C,T-V)
IMPLICIT REAL (I,J)

9、fortran 中只有圆括号,一次输入输出为一行

10、GOTO 语句——提供程序员可以任意跳转到所赋值“行代码” 的那一行程序位置来执行程序的能力,但不能跳进循环体内部

11、EXIT语句的作用是停止循环,将控制转移到当前循环之外。

12、CYCLE语句作用是在循环执行到该语句时,跳过循环体在它后面的那些语句, 再从循环体的第一条语句开始执行。只能引导循环的执行方向,并不能终止循环的执行。 

13character(len=1),dimension(1:7):: a!right
character(len=1),dimension(1:7) a  !wrong

14、最好不要用中文文件名,文件用单引号,单斜杠,和matlab 一样
rewind(10)!把文件读写位置移回文件最前面
trim 删除字符串后面多余的空格

15、定义常量
integer,parameter (m=20)
double precision pi=dtan(1.d0)*4.d0  !圆周率pi

16、字符串实际利用空间后都是被' '所占用的
ftext(:len_trim(ftext))!截取尾部的空格

17、编写程序时要注意避免两个大数相乘,大数除以小数。

18、不要以浮点数作为循环变量

19、处理浮点数后加'd0'将后面小数截尾
	!eg
	real*8 ::a=0.1
    print *,a*10
    1.00000001490116
	real*8 ::a=0.1d0
    print *,a*10
    1.00000000000000

PART II 一些知识点

1. 标准 FORTRAN 90/95 数据类型

在这里插入图片描述

2.属性说明关键字

在这里插入图片描述

3.基本函数

在这里插入图片描述

!1、常用函数
r = real( x ) //!把x 转换成real 类型
	r = real( x ,kind=8) //!把x 转换成kind=8 的real类型(双精度)
	r = float( x ) / r = dble( x )
r = int( x ) //!把x 转换成integer 类型
    r = int( x , kind=8) //!把x 转换成kind=8 的integer类型(长整型)
    r = nint( x ) //!四舍五入并转换
c = cmplx( a , b ) //!把a 和b 转换为复数,分别为实部/虚部
    r = cmplx(a,b,kind=8)
	c = (1.0,2.0)//!如果a b 都是常数,也可写为
	
内部文件转换:
write( 字符串, * ) //!其他数值其他类型转字符串
read( 字符串, * ) //!其他数值字符串转其他类型
    write( str , * ) 9.0 !// str = " 9.000000"
    read( str , * ) i !// i = 9.0
    
一般数值函数:
ri = abs( ri ) //!绝对值函数
ri = max( ri1 , ri2 , ri3 ..... ) //!最大值函数
ri = min( ri1 , ri2 , ri3 ..... ) //!最小值函数
ri = mod( a , b ) //!取余数函数

其他数学函数:
r = log( r ) //!自然对数函数
r = log10( r ) //!对数10为底函数(换底公式)
r = exp( r ) //!自然对数指数函数

向量矩阵数学函数:
b = transpose( a ) //!把m*n矩阵转置为n*m矩阵
c = matmul( a , b ) //!m*n矩阵与n*l矩阵相乘,得m*l矩阵

时间相关:
    i = Date_And_Time([date] [,time] [,zone] [,values])
    call CPU_Time(time)
    call System_Clock([count] [, count_rate] [, count_max])
    //第一个函数用来获得系统的日期和时间(及时区)精度不高
    //第二个函数用来获取当前CPU的时钟,常可以用来检查程序段的执行时间。
    //第三个函数用来获取系统时钟(基于1970年),也可用来检查程序段的执行时间。
    //后两个函数用来检查执行时间,需要执行前/执行后分别调用依次,两次相减。
    //CPU_Time 的特点是,多线程会多次计算,其他进程占用的CPU不计入。
    //System_Clock 的特点是,计算物理时间消耗。

4.关系表达式

关系表达式

5.逻辑运算符

五钟逻辑运算符

6.运算符优先级

在这里插入图片描述

PART III 使用示例

1.index 的使用

!1、分离以空格为分割符的字符串_ index 的使用
	subroutine split_space(str,a,n)
	!a is a real arry,n is the number,str(1)\=' '
    character*80 str
    integer n,i,j
    real::a(n)
    i=1;j=index(str,' ')   
    do while(j>1)
        read(str(:j-1),*)a(i);i=i+1
        str=str(j+1:)
        j=index(str,' ') 
    end do
    read(str(:len_trim(str)),*) a(i)
    end

2.统计’x’在str 中出现的次数及其每次的位置

!2、统计'x'在str 中出现的次数及其每次的位置   
    subroutine count_a(str,a,n,loc)
    !n is the number of ..
    !loc is the location of ..
    implicit none
    character *200    str
    character         a
    integer           i,j,n,loc(200)
    n=0
    j=len_trim(str)
    do i=1,j
        if(str(i:i).eq.a)then!you can change 'x' here
            n=n+1
            loc(n)=i
        endif
    enddo
    end

3.打开文件

!3、How to open a file?
program hello
    implicit none
    character *79 filename,ftext!the longest number of character is 80 for fortran output
    integer ::    fid=10
    logical ::    alive !check the file exists?
    
    filename='D:\复习资料\大3上\3_Fortran\1 编程\data\grades.txt'
    inquire(file=filename,exist=alive)
    if(.not.alive)then !if the file doesn't exist, then exit
        write(*,*)trim(filename)," doesn't exist."
        stop
    end if
    open(unit=fid,file=filename,status="old")
    do 
        read(fid,'(a)',end=101)ftext
        print *, ftext   
    enddo
101 close(fid)
    pause
    end    

4.函数和子程序的使用

!4、函数和子程序的使用:
    以子程序的形式编程实现两个3×3矩阵的求和。
 //!调用子例子程序
 program matrix_add
    implicit none
    real*8 a(3,3),b(3,3),c(3,3)
    integer i,j
    write(*,*) '输入矩阵a的元素:'
    read(*,*) ((a(i,j),i=1,3),j=1,3)
    write(*,'(3f10.3/3f10.3/3f10.3)') a
    write(*,*) '输入矩阵b的元素:'
    read(*,*) ((b(i,j),i=1,3),j=1,3)
    write(*,'(3f10.3/3f10.3/3f10.3)') b
    call matadd(a,b,c)
    write(*,*) '矩阵a、b之和为:'
    write(*,'(3f10.3/3f10.3/3f10.3)') c
    pause
    end program
    
    subroutine matadd(a,b,c)
    implicit none
    real*8 a(3,3),b(3,3),c(3,3)
    integer i,j
    do i=1,3
        do j=1,3
            c(i,j)=a(i,j)+b(i,j)
        enddo
    enddo
    end 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>     
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//!调用函数子函数(使用接口界面块)
program matrix_add
    implicit none
    
    interface !接口界面块
    function matadd(a1,b1)
    real*8 a1(3,3),b1(3,3),matadd(3,3)
    end function
    end interface
        
    real*8 a(3,3),b(3,3),c(3,3)
    integer i,j
    write(*,*) '输入矩阵a的元素:'
    read(*,*) ((a(i,j),i=1,3),j=1,3)
    write(*,'(3f10.3/3f10.3/3f10.3)') a
    write(*,*) '输入矩阵b的元素:'
    read(*,*) ((b(i,j),i=1,3),j=1,3)
    write(*,'(3f10.3/3f10.3/3f10.3)') b
    c=matadd(a,b)
    write(*,*) '矩阵a、b之和为:'
    write(*,'(3f10.3/3f10.3/3f10.3)') c
    pause
    end program
    
    function matadd(a,b)
    implicit none
    real*8 a(3,3),b(3,3),matadd(3,3)
    integer i,j
    do i=1,3
        do j=1,3
            matadd(i,j)=a(i,j)+b(i,j)
        enddo
    enddo
    end 
===================================================
!运行示例
 输入矩阵a的元素:
1 2 3 4 5 6 7 8 9
     1.000     2.000     3.000
     4.000     5.000     6.000
     7.000     8.000     9.000
 输入矩阵b的元素:
1 2 3 4 5 6 7 8 9
     1.000     2.000     3.000
     4.000     5.000     6.000
     7.000     8.000     9.000
 矩阵a、b之和为:
     2.000     4.000     6.000
     8.000    10.000    12.000
    14.000    16.000    18.000

5.定义动态数组

!5、定义动态数组
program Hello
    implicit none
    integer ::students,i
    integer,allocatable::a(:)!声明一个动态一维数组
    read(*,*)students
    allocate(a(students)) !配置内存空间
    do i=1,students
        read(*,*) a(i)
    end do
    print *,a
    deallocate(a)
    pause
end 
==========================================================
5
1
2
4
5 6
7!回车
           1           2           4           5           7

PART IV 常用功能实现

1.读取星历文件

星历问件格式数据类型有

X //空格
A //字符型
I //整型
F //单精度浮点型
D //双精度浮点型
E //科学计数法,浮点数

一看到这,我马上就想到了fortran (实际上我是先接触的星历,后学的fortran)但是,有充分的理由怀疑星历格式就是准备用fortran 来读的。fortran 用于科学计算,好像很古老了,用fortran 的人并不是很多,大多数人用fortran 主要是因为前辈们写的很多优秀代码都是fortran 写的,代代传。在贴吧里面看到一个笑话:"我觉得fortran 一点都不好用,我导师让我学fortran 的理由是我导师的导师让我导师学 fortran… "
https://blog.csdn.net/Gou_Hailong/article/details/106085616

PART V 一些有用的博客

1、win10 VS2010安装 fortran插件
2、格式化输出
在这里插入图片描述

参考/引用博客

[1] Coco_wjy-CSDN博主:https://blog.csdn.net/Coco_wjy/article/details/90291545?utm_source=app
[2] 小毛95-CSDN博主:https://blog.csdn.net/weixin_43780543/article/details/89928567
[3] 流浪猪头拯救地球-CSDN博主:https://blog.csdn.net/Gou_Hailong/article/details/106085616
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流浪猪头拯救地球

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值