[转载]Fortran 77, C, C++ 和 Fortran 90 的比较
Fortran的主要版本及差别

Fortran的主要版本及差别、Fortran的主要版本及差别按其发展历史,Fortran编译器的版本其实很多。
现在在广泛使用的是Fortran 77和Fortran90。
Fortran 90在Fortran 77基础上添加了不少使用的功能,并且改良了77编程的版面格式,所以编程时推荐使用90。
鉴于很多现成的程序只有77版本,有必要知道77的一些基本常识,至少保证能够看懂77程序。
以下是77和90的一些格式上的区别。
Fortran 77:固定格式(fixed format),程序代码扩展名:.f 或.for (1)若某行以C,c或*开头,则该行被当成注释;(2)每行前六个字符不能写程序代码,可空着,或者1~5字符以数字表明行代码(用作格式化输入输出等);7~72为程序代码编写区;73往后被忽略;(3)太长的话可以续行,所续行的第六个字符必须是"0"以外的任何字符。
Fortran 90:自由格式(free format),扩展名:.f90(1)以"!"引导注释;(2)每行可132字符,行代码放在每行最前面;(3)以&续行,放在该行末或下行初。
以下都是讨论Fortran 90。
3、Fortran的一些特点,和C的一些不同其实很多,在下面涉及具体方面时可以看到。
这里只是大致提一些。
(1)不分大小写(2)每句末尾不必要写分号(3)程序代码命令间的空格没有意义(4)不像C,Fortran不使用{ }(5)数据类型多出了复数和逻辑判断类型。
比如复数类型complex :: a !声明复数的方法。
复数显然方便了科学计算,满足了工程方面的需求a=(1.0,2.0) ! a=1+i(6)多出了乘幂运算(**)。
乘幂除了整数还可以是实数形式。
如开方,开立方a=4.0**0.5,a=8.0**(1.0/3.0)。
(7)数组有一些整体操作的功能;可以方便的对部分元素进行操作(8)有些情况下可以声明大小待定的数组,很实用的功能4、Fortran的基本程序结构先看一看所谓的"Hello Fortran"程序。
gcc使用大全

1、用于linux系统下编程的编译器概述GCC(GNU Compiler Collection,GNU编译器套装),是一套由GNU 开发的编程语言编译器。
它是一套GNU编译器套装以GPL 及LGPL 许可证所发行的自由软件,也是GNU计划的关键部分,亦是自由的类Unix及苹果电脑Mac OS X 操作系统的标准编译器。
GCC 原名为GNU C 语言编译器,因为它原本只能处理C语言。
GCC 很快地扩展,变得可处理C++。
之后也变得可处理Fortran、Pascal、Objective-C、Jav a, 以及Ada与其他语言。
历史GCC是由理查德·马修·斯托曼在1985年开始的。
他首先扩增一个旧有的编译器,使它能编译C,这个编译器一开始是以Pastel语言所写的。
Pastel是一个不可移植的Pascal语言特殊版,这个编译器也只能编译Pastel语言。
为了让自由软件有一个编译器,后来此编译器由斯托曼和Len Tower在1987年以C语言重写并成为GNU 专案的编译器。
GCC的建立者由自由软件基金会直接管理。
在1997年,一群不满GCC缓慢且封闭的创作环境者,组织了一个名为EGCS 〈Experimental/Enhanced GNU Compiler System〉的专案,此专案汇整了数项实验性的分支进入某个GCC专案的分支中。
EGCS比起GCC的建构环境更有活力,且EGCS最终也在1999年四月成为GCC的官方版本。
GCC目前由世界各地不同的数个程序设计师小组维护。
它是移植到中央处理器架构以及操作系统最多的编译器。
由于GCC已成为GNU系统的官方编译器(包括GNU/Linux家族),它也成为编译与建立其他操作系统的主要编译器,包括BSD家族、Mac OS X、NeXTSTEP 与BeOS。
GCC通常是跨平台软件的编译器首选。
有别于一般局限于特定系统与执行环境的编译器,GCC在所有平台上都使用同一个前端处理程序,产生一样的中介码,因此此中介码在各个其他平台上使用GCC编译,有很大的机会可得到正确无误的输出程序。
笫十五章 FORTRAN 90

笫十五章 FORTRAN 90
FORTRAN 90 与FORTRAN 77 不同之处
一、说明语句
(一)固有数据类型 整型、实型、复型,其后都可以接一个下划线_和另一个 整型常量或有名整型常量用来指明种别参数。如 42_2 42_long 0.3_double (3.14_double,_7) ascii_’john Q.public’ 种别参数(kind parameter):当它是一个整数1,2,3…时, 可能表示单精度双精度和四精度,在不同的系统中可能是 4,8,16。 (二)变量 integer (kind=2):: x,y character (len=20,kind=kanji) ::name kinji为一整型常量 real ::a=1.2,b=2.3, 初始化变量的值在执行过程中可变
六、数组
(六) 列表检索 1. 对无序列表的顺序检索 subroutine search_1(lost_card,card_number,found) integer,dimension(:),intent(in) :: lost_card integer,intent(in) ::card_number logcal,intent(out) ::found integer ::I found=.false. do I=1,size(lost_card) if(card_number==lost_card(I)) then found=.trun. exit end if end do end
几种Fortran 编译器简介

几种Fortran 编译器---------------------------------------------------------------------------------------1.CVFCompaq Visual Fortran (CVF), 当今PC平台上功能相当强大与完整的Fortran程序开发工具,还用于Abaqus的开发。
1997年,微软将Fortran PowerStation卖给DEC之后,微软就不再出版Fortran编译器了。
后来DEC并入了Compaq,再后来Compaq又和HP合并了。
现在最新的版本是HP出的Fortran for Windows v6.6,现在HP/Compaq已经不再开发Fortran了,CVF 6.6是最终的版本了,Compaq的Fortran开发小组已经投入Intel旗下,目前Intel已经有Intel Visual Fortran 11.0。
Compaq Visual Fortran 6.6官方的单价也相当昂贵。
Compaq Visual Fortran 6.6 下载:/SoftDown.asp?ID=11937Compaq Visual Fortran 6.6 绿色版下载:/down/10915.htmlCompaq Visual Fortran 6.5 下载:/soft/fortran6.5.rarftp://2006:2006@/36/-002124.rar---------------------------------------------------------------------------------------2. IVFIntel Visual Fortran (IVF)将Compaq Visual Fortran* (CVF) 语言的丰富功能与英特尔代码生成及优化技术结合在一起。
目前Intel已经有Intel Visual Fortran 11.0。
fortran用法总结

