文档库 最新最全的文档下载
当前位置:文档库 › Fortran语言编程练习题

Fortran语言编程练习题

Fortran语言编程练习题
Fortran语言编程练习题

平面驻点流动方程数值解

1问题描述

自编程序完成平面驻点流动方程:的数值解。

边界条件为

式中:。

2求解过程

由于上述方程是非线性方程,可采用MATLAB 7.0软件来求解,步骤如下:

第一步:将方程化为一阶常微分方程组。

边界条件为

第二步:建立ode.m和lbc.m两个M文件。

ode.m文件程序如下:

function dfdx=ode(x, f)

dfdx=[f(2);f(3);-f(1)*f(3)+f(2)^2-1];

lbc.m 文件程序如下:

function res=lbc(f0,finf)

res=[f0(1);f0(2);finf(2)-1];

第三步:求解方程。

在MATLAB 7.0工作窗口输入程序:

infinity=4;

solinit=bvpinit(0:0.4:infinity,[0 0 0]);

sol=bvp4c(@ode,@lbc,solinit);

x=0:0.4:infinity

f=deval(sol,x)

plot(x,f(1,:),'ob',x,f(2,:),'rp',x,f(3,:),'b*') /*绘图命令*/

xlabel('轴\it \eta');ylabel('轴\it \phi')

legend('平面驻点流动\phi曲线','平面驻点流动d\phi/d\eta曲线','平面

驻点流动d^2\phi/d\eta^2曲线')

title('平面驻点流动的数值解')

3结果分析

平面驻点流动数值解的计算结果见表1,图1是平面驻点流动数值解的散点图。从表和图中可以看出,从开始呈线性增长,随着的增加,偏离斜直线,当以后渐近于1。在左右,,即此时粘性流动的流速已接近

势流流速,只差百分之一。

00.40000.8000 1.2000 1.6000 2.000 2.4000 2.8000 3.2000

00.08800.31240.62200.9798 1.3620 1.7553 2.1530 2.5523

00.41450.68590.84670.93240.97320.99060.99710.9992

1.23250.84630.52510.29380.14730.06580.02600.00910.0028

表1 平面驻点流动数值解的计算结果

图1 平面驻点流动数值解散点图

FORTRAN程序设计复习题及答案

FORTRAN程序设计复习题 一、选择题 B (1)下列各FORTRAN表达式中合法的是 A) S+T*2P >= B) .NOT. (A*B+C) C) A2+B2/(C+D) <= D) (A+B).NOT.A*B.GT.(.NOT.只跟一个表达式) C (2)数学式(3/5)ex+y的FORTRAN表达式是 A) 3*EXP(X+Y)/5 B) 3*E* *(X+Y)/ C) (3/5)*EXP(X+Y)D) EXP(X+Y) D (3)下列FORTRAN77表达式中不合法的是 A) A.GT.B.EQV.C.GT.D B) A.AND.B.AND.C.AND.D C) .NOT.(X.LE.D) A.LT.B.LT.C.LT.D D(4)下列叙述中不正确的是 A) FORTRAN子程序可以单独编译 B) 对一个FORTRAN源程序进行编译和连接无误后可生成可执行文件 C) 即使编译和连接都正确无误,FORTRAN程序运行时仍可能出错 D) FORTRAN连接的主要任务是把函数库中的函数翻译成机器指令(正确描述:主要任务为连接目标文件) B (5)在下列FORTRAN77运算符中,优先级最高的是 A) .AND. B) .NOT. C) .OR. D) .EQ. B (6)FORTRAN表达式"6/5+9/2**3/2"的值为 A) 33 B) 1 C) 5 D) 3 A (7)下列FORTRAN77表达式中,合法的是: A) .AND.. B) 10.0 C) D) 提示:A)相当于 .AND.(.NOT.()) D (8)关于编译一个FORTRAN源程序文件,下列说法中错误的是 A) 允许编译只有一个主程序而没有子程序的源文件 B) 允许编译有多个子程序的源文件 C) 允许编译只有一个子程序而没有主程序的源文件 D) 允许编译有多个主程序的源文件 C (9)在FORTRAN77源程序中,续行标志符必须放在 A) 第1列 B) 第1-6列C) 第6列D) 第5列 D (10)下列关于"SUBROUTIN E MAP(X,Y)"语句行的叙述中,不正确的是 A) 这是子程序的第一个语句 B) 字符串"MAP"是子程序名 C) 变量X是子程序的形参D) 子程序执行后,MAP将返回整型数据 提示:子程序无返回值,自定义函数才有) A (11)FORTRAN表达式"2/4+"的值是 A) B) 1 C) D) 0 提示:2/4默认等于整型,=》 D (12)FORTRAN表达式"MOD,"的值是 A) B)0.0 C) D) A (13下列FORTRAN运算符中,优先级最低的是 A)逻辑运算符.AND. B)算术运算符*

