190 likes | 396 Views
Fortran. 5110379083 龚立航. 目录. 历史 特性 一些语句简介 和 C 语言的比较. 历史. 1957 年, IBM 公司开发出第一套 FORTRAN 语言 , 在 IBM704 计算机上 运作 。 1966 年,美国标准化协会制定了 Fortran66 和 Fortran66 标准 。这时 Fortran 语言还不是结构化的程序设计语言 。
E N D
Fortran 5110379083 龚立航
目录 • 历史 • 特性 • 一些语句简介 • 和C语言的比较
历史 • 1957年,IBM公司开发出第一套FORTRAN语言,在IBM704计算机上运作。 • 1966年,美国标准化协会制定了Fortran66和Fortran66标准。这时Fortran语言还不是结构化的程序设计语言。 • 1976年,美国标准化协会重新对Fortran66进行了评估,公布了新的Fortran标准,也就是Fortran 77。Fortran 77是具有结构化特性的编程语言。Fortran77在短时间内取得了巨大的成功,广泛地应用于科学和工程计算,几乎统治了数值计算领域。 • 1991年发布的Fortran 90大幅改进了旧版Fortran的型式,加入了对象导向的观念与提供指针,并同时加强数组的功能。 • 后来又陆续推出Fortran 95、Fortran 2003等更新版本。
约翰·贝克斯 • FORTRAN的发明小组组长 • BNF • 用于表示上下文无关文法的语言,上下文无关文法描述了一类形式语言。
特性 • Fortran语言的最大特性是接近数学公式的自然描述,在计算机里具有很高的执行效率。 • 易学,语法严谨。 • 可以直接对矩阵和复数进行运算,这点MATLAB有继承。 • 自诞生以来广泛地应用于数值计算领域,积累了大量高效而可靠的源程序。 • 很多专用的大型数值运算计算机针对Fortran做了优化。 • 广泛地应用于并行计算和高性能计算领域。 • Fortran 90,Fortran 95,Fortran 2003的相继推出使Fortran语言具备了现代高级编程语言的一些特性。 • 其矩阵元素在记忆空间储存顺序是采用列优先(Column first),MATLAB也承袭这点,目前最多使用的C语言则采用行优先(Row first)。
行优先顺序 • 将数组元素按行向量排列,第i+1个行向量紧接在第i个行向量后面。 • 例: 二维数组Amn的按行优先存储的线性序列为:a11,a12,…,a1n,a21,a22,…,a2n,……,am1,am2,…,amn • 列优先顺序 • 将数组元素按列向量排列,第i+1个列向量紧接在第i个列向量后面。 • 例: 二维数组Amn的按列优先存储的线性序列为:a11,a21,…,am1,a12,a22,…,am2,……,a1n,a2n,…,amn
输出语句 一般格式: print ﹡,〈输出表列〉 write (﹡,﹡)〈输出表列〉 例1: print ﹡,56.8,125 或 write (﹡,﹡) 56.8,125 例2: print ﹡,a, b, c 或 write (﹡,﹡) a, b, c
输出语句 • 每个整数占12列,数据打印在右端,左补空格。 例:print *,123,-1128 输出结果: ︺︺︺︺︺︺︺︺123︺︺︺︺︺︺︺-1128 • 每个实数占16列,数据打印在右端,左补空格。 例:print *,15.4,-321.45 输出结果: ︺︺︺︺︺︺15.400000︺︺︺︺︺-321.450000
C语言和Fortran语言的差异 • 复数运算的速度 • 程序参数与字串 • 内存的动态管理 • 多维阵列的处理 • 函数调用与参数传递
复数运算的速度 • 复数是 Fortran 的基本数据类型之一 • C 可以由 struct的定义,达到复数四则运算的目的,但却很可能牺牲了程序效能,或者是程序写起来相当繁杂降低可读性
程序参数与字串 C 程序可以有参数串列 int main(intargc, char **argv) { int a, b, c; a = atoi(argv[1]); b = atoi(argv[2]); c = atoi(argv[3]); } 而程序执行时,参数就是这样传入: a.out 12 15 18
程序参数与字串 Fortran 要传入任何参数,只能透过对话的方式: integer a, b, c c ------------------------------------ write(*,*) ''please input integer a:'' read(*,*) a write(*,*) ''please input integer b:'' read(*,*) b write(*,*) ''please input integer c:'' read(*,*) c c ------------------------------------ end
内存的动态管理 C 可以动态分配存储空间给任何数据类型,而Fortran 却不行 float *c_function(intcnt) { float *a; a = malloc(sizeof(float) * cnt); return a; }
多维阵列的处理 • C语言是行优先 • Fortran是列优先
函数调用与参数传递 C 的函数调用就只有一种方式,函数可以传入参数,也可以返回值,例如: void c_function1(int a, float *b) { ........ } int c_function2(int a, float *b) { int r; ........ return r; }
函数调用与参数传递 函数有两种,一为 subroutine,一为 function。subroutine不会有传回值,但 function 有传回值。 subroutine f_function1(a, b) integer a real b ........ end integer function f_function2(a, b) integer a real b ........ f_function2 = .... end
函数调用与参数传递 Fortran 的 function 还要更特殊一点,当程序要使用 f_function2 时,必须先申明:integer f_function2 program fout integer a, r, f_function2 real b c ----------------------------------- call f_function(a, b) r = f_function2(a, b)