Fortran90与C++的比较一、程序结构、语句和注释fortranC++程序结构Programmain(自定义程序名)主程序代码Stop(程序结束,可省)End(主程序代码结束)预处理命令以“#”开头,包括宏定义命令、文件包含命令和条件编译命令函数,有一个主函数和若干个函数组成,主函数为main函数。函数体由一对花括号“{}”括起来语句每行一般为一句语句,语句末不加“;”1.每行可写132个字符2.代码开头或结尾的“&”,连接下一行或下一行代码书写格式自由灵活,语句末加“;”1.每一行可写一条或多条语句,一条语句可分写在一行或多行内注释感叹号“!”后的文本为注释单行注释:“//”后的文本为注释多行注释:以“/*”开头,以“*/”结束,之间的内容都是注释二、字符集和变量命名规则fortranC++字符集1.A~Z及a~z2.0~93.其他字符:=+-*/(),.’!”%&;?$_(空格)变量命名规则1.英文字母、下划线或数字,前缀英文字母2.不区分大小写3.长度1~314.不要和执行命令同名,不能和主程序或已声明过的变量同名注释:Fortran默认I、J、K、L、M、N开头的变量为整型,其他为实型,故在PROGRAM命令下一行加入IMPLICITNONE命令,关闭默认类型功能。1.英文字母、下划线或数字,前缀英文字母或下划线2.严格区分大小写3.长度1~314.不要同名三、数据结构fortranC++数据类型1.整型INTEGERa1)长整型,4字节(默认)2)短整型,2字节3)更短整型,1字节声明方法:1)INTEGER(kind=4)a2)INTEGER*4a3)INTEGER(4)a2.实型REALa1)单精度,4字节(默认)2)双精度,8精度声明类似整型3.复数COMPLEXa4.字符和字符串CHARACTERa声明方法:Charater(len=10)aCharacter(10)aCharacter*10a注释:在””之间输入”需要””5.逻辑变量LOGICALaa=.true.a=.false.1.整型inta1)signed/unsignedlongint,4字节2)signed/unsignedint,4字节3)signed/unsignedshortint,2字节4)signed/unsignedchar,1字节默认:signed2.实型1)float2)double3)longdouble3.字符型chara1)char2)unsignedchar表示方法:1)引号之内的图形符号2)引号以内以\开头的ASCII码或特定符号注释:\a\a\t\n\v\r\”\’\?\\\ddd\xhh\ddd:1~3位8进制数对应ASCII码\xhh:1~2位16进制数对应ASCII码注释:转换次序从低到高:字符-短整型-整型-单精度-双精度(低自动向高转,不会出错)static_cast要转换的新数据类型被转换的表达式复合类型1.自定义数据类型type::personcharacter(len=20)::nameinteger::ageinteger::lengthendtypepersontype(person)::aa%name=”xiaoming”1.数据结构体structstructname{intname1;charname2;……;}sructnamea;赋初值(1)a={23,’w’}(2)a.name1=23;a.name2=’w’;四、常量和变量fortranC++常量1.数值常量同c++2.字符常量同c++3.符号常量声明方法:1)realpiparameter(pi=3.14159)2)realparameter::pi=3.141591.数值常量(整型常量、实型常量)2.字符常量(字符常量、字符串常量)转义字符:\a\b\f\n\r\t\v\\\?\’\”\0\ddd\xhh字符常量:单引号,单个字符,占一个字节字符串常量:双引号,单个多个字符,占一个以上字节(结束符\0)3.符号常量声明方法:#definepi3.14159或constintpi=3.14159变量五、输入和输出语句fortranC++输入输出输出:write(unit,fmt)A,B,Cprintfmt,A,B,C输入:read(unit,fmt)A,B,C1.默认输出位置和不限定输入输出格式write(*,*)A,B,C2.格式化输入输出1)指定代码行对应格式输入输出write(*,100)A100formt(I4)2)输入输出格式直接写在命令中write(*,”(I5)”)A3)利用字符串存储输入输出格式character(len=10)fmtstringfmtstring=”(I2)”write(*,fmtstring)3运用输入输出流头文件#includeiostream屏幕标准输出:cout”abc”34num;键盘标准输入:cinnum输入输出格式主要输入输出格式:2.Aw以w个字符宽输出字符串1)右对齐,不足左端补空格2)从左向右读入,超出部分截去3.Ew.d[Ee]以w个字符宽输出指数类型浮点数,小数部分占d个字符宽,指数部分占e个字符宽1)超过w字符宽,输出w个*2)小数或指数部分不足宽度补03)小数部分超出四舍五入截去4.Fw.d以w个字符宽输出浮点数,小数部分占d个字符宽1)超过w字符宽,输出w个2)小数部分不足补0,超出截去5.Iw[.m]以w个字符串输出整数,最少输出m个数字1)超过w字符宽,输出w个*2)右对齐,不足m位左端补06.nX插入n个空格六、表达式fortranC++算术表达式1.**乘方2.*乘、/除3.+加、-减1.*乘、/除、%取模2.+加、-减3.++自加、--自减注释:前置先计算再赋值后置先赋值再计算关系表达式1.、=、、=2.==、/=1.、=、、=2.==、!=逻辑表达式1..AND.2..OR.3..NOT.4..EQV.5..NEQV.1.&&2.||3.!注释:非0为真,0为假条件表达式无1.?:A?B:C先计算A,如果A值为true(非0),返回B值作为整个条件表达式的值,如果A值为false(0),返回C值。赋值表达式1.=2.=3.+=、-=、*=、/=、%=4.&=、^=、|=5.&&=、||=注释:x*=y即x=x*y,从右向左赋值逗号表达式无1.,用于将几个表达式隔开,从左向右计算,优先级最低优先级1.单目、双目、三目、赋值,逗号,优先级依次降低2.单目运算及赋值运算从左至右3.算术、位移、关系、位、逻辑运算依次降低七、选择结构fortranC++选择结构1.IF语句1)单分支IF结构a)IF(逻辑表达式)……if(s100)write(*,*)“slow”b)块IF结构IF(逻辑表达式)THEN……ENDIF2)双支IF结构IF(逻辑表达式)THEN……ELSE……ENDIF3)多支IF结构a)ELSEIF语句IF(条件1)THEN……ELSEIF(条件2)THEN……ELSE……ENDIFb)嵌套IF语句IF(条件1)THENIF(条件2)THENIF(条件3)THEN……ELSE……ENDIFENDIFENDIF2.SELECTCASE语句selectcase(变量)case(数值1)……case(数值2)……casedefault1.If语句1)单支if语句if语句……;2)双支if-else语句if(表达式)……;else……;3)嵌套if语句2.多支switch语句switch(表达式)case常量表达式1;……;case常量表达式n;……;default……;注释:(1)与break语句结合跳出循环(2)两个或以上常量都对应一个语句,则case表达式1case表达式2……;……endselect注释:case冒号前后两个数值代表范围内所有数值,用逗号放入一个或多个数值数值只能是整型或字符型case中数值必须为常量,不能使用变量八、循环结构fortranC++循环结构1.do语句docounter=起始值,终止值,计数器增值…………enddo2.dowhile语句dowhile(逻辑表达式)…………enddo1.while语句while(逻辑表达式){……;}2.for语句for(表达式1;表达式2;表达式3){……;}3.dowhile语句do{……;}while(表达式);流程控制语句1.GOTO语句GOTO100……100……跳跃至指定行,不建议使用2.PAUSE语句当遇到该语句暂停执行,直到用户按下ENTER继续执行3.CONTINUE语句继续向下执行语句4.STOP语句结束程序执行1.goto语句label;…………if(逻辑表达式)gotolabel;选择或循环控制语句1.CYCLE语句略去该语句之后的循环模块,继续下一次循环2.EXIT语句跳出当前的循环3.署名的循环例如:loop:doi=1,4,1与EXIT、CYCLE语句结合1.break语句只能用在switch和循环语句中用在循环中跳出当前的循环,同fortran的exit2.Continue语句略去该语句之后的循环模块,继续下一次循环,同fortran的cycle九、数组fortranC++一维数组声明方法1.integera(10)2.integer,dimension(10)::a注释方法:下标从1开始声明方法:inta[5]包含a[0],a[1]……a[4]注释:下标从0开始二维数组声明方法1.integera(10,10)2.integer,dimension(10,10)::a声明方法:inta[3][4]相当于inta[0][4],a[1][4],a[2][4]多维数组声明方法1.integera(10,10,10)2.integer,dimension(10,10,10)::a注释:另类声明:integera(m:n)m~n为坐标范围声明方法:inta[2][3][4]注释:三维以上很少使用赋初值1.使用DATA设置初值(1)integera(5)dataa/1,2,3,4,5/或dataa/5*3/(2)利用隐式循环(Fortran独有!)integera(5)integeridata(a(i),i=2,4)/2,3,4/注释:可以局部赋值2.省略DATA的声明(1)integer::a(5)=(/1,2,3,4,5/)(2)利用隐式循环integer::iinteger::a(i)=(/(i,i=1,5)/)注释:只可全部赋值,不可局部赋值1.在定义数组时给全部全速赋值inta[5]={1,2,3,4,5};2.部分数组赋值inta[5]={1,2,3}只能赋值前x个元素,不可以跳过某一元素给下一元素赋值3.初始化数组时初值全给出可不指定数组长度inta[]={1,2,3,4,5}整个数组操作(Fortran独有!)1.a=5对数组每个元素赋值52.a=b将a同位置元素值设置成和b一样3.a=b+c将b和c同位置值相加赋给a,同理-、*、/4.a=sin(b)无部分数组操作1.a(m:n,e)=……对m~n之间步长为e部分数组元素赋值等号左边须是大小维数和右边相等数组2.隐式循环赋值使用多个隐式循环,较低维循环可当作内无层循环数组函数1.where例如:where(a3)b=aelsewhereb=-aendwhere相当于数组中的if函数,可嵌套,可取名无存数顺序1.二维数组按列存放2.多维数组,自高维向低纬存放与Fortran相反!1.二维数组按行存放2.自低维向高维存放可变大小数组integer,allocatable::a(:)allocate(a(students))!分配内存空间deallocate(a)释放a无十、函数fortranC++子程序SUBROUTINEsubroutinesub1()……(return)endsubroutinesub1注释:1.可放在主程序前后2.