MATLAB 与C C + + 、FORTRAN语言混合编程

MATLAB 与C/ C + + 、FORTRAN语言混合编程摘要:对MATLAB 与C/ C + + 和FORTRAN 语言进行混合编程的常用方法进行了介绍,分析了其实现方式和各自的利弊,并用实例对MEX 文件实现方式进行了较详细的论述. 关键词: MATLAB ; C/ C + + ; FORTRAN ; 混合编程 中图分类号: TP313 文献标识码: A 文章编号:16722948X(2004) 0620547205 1 混合编程的意义及其实现方式 1. 1 混合编程的意义 MATLAB 语言具有功能强大、开发效率高等诸 多优点, 已在工程实际中得到广泛应用, 但是与 FORTRAN、C/ C + + 等语言相比,其执行效率较低, 特别是当程序中含有大量循环语句(例如迭代计算) 时,MATLAB 就有些力不从心, 速度很慢, 而运用 FORTRAN 等擅长数值计算语言进行编程,其运行效 率高. 一方面,如果放弃MATLAB 强大功能和数量 众多的应用工具箱,无疑是资源的极大浪费. 另一方 面,针对工程实际,人们用FORTRAN、C/ C + + 语言 已编写了大量实用程序,如果将其重新改写成M 文 件移植到MATLAB 环境中,不仅要花费大量的时间 和精力,而且有时还降低了其运行效率. 可否将二者 优势互补呢? 混合编程就是其有效的解决途径. 1. 2 混合编程的实现 正是考虑到上面这些原由,MATLAB 系统提供 了其应用程序接口(Application Program Interface) 来 解决这些问题. API 主要包括3 部分:MEX 文件——— 外部程序调用接口,用来在MATLAB 环境下调用 FORTRAN、C/ C + + 语言编写的程序;MAT 文件应 用程序———数据输入输出接口,用于MATLAB 系统 与外部环境之间互传数据; 计算引擎函数库——— MATLAB 处于后台作为一个计算引擎,与其它应用 程序建立客户机/ 服务器关系,在其它应用程序中调 用[1 ,2 ] . 1. 2. 1 MEX 文件 MEX 文件是按照一定格式,用FORTRAN 或C/ C + + 语言编写的源程序,在MATLAB 下借助相应 的编译器,生成的动态链接函数的统称. 在Windows 操作系统下,是用MATLAB 附带的批处理mex. bat 来编译生成文件后缀名为. dll (Dynamic Link Li2 brary) 动态链接库文件,该文件可在MATLAB 环境 下,像命令函数一样直接运行和调用,使用起来极为 方便. 采取MEX 文件方式,是重复利用已有FOR2 TRAN、C/ C + + 程序,让MATLAB 和FORTRAN、

C语言转换为fortran语言