我的Fortran基本用法小结周日, 10/14/2007 - 21:00 — gator一、说明二、概述三、数据类型及基本输入输出四、流程控制五、循环六、数组七、函数八、文件一、说明本文多数内容是我读彭国伦《Fortran 95 程序设计》的笔记。
只读到第九章,主要是3~9章,都是最基本的用法(原书共16章)。
这里主要摘录了我看书过程中总结的一些Fortran和C不同的地方,主要是语法方面。
希望这份笔记能够给学过C但没有接触过Fortran的同学带去一些帮助。
要想得更清楚些,推荐看一下原书,觉得作者真的写得很好,很清楚;如果有C语言的基础,看完前九应该很快的,花一两天就行了。
觉得如果耐心看完本文,基本功能应该也可以顺利用起来了。
外,由于我之前没有用过Fortran,这次为了赶文档看书又看得很粗浅,大多数东西看过之后都没得及仔细想,只是按着作者的意思去理解。
所以这份笔记还处于纸上谈兵的层次。
如果有不妥的方,希望大家指正。
谢谢!文中蓝色的部分是程序代码,!后面的内容为注释。
二、概述1、名词解释Fortran=For mula Tran slator/Translation一看就知道有什么特色了:可以把接近数学语言的文本翻译成机械语言。
的确,从一开始,IBM设计的时候就是为了方便数值计算和科学数据处理。
设计强大的数组操作就是为了实现这一目标。
ortran奠定了高级语言发展的基础。
现在Fortran在科研和机械方面应用很广。
2、Fortran的主要版本及差别按其发展历史,Fortran编译器的版本其实很多。
现在在广泛使用的是Fortran 77和Fortran90。
ortran 90在Fortran 77基础上添加了不少使用的功能,并且改良了77编程的版面格式,所以编程时推荐使用90。
鉴于很多现成的程序只有77版本,有必要知道77的一些基本常识,至少保证能够看77程序。
以下是77和90的一些格式上的区别。
[转载]Fortran程序基本特点及不同版本之间的区别
![[转载]Fortran程序基本特点及不同版本之间的区别](https://img.taocdn.com/s3/m/4979a303f08583d049649b6648d7c1c708a10b31.png)
[转载]Fortran程序基本特点及不同版本之间的区别原⽂地址:Fortran程序基本特点及不同版本之间的区别作者:caodanping_7141、F77和F90的区别名称:F77固定格式(fixed format),程序代码扩展名:.f或.for,F90⾃由格式(free format),扩展名:.f90格式:F77每⾏前六个字符不写程序代码,可以空着或者1-5字符使⽤数字来标注⾏代码(⽤作格式化输⼊出等),7-72为程序代码编写区,73⾏后被忽略,超过的话可以续⾏,F90每⾏可132字符注释:F77以C,c或*开头的⾏被当成注释;F90以"!"引导注释,也可放在⾏尾续⾏:F77所续⾏的第六个字符是"0"以外的字符,通过⽤+表⽰,F90以&续⾏,放在该⾏末或下⾏初均可变量名:F77⽀持6个字符长,F90⽀持31个字符长常数:F90中PARAMETER可以做形容词,和变量声明同时写在⼀起Real, parameter :: pi=3.1415926关系运算符:F90: == /= > >= < <= (更接近标准的数学符号)F77: .EQ. .NE. .GT. .GE. .LT. .LE.逻辑运算符:.AND. .OR. .NOT. .EQV. .NEQV.变量声明赋值:(1)integer: kind=1,2,4(长整型)F90: integer(kind=2) aInteger(kind=4)::a=15(加上两个冒号可以在定义时就直接赋值)F77: integer*2 b or integer(2) c⽤DATA命令单独赋值(属于声明),data b,c /1, 2.0/Fortran规定变量名以字母IJKLMN六个字母开头的即认为是整型变量(I-N规则),其他字母开头的为实型变量(2)real:kind=4,8(双精度)/real* 8=double precision(1.23E3/1.23D3)F90:real(kind=4) a, F77:real*4 a or real(4) a(3)complex kind=4,8(双精度)F90: complex(kind=4) a a=(3.1,2.5)(4)character len为最⼤长度(26个字母,数字0-9,专⽤字符13个:空格'$()+-*/,=.:)F90: character(len=10) c c=”Hello”, F77: c=’Hello’(5)logical kind=4,2(最少只需要1即可)F90: logical(kind=4) a a=.true.(6)⾃定义类型type:类似于C中的structF90: type::person ……引⽤时变量和元素直接以%区隔,visual fortran可以⽤.来表⽰全局变量全局变量:F77采⽤command来声明全局变量,编译器只提供内存共享⽽不去检查数据类型,使⽤时需要注意定义的是否⼀主程序和主程序中致,⽽F90则提供了module(不是函数,⽤于封装程序模块),可以把全局变量都声明在module中,这样主程序和主程序中就不需要编写重复的程序代码来声明全局变量就不需要编写重复的程序代码来声明全局变量了,函数在需要使⽤时只需要⽤use来调⽤该module_name即可:module module_name...end module还可以把功能上相关的函数放在同⼀个module模块中,程序想要调⽤时use该module才能调⽤,这样⽐较符合模块化的概念,在该module中⽤contains引导函数即可。
Fortran90

1.4 数字处理........................................................................................................................................ 1 1.5 数组处理........................................................................................................................................ 1 1.6 指针................................................................................................................................................ 1 1.7 数据结构........................................................................................................................................ 2 1.8 用户定义的类型和操作符 ............................................................................................................ 2 1.9 过程................................................................................................................................................ 3 1.10 模块(modules).............................................................................................................................. 3 1.11 输入和输出.................................................................................................................................. 3 1.12 荒废的特性.................................................................................................................................. 4 2. Fortran 77, C, C++ 和 Fortran 90 的比较............................................................................................. 5 2.1 数值健壮性................................................................................................................................... 5 2.2 数据并行化部分........................................................................................................................... 7 2.3 数据抽象..................................................................................................................................... 12 2.4 面向对象编程............................................................................................................................. 12 2.5 函数型程序设计......................................................................................................................... 12 3. 数值健壮性........................................................................................................................................... 13 3.1 数值种类(Kind)参数化 .............................................................................................................. 13 3.2 精度选择...................................................................................................................................... 14 3.3 数值多态性................................................................................................................................. 14 3.4 数值近似模型............................................................................................................................. 15 3.5 环境查询..................................................................................................................................... 15 4. 数据并行性........................................................................................................................................... 17 4.1 数组操作...................................................................................................................................... 17 4.2 数组片段..................................................................................................................................... 21 4.3 动态数组...................................................................................................................................... 22 4.4 返回赋值数组的函数(array-valued functions) .......................................................................... 24 4.5 例子:高斯消元法 ..................................................................................................................... 26 参考文献.................................................................................................................................................... 28
C与FORTRAN的差别

/c.htm2. C语言和Fortran语言的差异由于两者产生的背景不同,它们是存在差异的,在比较了几组源代码之后,主要有以下体会:C 最大的优点在于灵活,不但可以藉由 struct 来定义新的数据结构,同时 C 的pointer 更可以让我们自由而且有效率地处理大数据。
而在 UNIX 系统中,由于整个操作系统绝大部分就是 C 写出来的,故我们也有方便的 C 函数库,直接使用系统资源与享受系统带来的服务,以做到一些低阶、快速的动作。
而FORTRAN从一开始就用于科学计算,它与C的差异主要表现为:* 复数运算的速度* 程序参数与字串* 内存的动态管理* 多维阵列的处理* 函数调用与参数传递2.1. 复数运算的速度在进行复数运算的时候,C++ 可以定义复数的 class,还可以重新定义所有的四则运算式,复杂的算式也可以做到由一个表达式来解决。
但它的重新定义复数四则运算是用函数来做的,使用函数来调用其速度很慢,除非采用 inline function 的方式,但会遇到以下的问题:要先将这个算式拆解,分别算过后再重组结果,故表面上程序代码很简洁,但实际上是 compiler做了很多工作,还是要付出相当的计算时间代价的。
至于 Fortran,最大的优点在于复数 (complex number) 的运算,复数是 Fortran 的基本数据类型之一,这正是 C 所缺乏的 (C 基本上只有实型与整型类型而已)。
虽然C 也可以由 struct 的定义,达到复数四则运算的目的,但却很可能牺牲了程序效能,或者是程序写起来相当繁杂降低可读性。
因此,在大量而且要求高速的复数运算场合, Fortran 实际上比 C 还要适合。
然而既然复数已是 Fortran 基本数据类型之一,则 Fortran compiler在设计上可以做到对复数特别的 optimization,例如如果遇到较短的复数运算式,它可以用“心算”直接得出 real_part 与 imag_part 的 expression,像这样:real(a) =……;imag(a) = …….如此只需两步就得到结果。
[转载]Fortran 77, C, C++ 和 Fortran 90 的比较
![[转载]Fortran 77, C, C++ 和 Fortran 90 的比较](https://img.taocdn.com/s3/m/46277ad349649b6648d747a3.png)
[转载]Fortran 77, C, C++ 和 Fortran 90 的比较收藏发信人: quasar (飞贼克斯), 信区: Fortran标题: Fortran 77, C, C++ 和 Fortran 90 的比较(转载)发信站: 南京大学小百合站 (Tue Jun 1 10:59:14 2004)瀚海星云 -- 文章阅读 [讨论区: MathTools]发信人: HuiCai (老灰菜), 信区: SciComp标题: Fortran 77, C, C++ 和 Fortran 90 的比较(转载)发信站: 瀚海星云 (2002年12月19日10:40:38 星期四), 站内信件【以下文字转载自 Fortran 讨论区】【原文由 HuiCai 所发表】Fortran 77, C, C++ 和 Fortran 90 的比较/develop/article/16/16085.shtm三十年来, 从 Fortran 77 开始, Fortran 成为了计算科学的主要语言.在这段时间里, Fortran 的数值能力变得非常稳定而且优于其它计算机语言; 最大的改变来自于不断增长的各种可靠的数值过程库的种类. Fortran 联合(union), 它的使用技巧, 扩充的数值库为计算科学赋予了良好的基础.可是在过去十几年中, 动态数据结构(特别是动态数组)的重要性不窜上升, UNIX 工作站, 复杂的交互式可视化工具, 以及更近的并行体系结构--Fortran 77 都没有实现--刺激了其它语言作为计算语言的使用, 最明显的一个例子是C. 最近C++ 也已经引起人们的兴趣, Fortran 通过发展到 Fortran 90来弥补它在现代科学计算方面的不足. 这部分的一个通常的工作是比较四种语言对科学计算的适应性的, 这四种语言是两个C 的代表(C, C++) 和两个Fortran的代表(Fortran 77, Fortran 90). 下面的表格总结了这种比较, 后面的内容试图合理地解释这种等级排序, 从最好(1)到最差(4)..功能 ------------ F77 - C - C++ - F90数值健壮性 ---- 2 ---- 4 --- 3 ----- 1数据并行性 ---- 3 ---- 3 --- 3 ----- 1数据抽象 ------- 4 ---- 3 --- 2 ----- 1面向对象编程 - 4 ---- 3 --- 1 ----- 2函数型编程 ---- 4 ---- 3 --- 2 ----- 1平均等级 ------ 3.4 - 3.2 - 2.2 -- 1.21 数值健壮性Numeric Polymorphism(数值多态性)中是一个给定一个通用名称的几种版本的图形平滑过程的例子. 这里描述的通用能力是作为Fortran 90提供的一种额外的数值健壮性超过Fortran 77和C的特性. Fortran 77, Fortran 90 , 和 C 版本的SMOOTH子过程也在下面给出, 用于比较. (注意, Fortran 90版使用了第4部分描述的并行性)数值多态性, 加上实际类型的参数, 小数精度选择, 和数字环境变量检查等, 证明了Fortran 90排在这四种语言中的第一位. Fortran 77 列在第二为的原因在于它支持复杂变量, 这在很多计算科学应用中是很重要的. C ++ 把 C 挤出了第三位是由于它在通常领域多态性上的能力.2 数据并行化部分在这四种语言中, 只有Fortran 90具有对科学计算有价值的数据并行能力; 其它三种语言在这方面的特性基本上是一样的, 即全都没有. 这解释了四种语言在这个方面的排名.这里是完成高斯消去的一套Fortran 77 和 C 过程:****************************************************************** 编程决定正确的子过程处理过程: pivot.f , triang.f , 和 back.f. ** 子过程决定一系列同步方程的解*******************************************************************234567PROGRAM testgINTEGER IMAX, JMAXPARAMETER (IMAX = 3, JMAX = 4)REAL matrix(IMAX, JMAX)REAL matrix(IMAX)INTEGER i, j, nDATA ( ( matrix(i,j), j = 1, JMAX), i = 1, IMAX)+ /-1.0, 1.0, 2.0, 2.0, 3.0, -1.0, 1.0, 6.0,+ -1.0, 3.0, 4.0, 4.0/n = IMAXwrite(*,*) \"The original matrix,\",n,\"by\",n=1,\":\"call wrtmat(matrix, n, n +1)call pivot(matrix, n)write(*,*) \"The matrix after pivoting:\"call wrtmat(matrix, n, n +1)call triang(matrix, n)write(*,*) \"The matrix after lower triangulation:\"call wrtmat(matrix, n, n + 1)call back(solvec, matrix, n)write(*,*) \"The solution vector after back substitution:\"write(*,*) \"********************************************\"write(*,*) (solvec(i), i = 1, n)write(*,*) \"********************************************\"end******************************************************************** *子过程决定第一列系数矩阵的最大值, 把最大值所在的行和第一行交换, **处理器然后重复对其他的行和列做这种处理, 对于每一次叠代, 列的位置**和行的位置增加一(即, 第1行-第1列, 然后第2行-第2列, 然后第3行-第 **3列, 等 ********************************************************************* *234567SUBROUTINE pivot(matrix, n)INTEGER i, j, k, nREAL matrix(n, n + 1), maxval, tempvaldo 10, j = 1, nmaxval = matrix(j,j)do 20, i = j + 1, nif (maxval .lt. matrix(i,j)) thenmaxval = matrix(i,j)do 30, k = 1, n + 1tempval = matrix(i,k)matrix(i,k) = matrix(j, k)matrix(j,k) = tempval30continue20 continue10 continueend****************************************完成一个输入矩阵的低级分解的子过程 *****************************************234567SUBROUTINE triang(matrix, n)INTEGER i, j, k, nREAL matrix(n, n + 1), pivot, pcelemdo 10, j = 1, npivot = matrix(j,j)do 20, k = j + 1, n + 1matrix(j,k) = matrix(j,k) / pivot20 continuedo 30, i = j + 1, npcelem = matrix(i,j)do 40, k = j + 1, n + 1matrix(i,k) = matrix(i,k) - pcelem * matrix(j,k)40 continue30continueend********************************************************** * 子过程从一个已经经历了低级分解的参数矩阵计算一个解向量 *********************************************************** *234567SUBROUTINE back(solvec, matrix, n)REAL solvec(n), matrix(n, n + 1), sumsolvec(n) = matrix(n, n + 1)do 10, i = n -1, 1, -1sum = 0.0do 20, j = i + 1, nsum = sum + matrix(i, j) * solvec(j)20 continuesolvec(i) = matrix(i, n + 1) - sum10 continueend*********************************************************** * 测试子过程bisec.f的程序, bisec.f 决定一个方程(f.f中)的解** 可是这个函数确实假设函数-f由两个值支撑. 即在用户给定的终** 点之间的解不超过一个************************************************************ *234567PROGRAM testbsREAL xleft, xrightREAL fEXTERNAL fwrite(*,*) \"Please enter an initial left and right value:\"read(*,*) xleft, xrightcall bisec(f, xleft, xright)end这里是同一个算法的C 过程:/********************************************************* 决定三个函数(pivot.c, triang.c, back.c)正确处理的程序 ** 这些函数决定了一系列同步方程的解*********************************************************/#include <stdio.h>#define IMAX 3#define JMAX 4float matrix[IMAX][JMAX] = {{-1.0, 1.0, 2.0, 2.0 },{3.0, -1.0, 1.0, 6.0 },{-1.0, 3.0, 4.0, 4.0 }};float solvec[IMAX] = { 0.0, 0.0, 0.0 };main(){void wrt_output(void);void pivot(void);void triang(void);void back(void);void wrt_vector(void);(void)printf("The original matrix %d by %d :\n", IMAX, JMAX);(void)wrt_output();(void)pivot();(void)printf("The matrix after pivoting:\n");(void)wrt_output();(void)triang();(void)printf("The matrix after lower decomposition:\n");(void)wrt_output();(void)back();(void)printf("The solution vector after back substitution:\n");(void)wrt_vector();}/*********************************************************** * 决定参数矩阵中第一列的最大元素并移动第一列含有最大值的行 ** 到第一行. 然后重复对其他的行和列做这种处理, 对于每一次叠 ** 代, 列的位置和行的位置增加一(即, 第1行-第1列, 然后第2行- ** 第2列, 然后第3行-第3列, 等*************************************************************/ void pivot(){int i, j, k;float maxval, tempval;for(j = 1; j < IMAX; j++) {maxval = matrix[j][j];for ( i = (j + 1); i < IMAX; i++) {if ( maxval < matrix[i][j] ) {maxval = matrix[i][j];for( k = 0; k <= IMAX; k++) {tempval = matrix[i][k];matrix[i][k] = matrix[j][k];matrix[j][k] = tempval;}}}}}/************************************ 完成一个输入矩阵的低级分解的函数 *************************************/void triang(void){int i, j, k;float pivot, pcelem;for ( j = 0; j < IMAX; j++) {pivot = matrix[j][j];for ( k = ( j + 1 ); k <= IMAX; K++) {matrix[j][k] = matrix[j][k] / pivot;}for ( i = ( j + 1 ); i < IMAX; i++) {pcelem = matrix[i][j];for ( k = ( j + 1 ); k <= IMAX; k++) {matrix[i][k] = matrix[i][k] - ( pcelem * matrix[j][k] );}}}}/********************************************************* * 子过程从一个已经经历了低级分解的参数矩阵计算一个解向量 **********************************************************/ void back(void){int i, j;float sum;solvec[IMAX - 1] = matrix[IMAX - 1][JMAX -1];for ( i = (IMAX -1); i > -1; i--) {sum = 0.0;for ( j = (i + 1); j < IMAX; j++) {sum = sum + matrix[i][j] * solvec[j];}solvec[i] = matrix[i][IMAX] - sum;}}void wrt_output(void){int i, j;(void)printf("**************************************\n");for ( i = 0; i < IMAX; i++) {for ( j = 0; j < (JMAX - 1); j++) {(void)printf("%f", matrix[i][j]);}(void)printf("%f\n", matrix[i][JMAX - 1]);}(void)printf("****************************************\n"); }void wrt_vector(void);{(void)printf("*************************************\n");(void)printf("%f", solvec[0]);(void)printf(" %f", solvec[1]);(void)printg(" %f\n", solvec[2]);(void)printf("****************************************\n");}/************************************************************ 测试函数bisec.f的程序, bisec.f 决定一个方程(f中)的解** 可是这个函数确实假设函数-f由两个值支撑. 即在用户给定的终 ** 点之间的解不超过一个 *************************************************************/#include <stdio.h>#include <math.h>main(){void bisec(float init_left_val, float init_right_val);float f(float value):float xleft, xright;char line[100];(void)printf("Please enter an initial left and right value:");(void)fgets(line, sizeof(line), stdin);(void)sscanf(line, "%f %f", &xleft, &xright );(void)bisec(xleft, xright);return(0);}3 数据抽象Fortran 90有一个非常使用的,使用简单的数据抽象能力。
Fortran77语句和函数

―― Fortran77 结构化程序设计
第一章 FORTRAN语言程序设计初步...................................................................................................1 1.1 FORTRAN语言发展概况..........................................................................................................1 1.2 简单的FORTRAN程序分析......................................................................................................1 1.3 FORTRAN 源程序的书写格式................................................................................................1 1.4 Fortran程序的编辑与运行 ........................................................................................................1 1.5 常 量 ..........................................................................................................................................1 1.5.1 整型常量 .........................................................................................................................1 1.5.2 实型常量 .........................................................................................................................1 1.6 变 量 ..........................................................................................................................................2 1.6.1 变量的概念 .....................................................................................................................2 1.6.2 变量名 .............................................................................................................................2 1.6.3 变量类型 .........................................................................................................................2 1.7 Fortran内部函数 ........................................................................................................................2 1.8 Fortran算术表达式 ....................................................................................................................3 1.8.1 算术运算符和运算优先级 .............................................................................................3 1.8.2 表达式运算中的类型问题 .............................................................................................3 1.8.3 运算的误差问题 .............................................................................................................3 1.9 赋值语句 ....................................................................................................................................3 1.10 简单输出语句 ..........................................................................................................................3 1.11 简单输入语句 ..........................................................................................................................4 1.12 PARAMETER语句 ..................................................................................................................5 1.13 END,STOP,PAUSE语句 ....................................................................................................5 总结 ...................................................................................................................................................5
FORTRAN和C 对比

六、表达式
算术表 达式
fortran 1. ** 乘方 2. * 乘、/ 除 3. + 加、- 减
关系表 达式
逻辑表 达式
条件表 达式
1. <、<=、>、>= 2. ==、/= 1. .AND. 2. .OR. 3. .NOT. 4. .EQV. 5. .NEQV. 无
赋值表 1. = 达式
逗号表 无 达式
五、输入和输出语句
输入输 出
输入输 出格式
fortran 输出:write(unit,fmt) A,B,C
print fmt, A,B,C 输入:read(unit,fmt) A,B,C 1. 默认输出位置和不限定输入输出
格式 write(*,*) A,B,C 2. 格式化输入输出
1) 指定代码行对应格式输入输出 write (*,100) A 100 formt(I4)
Fortran90 与 C++的比较
一、程序结构、语句和注释
程序结 构
语句
注释
fortran
C++
Program main(自定义程序名) 主程序代码
预处理命令以“#”开头,包括宏定义命 令、文件包含命令和条件编译命令
Stop(程序结束,可省)
函数,有一个主函数和若干个函数组成,
End(主程序代码结束)
主函数为 main 函数。函数体由一对花括
号“{}”括起来
每行一般为一句语句,语句末不加“;” 书写格式自由灵活,语句末加“;”
1. 每行可写 132 个字符
1. 每一行可写一条或多条语句,一条语
2. 代码开头或结尾的“&”,连接下一 行或下一行代码
C语言和Fortran语言的差异(4) - 编程入门网

其中 c_function1() 没有返回值,而 c_function2() 有返回值。而 C 函数的参数传入则有两种方 式,正如前面的例子,一个是 call-by-value, 即 (int a),另一个是call-by-reference, 即 (float *b),二者的差别在于:call-by-value 是将参数值复制一份副本到子函数的参数列中,让子函数使用, 就算子函数改变了副本的值,也只是改变了子函数中的副本,也不会影响到上层父函数的原参数 值。Call-by-refernce 则相反,它则是将参数所在的地址当做参数传给子函数中,子函数只知道此参数 的存储空间所在的地址,它要存取该参数时,必须由此地址去找到该参数。因此,子函数使用的,其实是 与父函数相同的一个参数,故如果子函数改变了此参数的值,则父函数的参数值也跟着改变了。 而Fortran又与 C 相反了。它的函数有两种,一为 subroutine,一为 function。subroutine不会 有传回值,但 function 有传回值,就以上 C 的例子, Fortran 的写法如下:
C语言和Fortran语言的差异(4) - 编程入门网
C语言和Fortran语言的差异(4)
时间: 2007-10-25 温睿
double precision a(11:110)
这还是一个一维阵列,共 100 个元素,但第一个元素的 index 是 11, 最后一个是110 。在这里我 们可以看到, (idx1:idx2) 这样的叙述在 Fortran 中就是用来指定一个阵列的范围。 2.5. 函数调用与参数传递 C 的函数调用就只有一种方式,函数可以传入参数,也可以返回值,例如:
voidcfunction1intintcfunction2intreturnintmainvoidcfunction1cfunction2其中cfunction1没有返回值而cfunction2函数的参数入则有两种方式正如前面的例子一个是callvalue是将参数值复制一份副本到子函数的参数列中让子函数使用就算子函数改变了副本的值也只是改变了子函数中的副本也不会影响到上层父函数的原参数值
Fortran77_90_95

Fortran 的常量类型有整型、实型、复型、逻辑型和字符型:
[plain] view plaincopyprint?
1. PROGRAM VARIABLES 2. INTEGER I !整型声明语句 3. REAL F !实型声明语句 4. DOUBLE PRECISION D !双精度声明语句
从上面的打孔卡片可以看到,一行 Fortran 程序(即一张卡片)代表了一条 Fortran 语句。 有时会出现一张卡打不下一行语句,这时再第二张卡片的第 6 列打一个非 0 的孔,可以表 示该程序行是上一个程序行的续行。前 5 列是标号区,可以输入 5 位整数,通常情况下标 号区是不允许输入非数字的,但注释除外,第一列为 C 的语句不会被编译器处理。第 7~ 72 列是语句区。而最后 8 列是在卡片时代方便程序员查找的注释区,不会被编译器处理。 之后的 Fortran90 格式更加自由。它一行有 132 列,可以有多条语句,语句之间用分号隔开, 语句也没有固定位置的限制。在程序行中字符“!”后的内容都被视为注释(字符串中的“!”除外)。 空格也变得有意义了(Fortran77 会忽略行中的空格,关键字和变量中可以有空格)。此外 如果 132 列还写不完一行语句的话,可以在末尾加“&”字符表示有续行,续行的开始则用“&” 字符来承接上一行。F77 里前面 5 列的 10 进制整型数由来表示编号,可用于之后的跳转; F90 里还可以用英文名加冒号来表示标签,用于跳转。 文件名后缀.f 或.for 表示固定格式,而.f90 表示自由格式。
在 1992 年的超级计算国际会议作出的,正式文本在 1993 年公布的。1997 年发布了 HPF-2.0 语言定义。Fortran95 包含了许多 HPF 的新功能。 在 Fortran90 出现之前,在并行机上运行程序需要结合专门的矢量化子程序,或者信赖 Fortran 编译系统进行自动矢量化。而 Fortran90 之后,程序员可在程序中有目的地控制并 行化。Fortran90 具有 C++的所有重要功能,然而 C 语言主要用于微机上的廉价开发,而 Fortran 的目的是产生高效最优化运行的可执行程序。用 Fortran 编写的大型科学软件较 C 语言编写的通常要快一个量级。当今不仅大型机,微机和工作站也有了多处理器。高性能并 行计算已成必然,串行机上的线性内存模式已不再适用。Fortran 作为具有处理相应问题的 标准并行化语言,其独特的数组操作充分体现了它的先进性。
FORTRAN90

FORTRAN90FORTRAN 90第一章绪论一、特点在FORTRAN 77的基础上增添了许多具有现代特性的功能、递归、数组直接运算、派生类型、指针和过程。
二、与FORTRAN 77的区别1、不区分书写格式2、不赞成语句标号3、不使用BLOCK DATA 数据块子程序、语句函数4、主程序以PROGRAM 开头,以END PROGRAM为结尾函数子程序:区分函数名与函数值5、不使用GOTO 10、STOP、PAUSE语句6、不使用DO 10 I=1,3,而以DO与END DO 匹配使用。
7、不使用:I-N规则、双精度、DATA语句、多条RETURN语句。
而使用REAL ::A=0,B=2.58、不使用COMMON语句,而用模块MODULE9、用假定形状数组取代假定大小数组10、DIMENSION A(10)在FORTRAN 90中不再定义数组11、FORMAT 语句不再使用第二章F ORTRAN 90 基础知识第2.1节语言元素一、字符集1、A-Z (26个)2、0-9 (10个)3、_(下划线)(1个)4、特殊符号(21个):空格、等号、加号、减号、*、/、(、)、,、.、’、:、!、”、%、&、;、<、>、?、$二、数据类型本身:INTEGER real complex character logical派生类型种别参数:对可移值数据精度和范围进行选择的机制,他提供了对每种内部数据类型的不同机器表示进行选择的参数化方式,种别参数均为整数。
用法:KIND=种别参数。
函数KIND(X)表示返回X的种别参数。
1、常量(字符型:双、单引号表示)常数的种别标示:例15_2 14.36_3 .false._4 5_’ang’带种别参数的常量的运算:15_2+14.36_3=29.36_3定义常量:REAL(KIND=2),PARAMETER::N=52、变量(1)变量名(程序名、常量、虚参、派生类型)命名规则:长度小于等于31个字符、须以字母开头、由字母、数字、下划线构成,其中不出现空格。
Fortran77和90 95编程入门(丁泽军)

本节介绍Fortran的起源与发展历史,讲述Fortran由产生到形成标准FortranIV、Fortran77,并进一步形成新标准Fortran90/95的发展历程。
a)FortranIªFortranIVFortran是目前国际上广泛流行的一种高级语言,适用于科学计算。
Fortran是英文FORmula TRANslation的缩写,意为“公式翻译”。
它是为科学、工程问题中的那些能够用数学公式表达的问题而设计的语言,主要用于数值计算。
这种语言简单易学,因为可以像抄写数学教科书里的公式一样书写数学公式,它比英文书写的自然语言更接近数学语言。
Fortran语言是第一个真正推广的高级语言。
至今它已有四十多年历史,但仍历久不衰,始终是数值计算领域所使用的主要语言。
Fortran语言问世以来,根据需要几经发展,先后推出形成了很多版本。
第一代Fortran语言是在1954年提出来的,称为FortranI。
它于1956年在IBM 704计算机上得以实现。
在此之前编写计算机程序是极为繁琐的,程序员需要详细了解为之编写代码的计算机的指令、寄存器和中央处理器(CPU)等方面的知识。
源程序本身是用数学符号(八进制码)编写的,后来采用了助记符,即所谓机器码或汇编码,这些编码由汇编程序转换为指令字。
在50年代书写和调试一个程序要很长时间,因为用这种方式编写程序显然是很不方便的,尽管它能使CPU高效地工作。
正是这些原因,促使由John Backus率领的IBM公司的一个小组研究开发最早的高级程序设计语言Fortran。
其目的是开发一种容易理解、简单易学又能几乎像汇编一样高效运行的语言,他们取得了极大的成功。
Fortran语言作为第一种高级语言不仅是一次创新,也是一次革命。
它使程序员摆脱了使用汇编语言的冗长乏味的负担,而且它使得不再只是计算机专家才能编写计算机程序,任何一名科学家或工程技术人员,只要稍加努力学习和使用Fortran,就能按自己的意图编写出用于科学计算的程序。
Fortran 90-70基本语法

2. 浮點數(real): 單精確度,雙精確度 單精確度: Real*4, 雙精確度: Real*8
單精確度 (32 bits): 1.18E-38~3.4E+38
Fortran 基本語法
Fortran 的資料型態
資料型態:Fortran所能夠在電腦的記憶當 中記憶文字.數值等等資料. Bit的觀念: 一個bit只能儲存一個0或是1, 組合8個bits,叫一個位元組,為電腦最小儲 存單位.
Fortran 基本語法
1. 整數(integer): 一種是長整數,一種是短整數.
雙精確度 (64 bits): 2.23E-308~1.79E+308 3. 複數(complex): Ex: a+bi 4. 字元(character):
Fortran 基本語法
5. 邏輯判斷(logical): Fortran的邏輯半段只能儲存兩種邏輯結果,就是 真(true)或假(false).
Fortran 基本語法
Fortran 的數學算式
Fortran數學算式的規則及方法都很直覺 化,和在紙上的四則運算是只有一點差別.
Fortran 基本語法
實例 - Fortran 77
Fortran 基本語法
實例 - Fortran 90
Fortran 基本語法
Fortran 90/77
第三章 Fortran 基本語法
寫作 Fortran 的格式
Fortran 77程式在版面上的規定
Fortran与C++的比较

C++ 1) 整型(分 int, unsigned int, signed int,
short int, long int 等) 2) 实型(分 float, double, long double) 3) 逻辑型(bool) 4) 字 符 型 (char, unsigned char, signed
字符 集2
变量 命名 规则
Fortran77
C++
1) 52 个英文字母(大小写);
1) 同 Fortran;
2) 10 个数字;
2) 同 Fortran;
3) 其 它 字 符 ( 共 13 个 ):( 空 3) 其 它 字 符 : ( 空
格)’$()+-*/,(逗号)=.(小数点):(冒
格)’=+-*/,():;”?_!#%&[]|{}^<>
2.Fortran77 与 C++的比较
以下将分别从以下方面比较 Fortran77 与标准 C++(很多地方对 C 也是类似的): z 注释与语句 z 字符集和变量命名规则 z 数据结构 z 表达式(算术表达式、关系表达式、逻辑表达式) z 选择结构 z 循环结构 z 输入/输出(包括标准终端和文件) z 函数和子程序 z 其它
char) 1)C++有多种复合数据类型; 2)数组定义:a[N] (变量范围 a[0]—a[n-1], 同样的 Fortran77 数组定义变量范围为 a[1]—a[N]一定要注意!) 3 ) C++ 中 多 维 数 组 是 按 行 存 放 的 ; Fortran77 的数组是按列存放的。
2.3.2 Fortran77 与 C++数据结构对比小结 1) Fortran77 中有“I-N 规则”:在程序中的变量名中,凡以字母 I、J、K、L、M、N 六个字母开头的,即认为该变量为整型变量;以其它字母开头的变量为实型变量。 2) Fortran77 中复数是基本数据类型;C++中 Complex 是 Complex.h 头文件中定义的类。 3) Fortan77 中的字符串用单引号(’ ’)包含,C++中用双引号(“ ”)包含,单个字符 才用单引号(‘’)。在 Fortran 字符串中包含’要用’’,C++包含很多特殊字符(\a, \n, \t, \v, \b, \r, \\, \”, \’, \ddd, \xhh 等)
FORTRAN90第一章FORTRAN90概述

