});

Comparison of “If” & “While” among Fortran, Matlab, Python

Fortran、Matlab、Python中的if判断语句和while循环语句的对比

前言 Intro

一次课程设计要求将一个fortran语言编写的截面分析程序(切片法,条带法)用其他语言改写,过程中涉及了fortran、matlab代码的阅读理解以及python的编写。其中尤其判断语句和循环语句的嵌套关系的转写尤为复杂,在此记录下心得感悟。

示例代码

先来一段示例代码

# fortran
40         CONTINUE
           F1=ZM1-WJMAX*0.80
           CALL QWJ(QL2,II,ZM2,QL,WJ) !调用“求弯矩”程序,求得ZM2
           F2=ZM2-WJMAX*0.80

           IF(F1*F2.GT.0.0)THEN !如果F1、F2同号,则继续回退
             QL1=QL2
	       ZM1=ZM2
             QL2=QL2-DF1
             GOTO 40
           ENDIF

# matlab
while 1
            F1=ZM1-WJMAX*0.8;
            ZM2=QWJ(QL2,i,QL,WJ);
            F2=ZM2-WJMAX*0.8;
            if(F1*F2>0)
                QL1=QL2;
                ZM1=ZM2;
                QL2=QL2-DF1;
            else 
                break;
            end
        end

# python
while 1:
                F1 = ZM1-WJMAX*0.8
                ZM2 = QWJ(QL2,i,QL,WJ)
                F2 = ZM2-WJMAX*0.8

                if(F1*F2>0):
                    QL1 = QL2;
                    ZM1 = ZM2;
                    QL2 = QL2-DF1
                else: 
                    break

If 判断语句

Fortran和Matlab的判断语句都带有end if,且if (和else) 后无需加上“:”,if判断语句的结尾用end if来确定。而python的if(和else)后必须加上“:”,且仅通过缩进来判断if语句的内容范围。

# fortran
           IF(F1*F2.GT.0.0)THEN !如果F1、F2同号,则继续回退
             QL1=QL2
	       ZM1=ZM2
             QL2=QL2-DF1
             GOTO 40
           ENDIF

# matlab
            if(F1*F2>0)
                QL1=QL2;
                ZM1=ZM2;
                QL2=QL2-DF1;
            else 
                break;
            end

# python
            if(F1*F2>0):
                 QL1 = QL2;
                 ZM1 = ZM2;
                 QL2 = QL2-DF1
            else: 
                 break

While循环语句

严格来说,fortran中的循环语句应该不可以称为while循环语句,但这里为了方便权且这么称呼,fortran用的是CONTINUE+GOTO,其功能和matlab、python中的while+if…break应该是相似的。

# fortran
40         CONTINUE
           IF(F1*F2.GT.0.0)THEN !如果F1、F2同号,则继续回退
             QL1=QL2
             GOTO 40
           ENDIF

# matlab
while 1
            if(F1*F2>0)
                QL1=QL2;
            else 
                break;
            end
        end

# python
while 1:
                if(F1*F2>0):
                    QL1 = QL2;
                else: 
                    break

其他

还有些小的不同点也随手记录下

例如matlab中在list应当就是数组了,在数组末尾添加一个新的元素的命令是

A= [A, new_element]

在python中,自带的list其实是列表,不仅可以存放数字,也可以存放其他的数据类型。其对应的添加新元素命令为

A = []
A.append(new_element)

而且,用range()函数生成的生成的是生成器,不可直接用上述方法添加新的元素哦。python中对应的专用数组,应该是Numpy库中的nd.array数据类型,也是这一原因,python中用matplotlib成图比较稳妥的方法,是用numpy先把list转成nd.array再生成图片。nd.array中添加新元素的命令为

A_arr = numpyp.append(A_arr, new_element) 

对于A_arr,此时的append是作为numpy库的一个独立函数被调用,而不是作为实例化后的list A的内置函数