C/C++采用的是缺省调用约定是STDCALL约定.在C程序中,可以在函数原型的声明中使用_stdcall关键字来指明过程采用STDCALL调用约定。 Fortran过程采用的缺省标识符是,全部大写的过程名加上“_”前缀和“@n”后缀。在C程序中保留标识符的大小写。编译程序会给采用STDCALL约定的过程标识符加上“_”前缀和“@n”后缀。 Fortran过程缺省的参数传递方式是引用方式是。对于下面这个Fortarn过程:SUBROUTINE ForSub(ivar,rvar) INTEGER ivar REAL rvar WRITE(*,*) ivar,rvar END 在C语言程序中应给出过程的函数原型及调用方式为: void main() { extern void__stdcall FORSUB(int*I,float*f); int iCV AR=1; float rCV AR=2.0; FORSUB(&iCV AR,&rCV AR); } 在C++中调用Fortan的过程,在声明函数原型时需要用extern“C”语句,以避免C++编译程序对标识符的修饰;并且C++也可以通过引用方式传递参数。对于上面的Fortran过程,C++程序应给出的函数原型及调用方法是: void main() { extern “C”{void__stdcall FORSUB(int*I,float*f);} int iCV AR=1; float rCV AR=2.0; FORSUB(&iCV AR,&rCV AR); } 另外,也可以在Fortran中用!MS$ATTRIBUTES编译伪指令来改变Fortran子过程的调用约定,以便于被其他语言的程序调用。在下面的例子中,过程ForSub具有C语言的调用约定。 SUBROUTINE ForSub(ivar,rvar) !MS$ATTRIBUTES C::ForSub INTEGER ivar REAL rvar WRITE(*,*) ivar,rvar END 这样,这个过程使用的是C调用约定,并且参数传递方式也变为传值方式,过程的标识符变为全部小写且有_前缀而无后缀的方式。在C语言源程序中的函数原型及调用方法为:void main() { extern void FORSUB(int ivar,float rvar); int iVar=1;

C与C++与FORTRAN混合编程

C/C++/FORTRAN 混合编程 混合编程在软件编程中是经常遇到的问题,尤其是C/C++/FORTRAN的混合编程,本文主要说明以上三种语言混合编程中经常遇到的问题,同时,也说明了不同平台下混合编程应注意的问题。 混合语言编程要注意的问题主要体现在:函数调用和数据结构的存储。 1 Windows平台 函数:由于Fortran编程语言没有大小写之分,Windows平台下的混合语言编程要注意的主要是大小写的问题。考虑到编译器的差异,可以用下面的方式进行跨平台编程的函数声明。( C/C++编译器使用Microsoft Visual C++ 6.0, Fortran编译器使用 Digital Visual Fortran 6.0)。 假设一个C的函数为 void cFunction(); 那么,只需要在它的头文件里面进行如下定义即可: #ifdef __cplusplus extern “C” void { #endif extern void __stdcall CFunction(); #define cFunction CFUNCTION #ifdef __cplusplus } #endif 这样,在Fortran或者C++的程序里面就可以直接调用了。 假设是一个Fortran函数SUBROUTINE FFUNCTION(); 那么,在C++头文件里进行如下的定义就可以了: #ifdef __cplusplus extern “C” void { #endif extern void __stdcall ffunction(); #define ffunction FFUNCTION #ifdef __cplusplus } #endif 这样,就可以在C++的程序里面直接调用。由于C编译器里面,没有定义__cplusplus这个环境变量,因此,C文件里面,也可以直接使用这个头文件。如果是一个C++函数,如: void cPlusplusFunction();和c函数一样,进行下面的定义即可: #ifdef __cplusplus extern “C” void { #endif extern void __stdcall cPlusplusFunction (); #define cPlusplusFunction CPLUSPLUSFUNCTION #ifdef __cplusplus }

计算机程序设计语言(FORTRAN语言)

计算机程序设计语言(FORTRAN语言) (总分:36.00,做题时间:90分钟) 一、 (总题数:36,分数:36.00) 1.编译程序能将高级语言编写的源程序转换成( )。 A.解释程序 B.汇编程序 C.映象程序 D.目标程序 (分数:1.00) A. B. C. D. √ 解析: 2.一个完整的FORTRAN源程序( )。 A.至少包括一个主程序 B.至少包括一个主程序和一个子程序 C.由一个主程序与一个以上的子程序组成 D.由一个主程序与一个子程序组成 (分数:1.00) A. √ B. C. D. 解析: 3.语句函数定义语句在程序内合法的位置是( )。 A.在程序块开头语句之后,END语句之前 B.在程序块开头语句之后,可执行语句之前 C.在说明语句之后,END语句之前 D.在说明语句之后,可执行语句之前 (分数:1.00) A. B. C. D. √ 解析: 4.下列关于函数子程序虚实参数的错误说法是( )。 A.可以没有形参数 B.虚实结合的数组长度可以不同 C.实参表与虚参表类型可以不同 D.函数名可以作为虚参

(分数:1.00) A. B. C. √ D. 解析: 5.下列叙述中正确的是( )。 A.FORTRAN程序块中,无名公用语句只能有一个B.FORTRAN子程序中,至少应有一个RETURN语句C.FORTRAN程序块中,最后一行必须是END语句D.FORTRAN程序块中,必须有变量说明语句 (分数:1.00) A. B. C. √ D. 解析: 6.运行下面的程序时得不到所需的结果,其主要原因是( )。INTEGER X(11) DATA X/9,8,7,6,5,4,3,2,1,0,-1/ DO 10 1=1,X(1) ,-1 WRITE(*,*)1.0/SQRT(25.0-REAL(X(1) )* * 2) 10 CONTINUE END A.没有给X(11) 赋初值 B.发生除以零的情况 C.发生负数开平方的情况 D.循环参数设置错误 (分数:1.00) A. B. C. D. √ 解析: 7.下列数据中,不符合FORTRAN常量表示法的是( )。 A.-25.6 B.2.758D3 C.'FOOT"=' D.TRUE (分数:1.00) A. B. C. D. √ 解析:

fortran语言内部函数

附录 FORTRAN 90标准函数 符号约定: ●I代表整型;R代表实型;C代表复型;CH代表字符型;S代表字符串;L代表逻辑型;A代表数组;P代表指针;T代表派生类型;AT为任意类型。 ●s:P表示s类型为P类型(任意kind值)。s:P(k)表示s类型为P类型(kind值=k)。 ●[…]表示可选参数。 ●*表示常用函数。 表1 数值和类型转换函数 函数名说明 ABS(x)*求x的绝对值∣x∣。x:I、R,结果类型同x; x:C,结果:R AIMAG(x)求x的实部。x:C,结果:R AINT(x[,kind])*对x取整,并转换为实数(kind)。x:R, kind:I,结果:R(kind) AMAX0(x1,x2,x3,…)*求x1,x2,x3,…中最大值。x I:I,结果:R AMIN0(x1,x2,x3,…)*求x1,x2,x3,…中最小值。x I:I,结果:R ANINT(x[,kind])*对x四舍五入取整,并转换为实数(kind)。x:R, kind:I,结果:R(kind) CEILING(x)*求大于等于x的最小整数。x:R,结果:I CMPLX(x[,y][,kind]))将参数转换为x、(x,0.0)或(x,y)。x:I、R、C, y:I、R,kind:I,结果:C(kind) CONJG(x)求x的共轭复数。x:C,结果:C DBLE(x)*将x转换为双精度实数。x:I、R、C,结果:R(8) DCMPLX(x[,y])将参数转换为x、(x,0.0)或(x,y)。x:I、R、C, y:I、R,结果:C(8) DFLOAT(x)将x转换为双精度实数。x:I,结果:R(8) DIM(x,y)*求x-y和0中最大值,即MAX(x-y,0)。x:I、R, y的类型同x,结果类型同x DPROD(x,y)求x和y的乘积,并转换为双精度实数。x:R, y:R,结果:R(8)