每个语句行不能超过132个字符, 每个语句行不能超过132个字符,书写格式 132个字符 是自由的,大写字母与小写字母不加区分, 是自由的,大写字母与小写字母不加区分,一 行中如果有多条语句,则用分号隔开。 行中如果有多条语句,则用分号隔开。 语句行中 ! 表示注释 ,! 后面的内容只有注 释作用。 不在此列。 释作用。但是,在引号内部的!不在此列。空 行使程序易于阅读,也可把空行看作注释语 句。 在一行的末尾加上 &( 续行标志 ), 下一行 就会与本行形成一个较长的行。 就会与本行形成一个较长的行 。 只在需要 时采用继续行的办法书写语句,不提倡书写 很长或续行很多的语句。 很长或续行很多的语句。
1980年ISO公布国际标准 年 公布国际标准FORTRAN ISO 公布国际标准 1539---1980 1991年ISO推出基于 年 推出基于Windows编程的 推出基于 编程的 FORTRAN 90标准 标准:ISO/IEC 1539—1991 标准 FORTRAN 95业已出现 新的标准正在准备。 业已出现,新的标准正在准备 业已出现 新的标准正在准备。
常量:在程序运行过程中其值始终保持不变。 常量:在程序运行过程中其值始终保持不变。 整型常量就是整数, 两字节整数的范围为-32768到 整型常量就是整数 , 两字节整数的范围为 -32768 到 32767, 字节整数的范围为32767,4字节整数的范围为-231到231-1。例: 100, 123,45000, 100,-123,45000,… 实型常量就是实数,有两种表示方法: 实型常量就是实数,有两种表示方法: 小数型, :1.3,-0.5,3.14159,…… 小数型,如:1.3,-0.5,3.14159, 指数型, :0.45E+4,1.234E-2,12E+6,-3.5E+3,… 指数型,如:0.45E+4,1.234E-2,12E+6,-3.5E+3,
g77介绍g77是Fortran...

