更新时间:2020/3/1
文章目录
PART I 一些细节及快捷使用
!EASY USING
//字符型数组使用:
1.字符运算符只有一个,就是字符连接符'//'其作用是将两个字符型数据连接起来, 成为一个字符型数据。例如:'HE'//'LLO!'的值为 'HELLO!' 。
2.用于字符处理的内在函数
1)LEN(String) //返回变量的内存长度
2)LEN_TRIM(String) //返回变量的实际已利用的长度(除去尾部空格)
3)TRIM(String) //去除字符串尾部空格,返回处理过的字符串
4)LGE(String1, String2) //字符串比较函数, 若String1≥ String2,其函数结果值为“真”,否则为 “假”。
5)INDEX(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规则”的隐含约定级别最低
5、KIND(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语句作用是在循环执行到该语句时,跳过循环体在它后面的那些语句, 再从循环体的第一条语句开始执行。只能引导循环的执行方向,并不能终止循环的执行。
13、
character(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