[转载]Fortran 77, C, C++ 和 Fortran 90 的比较

[转载]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 的比较 https://www.wendangku.net/doc/4819104338.html,/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.2

C与FORTRAN的差别

https://www.wendangku.net/doc/4819104338.html,/c.htm 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,像这样: 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;

fortran与c语言接口参数传递混合编程

Sun Studio 12:Fortran 编程指南 ?Previous: 第10 章并行化 第11 章C-Fortran 接口 本章论述Fortran 与C 的互操作性方面的问题,内容仅适用于Sun Studio Fortran 95 和C 编译器的特定情况。 11.9 Fortran 2003 与C 的互操作性简要说明了Fortran 2003 标准第15 部分中提到的C 绑定功能。(此标准可以从国际Fortran 标准Web 站点获得)。Fortran 95 编译器实现了标准中所述的这些功能。 如不特别注明,32 位x86 处理器视为与32 位SPARC 处理器等同。对于64 位 x86 处理器和64 位SPARC 处理器也是如此,只是x86 系统未定义REAL*16 和COMPLEX*32 数据类型,这些数据类型只能用于SPARC。 11.1 兼容性问题 大多数 C-Fortran 接口必须在以下这些方面全部保持一致: ?函数和子例程的定义及调用 ?数据类型的兼容性 ?参数传递(按引用或按值) ?参数的顺序 ?过程名(大写、小写或带有结尾下划线(_)) ?向链接程序传递正确的库引用 某些C-Fortran 接口还必须符合: ?数组索引及顺序 ?文件描述符和stdio ?文件权限 11.1.1 函数还是子例程? 函数一词在 C 和Fortran 中有不同的含义。根据具体情况做出选择很重要:?在C 中,所有的子程序都是函数;但void函数不会返回值。 ?在Fortran 中,函数会传递一个返回值,但子例程一般不传递返回值。

