第2章 Fortran程序设计基础
Win 7 OS Microsoft Visual Studio Intel Visual Fortran 安装
安装文件 Grid.ustc.edu.cn 学校已经购买正版安装文件
安装过程
初步使用
初步使用 编译 连接 运行(Debug) 运行(非Debug) 在Release模式下,编译程序只会将源代码中的有效语句编译成可执行文件,因此编译出来的可执行文件“个头小”、“跑得快”。
编写Fortran程序所能使用的字符和符号 字符集和书面格式 编写Fortran程序所能使用的字符和符号 英文26个字母 A-Z及a-z (不区分大小写) 数字 0-9 22个特殊符号 :=+-*/(),.’!”%&;<>?$_以及空格 书面格式 文件后缀名 固定格式 *.f 或者*.for 自由格式 *.f90
自由格式注意事项 叹号!后面的文本均为注释 每行可以编写132个字符 一行程序代码的最后如果是符号&,代表下一行程序会和这一行连接。如果一行程序代码的开头是符号&,代表它会和上一行程序连接。 空格实际无意义,主要用来作为分割以及方便阅读程序代码使用。字符串中出现除外。 C=A+B C=A+& B C=A+ &B
数据类型的概念 数值型 数据 类型 非数值型 数据类型有四个性质: 类型名:如:Integer 允许值的集合:如整型 长整型 短整型 REAL 单精度 双精度 COMPLEX 非数值型 CHARACTER 字符 字符串 LOGICAL 数据类型有四个性质: 类型名:如:Integer 允许值的集合:如整型 允许值(常量)的表示方法 操作这些值的运算集合
整型数据 整型变量的说明基本格式为: INTEGER [ ( [ KIND = ] 类别参数值 ) ] [ [ ,属性列表 ] :: ] 变量列表 其中类别参数值取1,2,4 例:INTEGER I,TOTAL INTEGER(2) :: K,LIMIT INTEGER(KIND=4) :: MIN,MAX INTEGER*2 :: K,LIMIT INTEGER*4 :: MIN,MAX
整型数据 INTEGER I,N ! 默认整型 INTEGER(2)::K,L ! 两字节整型 integer*2::n=1,m !两字节表示 INTEGER*4::MIN,MAX !四字节表示 integer*4 m,n1,n2,n3 !四字节表示
变量的属性 属性是被说明对象的所属性质。一个对象被说明具有某一属性时,就使该对象具有某种附加功能、特殊的使用方式与适用范围。属性的种类有很多,这里介绍两种最常见属性的说明格式。 INTEGER, PARAMETER :: I=5,J=24 INTERGER, DIMENSION(1:10) :: A
整型数据 整数不应包括小数点,例如8.0不是整数 整数可以包含数符,例如,+8(与8等价),-8 整数常数各数字间的空格不起作用 类别参数 字节数 取值范围 1 -128~127 2 -32,768~32,767 4 -2,147,483,648~2,147,483,647 整数不应包括小数点,例如8.0不是整数 整数可以包含数符,例如,+8(与8等价),-8 整数常数各数字间的空格不起作用 整数常数不允许加入逗号
整型数据 在FORTRAN90中,还可以使用二进制、八进制和十六进制整型常量,但它只能用于DATA语句中。 二进制常量的形式是以字母B开头,后跟用一对撇号或双引号括起来的数字串,而且每个数字不是0就是1。例如 B'10101101'、B"1011101" 八进制常量的形式是以字母O开头,后跟用一对撇号或双引号括起来的数字串,而且每个数字是0到7之间的一个数字。例如,O'453'、O"376"。 十六进制常量的形式是以字母Z开头,后跟用一对撇号或双引号括起来的数字串,而且每个数字是0到9或字母A到F之间的一个。例如,Z'FFA9'、 B"9B45" 。 INTEGER i, j, k DATA i /B'110010'/ DATA j /O'62'/ DATA k /Z'32'/ 题目2.1 请写出如下三组数对应的二进制、八进制和十六进制形式。 B'110010‘ O'62‘ Z'32'
实型数据 FORTRAN用类别类型参数区分不同类型的实型数据。实型数据有单精度和双精度之分。单精度类别类型参数值为4,双精度数类别类型参数值为8。 一般形式为: 有效数E指数 有效数D指数
实型变量的说明 REAL [ ( [KIND = ] 类别参数值) ] [ [ ,属性列表] :: ] 变量列表 单精度用REAL(4)定义,双精度用REAL(8)或DOUBLE PRECISION定义。缺省的类别值为4,即为单精度。 REAL :: M12,AREA,LEN REAL(4) :: DX,DY REAL*4 :: DX,DY REAL(8) :: D_PRE,X REAL*8 :: D_PRE,X DOUBLE PRECISION :: D_PRE,X
实型数据 单精度类型 REAL X,Y REAL(4):: A,B 等价于 REAL*4::A,B 双精度类型(一般为8个字节来存储数据,提供15~17位有效数字) REAL(8)::X1,X2 等价于 REAL*8::X1,X2 REAL*8 X1,X2 或者 DOUBLE PRECISION X1,X2
双精度数据类型 Fortran中双精度常数要用指数表示(小数位数达到15位: 如:12.3456789 → 1.2345656789D+1 注意:不可写成 1.2345676789E-1 否则相当于 1.234568E-1 2018/11/13 18
复型数据 复型变量 COMPLEX [ ( [KIND = ] 类别值) ] [ [ ,属性列表] :: ] 变量列表 COMPLEX Z1,Z2 COMPLEX(4) :: COM_VAL COMPLEX(8) :: CZ, CQ CZ = (3.0, 6.3) CQ = (8.76E+5, -67.8E-3) Fortran中复型常数要用一个括弧中的两个实数来表示,第一个实数表示复数中的实部,第二个实数表示复数中的虚部。 如:1+2.5i → (1.0, 2.5) -5.4i → (0.0, 5.4)
复型类型数据 直接赋值 如: c=(3.0, 4.0) d=(8.76E+5, -5.8E-3) 当实部和虚部不是常数,而是表达式时,则应该用CMPLX函数将实部和虚部组成复型数据再赋给复型变量 如: C=cmplx( 3.0*A, 5.0+B )
复型类型数据 如果CMPLX函数只有一个自变量,则它代表实部 如:cmplx(3.0) → (3.0, 0.0) 在内存中一个复型数据占两个实数的存储单元,在PC中通常为8个字节
数学运算符号 数值型类型 + 加法 –减法 *乘法 / 除法 **乘幂(特别注意,两个星号要连续) () 括号 (表示括号部分优先计算)
运算注意事项 乘号用*表示,不可以写成×(避免和X混淆),也不能用 ’.’ 代替。 两个运算符不能紧邻,例如A*-B 是不合法的 运算符优先级 () > ** > *,/ > +,- 同一优先级的两个运算,按“先左后右”原则 3**2**3=? Fortran 77 规定,对于多次乘方按照“先右后左”原则 题目2.2 请采用Fortran90 自由格式编写程序,计算 3**2**3=?
运算类型问题 同类型算术量之间的运算保持原类型 4*8/5=? 不同类型算术量之间的运算,编译系统会将他们首先转换成同一类型,然后进行运算。转换的规律是,将低级类型转换成高级类型 4*8.0/5=? 1/4*20.0=?
数值型运算内部函数 作为一种主要面向科学、工程和事务处理中的数值计算问题的高级计算机语言,Fortran提供了丰富的数学函数供用户在编程时使用。 无需自己编写,仅需直接调用,最终由编译器连接生成可执行文件
绝对值函数 绝对值函数用于求出数据的绝对值,函数的原型如下: C = ABS(X) 其中,ABS是Fortran中绝对值函数的通用名。除了这个通用名外,绝对值函数还有4个专用名,它们是: IABS,专用于求默认种别的整型数据的绝对值,返回值也为默认种别的整型数据。 ABS,专用于求默认种别的实型数据的绝对值,返回值也为默认种别的实型数据。 DABS,专用于求双精度实型数据的绝对值,返回值也为双精度的实型数据。 CABS,专用于默认种别的复型数据的绝对值,返回值也为默认种别的复型数据。
指数函数 指数函数用于求出数据的指数值,函数的原型如下: C = EXP(X) 其中,EXP是Fortran中指数函数的通用名。除了这个通用名外,指数函数还有3个专用名,它们是: EXP,专用于求默认种别的实型数据的指数值,返回值也为默认种别的整型数据。 DEXP,专用于求双精度的实型数据的指数值,返回值也为双精度的实型数据。 CEXP,专用于默认种别的复型数据的指数值,返回值也为默认种别的复型数据。
正弦函数 正弦函数用于求出数据的正弦值,函数的原型如下: C = SIN(X) 其中,SIN是Fortran中正弦函数的通用名。除了这个通用名外,正弦函数还有3个专用名,它们是: SIN,专用于求默认种别的实型数据的正弦值,返回值也为默认种别的整型数据。 DSIN,专用于求双精度的实型数据的正弦值,返回值也为双精度的实型数据。 CSIN,专用于默认种别的复型数据的正弦值,返回值也为默认种别的复型数据。 函数在数学上等价于。函数中参数的单位是弧度而不是度,在使用时需要注意这一点。
余弦函数 余弦函数用于求出数据的余弦值,函数的原型如下: C = COS(X) 其中,COS是Fortran中余弦函数的通用名。除了这个通用名外,余弦函数还有3个专用名,它们是: COS,专用于求默认种别的实型数据的余弦值,返回值也为默认种别的整型数据。 DCOS,专用于求双精度的实型数据的余弦值,返回值也为双精度的实型数据。 CCOS,专用于默认种别的复型数据的余弦值,返回值也为默认种别的复型数据。
6.2.5 反正弦函数 反正弦函数用于求出数据的反正弦值,函数的原型如下: C = ASIN(X) 6.2.5 反正弦函数 反正弦函数用于求出数据的反正弦值,函数的原型如下: C = ASIN(X) 其中,ASIN是Fortran中反正弦函数的通用名。除了这个通用名外,反正弦函数还有2个专用名,它们是: ASIN,专用于求默认种别的实型数据的反正弦值,返回值也为默认种别的整型数据。 DASIN,专用于求双精度的实型数据的反正弦值,返回值也为双精度的实型数据。
反余弦函数 反余弦函数用于求出数据的反余弦值,函数的原型如下: C = ACOS(X) 其中,ACOS是Fortran中反余弦函数的通用名。除了这个通用名外,反余弦函数还有2个专用名,它们是: ACOS,专用于求默认种别的实型数据的反余弦值,返回值也为默认种别的整型数据。 DACOS,专用于求双精度的实型数据的反余弦值,返回值也为双精度的实型数据。
正切函数 正切函数用于求出数据的正切值,函数的原型如下: C = TAN(X) 其中,TAN是Fortran中正切函数的通用名。除了这个通用名外,正切函数还有2个专用名,它们是: TAN,专用于求默认种别的实型数据的正切值,返回值也为默认种别的整型数据。 DTAN,专用于求双精度的实型数据的正切值,返回值也为双精度的实型数据。
反正切函数 反正切函数用于求出数据的反正切值,函数的原型如下: C = ATAN(X) 其中,ATAN是Fortran中反正切函数的通用名。除了这个通用名外,反正切函数还有2个专用名,它们是: ATAN,专用于求默认种别的实型数据的反正切值,返回值也为默认种别的整型数据。 DATAN,专用于求双精度的实型数据的反正切值,返回值也为双精度的实型数据。
自然对数函数 自然对数函数用于求数据的自然对数值,函数的原型如下: C = LOG(X) 其中,LOG是Fortran中自然对数函数的通用名。除了这个通用名外,自然对数函数还有3个专用名,它们是: ALOG,专用于求默认种别的实型数据的自然对数值,返回值也为默认种别的整型数据。 DLOG,专用于求双精度的实型数据的自然对数值,返回值也为双精度的实型数据。 CLOG,专用于求默认种别的复型数据的自然对数值,返回值也为默认种别的复型数据。
6.2.10 常用对数函数 常用对数函数用于求数据的常用对数值,函数的原型如下: C = LOG10(X) 6.2.10 常用对数函数 常用对数函数用于求数据的常用对数值,函数的原型如下: C = LOG10(X) 其中,LOG10是Fortran中常用对数函数的通用名。除了这个通用名外,常用对数函数还有2个专用名,它们是: ALOG10,专用于求默认种别的实型数据的常用对数值,返回值也为默认种别的整型数据。 DLOG10,专用于求双精度的实型数据的常用对数值,返回值也为双精度的实型数据。
取整函数 取整函数用于将数据转换为整型,函数的原型如下: C = INT(X) 其中,INT是Fortran中取整函数的通用名。除了这个通用名外,取整函数还有3个专用名,它们是: IFIX,专用于将默认种别的实型数据转换为整数,返回值为默认种别的整型数据。 INT,专用于将默认种别的实型数据转换为整数,返回值为默认种别的整型数据。 IDINT,专用于将双精度的实型数据转换为整数,返回值为默认种别的整型数据。 函数的执行结果同数学上的取整有所不同,Fortran中的取整函数只是将数据的小数部分截去,不使用四舍五入规则。函数的参数可以是实型、整型和复型。
求余函数 求余函数用于求第一个变量被第二个变量所除后的余数,函数的原型如下: C = MOD(X1, X2) 其中,MOD是Fortran中求余函数的通用名。除了这个通用名外,求余函数还有2个专用名,它们是: MOD,适用于默认种别的整型数据,返回值为默认种别的整型数据。 AMOD,适用于默认种别的实型数据,返回值为默认种别的实型数据。
取符号函数 取符号函数返回第一个参数的绝对值与第二个参数的符号的乘积,函数的原型如下: C = SIGN(X1, X2) 其中,SIGN是Fortran中取符号函数的通用名。除了这个通用名外,取符号函数还有3个专用名,它们是: ISIGN,适用于默认种别的整型数据,返回值为默认种别的整型数据。 SIGN,适用于默认种别的实型数据,返回值为默认种别的实型数据。 DSIGN,适用于双精度的实型数据,返回值为双精度的实型数据。
最大值函数 最大值函数用于找出一系列数据中的最大值,函数的原型为: C = MAX(X1, X2[, X3]…) 其中,MAX是Fortran中最大值函数的通用名。除了这个通用名外,最大值函数还有5个专用名,它们是: MAX0,适用于默认种别的整型数据,返回值为默认种别的整型数据。 AMAX0,适用于默认种别的整型数据,返回值为默认种别的实型数据。 MAX1,适用于默认种别的实型数据,返回值为默认种别的整型数据。 AMAX1,适用于默认种别的实型数据,返回值为默认种别的实型数据。 DMAX1,适用于双精度的实型数据,返回值为双精度的实型数据。
最小值函数 最小值函数用于找出一系列数据中的最小值,函数的原型为: C = MIN(X1, X2[, X3]…) 其中,MIN是Fortran中最小值函数的通用名。除了这个通用名外,最小值函数还有5个专用名,它们是: MIN0,适用于默认种别的整型数据,返回值为默认种别的整型数据。 AMIN0,适用于默认种别的整型数据,返回值为默认种别的实型数据。 MIN1,适用于默认种别的实型数据,返回值为默认种别的整型数据。 AMIN1,适用于默认种别的实型数据,返回值为默认种别的实型数据。 DMIN1,适用于双精度的实型数据,返回值为双精度的实型数据。
赋值语句 ‘=’为赋值符号,而不是等于号。赋值号左边只能是变量名,而不能是表达式;赋值号右边可以是常量、变量和表达式 X+y=3.6 A=1.0 B=2.0 A=B 赋值号的理解应是带方向的,“A=3.6”应理解为A<=3.6 N=N+1? 赋值语句的作用是将一个确定的值赋格一个变量,其一般格式为 V=e 其中,V为变量,e为表达式 表达式分为三类: 算术表达式 关系表达式 逻辑表达式 字符表达式
字符型数据 一、字符型常量:又称字符串,是用撇号括起来的若干个字符 如:'CHINA' 'U.S.A'
字符型数据 一、字符串常量 1. 空格也是有效字符 ' ' 2. 用单撇号或双撇号括起来 如:'How are you?' 1. 空格也是有效字符 ' ' 2. 用单撇号或双撇号括起来 如:'How are you?' 'abc@sina.com.cn' 都是合法字符串 3. 当字符串本身有撇号时,用两个撇号表示 如:'That''s right' 或 "That''s right"
字符串中含有单撇号或双引号的处理 当字符串中又含有单撇号时,例如要将I′M A STUDENT作为一个字符串来处理,为了区分′是字符串中的字符还是定界符,可采用两种方式表示: ″I′M A STUDENT″ ′I′′M A STUDENT′ 前者用双撇号作定界符,后者用单撇号作定界符,而将字符串的单撇号用两个单撇号表示,系统会自动将其处理为字符串的一个单撇号字符。
字符型变量 CHARACTER(LEN=n1[,KIND=n2])[[,属性说明] ::] 变量列表 格式中的n1和n2是一个整数和整型表达式,n1代表被说明变量的长度,n2代表字符变量的类别参数,各项属性说明是字符型变量有关属性的说明。例如 CHARACTER(LEN=25,KIND=2)::A,B,C CHARACTER(KIND=3,LEN=15)::VAR,CH CHARACTER(LEN=8),DIMENSION(1:10)::X,Y,Z CHARACTER(LEN=10),PARAMETER::NAME=′FORTRAN_90′ CHARACTER(LEN=15)::A CHARACTER*15::A CHARACTER(LEN=15)::A,B*8,C*5 CHARACTER(LEN=8)::B Character(LEN=5)::C
在以下两种状态下均可以采用星号来说明长度: (1)具有PARAMETER属性的字符常量。例如以下两个语句: CHARACTER(LEN=*),PARAMETER::PARA= ′FORTRAN_90′ CHARACTER*(*),PARAMETER::PARA= ′FORTRAN_90′ 给出的字符串长度是确定的,因此字符符号常数PARA的长度是可知的(等于10),可用*说明。 (2)用字符变量作虚元时 在子程序中,用字符型变量作虚元时可以不指明其具体长度,即用*定义长度。这时它可以与任意长度的字符型实元相结合,有利于提高子程序的通用性。
字符型数据 ︺ 字符变量的赋值 用赋值语句直接对字符型变量赋值 如: character*5 A, B*6, C*7 A='CHINA' B='NANJING' C='WHU' A B C C H I N A N A J I W H U ︺
字符型数据 子字符串:一个字符串连续的一部分 如:一个字符串nanjing 则na,nan,nanj,nanji,…都是其子串 子串表示形式 字符变量名(m:n) m和n是整型表达式,分别表示子字符串在原字符串中的起止位置,且1≤m≤n≤L,L是字符变量的长度。
字符型数据 如:str='structured programming in fortran' 子字符串 子串的值 备注 子字符串 子串的值 备注 str(12:22) programming str(27:) fortran 与str(27:33)相同 str(:10) structured 与str(1:10)相同 str(5:5) c str(:) 原字符串 与str(1:33)相同
字符型数据 可以将一个子字符串赋给一个字符变量或另一个子字符串 如:name=str(27:33) str(1:10)= str(27:33) 赋值号两侧的子串不能相互覆盖 如:str(25:29)= str(27:33) 错误!
字符型数据 字符表达式 Fortran只提供一种字符运算符“//”,即为字符连接符,其功能是把前后两个字符型数据连接起来 如:'a'//'b' → 'ab'
用于字符处理的内部函数 1. LEN(A) — 计算字符串a的长度 2. LGT(a,b) — 若a>b则返回真,否则为假 3. LGE(a,b) — 若a≥b则返回真,否则为假 4. LLT(a,b) — 若a<b则返回真,否则为假 5. LLE(a,b) — 若a≤b则返回真,否则为假 5. INDEX(a,b) — 检查字符串a是否包含字符串b 7. CHAR(I) — 得到ASCII码为I的字符 CHAR(97) → 'a' CHAR(65) → 'A' 8. ICHAR(a) — 得到字符串a中第一个字符的ASCII码 ICHAR('apple') → 97 2018/11/13 52
用于字符处理的内部函数 求字符串长度函数(LEN和LEN_TRIM) LEN(String)和LEN_TRIM(String) LEN_TRIM(′ABC D′)的值为5 LEN(′ABC D′)的值为5 LEN_TRIM(′ABC ′)的值为3 LEN(′ABC ′)的值为5 LEN_TRIM(′ ′)的值为0 LEN(′ ′)的值为5
除去字符串尾部空格函数(TRIM) 其一般形式为:TRIM(String) 函数的结果值是去掉String中的尾部空格后剩余的字符串。例如 TRIM(′ABC ′)的值为′ABC′ TRIM(′ ABC ′)的值为′ ABC′
子串位置函数(INDEX) 其一般形式为:INDEX(String1, String2) 其中String1,String2均为字符型,且类别参数应该一致。若String2是String1的一个子串,其函数的结果值是一个正整数,该数表示String2在String1中最左边的子串的起始位置;若String2不是String1的子串,则函数结果值为0。例如,INDEX(′FOLLOW ME′, ′ME′)的值为8,因为′ME′的第一个字符M出现在′FOLLOW ME′的第8个字符位置上;INDEX(′FOLLOW ME′, ′L O′)的值为0。
首、尾部空格调整函数(ADJUSTL和ADJUSTR) 其一般形式为:ADJUSTL(String)和ADJUSTR(String) 调左函数ADJUSTL的函数值是把String的首部空格调到尾部,调右函数ADJUSTR的函数值是把String的尾部空格调到首部。例如 ADJUSTL(′ ABC ′)的值为′ABC ′ ADJUSTR(′ABC ′)的值为′ ABC′
逻辑型数据 逻辑常量只有真和假两种值:.TRUE.和.FALSE.。变量说明的格式为: LOGICAL [ ( [ KIND = ] 类别值 ) ] [ [ ,属性列表 ] :: ] 变量列表 逻辑型变量可以定义为LOGICAL,LOGICAL(1),LOGICAL(2),LOGICAL(4) LOGICAL DOIT, DONT LOGICAL(2) :: IIS, IIF LOGICAL*4 :: FLAG1, FLAG2 逻辑型数据能否直接参与数学计算呢? 题目2.3 请采用Fortran90 自由格式编写程序,检验逻辑型变量能否直接参与数学计算。已知逻辑型变量A=.ture.,请输出A-1,A+0, A+1 和 A+2 的具体值。
变量类型隐含规定 Fortran变量并不一定要经过声明(定义)才能使用。 I-N规则:程序中的变量名,凡以字母I, J, K, L, M, N 六个字母开头的,默认为是整型变量,而以其他字母开头的默认为实型变量。 Implicit 语句隐含说明,将某一字母开头的全部变量指定为所需类型。 Implicit integer (A,C, T-V)
类型说明 优先级: 显式类型说明>IMPLICIT 语句>I-N规则 类型说明仅在本程序单位有效。例如,主程序和子程序中同一名称变量可以具有不同类型。 类型说明语句应该出现在本程序单元所有执行语句前面,其中,implicit语句又硬放在所有显式类型说明的前面。
常数声明 Parameter 语句 Parameter (PI=3.1415926) Fortran 77 Real,parameter:: PI=3.1415926 Fortran 90 Parameter 语句不是执行语句,需要放在可执行语句前面 常数变量在程序代码中不得改变数值,否则编译时会出现错误信息。 把不会改变内容的变量设置为常数,可以提高程序的运行效率。
设置变量的初值 Fortran 77 源程序书写规则 每一行80列 第1-5列为标号区,可以写1-5位整数,也可以没有标号。标号区内第1列为“C”或“*”,该行即被认为是注释行。如果第一列不是数字、空格或者“C”,“*”,编译时按出错处理。、 第6列为续行标志区,如果在一行的第6列上写一个非空格和非零的字符,则该行为上一行的续行。 第7-72列为语句区。语句可以从第7列之后的任何位置开始书写。 第73-80列为注释区。 Program main implicit none integer::a=1 real:: b=2.0 complex::c=(1.0,2.0) Character(len=20):: str=’Fortran 90 ’ End program Program main implicit none Integer a real b complex c character*20 str data A, B, C, STR & /1, 2.0,(1.0,2.0),’Fortran & 77’/ end
等价声明 使两个以上的变量共同分享一个内存地址 Integer a, b Equivalence (a,b) 精简代码,并加速程序运行。例如,程序中可能经常使用数组某个元素array(1,1,5)的值,这时就可以用如下声明 Eqyuivalence (array(1,1,5),A) 这个声明可以让A代替array(1,1,5),除了程序代码精简外,程序直接读取变量A的速度也会比读取数组Array(1,1,5)要快
Fortran 90 自定义数据类型 创建类型 Type:: person character(len=30)::name integer:: age integer::length Integer::weight character(len=80)::address End type person
简单输出输入语句 输出语句 Print*, A,B Write(*,*) A,B 输入语句 Read*,I,j,a,b 键盘输入:3,10,7.5,3.7 (数据间以逗号或者一个或多个空格分隔) 题目2.4 请采用Fortran90 自由格式编写程序,求解实系数一元二次方程ax2+bx+c=0的解。要求:系数a,b,c 为程序执行时键盘输入;所有的解(包括实数和复数)都输出到屏幕。