g77介绍g77是Fortran...GFORTRAN维基百科,自由的百科全书跳到导航跳到搜索此条目需要扩充。
(2018年11月2日)请协助改善这篇条目,更进一步的信息可能会在讨论页或扩充请求中找到。
请在扩充条目后将此模板移除。
此条目没有列出任何参考或来源。
(2018年11月2日)维基百科所有的内容都应该可供查证。
请协助添加来自可靠来源的引用以改善这篇条目。
无法查证的内容可能被提出异议而移除。
gfortran是GCC中的GNU Fortran编译器。
从GCC4.0版开始,gfortran取代了g77成为GCC中的fortran编译器。
gfortran目前仍在开发中,gfortran支持fortran77 90 95语法,部分支持fortran200X语法。
Gcc Fortran Intro - Ubuntu中文•页面•讨论•查看源代码•历史导航•首页•最近更改•随机页面•页面分类•帮助编辑•编辑指南•沙盒•新闻动态•字词处理工具•链入页面•相关更改•特殊页面•打印版本•固定链接•页面信息Gcc Fortran Intro在GCC 4.0 之前,g77是GCC的一部分;此后,gfortran是GCC的一部分。
g95是一个基于GCC的Fortran 编译器,它不是GCC的一部分。
g77介绍•g77 是 Fortran77 的编译器。
它对 Fortran 77 标准提供完备的支持,并支持 Fortran 90 和 95 的部分特性。
•由于 Fortran 77 标准在数值计算中的影响力,g77 可能是应用最广的Fortran编译器。
•在GCC 4.0 之前,g77 是GCC的一部分,但现在,g77 已经停止开发。
g77为何不再被支持:gcc-4.0 改变了gcc中所有语言的前端界面。
由于缺少志愿者和公司来更新 g77 到gcc-4.0 的架构,因此它被废弃了。
不同于 g77,gfortran项目处于活跃开发期,因此它取代了 g77 的位置。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
[转载]Fortran 77, C, C++ 和 Fortran 90 的比较收藏发信人: quasar (飞贼克斯), 信区: Fortran标题: Fortran 77, C, C++ 和 Fortran 90 的比较(转载)发信站: 南京大学小百合站 (Tue Jun 1 10:59:14 2004)瀚海星云 -- 文章阅读 [讨论区: MathTools]发信人: HuiCai (老灰菜), 信区: SciComp标题: Fortran 77, C, C++ 和 Fortran 90 的比较(转载)发信站: 瀚海星云 (2002年12月19日10:40:38 星期四), 站内信件【以下文字转载自 Fortran 讨论区】【原文由 HuiCai 所发表】Fortran 77, C, C++ 和 Fortran 90 的比较/develop/article/16/16085.shtm三十年来, 从 Fortran 77 开始, Fortran 成为了计算科学的主要语言.在这段时间里, Fortran 的数值能力变得非常稳定而且优于其它计算机语言; 最大的改变来自于不断增长的各种可靠的数值过程库的种类. Fortran 联合(union), 它的使用技巧, 扩充的数值库为计算科学赋予了良好的基础.可是在过去十几年中, 动态数据结构(特别是动态数组)的重要性不窜上升, UNIX 工作站, 复杂的交互式可视化工具, 以及更近的并行体系结构--Fortran 77 都没有实现--刺激了其它语言作为计算语言的使用, 最明显的一个例子是C. 最近C++ 也已经引起人们的兴趣, Fortran 通过发展到 Fortran 90来弥补它在现代科学计算方面的不足. 这部分的一个通常的工作是比较四种语言对科学计算的适应性的, 这四种语言是两个C 的代表(C, C++) 和两个Fortran的代表(Fortran 77, Fortran 90). 下面的表格总结了这种比较, 后面的内容试图合理地解释这种等级排序, 从最好(1)到最差(4)..功能 ------------ F77 - C - C++ - F90数值健壮性 ---- 2 ---- 4 --- 3 ----- 1数据并行性 ---- 3 ---- 3 --- 3 ----- 1数据抽象 ------- 4 ---- 3 --- 2 ----- 1面向对象编程 - 4 ---- 3 --- 1 ----- 2函数型编程 ---- 4 ---- 3 --- 2 ----- 1平均等级 ------ 3.4 - 3.2 - 2.2 -- 1.21 数值健壮性Numeric Polymorphism(数值多态性)中是一个给定一个通用名称的几种版本的图形平滑过程的例子. 这里描述的通用能力是作为Fortran 90提供的一种额外的数值健壮性超过Fortran 77和C的特性. Fortran 77, Fortran 90 , 和 C 版本的SMOOTH子过程也在下面给出, 用于比较. (注意, Fortran 90版使用了第4部分描述的并行性)数值多态性, 加上实际类型的参数, 小数精度选择, 和数字环境变量检查等, 证明了Fortran 90排在这四种语言中的第一位. Fortran 77 列在第二为的原因在于它支持复杂变量, 这在很多计算科学应用中是很重要的. C ++ 把 C 挤出了第三位是由于它在通常领域多态性上的能力.2 数据并行化部分在这四种语言中, 只有Fortran 90具有对科学计算有价值的数据并行能力; 其它三种语言在这方面的特性基本上是一样的, 即全都没有. 这解释了四种语言在这个方面的排名.这里是完成高斯消去的一套Fortran 77 和 C 过程:****************************************************************** 编程决定正确的子过程处理过程: pivot.f , triang.f , 和 back.f. ** 子过程决定一系列同步方程的解*******************************************************************234567PROGRAM testgINTEGER IMAX, JMAXPARAMETER (IMAX = 3, JMAX = 4)REAL matrix(IMAX, JMAX)REAL matrix(IMAX)INTEGER i, j, nDATA ( ( matrix(i,j), j = 1, JMAX), i = 1, IMAX)+ /-1.0, 1.0, 2.0, 2.0, 3.0, -1.0, 1.0, 6.0,+ -1.0, 3.0, 4.0, 4.0/n = IMAXwrite(*,*) \"The original matrix,\",n,\"by\",n=1,\":\"call wrtmat(matrix, n, n +1)call pivot(matrix, n)write(*,*) \"The matrix after pivoting:\"call wrtmat(matrix, n, n +1)call triang(matrix, n)write(*,*) \"The matrix after lower triangulation:\"call wrtmat(matrix, n, n + 1)call back(solvec, matrix, n)write(*,*) \"The solution vector after back substitution:\"write(*,*) \"********************************************\"write(*,*) (solvec(i), i = 1, n)write(*,*) \"********************************************\"end******************************************************************** *子过程决定第一列系数矩阵的最大值, 把最大值所在的行和第一行交换, **处理器然后重复对其他的行和列做这种处理, 对于每一次叠代, 列的位置**和行的位置增加一(即, 第1行-第1列, 然后第2行-第2列, 然后第3行-第 **3列, 等 ********************************************************************* *234567SUBROUTINE pivot(matrix, n)INTEGER i, j, k, nREAL matrix(n, n + 1), maxval, tempvaldo 10, j = 1, nmaxval = matrix(j,j)do 20, i = j + 1, nif (maxval .lt. matrix(i,j)) thenmaxval = matrix(i,j)do 30, k = 1, n + 1tempval = matrix(i,k)matrix(i,k) = matrix(j, k)matrix(j,k) = tempval30continue20 continue10 continueend****************************************完成一个输入矩阵的低级分解的子过程 *****************************************234567SUBROUTINE triang(matrix, n)INTEGER i, j, k, nREAL matrix(n, n + 1), pivot, pcelemdo 10, j = 1, npivot = matrix(j,j)do 20, k = j + 1, n + 1matrix(j,k) = matrix(j,k) / pivot20 continuedo 30, i = j + 1, npcelem = matrix(i,j)do 40, k = j + 1, n + 1matrix(i,k) = matrix(i,k) - pcelem * matrix(j,k)40 continue30continueend********************************************************** * 子过程从一个已经经历了低级分解的参数矩阵计算一个解向量 *********************************************************** *234567SUBROUTINE back(solvec, matrix, n)REAL solvec(n), matrix(n, n + 1), sumsolvec(n) = matrix(n, n + 1)do 10, i = n -1, 1, -1sum = 0.0do 20, j = i + 1, nsum = sum + matrix(i, j) * solvec(j)20 continuesolvec(i) = matrix(i, n + 1) - sum10 continueend*********************************************************** * 测试子过程bisec.f的程序, bisec.f 决定一个方程(f.f中)的解** 可是这个函数确实假设函数-f由两个值支撑. 即在用户给定的终** 点之间的解不超过一个************************************************************ *234567PROGRAM testbsREAL xleft, xrightREAL fEXTERNAL fwrite(*,*) \"Please enter an initial left and right value:\"read(*,*) xleft, xrightcall bisec(f, xleft, xright)end这里是同一个算法的C 过程:/********************************************************* 决定三个函数(pivot.c, triang.c, back.c)正确处理的程序 ** 这些函数决定了一系列同步方程的解*********************************************************/#include <stdio.h>#define IMAX 3#define JMAX 4float matrix[IMAX][JMAX] = {{-1.0, 1.0, 2.0, 2.0 },{3.0, -1.0, 1.0, 6.0 },{-1.0, 3.0, 4.0, 4.0 }};float solvec[IMAX] = { 0.0, 0.0, 0.0 };main(){void wrt_output(void);void pivot(void);void triang(void);void back(void);void wrt_vector(void);(void)printf("The original matrix %d by %d :\n", IMAX, JMAX);(void)wrt_output();(void)pivot();(void)printf("The matrix after pivoting:\n");(void)wrt_output();(void)triang();(void)printf("The matrix after lower decomposition:\n");(void)wrt_output();(void)back();(void)printf("The solution vector after back substitution:\n");(void)wrt_vector();}/*********************************************************** * 决定参数矩阵中第一列的最大元素并移动第一列含有最大值的行 ** 到第一行. 然后重复对其他的行和列做这种处理, 对于每一次叠 ** 代, 列的位置和行的位置增加一(即, 第1行-第1列, 然后第2行- ** 第2列, 然后第3行-第3列, 等*************************************************************/ void pivot(){int i, j, k;float maxval, tempval;for(j = 1; j < IMAX; j++) {maxval = matrix[j][j];for ( i = (j + 1); i < IMAX; i++) {if ( maxval < matrix[i][j] ) {maxval = matrix[i][j];for( k = 0; k <= IMAX; k++) {tempval = matrix[i][k];matrix[i][k] = matrix[j][k];matrix[j][k] = tempval;}}}}}/************************************ 完成一个输入矩阵的低级分解的函数 *************************************/void triang(void){int i, j, k;float pivot, pcelem;for ( j = 0; j < IMAX; j++) {pivot = matrix[j][j];for ( k = ( j + 1 ); k <= IMAX; K++) {matrix[j][k] = matrix[j][k] / pivot;}for ( i = ( j + 1 ); i < IMAX; i++) {pcelem = matrix[i][j];for ( k = ( j + 1 ); k <= IMAX; k++) {matrix[i][k] = matrix[i][k] - ( pcelem * matrix[j][k] );}}}}/********************************************************* * 子过程从一个已经经历了低级分解的参数矩阵计算一个解向量 **********************************************************/ void back(void){int i, j;float sum;solvec[IMAX - 1] = matrix[IMAX - 1][JMAX -1];for ( i = (IMAX -1); i > -1; i--) {sum = 0.0;for ( j = (i + 1); j < IMAX; j++) {sum = sum + matrix[i][j] * solvec[j];}solvec[i] = matrix[i][IMAX] - sum;}}void wrt_output(void){int i, j;(void)printf("**************************************\n");for ( i = 0; i < IMAX; i++) {for ( j = 0; j < (JMAX - 1); j++) {(void)printf("%f", matrix[i][j]);}(void)printf("%f\n", matrix[i][JMAX - 1]);}(void)printf("****************************************\n"); }void wrt_vector(void);{(void)printf("*************************************\n");(void)printf("%f", solvec[0]);(void)printf(" %f", solvec[1]);(void)printg(" %f\n", solvec[2]);(void)printf("****************************************\n");}/************************************************************ 测试函数bisec.f的程序, bisec.f 决定一个方程(f中)的解** 可是这个函数确实假设函数-f由两个值支撑. 即在用户给定的终 ** 点之间的解不超过一个 *************************************************************/#include <stdio.h>#include <math.h>main(){void bisec(float init_left_val, float init_right_val);float f(float value):float xleft, xright;char line[100];(void)printf("Please enter an initial left and right value:");(void)fgets(line, sizeof(line), stdin);(void)sscanf(line, "%f %f", &xleft, &xright );(void)bisec(xleft, xright);return(0);}3 数据抽象Fortran 90有一个非常使用的,使用简单的数据抽象能力。