当Fortran 例程调用C 函数时: ?如果被调用的C 函数返回一个值,则将其作为函数从Fortran 中调用。 ?如果被调用的C 函数不返回值,则将其作为子例程调用。 当C 函数调用Fortran 子程序时: ?如果被调用的Fortran 子程序是一个函数,则将其作为一个返回兼容数据类型的函数从 C 中调用。 ?如果被调用的Fortran 子程序是一个子例程,则将其作为一个返回int(与Fortran INTEGER*4兼容)或void值的函数从C 中调用。如果Fortran 子例程使用交替返回,则会返回一个值,这种情况下它是RETURN语句中的表达式的值。如果RETURN语句中没有出现表达式,但在SUBROUTINE语句中声明了交替返回,则会返回零。 11.1.2 数据类型的兼容性 表11–2总结了Fortran 95(与 C 比较)数据类型的数据大小和缺省对齐。该表假设未应用影响对齐或提升缺省数据大小的编译选项。请注意以下事项: ? C 数据类型int、long int和long在32 位环境下是等同的(4 字节)。 但是,在64 位环境下long和指针为8 字节。这称为LP64 数据模型。 ?在64 位SPARC 环境下,当用任意-m64选项进行编译时, REAL*16和COMPLEX*32与16 字节边界对齐。 ?标有4/8 的对齐表示缺省情况下与8 字节边界对齐,但在COMMON 块中与 4 字节边界对齐。COMMON 中的最大缺省对齐为4 字节。当用-m64选项进 行编译时,4/8/16 表示与16 字节边界对齐。 ?REAL(KIND=16)、REAL*16、COMPLEX(KIND=16)、COMPLEX*32只能用于SPARC 平台。 ?数组和结构的元素及字段必须兼容。 ?不能按值传递数组、字符串或结构。 ?可以在调用点使用%VAL(arg),按值将参数从Fortran 95 例程传递到C 例程。假如Fortran 例程具有一个显式接口块,该接口块用VALUE属性声明了伪参数,则可以按值将参数从 C 传递到Fortran 95。 ?数值序列类型的组件的对齐方式与通用块的对齐方式相同,也会受到-aligncommon选项的影响。数值序列类型是这样一种序列类型:其中所 有组件的类型为缺省整数、缺省实数、双精度实数、缺省复数或缺省逻辑,而不是指针。 ?在大多数情况下,非数值序列类型的数据类型组件以自然对齐的方式对齐,但QUAD 变量除外。对于四精度变量,32 位SPARC 平台和64 位SPARC 平台之间的对齐方式不同。 ?在所有平台上,用BIND(C) 属性定义的VAX 结构和数据类型的组件始终与C结构具有相同的对齐方式。

C与FORTRAN混合编程2(写得挺好的)

发信人: jxbking (arcane), 信区: Fortran 标题: 偶总结的FORTRAN/C/C++混合编程,大家有兴趣就看看吧 发信站: 南京大学小百合站(Fri Jun 4 13:21:50 2004) C/C++/FORTRAN 混合编程 混合编程在软件编程中是经常遇到的问题,尤其是C/C++/FORTRAN的混合编程,本文主要说明以上三种语言混合编程中经常遇到的问题,同时,也说明了不同平台下混合编程应注意的问题。 混合语言编程要注意的问题主要体现在:函数调用和数据结构的存储。 1 Windows平台 函数:由于Fortran编程语言没有大小写之分,Windows平台下的混合语言编程要注意的主要是大小写的问题。考虑到编译器的差异,可以用下面的方式进行跨平台编程的函数声明。(C/C++编译器使用Mi crosoft Visual C++ 6.0, Fortran编译器使用Digital Visual Fortran 6.0)。 假设一个C的函数为void cFunction(); 那么,只需要在它的头文件里面进行如下定义即可: #ifdef __cplusplus exte rn “C” void { #endif extern void __stdcall CFunction(); #define cFunction CFUNCTION #ifdef __cplusplus } #endif 这样,在Fortran或者C++的程序里面就可以直接调用了。 假设是一个Fortran函数SUBROUTINE FFUNCTION(); 那么,在C++头文件里进行如下的定义就可以了: #ifdef __cplusplus extern “C” void { #endif extern void __stdcall ffunction(); #define ffunction FFUNCTION

C语言和Fortran语言的比较

C语言和Fortran语言的差异 本文详细介绍C语言和Fortran语言的差异 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,像这样: real(a) =……;imag(a) = ……. 如此只需两步就得到结果。直到遇到太长太复杂的算式,才去做拆解的动作。 这样使用 C 来做复数运算可能需要绕圈圈,而且绕出来的圈圈可能还不小。不过如果程序中需要复合的数据结构,如一个自定义的数据结构中既有浮点数、整数、还有字符串时,Fortran 只有举白旗投降了。当然,Fortran 如果要做还是可以做,只是不太方便,而且可能也需要绕圈圈。但如果使用Fortran 90 则不成问题了,因为Fortran 90 也有类似C 的struct 结构以定义复合的数据类型。 2.2. 程序参数与字串

