Fortran学习笔记1

  • Post author:
  • Post category:其他


fortran是一个比较老的语言了,但是非常适合数学运算,特此学习(之前学习过c++,所以很多地方会用c++类比)

使用vscode进行编程学习,fixed format已经很少使用了,现在主要是使用free format,主要特点是:

1、感叹号为注释符

2、每行可以编132个字符

3、行号在每行程序的最前面

4、一行代码的最后符号是&时,下一行程序会和这一行链接,而如果一行代码的开头是&的话,那他就上一行代码连接

eg.wir&

&ite(*,*)”hello”当然最好别这样写,太难看且没啥用

一、Fortran的数据类型:

1:整数integer :分32位的短整型和64位的长整型;

2、浮点数real:分32bit单精度浮点数和64bit双精度浮点数

3、复数complex:a+bi的形式,也有单精度复数和双精度复数

4、字符charcater:一个字符是占1byte空间

5、逻辑判断logical:boolean类型true和false

二、运算符号:

+加、-减、*乘、/除、**乘幂

三、io

out:

1、write:write(unit=iounit, fmt=”(format string)”, iostat=ios, advance=’NO’) variables

最简单的用法就是write(*,*)第一个*表示输出的位置默认是屏幕,第二个*表示不特别设置输出的格式,即write(unit=*,fmt=*),当然参照上面最完整的表达式,可以在多种情况下选择不同的输出形式。

注意:

1)每次write之后,便会换行输出

2)用双引号来输出,当要想输出双引号的时候,要连用双引号

eg.write(*,*)”he comes from “a disappeared continent””

2、print:和write其实没有多大的区别,主要是print不带括号,且其后只有一个*,表示不限制输出格式,没有赋值输出位置的能力,只是打印在屏幕上就行,eg.print*,”Hello”

3、一般来说,一个程序的结构是:

program program_name

...

stop

end

当然,这是free format的书写格式,fixed format尤其特殊的写法和要求,这里不做概述

程序到stop就终止了,end是用来封装程序的,这就类似于c++的{},

eg:int function_name(variable1,variable2,variable3….){}

四、参数声明

很奇怪的一点就是,我在书上并没有看到过例如c++、java、python等语言那样,声明一个参数的时候就可以直接给赋值,Fortran是先声明,声明之后再赋值,让我想起了很好玩的一个事情,他可能是先声明一个变量(就是先告诉计算机,给分配一块区域,我要存变量,计算机就分配一块所需要的区域,区域的名字就是变量名,有点接近底层了哈),其他到没啥大问题 附上一些代码和注释就ok啦,不过搞笑的是我才发现还可以使用例如real::a=xxx的形式,这样可以直接赋值。

!我去,这家伙老的添加代码段的时候都找不到Fortran语言了,随遍用其他语言高亮了,哈哈
! free format
program main
!Fortran有个很让人无语的问题,他有可能根据变量的首字母判断一个变量是什么类型,比如首字母是
!I、J、K、L、M、N的,编译器会直接认为是integer,所以,用一个implicit none来告诉编译器不
!使用默认类型。
implicit none
!kind=4,kind=8分别表示的是精度,4:短精度,8:长精度
integer(kind=4) a
real(kind=4) b
real(kind=8) c
complex(kind=4) d
complex(kind=8) e 
character(len=4) f 
logical g
! 变量赋值
a=3
b=0.1
c=sin(b)*cos(b)
d=(1.0,1.0)!d=1.0+1.0j
e=(1.0,2.0)!e=1.0+2.0j
f="hello//word!"
! 注意,f我只声明了4byte:character(len=4) f ,所以不会把f完全打印
g=.true.!注意这里的.true.以及.false.
! 打印输出
write(*,*)"a=",a
write(*,*)"b=",b
write(*,*)"c=",c
write(*,*)"d=",d
write(*,*)"e=",e
write(*,*)"f=",f
write(*,*)"g=",g
stop!除了主程序,其他地方还是不加stop的好
end
上述程序变量声明和结果

输入流就是read:

read(unit=iounit, fmt=”(format string)”, iostat=istat, advance=’NO’, size=number of characters) variables

