彭国伦fortran第十七章.docx
- 文档编号:10433606
- 上传时间:2023-02-11
- 格式:DOCX
- 页数:63
- 大小:193.95KB
彭国伦fortran第十七章.docx
《彭国伦fortran第十七章.docx》由会员分享,可在线阅读,更多相关《彭国伦fortran第十七章.docx(63页珍藏版)》请在冰豆网上搜索。
彭国伦fortran第十七章
第17章VisualFortran扩充功能
这一章会介绍VisualFortran在FORTRAN标准外所扩充的功能,主要分成两大部分;第一部分会介绍VisualFortran的扩充函数,第二部分会介绍VisualFortran的绘图功能。
17-1VisualFortran扩充函数
VisualFortran中提供了很多让FORTRAN跟操作系统通信的函数,这些函数都封装在MODULEDFPORT中。
调用这些函数前,请先确认程序代码中有使用USEDFPORT这一行命令。
integer(4)functionIARGC()
返回执行时所传入的参数个数
subroutineGETARG(n,buffer)
用命令列执行程序时,可以在后面加上一些参数来执行程序,使用GETARG可以取出这些参数的内容。
integern
决定要取出哪个参数
character*(*)buffer
返回参数内容
FORTRAN程序编译好后,执行程序时可以在命令列后面加上一些额外的参数。
假如有一个可执行文件为a.exe,执行时若输入a–o–f,在a之后的字符串都会被当成参数。
这时候执行a–o-f时,调用函数IARGC会得到2,因为总共传入了两个参数。
调用函数GETARGC(1,buffer)时,字符串buffer=”-o”,也就是第1个参数的值。
subroutineGETLOG(buffer)
查询目前登录计算机的使用者名称。
character*(*)buffer
返回使用者名称
integer(4)functionHOSTNAM(buffer)
查询计算机的名称,查询动作成功完成时函数返回值为0。
buffer字符串长度不够使用时,返回值为-1。
character*(*)buffer
返回计算机的名称
程序执行时,工作目录是指当打开文件时,没有特别指定目录位置时会使用的目录。
通常这个目录就是执行文件的所在位置,在程序进行中可以查询或改变这个目录的位置。
integerfunctionGETCWD(buffer)
查询程序目前的工作目录位置,查询成功时函数返回0。
integerfunctionCHDIR(dir_name)
把工作目录转换到dir_name字符串所指定的目录下,转换成功时返回0。
扩充的文件相关函数,补充了一些原本的缺失。
INQURE命令可以用来查询文件信息,不过它并没有提供很详细的信息,例如文件大小就没有辨法使用INQUIRE来查询。
integer(4)functionSTAT(name,statb)
查询文件的数据,结果放在整数数组statb中。
查询成功时函数返回值为0。
character*(*)name
所要查询的文件名。
integerstatb(12)
查询结果,每个元素代表某一个属性,statb(8)代表文件长度,单位为bytes。
其它值请参考使用说明。
integer(4)functionRENAME(from,to)
改变文件名称,改名成功时返回0。
character*(*)from
原始文件名
character*(*)to
新文件名
程序执行时,可以经由函数SYSTEM再去调用另外一个程序来执行。
integer(4)functionSYSTEM(command)
让操作系统执行command字符串中的命令。
subroutineQSORT(array,len,size,compar)
使用QuickSort算法把传入的数组数据排序。
array
任意类型的数组
integer(4)len
数组大小
integer(4)size
数组中每个元素所占用的内存容量
integer
(2),external:
:
compar
使用者必须自行编写比较两笔数据的函数,函数compar会自动传入两个参数a、b。
当a要排在b之前时,compar要返回负数,a、b相等时请返回0,a要排在b之后时,compar要返回正数。
QSORT.F90
1.programmain!
使用QSORT函数的范例
2.useDFPORT
3.implicitnone
4.integer:
:
a(5)=(/5,3,1,2,4/)
5.integer
(2),external:
:
compareINT
6.callQSORT(a,5,4,compareINT)
7.write(*,*)a
8.stop
9.endprogram
10.!
要自行提供比较大小用的函数
11.integer
(2)functioncompareINT(a,b)
12.implicitnone
13.integera,b
14.if(a
15.compareINT=-1!
a排在b之前
16.elseif(a==b)then
17.compareINT=0
18.else
19.compareINT=1!
a排在b之后
20.endif
21.return
22.endfunction
17-2VisualFortran的绘图功能
第12章的SGL是笔者提供的绘图函数库,VisualFortran中另外有提供绘图功能。
VisualFortran的绘图功能不完全是以扩充函数的类型存在,使用它的绘图功能必须在选择Project类型时,选择StandardGraphics或QuickWin模式。
VisualFortran提供的绘图方法,跟SGL比较起来算是各有利弊。
SGL使用比较简单的参数接口,使用效率比较好的DirectX,支持DoubleBuffer动画功能,而且并不限制只能在VisualFortran中使用。
VisualFortran的QuickWin及StandardGraphics模式在简单的绘图使用上会比较方便,不像SGL必须自行处理一些窗口信息。
它的绘图函数功能比较多样,不过效率会比较差,而且不支持动画功能。
StandardGraphics和QuickWin模式在绘图方面的使用方法完全相同,它们都是调用相同的函数来绘图。
差别在于StandardGraphics只能打开一个窗口来绘图、QuickWin模式则可以打开多个窗口来绘图。
QuickWin模式下可以有菜单及对话窗的功能,StandardGraphics则不行。
StandardGraphics模式的程序代码可以原封不动直接转换到QuickWin模式下使用,但是QuickWin的程序代码并不一定可以直接拿到StandardGraphics模式下使用。
17-2-1基本绘图功能范例
这个小节没有什么新的概念,只会范例VisualFortran绘图函数的使用方法。
直接来看一个范例程序。
这个程序会在屏幕上画出一条斜线、一个方形及一个椭圆。
编译程序时,请选择FortranStandardGraphicsorQuickWinApplication这个模式。
这个程序可以在StandardGraphics或QuickWin模式下使用。
打开好Project后,再把下面的程序加入Project中来编译。
PLOT.F90
1.!
简单的绘图范例
2.!
ByPerng1997/9/19
3.programPlot_Demo
4.!
使用VisualFortran的绘图功能时需要moduledflib
5.useDFLIB
6.implicitnone
7.type(xycoord):
:
t
8.integer:
:
result
9.callMoveTo(10,10,t)!
把目前绘图的位置移动到坐标(10,10)
10.result=LineTo(100,50)!
从(10,10)到(100,50)间绘一条直线
11.!
画一个左上角为(110,10),右下角为(150,50)的实心方形
12.result=Rectangle($GFILLINTERIOR,110,10,150,50)
13.!
画一个可以放入在(10,60)--(150,100)方形当中的空心椭圆
14.result=Ellipse($GBORDER,10,60,150,100)
15.endprogramPlot_Demo
使用StandardGraphics模式时,会出现一个绘图窗口来画图。
使用QuickWin模式时,除了绘图窗口外,还有内定的菜单可以使用。
File菜单中的Print可以把图形显示出,Save可以把绘图结果储存成*.BMP图文件。
图17.1
PLOT.F90用QuickWin模式编译的结果
使用VisualFortran的绘图功能时,打开窗口的工作是自动完成的。
程序代码只需要直接调用绘图函数就可以进行绘图,下面对程序中所使用的绘图函数做一些介绍:
subroutineMoveTo(x,y,t)
使用这个子程序时,要先把屏幕想像成一张画纸,程序会使用一只画笔在屏幕上画画。
MoveTo(x,y,t)可以把这只画笔移动到画纸上的(x,y)坐标处,参数t则会返回移动之前的画笔所在位置(这个参数其实没有什么用,不过既然有规定就一定要把它放入)。
请注意,原点(0,0)是位在窗口的左上角,x坐标轴向右为正,y坐标轴向下为正。
integer
(2)functionLineTo(x,y)
这个函数可以把画笔从目前的位置到(x,y)处画一条直线。
返回值如果不为0,代表函数运行不正常。
integer
(2)functionRectangle(control,x1,y1,x2,y2)
这个函数可以在(x1,y1)、(x2,y2)两个端点间画出一个方形。
control值可以用来设定是要画出一个实心方形或是只有外框而已。
在范例中把control的值用$GFILLINTERIOR来代入,表示要画实心。
$GFILLINTERIOR定义在MODULEDFLIB里面。
integer
(2)functionEllipse(control,x1,y1,x2,y2)
这个函数会在(x1,y1)、(x2,y2)两端点间所形成的矩形中画椭圆。
control的意义同上,在范例中使用$GBORDER,代表只画出外框。
再来看一个范例,它会画出SIN函数的图形。
SIN.F90
1.!
sin函数的绘图范例
2.programPlot_Sine
3.useDFLIB
4.implicitnone
5.integer,parameter:
:
lines=500!
用多少线段来画函数曲线
6.real(kind=8),parameter:
:
X_Start=-5.0!
x轴最小范围
7.real(kind=8),parameter:
:
X_End=5.0!
x轴最大范围
8.real(kind=8),parameter:
:
Y_Top=2.0!
y轴最大范围
9.real(kind=8),parameter:
:
Y_Bottom=-2.0!
y轴最小范围
10.integer:
:
result!
取回绘图函数运行状态
11.integer(kind=2):
:
color!
设定颜色用
12.real(kind=8):
:
step!
循环的增量
13.real(kind=8):
:
x,y!
绘图时使用,每条小线段都连接
14.real(kind=8):
:
NewX,NewY!
(x,y)及(NewX,NewY)
15.real(kind=8),external:
:
f!
待绘图的函数
16.type(wxycoord):
:
wt!
返回上一次的虚拟坐标位置
17.type(xycoord):
:
t!
返回上一次的实际坐标位置
18.
19.!
设定虚拟坐标范围大小
20.result=SetWindow(.true.,X_Start,Y_Top,X_End,Y_Bottom)
21.!
用索引值的方法来设定颜色
22.result=SetColor
(2)!
内定的2号是应该是绿色
23.callMoveTo(10,20,t)!
移动画笔到窗口的(10,20)
24.callOutGText("f(x)=sin(x)")!
写出内容
25.!
使用全彩RGB0-255的256种色阶来设定颜色
26.color=RGBToInteger(255,0,0)!
把控制RGB的三个值转换到color中
27.result=SetColorRGB(color)!
利用color来设定颜色
28.
29.callMoveTo_W(X_Start,0.0_8,wt)!
画X轴
30.result=LineTo_W(X_End,0.0_8)!
31.callMoveTo_W(0.0_8,Y_Top,wt)!
画Y轴
32.result=LineTo_W(0.0_8,Y_Bottom)!
33.
34.step=(X_End-X_Start)/lines!
计算小线段间的X间距
35.!
参数#FF0000是使用16进制的方法来表示一个整数
36.result=SetColorRGB(#FF0000)
37.!
开始绘制小线段们
38.dox=X_Start,X_End-step,step
39.y=f(x)!
线段的左端点
40.NewX=x+step
41.NewY=f(NewX)!
线段的右端点
42.callMoveTo_W(x,y,wt)
43.result=LineTo_W(NewX,NewY)
44.enddo
45.!
设定程序结束后,窗口会继续保留
46.result=SetExitQQ(QWIN$EXITPERSIST)
47.end
48.!
所要绘图的函数
49.real(kind=8)functionf(x)
50.implicitnone
51.real(kind=8):
:
x
52.f=sin(x)
53.return
54.endfunctionf
这个程序会以目前Windows分辨率的大小来打开绘图窗口。
程序执行后只能够看到窗口的一小部分,读者可以试着按下Alt+Enter来把窗口放大成全屏幕大小,不然看不到全部的图形。
使用QuickWin模式时,并不像使用SGL时一样可以得到窗口大小改变的信息,所以QuickWin下的虚拟坐标是对固定分辨率来对应,不会随着窗口大小改变而缩放图形。
把这个程序中新使用的绘图函数做一个介绍
integer
(2)functionSetWindow(invert,x1,y1,x2,y2)
用来设定虚拟坐标,invert的值是用来指定Y轴向上为正或为负。
invert=.true.时向上为正,invert=.false.时向下为负。
(x1,y1)、(x2,y2)则使用双精度浮点数来定义绘图范围两端的虚拟坐标值。
integer
(2)functionSetColor(index)
使用索引值的方法来设定所要使用的颜色。
subroutineOutGText(text)
调用这个子程序可以在目前画笔的位置上写出text字符串。
integer(4)functionRGBToInteger(R,G,B)
前面有提过,全彩模式中,RGB三种色光可以各自有256种色阶变化,所以一个颜色需要使用3bytes的空间来做记录。
但是FORTRAN中通常一个整数使用4bytes的空间来做记录,如果分别使用3个变量来记录一个颜色值会很浪费空间,因为这3个变量都只会使用到最低的8个位,其它地方都不会使用。
这个函数可以重新组合RGB这三个传入的整数,取出这三个整数中最低8个位的数值,把它重新安排到返回值color中。
color中的第0~7bits用存放原本的R,8~15bits会存放原本的G,16~23bits会存放原本的B,剩下第24~31bits的空间则不会使用。
integer
(2)functionSetColorRGB(color)
用RGB方法来设定颜色,参数color中的第0~7个bits用来设定红光,第8~15bits用来设定绿光,第16~23bits用来设定蓝光,其它位不使用。
在范例当中曾使用SetColorRGB(#FF0000)来设定颜色,在VisualFortran中以#符号开头的数字,代表一个16进制的数字。
16进制数值在0~9时和10进制数字相同,但是接在9下面的数字为A、B、C、D、E、F。
其中A等于10进制的10,B=11,C=12.....,同理可推得1016=16,FF16=255。
使用16进制的系统可以比较容易来操作这种需要控制到位内容的数值。
正规的FORTRAN90写法应该用Z”FF0000”来设定16进制的数值,第5章的最后一节有介绍这个方法。
在此顺便范例一下VisualFortran的扩充语法。
17-3互动功能
这一节要介绍QuickWin模式下,使用者和程序间的互动功能。
鼠标及菜单、对话窗等等的工具,都是本节所要讨论的范围。
17-3-1传统的键盘输入
如果读者想把原先发展好的程序,转换到QuickWin模式下来使用,还是可以使用READ/WRITE命令来输出入。
下面的范例程序会根据使用者的选择来画出函数图形。
程序执行后,会出现两个小窗口,一个窗口会负责读取键盘的输入,另一个窗口则负责绘图。
图17.2
这个程序打开了两个窗口,分别用来做绘图及输入的工作。
读者可以注意到绘图部分的程序代码和上一节的程序一模一样,不过这个程序把绘图窗口缩小了,所以不经过放大就可以看到全部的图形。
因为绘图坐标系是使用虚拟坐标,所以图形的相对位置不会因窗口分辨率而改变。
INPUT.F90(QuickWin模式)
1.!
Interactive的绘图范例
2.!
ByPerng1997/9/20
3.programPlot_Sine
4.useDFLIB
5.implicitnone
6.logical:
:
result
7.integer:
:
input
8.type(WindowConfig):
:
wc
9.real(kind=8),external:
:
f1,f2,f3!
所要画的函数
10.!
打开输入用的窗口
11.open(unit=5,file='user',iofocus=.true.)
12.!
-1代表由程序自行去做决定
13.wc.numxpixels=300!
窗口的宽
14.wc.numypixels=300!
窗口的高
15.wc.numtextcols=-1!
每行可容纳的文字
16.wc.numtextrows=-1!
可以有几列文字
17.wc.numcolors=-1!
可以使用的颜色
18.wc.title="InputArea"C!
窗口的标题文字
19.wc.fontsize=-1!
所使用的文字大小
20.!
根据wc中所定义的数据来重新设定窗口大小
21.result=SetWindowConfig(wc)
22.result=DisplayCursor($GCURSORON)!
显现出光标
23.!
打开绘图所要使用的窗口
24.open(unit=10,file='user',iofocus=.true.)
25.wc.numxpixels=300!
窗口的宽
26.wc.numypixels=300!
窗口的高
27.!
-1代表让程序自行去做决定
28.wc.numtextcols=-1!
每行容量的文字
29.wc.numtextrows=-1!
可以有几列文字
30.wc.numcolors=-1!
使用多少颜色
31.wc.title="PlotArea"C!
窗口的标题
32.wc.fontsize=-1
33.!
根据wc中所定义的数据来重新设定窗口大小
34.result=SetWindowConfig(wc)
35.!
程序自动按下菜单中Windows的Tile命令,使两个窗口之间
36.!
不会互相重叠
37.result=ClickMenuQQ(QWIN$TILE)
38.input=1!
随便给一个合理的值,不然不能进入下面的循环
39.!
把输入使用的窗口设为可以被输入的状态,5就是第一次打开
40.!
绘图窗口时所用的unit值
41.result=FocusQQ(5)
42.dowhile(input>0.and.input<4)
43.write(5,*)'
(1)Plotf(x)=sin(x)'
44.write(5,*)'
(2)Plotf(x)=cos(x)'
45.write(5,*)'(3)Plotf(x)=(x+2)*(x-2)'
46.write(5,*)'OthertoEXIT'
47.read(5,*)input
48.result=SetActiveQQ(10)!
把绘图命令指定到绘图窗口的代码上
49.!
根据input来决定要画出那一个函数
50.selectcase(input)
51.case
(1)
52.callDraw_Func(f1)
53.case
(2)
54.callDraw_Func(f2)
55.case(3)
56.callDraw_Func(f3)
57.endselect
58.enddo
59.!
设定主程序代码结束后,窗口会自动关闭
60.result=SetExitQQ(QWIN$EXITNOPERSIST)
61.endprogramPlot_Sine
62.
63.subroutineDraw_Func(func)
64.useDFLIB
65.implicitnone
66.integer,parameter:
:
lines=500!
用多少线段来画函数曲线
67.real(kind=8),parameter:
:
X_Start=-5.0!
x轴最小范围
68.real(kind=8),parameter:
:
X_End=5.0!
x轴最大范围
69.real(kind=8),parameter:
:
Y_Top=5.0!
y轴最大范围
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 彭国伦 fortran 第十七