C语言和Fortran语言

2016-01-29 12:25 8 1 收藏

C语言和Fortran语言,C语言和Fortran语言

【 tulaoshi.com - C语言心得技巧 】

C语言和Fortran语言

作者: 解放军信息工程大学理学院学员旅一队 温睿


目录

第1章. C++语言和Fortran语言的发展背景

第2章. C语言和Fortran语言的差异

2.1. 复数运算的速度.

2.2. 程序参数与字串.

2.3. 内存的动态管理.

2.4. 多维阵列的处理.

2.5. 函数调用与参数传递.


1. C++语言和Fortran语言的发展背景


在程序设计语言的发展过程中,FORTRAN 语言被认为是科学计算的专用语言。后来推出的FORTRAN90 和FORTRAN 95 版本也不例外,它们虽然可以完全实现C++语言同样的功能,然而其软件开发环境和软件的集成性等方面都远不如C++ 语言。近年来,随着计算机软硬件技术的发展,数据结构、数据库管理技术、可视化与计算机图形学、用户接口系统集成以及人工智能等领域的成果被逐渐应用到结构分析软件中,结构分析软件的设计并不仅仅局限于单一的科学计算需要涉及众多的软件开发领域。C++ 语言可以提供这类软件开发所需的功能,而用FORTRAN 90 却很难实现,另一方面从软件的编程环境来看,目前FORTRAN 90 的编译器极少,而C++ 语言的编译系统相当普及,可以运行在各种机型上,便于实现跨平台的软件系统集成。


2. 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,像这样:

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com)

real(a) =……;imag(a) = …….

如此只需两步就得到结果。直到遇到太长太复杂的算式,才去做拆解的动作。

这样使用 C 来做复数运算可能需要绕圈圈,而且绕出来的圈圈可能还不小。不过如果程序中需要复合的数据结构,如一个自定义的数据结构中既有浮点数、整数、还有字符串时, Fortran 只有举白旗投降了。当然, Fortran 如果要做还是可以做,只是不太方便,而且可能也需要绕圈圈。但如果使用 Fortran 90 则不成问题了,因为 Fortran 90 也有类似 C 的 struct 结构以定义复合的数据类型。

2.2. 程序参数与字串

C 程序可以有参数串列, Fortran 则没有。例如,当程序执 行时,必须输入 a, b, c
三个参数,在 C 可以这样写:

int main(int argc, char **argv) { int a, b, c; a = atoi(argv[1]); b = atoi(argv[2]); c = atoi(argv[3]); } 

而程序执行时,参数就是这样传入: a.out 12 15 18

Fortran 却没有办法 ,要传入任何参数,只能透过对话的方式:

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com)
integer a, b, c c ------------------------------------ write(*,*) ''please input integer a:'' read(*,*) a write(*,*) ''please input integer b:'' read(*,*) b write(*,*) ''ple
                        

来源:https://www.tulaoshi.com/n/20160129/1486027.html

延伸阅读
作者:肖进 Socket(套接字) ◆先看定义: typedef unsigned int u_int; typedef u_int SOCKET; ◆Socket相当于进行网络通信两端的插座,只要对方的Socket和自己的Socket有通信联接,双方就可以发送和接收数据了。其定义类似于文件句柄的定义。 ◆Socket有五种不同的类型: 1、流式套接字(stream soc...
1.图像平移 图像平移只是改变图像在屏幕上的位置,图像本身并不发生变化。 !-- frame contents -- !-- /frame contents -- 假设原图像区域左上角坐标为(x0, y0),右下角坐标为(x1, y1),将图像分别沿x和y轴平移dx和dy,则新图像的左上角坐标为(x0 +dx, y0+dy),右下角坐标为(x1+dx, y1+dy)。坐标平移变换公...
什么是好的程序员?是不是懂得很多技术细节?还是懂底层编程?还是编程速度比较快? 我觉得都不是。对于一些技术细节来说和底层的技术,只要看帮助,查资料就能找到,对 于速度快,只要编得多也就熟能生巧了。 我认为好的程序员应该有以下几方面的素质: 1、有专研精神,勤学善问、举一反三。 ...
入门简介 变量 C++数据类型 C++操作符 C++中的函数 main函数 数组 字符串数组 字符串操作函数 C++是个强大的语言,可以用于做别的语言做不了的工作。但是,这种强大功能是有代价的。开始使用C++时,你可能会遇到内存溢出和访问失效等问题,使程序死机。这里用最简短的篇幅介绍C++语言基础。C++语言本身有专著介绍,这种书...
1. strUCt的巨大作用 面对一个人的大型C/C++程序时,只看其对struct的使用情况我们就可以对其编写者的编程经验进行评估。因为一个大型的C/C++程序,势必要涉及一些(甚至大量)进行数据组合的结构体,这些结构体可以将原本意义属于一个整体的数据组合在一起。 !-- frame contents -- !-- /frame contents -- 从某种程度上来说,会...

经验教程

348

收藏

24
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部