C语言直接操作FORTRAN数据文件的方法

C语言直接操作FORTRAN数据文件的方法 张云如 摘要:FORTRAN数据文件的结构及用C语言直接对FORTRAN数据文件进行数据读取和处理的方法,并结合实例,给出了完成操作的C语言源程序。 关键词:C语言FORTRAN数据文件数据直接读写 FORTRAN语言适用于数值计算,在科学和工程计算方面发挥了重要作用。C语言具有很强的通用程序设计功能,而且很适于处理图形图像、系统程序方面的问题,但它的数值计算能力不如FORTRAN语言。如果能在C语言程序中直接调用FORTRAN程序的计算结果,则可充分利用这2种语言的优势。为此,有必要建立用C语言对FORTRAN数据文件进行直接读取和处理的方法。 1 FORTRAN数据文件的结构 在C语言程序中调用FORTRAN程序的计算结果,可通过FORTRAN数据文件来实现,而要用C语言直接存取FORTRAN数据文件,必须首先清楚FORTRAN数据文件的结构。 FORTRAN数据文件按存取方式的不同可分为顺序文件和直接文件。而不论是顺序文件还是直接文件,按数据在文件中的存放方式的不同,都有2种存放形式,一种是字符形式(即ASCII码形式),另一种是二进制代码形式。前者称为有格式存放,后者称为无格式存放。由于对直接文件存取的基本操作步骤与对顺序文件存取的基本操作步骤相同,二者的不同主要体现在操作时是否应顺序进行。下面以顺序文件为例进行具体分析。 1.1 有格式文件的结构 有格式文件全部由有格式的记录组成,有格式的记录是字符的序列,以ASCII码形式存放。各记录以回车符(0DH)和换行符(0AH)作为结束标志,各记录之间无分隔符,各记录的长度(字节数)可以不等。 1.2 无格式文件的结构 无格式文件全部由无格式记录组成,无格式记录是值的序列,即二进制代码序列。这种格式的文件,其第1个字节是4BH(即十进制的75),最后1个字节为82H(即十进制的130),各无格式记录的数据信息位于这2个字节之间。 每一个无格式记录都由下面3部分组成:(1)记录的首字节,是该记录所有数据所占的字节数;(2)组成该记录的各数据内容。不论是整型数据还是实型数据,每个数据均占4个字节,其中整型数据只占4个字节中的前2个字节(低字节在前),而后面的2个字节为空(20H)。各数据之间不空格。(3)每个无格式记录的末字节,又是该记录的字节数,而不是以回车换行符作为结束标志。各记录之间也没有分隔符。 2 用C语言直接操作FORTRAN数据文件的方法 2.1 直接读取FORTRAN数据文件 由于有格式文件是ASCII文件,因而用C语言读取它时,只要用“r”方式打开它,便可逐字符读取该文件中的数据,直至遇到文件结束标志为止。 用C语言读取无格式文件时,一般先用“rb”方式打开它,然后用fseek函数将文件指针定位到第2个字节处,先读取第1个无格式记录的字节数(它一定为4的倍数),然后自第3个字节开始,每次用fread 函数(不能用fscanf函数)读取4个字节,便可将该无格式记录中的数据逐个读出,直至达到第1个无格式记录的字节数。若要读取第2个无格式记录中的诸数据,可在读完第1个记录之后(此时,文件指针已定位于第1个字节的末字节处),将文件指针再前移1个字节,先从该字节读出第2个记录的字节数,之后的操作便与读取第1个记录的相同。其余记录的读取可依此类推。 在创建FORTRAN无格式文件时,如果将整数写成同值的实数,则在用fread函数读取时,可免去进行所读数据是整数还是实数的判断,而又不影响数据值的大小。

Fortran95课程设计

Fortran95 课程设计