read(*,*)variable_name,严谨点,unit=5,代表着从键盘输入

五、格式化

fortran的格式化最主要使用的是I(int型)、F(float型)、A(char型)、E(科学计数法)、X(空白),其他的格式使用的其实不多,而且主要是在write的第二个参数fmt=xxx里使用,我看了看,不喜欢用那种write一行,format一行的写法,很乱也很难看,直接write(*,”()”)variab,好看

如:

I5:固定以5个字符的字段来输出一个整数:

I5.3:在前者基础上,至少输出三个数字,

主要有这些格式:

输出时:

1)Iw[.m]:以w个字符宽度输出整数,至少输出m个

2)Fw.m:以w个字符宽度输出浮点数,小数部分占m个字符宽

3)Ew.d[Ee]:以科学计数法输出,w个字符宽度浮点数,小数占m个字符宽

4)Dw.d:和(3)一模一样,就是把e换成d

5)Aw:以w个字符宽度输出字符串

6)nX:输出右移n位

7)Lw:以w个字符宽度输出T or F

8)Gw.d[Ee]:G是通用类型

9)Bw[.m]:整数换成二进制形式,固定输出m位

10)Ow[.m]:整数换成八进制形式,固定输出m位

11)Zw[.m]:整数换成十六进制形式,固定输出m位

输入时:

12)TLn、TRn输出位置左移或右移n位

13)SP、SS:加sp后,if number>0:输出加”+”,ss则用来取消sp

14)kP:改变输入浮点数的Scale,输入的数值会自动乘上10的-k次方

15)BN、BZ:BN:在输入时,没有数据的字节代表”没有东西”,

BZ:在输入时,没有数据的字节用0代替

常数声明很简单:eg.parameter(pi=3.1415925),就是c++的 const double pi=3.1415925

等价声明和c++中的取地址&一模一样,就是两个参数使用同一块内存单元,fortran中的写法是

equivalent(a,b)

自定义数据类型(卧槽,内心的c++基因他动了,这就是结构体啊)简单的一匹,直接上代码:

type type_name
    integer:: integer_number
    real::real_number
    character::character_number
end type type_name
! 声明一个type对象:
type(type_name)::type_name_one
! 调用对象内的变量:
type_name_one%integer_number
type_name_one%real_number
type_name_one%character_number
!对比一下c++:
struct struct_name
{
    int int_name;
    float float_name;
    char char_name;
    /* data */
};
// 声明+调用
int main(){
struct_name struct_name_one;
struct_name_one.int_name=1;
struct_name_one.float_name=2.0;
struct_name_one.char_name="hello"
}
!比起Fortran,我还是喜欢c++

到这里就差不多OK了,下一章是Fortran的控制流,有了基础就不会很难了!

书后的题已上传

program main
implicit none
!question one
character(len=20) ::one="Have a good time"
character(len=20)::two="That's not bad"
character(len=20) :: three='"Mary"'//" isn't my name"
write(*,*)one
write(*,*)two
write(*,*)three
stop 
!!question two
real pi
parameter(pi=3.1415926535)
real radius
real square
write(*,*)"please input the radius"
read(*,*) radius
square=pi*radius**2
write(*,*)"square=",square
stop 
!!!question three
real grade
write(*,*)"student's grade="
read(*,*)grade
grade=sqrt(grade)*10
write(*,*)"grade="
write(*,"(F9.3)")grade
stop
!!!!question four
integer a,b
real ra,rb
a=2
b=3
ra=2.0
rb=3.0
write(*,*)b/a
write(*,*)rb/ra
!!!!!question five
type distance
    real m,cm,inch
end type distance
type(distance)::distance_one
real chi
write(*,*)"input a number"
read(*,*)chi
distance_one%cm=chi/33.33
distance_one%m=chi/0.333
distance_one%inch=chi/1.09
write(*,*)"distance_one.cm=",distance_one%cm
write(*,*)"distance_one.m=",distance_one%m
write(*,*)"distance_one.inch=",distance_one%inch
stop
end 



版权声明:本文为faltas原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。