目录 一,任务书...............................................................................1 二,员工档案(工资和个人所得税)..................................6 三,求解方程.........................................................................11 1,求解一元方程的根494-)(23++=x x x x f .. (11) 1-1,二分法求解 1-2,弦截法求解 1-3,Newton 迭代法求解 (13) 2,求方程的积分()dx x e x b a 5431+++?.......................................15 2-1,矩形法积分 2-2,梯形法积分 2-3,辛普生法积分 3,Gauss-Jordan 法求联立方程组 (18) ?? ???=++=++=++8z 2y x 7z y 2x 6z y x 四 ,课程总结 (22)

2012级FORTRAN 95程序设计语言课程设计任务书 一、实践目的 通过本课程设计、加深学生对所学程序设计语言的理解,培养其程序设计能力以及综合解决实际问题的能力。通过自己分析问题、分解问题、查找算法、编写、调试程序的过程,掌握FORTRAN 95程序设计与调试方法,提高应用所学知识借助计算机程序解决具体问题的能力。 二、设计任务 1、综合应用所学FORTRAN 95知识点解决具体问题。 某小型公司有员工25人,员工信息包括员工编号,姓名,性别,工龄,工资(为方便,视其为三险一金减除后的金额),现在需要对这25名员工按照其工资进行个人信息的排序,计算每个人的个人所得税并添加到个人信息中。请按以下要求进行设计 ⑴利用记事本创建员工基本信息文件。 ⑵设计包含以上信息内容的派生类和结构体数组。 ⑶以结构体数组为虚参编写排序子程序,可使用简单交换法、选择法和冒泡法中的任何一种。 ⑷以普通变量为虚参,编写函数子程序计算个人所得税子程序。 ⑸编写主程序完成以上工作,并将包含所得税信息的员工信息输出到另一个文本文件。

c和fortran混编(基于GNULinux)

c和fortran混编(基于GNU/Linux) 2011-08-26 12:02:01| 分类:系统配置 | 标签: |字号大中小订阅 https://www.wendangku.net/doc/4819104338.html,/blog/static/41789395200972931110461/ c和fortran混编(基于GNU/Linux) (转载于csdn,方便自己查阅) 2009-08-29 15:11:10| 分类:默认分类|字号订阅转下来是自己用这个方法编译成功,推荐下。注意如果gcc版本>=4.0,则将链接时则将-lfrtbegin -lg2c改为-lgfortran -lgfortranbegin。其实这方面的资料网上很多,我只是总结一下说说自己的理解(因为昨天看到有个xd问到这个)。先声明一下,我对fortran是一窍不通,只是看了看网上的程序推敲了下面几个的最简单的fortran源码。网上说要分c为主程序和fortran为主程序两种情况讨论,其实我觉得不用,只要你了解生成可执行文件的机制。这个机制就是:不论是单一语言模块之间的链接还是不同语言之间的混合链接,本质目的都是要链接器能找到定义于其他模块中的符号,如果全部找到,则链接成功,生成可执行的二进制文件。下面的内容比较基础,看烦了就跳过。比如简单的一个c程序:/* main.c */void FOO (); /* 其实按c语言的规定,调用程序之前不需声明,* c编译器会猜测函数的原型。需要在调用之前* 定义或者声明那是c++的风格*/int main (){FOO ();return 0;}/* foo.c */#include void FOO (){printf (“hello world\n”);}这两个文件都可以编译通过gcc -c main.cgcc -c foo.c这里gcc只用来编译并不链接,因为单独链接其中一个文件都是不完整的。必须将两个目标文件(上面会生成main.o和foo.o)链接在一起。gcc -osample main.o (gcc在编译时foo.o这里gcc 因为看到文件后缀名为.o所以直接进行链接而不再进行编译。 对文件的识别主要靠起后缀名。如果是gcc -osample main.c foo.c那么因为后缀名为.c所以会先编译,又因为没有-c选项所以会再链接。多说一点如果是gcc -osample main.c foo.o 那么只编译main.c文件,再将编译后的临时目标文件与foo.o链接。gcc还会因为不同的后缀名采用不同的编译器进行编译具体参见man 或者info,因为他是compiler collection 嘛:)不好意思,绕了一大圈。上面说到这两个文件都能独立编译(因为语法没错嘛),并且将编译出的目标文件放在一起链接就可以了。这正是因为链接器(链接器其实是ld,gcc调用了它)在foo.o中找到了main.o中需要的foo的定义,并且在main.o中找到了main的定义。这里还牵扯到一个问题,那就是c是很纯朴的语言,c的函数在文本文件中是什么名字,那么编译出来在目标文件(一般是.o文件)中相应的那个函数还是那个名字(不会像c++一样为了重载在函数名前后加一大堆区分符)。比如用nm查看main.o和foo.onm main.oU FOO00000000 T mainU表示在main.o中符号foo是未定义的,需要从外部链接进来。T表示该符号存在于这个目标文件对应的文本文件中,说白了就是有定义的符号。nm foo.o00000000 T FOOU printf这样就可以看出,编译出的foo.o与原foo.c中的函数名都是FOO。main.c 中调用了函数FOO,那么他编译出的这个函数的符号也还是FOO,这样对函数FOO的供与求才能对的上,链接器能找到对得上的符号才能链接成功。有人说foo.o里还有一个未定义符号printf,这个到哪里去找?gcc总是会有很多默认链接的库和链接选项,这其中包括c 的标准库,而printf就在c标准库中。加上-v选项就可以看出来,gcc在编译和链接时到底做了哪些事。又多说一点,如果一个函数有定义或者被调用,那么编译后在目标文件中就会有其相应的符号,因为要告诉链接器有这个供给,或者有这个需求嘛。如果一个函数仅仅有什么声明,那么是不会编译出它的符号的,因为它既不会给别人用,也不会用别人。那么,说了这么多其实还是为了明确一点:要让链接器找到在一个文件中需要的符号定义,那么链接就能成功,就能生成可执行文件了。这也是混编的关键!现在开始真真儿的了。将主程序main.c换成fortran的c main.fprogram testexternal FOOcall FOO ()end还是原来的foo.c,

Fortran95程序设计课后习题答案(word版方便).docx

第四章 1.program main implicit none write(*,*)"Have a good time."write(*,*)"That's not bad."write(*,*) '"Mary" isn''t my name.' end program 2.program main real, parameter :: PI=3implicit none.14159real radius write(*,*) "请输入半径长 "read(*,*)radius write(*,"('面积 ='f8.3)")radius*radius*PI end program 3.program main implicit none real grades write(*,*)"请输入成绩 "read(*,*)grades write(*,"('调整后成绩为 'f8.3)") SQRT(grades)*10.0 end program 4.integer a,b real ra,rb a=2 b=3 ra=2.0 rb=3.0 write(*,*) b/a! 输出 1,因为使用整数计算,小数部分会无条件舍去write(*,*) rb/ra! 输出 1.5 5.program main implicit none type distance real meter,inch,cm end type type(distance) ::d write(*,*)" 请输入长度 :"read(*,*)d%meter d%cm = d%meter*100 d%inch=d%cm/2.54write(*,"(f8.3'米 ='f8.3' 厘米 ='f8.3' 英寸 ')") d%meter,d%cm, d%inch end program 第五章 1.program main implicit none integer money real tax write(*,*) "请输入月收入"read(*,*) money if ( money<1000 ) then tax = 0.03else if ( money<5000) then tax=0.1else tax=0.15end if write(*,"('税金为 'I8)")nint(money*tax)end program 2.program main implicit none integer day character(len=20) :: tv write(*,*) "请输入星期几 "read(*,*) day select case(day)case(1,4)tv = " 新闻 "case(2,5)tv = " 电视剧"case(3,6)tv=" 卡通 "case(7)tv = " 电影 "case default write(*,*) "错误的输入 "stop end select write(*,*) tv end program 3.program main implicit none integer age, money real tax write(*,*)" 请输入年龄 " read(*,*)age write(*,*)"请输入月收入 "read(*,*)money if (age<50 )then if ( money<1000 ) then tax = 0.03else if ( money<5000 )then tax = 0.10else tax = 0.15end if else if(money<1000) then tax= 0.5else if( money<5000 )then tax = 0.7else tax = 0.10end if end if write(*,"('税金为 'I8)") nint(money*tax) end program 4.program main implicit none integer year, days logical mod_4,mod_100, mod_400 write(*,*)" 请输入年份 "read(*,*) year mod_4= ( MOD(year,4)== 0 )mod_100 = ( MOD(year,100) == 0 )mod_400 = (MOD(year,400) ==0)if ((mod_4.NEQV. mod_100) .or. mod_400 ) then days = 366else days = 365end if write(*,"('这一年有 'I3' 天 ')") days stop end program 第六章 1.program main implicit none integer i do i=1,5write(*,*)"Fortran"end do stop end program 2.program main implicit none integer i,sum sum = 0do i=1,99,2sum = sum+i end do write(*,*) sum stop end program 3.program main implicit none integer,parameter:: answer= 45integer,parameter :: max = 5integer weight, i do i=1,max write(*,*) "请输入体重 "read(*,*) weight if (weight==answer) exit end do if(i<=max ) then write(*,*)" 猜对了 "else write(*,*) "猜错了 "end if stop end program 4.program main implicit none integer, parameter :: max=10integer i real item real ans ans = 1.0item = 1.0do i=2,max item = item/real(i)ans = ans+item

相关文档
相关文档 最新文档