好的就加分,其实我也是收藏别人的
嵌入式系统>51单片机浮点运算子程序库
1: FSDT 功能:浮点数格式化
2: FADD 功能:浮点数加法
3: FSUB 功能:浮点数减法
4: FMUL 功能:浮点数乘法
5: FDIV 功能:浮点数除法
6: FCLR 功能:浮点数清零
7: FZER 功能:浮点数判零
8: FMOV 功能:浮点数传送
9: FPUS 功能:浮点数压栈
10: FPOP 功能:浮点数出栈
11: FCMP 功能:浮点数代数值比较不影响待比较 *** 作数
12: FABS 功能:浮点绝对值函数
13: FSGN 功能:浮点符号函数
14: FINT 功能:浮点取整函数
15: FRCP 功能:浮点倒数函数
16: FSQU 功能:浮点数平方
17: FSQR 功能:浮点数开平方快速逼近算法
18: FPLN 功能:浮点数多项式计算
19: FLOG 功能:以10为底的浮点对数函数
20: FLN 功能:以e为底的浮点对数函数
21: FE10 功能:以10为底的浮点指数函数
22: FEXP 功能:以e为底的浮点指数函数
23: FE2 功能:以2为底的浮点指数函数
24: DTOF 功能:双字节十六进制定点数转换成格式化浮点数
25: FTOD 功能:格式化浮点数转换成双字节定点数
26: BTOF 功能:浮点BCD码转换成格式化浮点数
27: FTOB 功能:格式化浮点数转换成浮点BCD码
28: FCOS 功能:浮点余弦函数
29: FSIN 功能:浮点正弦函数
30: FATN 功能:浮点反正切函数
31: RTOD 功能:浮点弧度数转换成浮点度数
32: DTOR 功能:浮点度数转换成浮点弧度数
为便于读者使用本程序库,先将有关约定说明如下:
1.双字节定点 *** 作数:用[R0]或[R1]来表示存放在由R0或R1指示的连续单元中的数据,地址小的单元存放高字节?如果[R0]=1234H,若(R0)=30H,则(30H)=12H,(31H)=34H?
2.二进制浮点 *** 作数:用三个字节表示,第一个字节的最高位为数符,其余七位为阶码(补码形式),第二字节为尾数的高字节,第三字节为尾数的低字节,尾数用双字节纯小数(原码)来表示?当尾数的最高位为1时,便称为规格化浮点数,简称 *** 作数?在程序说明中,也用[R0]或[R1]来表示R0或R1指示的浮点 *** 作数,例如:当[R0]=-6.000时,则二进制浮点数表示为83C000H?若(R0)=30H,则(30H)=83H,(31H)=0C0H,(32H)=00H?
3.十进制浮点 *** 作数:用三个字节表示,第一个字节的最高位为数符,其余七位为阶码(二进制补码形式),第二字节为尾数的高字节,第三字节为尾数的低字节,尾数用双字节BCD码纯小数(原码)来表示?当十进制数的绝对值大于1时,阶码就等于整数部分的位数,如 876.5 的阶码是03H,-876.5 的阶码是 83H当十进制数的绝对值小于1时,阶码就等于 80H 减去小数点后面零的个数,例如 0.00382 的阶码是 7EH,-0.00382的阶码是 0FEH?在程序说明中,用[R0]或[R1]来表示R0或R1指示的十进制浮点 *** 作数?例如有一个十进制浮点 *** 作数存放在30H?31H?32H中,数值是 -0.07315,即-0.7315乘以10的-1次方,则(30H)=0FFH,31H=73H,(32H)=15H?若用[R0]来指向它,则应使(R0)=30H?
4.运算精度:单次定点运算精度为结果最低位的当量值单次二进制浮点算术运算的精度优于十万分之三单次二进制浮点超越函数运算的精度优于万分之一BCD码浮点数本身的精度比较低(万分之一到千分之一),不宜作为运算的 *** 作数,仅用于输入或输出时的数制转换?不管那种数据格式,随着连续运算的次数增加,精度都会下降?
5.工作区:数据工作区固定在A?B?R2~R7,数符或标志工作区固定在PSW和23H单元(位1CH~1FH)?在浮点系统中,R2?R3?R4和位1FH为第一工作区,R5?R6?R7和位1EH为第二工作区?用户只要不在工作区中存放无关的或非消耗性的信息,程序就具有较好的透明性?
6.子程序调用范例:由于本程序库特别注意了各子程序接口的相容性,很容易采用积木方式(或流水线方式)完成一个公式的计算?以浮点运算为例:
计算 y = Ln √ | Sin (ab/c+d) |
已知:a=-123.4b=0.7577c=56.34d=1.276它们分别存放在30H?33H?36H?39H开始的连续三个单元中?用BCD码浮点数表示时,分别为a=831234Hb=007577Hc=025634Hd=011276H?
求解过程:通过调用BTOF子程序,将各变量转换成二进制浮点 *** 作数,再进行各
种运算,最后调用FTOB子程序,还原成十进制形式,供输出使用?程序如下:
TEST: MOV R0,#39H 指向BCD码浮点 *** 作数d
LCALL BTOF 将其转换成二进制浮点 *** 作数
MOV R0,#36H 指向BCD码浮点 *** 作数c
LCALL BTOF 将其转换成二进制浮点 *** 作数
MOV R0,#33H 指向BCD码浮点 *** 作数b
LCALL BTOF 将其转换成二进制浮点 *** 作数
MOV R0,#30H 指向BCD码浮点 *** 作数a
LCALL BTOF 将其转换成二进制浮点 *** 作数
MOV R1,#33H 指向二进制浮点 *** 作数b
LCALL FMUL 进行浮点乘法运算
MOV R1,#36H 指向二进制浮点 *** 作数c
LCALL FDIV 进行浮点除法运算
MOV R1,#39H 指向二进制浮点 *** 作数d
LCALL FADD 进行浮点加法运算
LCALL FSIN 进行浮点正弦运算
LCALL FABS 进行浮点绝对值运算
LCALL FSQR 进行浮点开平方运算
LCALL FLN 进行浮点对数运算
LCALL FTOB 将结果转换成BCD码浮点数
STOP: LJMP STOP
END
运行结果,[R0]=804915H,即y=-0.4915,比较精确的结果应该是-0.491437?
(1) 标号: FSDT 功能:浮点数格式化
入口条件:待格式化浮点 *** 作数在[R0]中?
出口信息:已格式化浮点 *** 作数仍在[R0]中?
影响资源:PSW?A?R2?R3?R4?位1FH 堆栈需求: 6字节
FSDT: LCALL MVR0 将待格式化 *** 作数传送到第一工作区中
LCALL RLN 通过左规完成格式化
LJMP MOV0 将已格式化浮点 *** 作数传回到[R0]中
(2) 标号: FADD 功能:浮点数加法
入口条件:被加数在[R0]中,加数在[R1]中?
出口信息:OV=0时,和仍在[R0]中,OV=1时,溢出?
影响资源:PSW?A?B?R2~R7?位1EH?1FH 堆栈需求: 6字节
FADD: CLR F0 设立加法标志
SJMP AS 计算代数和
(3) 标号: FSUB 功能:浮点数减法
入口条件:被减数在[R0]中,减数在[R1]中?
出口信息:OV=0时,差仍在[R0]中,OV=1时,溢出?
影响资源:PSW?A?B?R2~R7?位1EH?1FH 堆栈需求:6字节
FSUB: SETB F0 设立减法标志
AS: LCALL MVR1 计算代数和?先将[R1]传送到第二工作区
MOV C,F0 用加减标志来校正第二 *** 作数的有效符号
RRC A
XRL A,@R1
MOV C,ACC.7
ASN: MOV 1EH,C 将第二 *** 作数的有效符号存入位1EH中
XRL A,@R0 与第一 *** 作数的符号比较
RLC A
MOV F0,C 保存比较结果
LCALL MVR0 将[R0]传送到第一工作区中
LCALL AS1 在工作寄存器中完成代数运算
MOV0: INC R0 将结果传回到[R0]中的子程序入口
INC R0
MOV A,R4 传回尾数的低字节
MOV @R0,A
DEC R0
MOV A,R3 传回尾数的高字节
MOV @R0,A
DEC R0
MOV A,R2 取结果的阶码
MOV C,1FH 取结果的数符
MOV ACC.7,C 拼入阶码中
MOV @R0,A
CLR ACC.7 不考虑数符
CLR OV 清除溢出标志
CJNE A,#3FH,MV01阶码是否上溢?
SETB OV 设立溢出标志
MV01: MOV A,@R0 取出带数符的阶码
RET
MVR0: MOV A,@R0 将[R0]传送到第一工作区中的子程序
MOV C,ACC.7 将数符保存在位1FH中
MOV 1FH,C
MOV C,ACC.6 将阶码扩充为8bit补码
MOV ACC.7,C
MOV R2,A 存放在R2中
INC R0
MOV A,@R0 将尾数高字节存放在R3中
MOV R3,A
INC R0
MOV A,@R0 将尾数低字节存放在R4中
MOV R4,A
DEC R0 恢复数据指针
DEC R0
RET
MVR1: MOV A,@R1 将[R1]传送到第二工作区中的子程序
MOV C,ACC.7 将数符保存在位1EH中
MOV 1EH,C
MOV C,ACC.6 将阶码扩充为8bit补码
MOV ACC.7,C
MOV R5,A 存放在R5中
INC R1
MOV A,@R1 将尾数高字节存放在R6中
MOV R6,A
INC R1
MOV A,@R1 将尾数低字节存放在R7中
MOV R7,A
DEC R1 恢复数据指针
DEC R1
RET
AS1: MOV A,R6 读取第二 *** 作数尾数高字节
ORL A,R7
JZ AS2 第二 *** 作数为零,不必运算
MOV A,R3 读取第一 *** 作数尾数高字节
ORL A,R4
JNZ EQ1
MOV A,R6 第一 *** 作数为零,结果以第二 *** 作数为准
MOV R3,A
MOV A,R7
MOV R4,A
MOV A,R5
MOV R2,A
MOV C,1EH
MOV 1FH,C
AS2: RET
EQ1: MOV A,R2 对阶,比较两个 *** 作数的阶码
XRL A,R5
JZ AS4 阶码相同,对阶结束
JB ACC.7,EQ3阶符互异
MOV A,R2 阶符相同,比较大小
CLR C
SUBB A,R5
JC EQ4
EQ2: CLR C 第二 *** 作数右规一次
MOV A,R6 尾数缩小一半
RRC A
MOV R6,A
MOV A,R7
RRC A
MOV R7,A
INC R5 阶码加一
ORL A,R6 尾数为零否?
JNZ EQ1 尾数不为零,继续对阶
MOV A,R2 尾数为零,提前结束对阶
MOV R5,A
SJMP AS4
EQ3: MOV A,R2 判断第一 *** 作数阶符
JNB ACC.7,EQ2如为正,右规第二 *** 作数
EQ4: CLR C
LCALL RR1 第一 *** 作数右规一次
ORL A,R3 尾数为零否?
JNZ EQ1 不为零,继续对阶
MOV A,R5 尾数为零,提前结束对阶
MOV R2,A
AS4: JB F0,AS5 尾数加减判断
MOV A,R4 尾数相加
ADD A,R7
MOV R4,A
MOV A,R3
ADDC A,R6
MOV R3,A
JNC AS2
LJMP RR1 有进位,右规一次
AS5: CLR C 比较绝对值大小
MOV A,R4
SUBB A,R7
MOV B,A
MOV A,R3
SUBB A,R6
JC AS6
MOV R4,B 第一尾数减第二尾数
MOV R3,A
LJMP RLN 结果规格化
AS6: CPL 1FH 结果的符号与第一 *** 作数相反
CLR C 结果的绝对值为第二尾数减第一尾数
MOV A,R7
SUBB A,R4
MOV R4,A
MOV A,R6
SUBB A,R3
MOV R3,A
RLN: MOV A,R3 浮点数规格化
ORL A,R4 尾数为零否?
JNZ RLN1
MOV R2,#0C1H阶码取最小值
RET
RLN1: MOV A,R3
JB ACC.7,RLN2尾数最高位为一否?
CLR C 不为一,左规一次
LCALL RL1
SJMP RLN 继续判断
RLN2: CLR OV 规格化结束
RET
RL1: MOV A,R4 第一 *** 作数左规一次
RLC A 尾数扩大一倍
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
DEC R2 阶码减一
CJNE R2,#0C0H,RL1E阶码下溢否?
CLR A
MOV R3,A 阶码下溢, *** 作数以零计
MOV R4,A
MOV R2,#0C1H
RL1E: CLR OV
RET
RR1: MOV A,R3 第一 *** 作数右规一次
RRC A 尾数缩小一半
MOV R3,A
MOV A,R4
RRC A
MOV R4,A
INC R2 阶码加一
CLR OV 清溢出标志
CJNE R2,#40H,RR1E阶码上溢否?
MOV R2,#3FH 阶码溢出
SETB OV
RR1E: RET
(4) 标号:FMUL 功能:浮点数乘法
入口条件:被乘数在[R0]中,乘数在[R1]中?
出口信息:OV=0时,积仍在[R0]中,OV=1时,溢出?
影响资源:PSW?A?B?R2~R7?位1EH?1FH 堆栈需求:6字节
FMUL: LCALL MVR0 将[R0]传送到第一工作区中
MOV A,@R0
XRL A,@R1 比较两个 *** 作数的符号
RLC A
MOV 1FH,C 保存积的符号
LCALL MUL0 计算积的绝对值
LJMP MOV0 将结果传回到[R0]中
MUL0: LCALL MVR1 将[R1]传送到第二工作区中
MUL1: MOV A,R3 第一尾数为零否?
ORL A,R4
JZ MUL6
MOV A,R6 第二尾数为零否?
ORL A,R7
JZ MUL5
MOV A,R7 计算R3R4×R6R7-→R3R4
MOV B,R4
MUL AB
MOV A,B
XCH A,R7
MOV B,R3
MUL AB
ADD A,R7
MOV R7,A
CLR A
ADDC A,B
XCH A,R4
MOV B,R6
MUL AB
ADD A,R7
MOV R7,A
MOV A,B
ADDC A,R4
MOV R4,A
CLR A
RLC A
XCH A,R3
MOV B,R6
MUL AB
ADD A,R4
MOV R4,A
MOV A,B
ADDC A,R3
MOV R3,A
JB ACC.7,MUL2积为规格化数否?
MOV A,R7 左规一次
RLC A
MOV R7,A
LCALL RL1
MUL2: MOV A,R7
JNB ACC.7,MUL3
INC R4
MOV A,R4
JNZ MUL3
INC R3
MOV A,R3
JNZ MUL3
MOV R3,#80H
INC R2
MUL3: MOV A,R2 求积的阶码
ADD A,R5
MD: MOV R2,A 阶码溢出判断
JB ACC.7,MUL4
JNB ACC.6,MUL6
MOV R2,#3FH 阶码上溢,设立标志
SETB OV
RET
MUL4: JB ACC.6,MUL6
MUL5: CLR A 结果清零(因子为零或阶码下溢)
MOV R3,A
MOV R4,A
MOV R2,#41H
MUL6: CLR OV
RET
(5) 标号: FDIV 功能:浮点数除法
入口条件:被除数在[R0]中,除数在[R1]中?
出口信息:OV=0时,商仍在[R0]中,OV=1时,溢出?
影响资源:PSW?A?B?R2~R7?位1EH?1FH 堆栈需求: 5字节
FDIV: INC R0
MOV A,@R0
INC R0
ORL A,@R0
DEC R0
DEC R0
JNZ DIV1
MOV @R0,#41H被除数为零,不必运算
CLR OV
RET
DIV1: INC R1
MOV A,@R1
INC R1
ORL A,@R1
DEC R1
DEC R1
JNZ DIV2
SETB OV 除数为零,溢出
RET
DIV2: LCALL MVR0 将[R0]传送到第一工作区中
MOV A,@R0
XRL A,@R1 比较两个 *** 作数的符号
RLC A
MOV 1FH,C 保存结果的符号
LCALL MVR1 将[R1]传送到第二工作区中
LCALL DIV3 调用工作区浮点除法
LJMP MOV0 回传结果
DIV3: CLR C 比较尾数的大小
MOV A,R4
SUBB A,R7
MOV A,R3
SUBB A,R6
JC DIV4
LCALL RR1 被除数右规一次
SJMP DIV3
DIV4: CLR A 借用R0R1R2作工作寄存器
XCH A,R0 清零并保护之
PUSH ACC
CLR A
XCH A,R1
PUSH ACC
MOV A,R2
PUSH ACC
MOV B,#10H 除法运算,R3R4/R6R7-→R0R1
DIV5: CLR C
MOV A,R1
RLC A
MOV R1,A
MOV A,R0
RLC A
MOV R0,A
MOV A,R4
RLC A
MOV R4,A
XCH A,R3
RLC A
XCH A,R3
MOV F0,C
CLR C
SUBB A,R7
MOV R2,A
MOV A,R3
SUBB A,R6
ANL C,/F0
JC DIV6
MOV R3,A
MOV A,R2
MOV R4,A
INC R1
DIV6: DJNZ B,DIV5
MOV A,R6 四舍五入
CLR C
RRC A
SUBB A,R3
CLR A
ADDC A,R1 将结果存回R3R4
MOV R4,A
CLR A
ADDC A,R0
MOV R3,A
POP ACC 恢复R0R1R2
MOV R2,A
POP ACC
MOV R1,A
POP ACC
MOV R0,A
MOV A,R2 计算商的阶码
CLR C
SUBB A,R5
LCALL MD 阶码检验
LJMP RLN 规格化
(6) 标号: FCLR 功能:浮点数清零
入口条件: *** 作数在[R0]中?
出口信息: *** 作数被清零?
影响资源:A 堆栈需求: 2字节
FCLR: INC R0
INC R0
CLR A
MOV @R0,A
DEC R0
MOV @R0,A
DEC R0
MOV @R0,#41H
RET
(7) 标号: FZER 功能:浮点数判零
入口条件: *** 作数在[R0]中?
出口信息:若累加器A为零,则 *** 作数[R0]为零,否则不为零?
影响资源:A 堆栈需求: 2字节
FZER: INC R0
INC R0
MOV A,@R0
DEC R0
ORL A,@R0
DEC R0
JNZ ZERO
MOV @R0,#41H
ZERO: RET
(8) 标号: FMOV 功能:浮点数传送
入口条件:源 *** 作数在[R1]中,目标地址为[R0]?
出口信息:[R0]=[R1],[R1]不变?
影响资源:A 堆栈需求: 2字节
FMOV: INC R0
INC R0
INC R1
INC R1
MOV A,@R1
MOV @R0,A
DEC R0
DEC R1
MOV A,@R1
MOV @R0,A
DEC R0
DEC R1
MOV A,@R1
MOV @R0,A
RET
(9) 标号: FPUS 功能:浮点数压栈
入口条件: *** 作数在[R0]中?
出口信息: *** 作数压入栈顶?
影响资源:A?R2?R3 堆栈需求: 5字节
FPUS: POP ACC 将返回地址保存在R2R3中
MOV R2,A
POP ACC
MOV R3,A
MOV A,@R0 将 *** 作数压入堆栈
PUSH ACC
INC R0
MOV A,@R0
PUSH ACC
INC R0
MOV A,@R0
PUSH ACC
DEC R0
DEC R0
MOV A,R3 将返回地址压入堆栈
PUSH ACC
MOV A,R2
PUSH ACC
RET 返回主程序
(10) 标号: FPOP 功能:浮点数出栈
入口条件: *** 作数处于栈顶?
出口信息: *** 作数d至[R0]中?
影响资源:A?R2?R3 堆栈需求: 2字节
FPOP: POP ACC 将返回地址保存在R2R3中
MOV R2,A
POP ACC
MOV R3,A
INC R0
INC R0
POP ACC 将 *** 作数d出堆栈,传送到[R0]中
MOV @R0,A
DEC R0
POP ACC
MOV @R0,A
DEC R0
POP ACC
MOV @R0,A
MOV A,R3 将返回地址压入堆栈
PUSH ACC
MOV A,R2
PUSH ACC
RET 返回主程序
(11) 标号: FCMP 功能:浮点数代数值比较(不影响待比较 *** 作数)
入口条件:待比较 *** 作数分别在[R0]和[R1]中?
出口信息:若CY=1,则[R0] <[R1],若CY=0且A=0则 [R0] = [R1],否则[R0] >[R1]?
影响资源:A?B?PSW 堆栈需求: 2字节
FCMP: MOV A,@R0 数符比较
XRL A,@R1
JNB ACC.7,CMP2
MOV A,@R0 两数异号,以[R0]数符为准
RLC A
MOV A,#0FFH
RET
CMP2: MOV A,@R1 两数同号,准备比较阶码
MOV C,ACC.6
MOV ACC.7,C
MOV B,A
MOV A,@R0
MOV C,ACC.7
MOV F0,C 保存[R0]的数符
MOV C,ACC.6
MOV ACC.7,C
CLR C 比较阶码
SUBB A,B
JZ CMP6
RLC A 取阶码之差的符号
JNB F0,CMP5
CPL C [R0]为负时,结果取反
CMP5: MOV A,#0FFH 两数不相等
RET
CMP6: INC R0 阶码相同时,准备比较尾数
INC R0
INC R1
INC R1
CLR C
MOV A,@R0
SUBB A,@R1
MOV B,A 保存部分差
DEC R0
DEC R1
MOV A,@R0
SUBB A,@R1
DEC R0
DEC R1
ORL A,B 生成是否相等信息
JZ CMP7
JNB F0,CMP7
CPL C [R0]为负时,结果取反
CMP7: RET
(12) 标号: FABS 功能:浮点绝对值函数
入口条件: *** 作数在[R0]中?
出口信息:结果仍在[R0]中?
影响资源:A 堆栈需求: 2字节
FABS: MOV A,@R0 读取 *** 作数的阶码
CLR ACC.7 清除数符
MOV @R0,A 回传阶码
RET
(13) 标号: FSGN 功能:浮点符号函数
入口条件: *** 作数在[R0]中?
出口信息:累加器 A=1 时为正数,A=0FFH时为负数,A=0 时为零?
影响资源:PSW?A 堆栈需求: 2字节
FSGN: INC R0 读尾数
MOV A,@R0
INC R0
ORL A,@R0
DEC R0
DEC R0
JNZ SGN
RET 尾数为零,结束
SGN: MOV A,@R0 读取 *** 作数的阶码
RLC A 取数符
MOV A,#1 按正数初始化
JNC SGN1 是正数,结束
MOV A,#0FFH 是负数,改变标志
SGN1: RET
(14) 标号: FINT 功能:浮点取整函数
入口条件: *** 作数在[R0]中?
出口信息:结果仍在[R0]中?
影响资源:PSW?A?R2?R3?R4?位1FH 堆栈需求: 6字节
FINT: LCALL MVR0 将[R0]传送到第一工作区中
LCALL INT 在工作寄存器中完成取整运算
LJMP MOV0 将结果传回到[R0]中
INT: MOV A,R3
ORL A,R4
JNZ INTA
CLR 1FH 尾数为零,阶码也清零,结束取整
MOV R2,#41H
RET
INTA: MOV A,R2
JZ INTB 阶码为零否?
JB ACC.7,INTB阶符为负否?
CLR C
SUBB A,#10H 阶码小于16否?
JC INTD
RET 阶码大于16,已经是整数
INTB: CLR A 绝对值小于一,取整后正数为零,负数为负一
MOV R4,A
MOV C,1FH
RRC A
MOV R3,A
RL A
MOV R2,A
JNZ INTC
MOV R2,#41H
INTC: RET
INTD: CLR F0 舍尾标志初始化
INTE: CLR C
LCALL RR1 右规一次
ORL C,F0 记忆舍尾情况
MOV F0,C
CJNE R2,#10H,INTE阶码达到16(尾数完全为整数)否?
JNB F0,INTF 舍去部分为零否?
JNB 1FH,INTF *** 作数为正数否?
INC R4 对于带小数的负数,向下取整
MOV A,R4
JNZ INTF
INC R3
INTF: LJMP RLN 将结果规格化
(15) 标号: FRCP 功能:浮点倒数函数
入口条件: *** 作数在[R0]中?
出口信息:OV=0时,结果仍在[R0]中,OV=1时,溢出?
影响资源:PSW?A?B?R2~R7?位1EH?1FH 堆栈需求: 5字节
FRCP: MOV A,@R0
MOV C,ACC.7
MOV 1FH,C 保存数符
MOV C,ACC.6 绝对值传送到第二工作区
MOV ACC.7,C
MOV R5,A
INC R0
MOV A,@R0
MOV R6,A
INC R0
MOV A,@R0
MOV R7,A
DEC R0
DEC R0
ORL A,R6
JNZ RCP
SETB OV 零不能求倒数,设立溢出标志
RET
RCP: MOV A,R6
JB ACC.7,RCP2 *** 作数格式化否?
CLR C 格式化之
MOV A,R7
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
DEC R5
SJMP RCP
RCP2: MOV R2,#1 将数值1.00传送到第一工作区
MOV R3,#80H
MOV R4,#0
LCALL DIV3 调用工作区浮点除法,求得倒数
LJMP MOV0 回传结果
(16) 标号: FSQU 功能:浮点数平方
入口条件: *** 作数在[R0]中?
出口信息:OV=0时,平方值仍然在[R0]中,OV=1时溢出?
影响资源:PSW?A?B?R2~R7?位1EH?1FH 堆栈需求: 9字节
FSQU: MOV A,R0 将 *** 作数
XCH A,R1 同时作为乘数
PUSH ACC 保存R1指针
LCALL FMUL 进行乘法运算
POP ACC
MOV R1,A 恢复R1指针
RET
(17) 标号: FSQR 功能:浮点数开平方(快速逼近算法)
入口条件: *** 作数在[R0]中?
出口信息:OV=0时,平方根仍在[R0]中,OV=1时,负数开平方出错?
影响资源:PSW?A?B?R2~R7 堆栈需求: 2字节
FSQR: MOV A,@R0
JNB ACC.7,SQR
SETB OV 负数开平方,出错
RET
SQR: INC R0
INC R0
MOV A,@R0
DEC R0
ORL A,@R0
DEC R0
JNZ SQ
MOV @R0,#41H尾数为零,不必运算
CLR OV
RET
SQ: MOV A,@R0
MOV C,ACC.6 将阶码扩展成8bit补码
MOV ACC.7,C
INC A 加一
CLR C
RRC A 除二
MOV @R0,A 得到平方根的阶码,回存之
INC R0 指向被开方数尾数的高字节
JC SQR0 原被开方数的阶码是奇数吗?
MOV A,@R0 是奇数,尾数右规一次
RRC A
MOV @R0,A
INC R0
MOV A,@R0
RRC A
MOV @R0,A
DEC R0
SQR0: MOV A,@R0
JZ SQR9 尾数为零,不必运算
MOV R2,A 将尾数传送到R2R3中
INC R0
MOV A,@R0
MOV R3,A
MOV A,R2 快速开方,参阅定点子程序说明
ADD A,#57H
JC SQR2
ADD A,#45H
JC SQR1
ADD A,#24H
MOV B,#0E3H
MOV R4,#80H
SJMP SQR3
SQR1: MOV B,#0B2H
MOV R4,#0A0H
SJMP SQR3
SQR2: MOV B,#8DH
MOV R4,#0D0H
SQR3: MUL AB
MOV A,B
ADD A,R4
MOV R4,A
MOV B,A
MUL AB
XCH A,R3
CLR C
SUBB A,R3
MOV R3,A
MOV A,B
XCH A,R2
SUBB A,R2
MOV R2,A
SQR4: SETB C
MOV A,R4
RLC A
MOV R6,A
CLR A
RLC A
MOV R5,A
MOV A,R3
SUBB A,R6
MOV B,A
MOV A,R2
SUBB A,R5
JC SQR5
INC R4
MOV R2,A
MOV R3,B
SJMP SQR4
SQR5: MOV A,R4
XCH A,R2
RRC A
MOV F0,C
MOV A,R3
MOV R5,A
MOV R4,#8
SQR6: CLR C
MOV A,R3
RLC A
MOV R3,A
CLR C
MOV A,R5
SUBB A,R2
JB F0,SQR7
JC SQR8
SQR7: MOV R5,A
INC R3
SQR8: CLR C
MOV A,R5
RLC A
MOV R5,A
MOV F0,C
DJNZ R4,SQR6
MOV A,R3 将平方根的尾数回传到[R0]中
MOV @R0,A
DEC R0
MOV A,R2
MOV @R0,A
SQR9: DEC R0 数据指针回归原位
CLR OV 开方结果有效
RET
(18) 标号: FPLN 功能:浮点数多项式计算
入口条件:自变量在[R0]中,多项式系数在调用指令之后,以40H结束?
出口信息:OV=0时,结果仍在[R0]中,OV=1时,溢出?
影响资源:DPTR?PSW?A?B?R2~R7?位1EH?1FH 堆栈需求: 4字节
FPLN: POP DPH 取出多项式系数存放地址
POP DPL
XCH A,R0 R0?R1交换角色,自变量在[R1]中
XCH A,R1
XCH A,R0
CLR A 清第一工作区
MOV R2,A
MOV R3,A
MOV R4,A
CLR 1FH
PLN1: CLR A 读取一个系数,并装入第二工作区
MOVC A,@A+DPTR
MOV C,ACC.7
MOV 1EH,C
MOV C,ACC.6
MOV ACC.7,C
MOV R5,A
INC DPTR
CLR A
MOVC A,@A+DPTR
MOV R6,A
INC DPTR
CLR A
MOVC A,@A+DPTR
MOV R7,A
INC DPTR 指向下一个系数
MOV C,1EH 比较两个数符
RRC A
XRL A,23H
RLC A
MOV F0,C 保存比较结果
LCALL AS1 进行代数加法运算
CLR A 读取下一个系数的第一个字节
MOVC A,@A+DPTR
CJNE A,#40H,PLN2是结束标志吗?
XCH A,R0 运算结束,恢复R0?R1原来的角色
XCH A,R1
XCH A,R0
LCALL MOV0 将结果回传到[R0]中
CLR A
INC DPTR
JMP @A+DPTR 返回主程序
PLN2: MOV A,@R1 比较自变量和中间结果的符号
XRL A,23H
RLC A
MOV 1FH,C 保存比较结果
LCALL MUL0 进行乘法运算
SJMP PLN1 继续下一项运算
(19) 标号: FLOG 功能:以10为底的浮点对数函数
入口条件: *** 作数在[R0]中?
出口信息:OV=0时,结果仍在[R0]中,OV=1时,负数或零求对数出错?
影响资源:DPTR?PSW?A?B?R2~R7?位1EH?1FH 堆栈需求:9字节
FLOG: LCALL FLN 先以e为底求对数
JNB OV,LOG
RET 如溢出则停止计算
LOG: MOV R5,#0FFH系数0.43430(1/Ln10)
MOV R6,#0DEH
MOV R7,#5CH
LCALL MUL1 通过相乘来换底
LJMP MOV0 传回结果
习题一答案在教材上找。
习题二
1.对象指现实世界中的实体。每个对象有自己的特征(属性)、行为(方法)和发生在该对象上的活动(事件)。
类是对同一种对象的集合与抽象。类包含所创建对象的属性数据,以及对这些数据进行 *** 作的方法。封装和隐藏是类的重要特性,将数据结构和对数据的 *** 作封装在一起,类的内部实现细节对用户来说是透明的。
VB工具箱中的可视图标是VB系统设计好的标准控件类。通过将控件类实例化,得到真正的控件对象。在窗体上画一个控件,就将类转换为对象,创建了一个控件对象。
VB中常用的对象是控件。此外,VB还提供了系统对象。窗体是个特例,它既是类也是对象。当向一个工程添加一个新窗体时,实质就由窗体类创建了一个窗体对象。
对象的三要素:属性、事件和方法。
属性:存放对象的数据(决定对象外观及功能)对象属性的设置方法:在设计阶段,利用属性窗口直接设置属性值;程序运行时,通过语句[对象名.]属性名=属性值。若属性只能在设计阶段设置,在程序运行阶段不可改变,称为只读属性。
事件:发生在对象上的事情。同一事件,对不同的对象,会引发不同的反应。
事件过程:应用程序处理事件的步骤。应用程序设计的主要工作就是为对象编写事件过程的代码。
方法:面向对象的程序设计语言,为程序设计人员提供了一种特殊的过程和函数。方法是面向对象的,调用时一定要指明对象。
2.窗体和控件具有的基本属性“
(1) Name属性:名称
所创建的对象名称,在程序中引用。
(2) Caption属性:标题
该属性决定了对象上显示的内容。
(3) Height、Width、Top和Left属性
决定对象的大小和位置。
(4) Enabled 属性:对象是否允许 *** 作
(5) Visible 属性:对象是否可见
(6) Font 属性组:文本的外观
FontName字体、FontSize大小
FontBold粗体、FontItalic斜体
FontStrikethru 删除线
FontUnderline 下划线
(7) ForeColor属性:前景颜色
(8) BackColor属性:背景颜色
(9) MousePointer属性:鼠标指针类型, 设置值范围0~15,由系统指定 。若为99,由用户提供的图形文件定义鼠标指针形状。
(10) MouseIcon属性:在MousePointer属性值为99时,存放自定义的鼠标图标文件(.ico或.cur)。图标库在Graphics目录下。
3.窗体的事件:Load事件是在窗体被装入工作区时触发的事件。当应用程序启动,自动执行该事件,该事件通常用来在启动应用程序时对属性和变量进行初始化。
窗体的方法:(1)Print方法
用来显示文本内容,格式:[对象.]print 表达式
(2)Cls方法
清除运行时在窗体或图形框中产生的文本或图形, Cls方法不能清除窗体在设计时的文本和图形。
格式:[对象.]cls
(3)Move方法
可移动窗体或控件,并可改变其大小。
语法格式如下:
[对象.]Move 左边距离[,上边距离[,宽度[,高度]]]
4.标签作用:用于显示文本(输出)信息,不能作为输入信息的界面。其内容只能通过Caption属性设置或修改,不能直接编辑。
5.文本框是一个文本编辑区域,可以在该区域输入、编辑、修改和显示正文内容。在VB中字符长度以字为单位,也就是一个西文字符与一个汉字都是一个字,长度为1。
重要属性(1) Text 显示或输入的正文内容。
(2) Maxlength 设置文本框可输入的文字最大长度。默认值为0,表示可以输入任意长字符串。
(3) MultiLine 多行属性
设置为True时,文本框可以输入或显示多行正文,同时具有文字处理器的自动换行功能,按Enter键可插入一空行。
(4) ScrollBars 滚动条属性
0-None无滚动条
1-Horizontal 水平滚动条
2-Vertical垂直滚动条
3-Both同时加水平和垂直滚动条
注意:当MultiLine为True时,ScrollBars才有效
(5) PassWordChar 设置显示文本的替代符。例如,当设置为“*”,则在文本框输入的内容均以“*”显示,而存储的值是用户输入的原文。一般用于设置口令的输入。
当MultiLine为True时,该属性不起作用,密码不允许多行。
(6) Locked 指定文本控件是否可被编辑,默认值为False(可编辑),当设置为True时,文本控件相当于标签控件的作用。
注意:Locked与Enabled的区别。
(7)文本内容进行选择 *** 作的三个属性
SelStart 选定的正文开始位置
SelLength 选定的正文长度
SelText 选定的正文内容
这3个属性互相关联,例如设置SelStart、SelLength后,SelText 自动存放指定的文本。
注意:属性窗口中没有这三个属性,只能在程序代码中使用。
6.文本框的事件:(1) Change事件:当Text属性值发生改变时引发该事件
(2) KeyPress事件:按下并且释放键盘上的一个键时,引发焦点所在控件的KeyPress事件,所按键的值存放在参数KeyAscii中。对回车的判断 KeyAscii=13
7.文本框最有用的方法是SetFocus,把光标移到指定的文本框中。
8.命令按钮 Picture属性:按钮可显示图片文件(.bmp和.Ico),当Style为1时有效。
10. 启动窗体时将命令按钮定位在窗体中央的代码
Private Sub Form_Load()
Command1.Left = Form1.ScaleWidth / 2 - Command1.Width / 2
Command1.Top = Form1.ScaleHeight / 2 - Command1.Height / 2
End Sub
11.vb图片文件在 C:\Program Files\Microsoft Visual Studio\Common\Graphics 文件夹。
安装VB时可选择是否安装这些图片文件。
习题三
1. 合法常量:
(1) Double
(2) 错误
(3) Double
(4) Double
(5) 错误
(6) Integer
(7) String
(8) String
(9) Date
(10) Double
(11) 错误(汉字字符)
(12)Integer(八进制)
(13) 错误(八进制无数码8)
(14) Integer
(15) Boolean
(16) 错误
(17) 错误(十六进制无数码g)
(18) Single
说明:浮点型变量默认为Double类型而非Single。
2. 合法变量名:
(1) √
(2) √
(3) 误:数字开头
(4) 误:含空格
(5) 误:关键字
(6) √
(7) 误:关键字
(8) 误:有括号
(9) √
(10) √
(11) √
(12) √(汉字字符可作为变量名,但不常用,且此名称易误解)
变量命名规则见P.41-42。
字母(汉字)开头,字母(汉字)、数字、下划线组成,长度为1-255个字符;关键字不可作为变量名,但可在变量名中嵌入关键字;不区分大小写。
常量、数组、类型、函数、过程、对象命名规则与此相同。常量名通常全用大写。
3. 写VB表达式
(1) Abs(x + y) + z ^ 5
(2) (1 + x * y) ^ 6
(3) (10 * x + Sqr(3 * y)) / (x * y)
(4) (-b + Sqr(b ^ 2 - 4 * a * c)) / (2 * a)
(5) 1 / (1 / r1 + 1 / r2 + 1 / r3)
(6) Sin(45 * 3.14159 / 180) + (Exp(10) + Log(10)) / Sqr(x + y + 1)
4. 根据条件写表达式
(1) 随机产生大写字母 Chr(Int(Rnd * (Asc("L") - Asc("C") + 1) + Asc("C")))
(2) [100,200]内的随机数 Int(Rnd * 101) + 100
(3) 点(x,y)位于第一或第三象限 x >0 And y >0 Or x <0 And y <0 或 x * y >0
(4) x是5或7的整数倍 x Mod 5 = 0 Or Int(x / 7) = x / 7
(5) 将两位整数x的个位与十位对换 x \ 10 + (x Mod 10) * 10
(6) 四舍五入取两位小数 Round(x, 2)
(7) 字符变量C是字母字符(不区分大小写)——准确地说是:字符变量C的第一个字符是字母
C >= "A" And C <= "Z" Or C >= "a" And C <"z"
或 UCase(C) >= "A" And UCase(C) <= "Z"
或 LCase(C) >= "a" And LCase(C) <= "z"
(8) 字符变量S第5个字符起取6个字符 Mid(S, 5, 6)
(9) 10≤x<20 10 <= x And x <20
(10) x,y至少有一个小于zx <z Or y <z
(11)x,y都大于z x >z And y >z
5. 写表达式的值
(1) 188 ——注意运算的优先级顺序,以及整除运算“\”的计算
(2) 200100 —— 计算100 + "100"时,由于两个 *** 作数类型不同,在可能的情况下自动采用精度较高的类型,即把字符型转换为数值型,100 +100 得到200;然后进行字符串连接运算200 &100 ,再自动将两个数值转换为字符串,得200100。
(3) 68.56——在四舍五入函数产生之前,这就是四舍五入的计算方法
(4) 876554 ——先进行字符串的“+”运算,再转换成数值。在变量名和函数名后可加上类型符,以强调其类型,但不是必须的。
(5) 2000-2-29
(6) 6
6.Shell函数调用
i = Shell("mspaint.exe", 1) '启动画图
i = Shell("C:\Program Files\Microsoft Office\OFFICE11\winword.exe", 1) '启动Word
说明:“画图”是Windows本身提供的程序,可以省略路径。
8. 答:单精度浮点型
第7,9题答案在教材中找。
习题四
第1,3,5,8题答案在教材中找。
2. 赋值语句的错误
(1)10x 不能做变量名。
上机验证结果:VB将10识别为行号,x = Sin(x) + y是为变量x赋值。故无语法错误。
(2)Sqr函数的参数为负数。
上机验证结果:“无效的过程调用或参数”
(3)赋值号左边不是变量名。
上机验证结果:“缺少子程序、函数或属性”
(4)除数为0
上机验证结果:“溢出”。
4. [答案略]
说明:小数位可以使用四舍五入函数Round或输出格式函数Format。例如Round(x, 2)和Format(x, “0.00”)均可使结果只保留两位小数。但如果四舍五入后要进行数值运算,则使用Round函数,例如z=Round(x,2)+Round(y,2)。而Format函数通常只用于输出格式设置。
6.指出错误
(1)“≥”应改为“>=”,前者是中文字符,不具有运算功能。
(2)“10<x<20”应改为“10<x And x<20”,否则运行结果错误。
7.写条件语句
(1)
Dim c As String
c = InputBox("c=")
If Mid(c, 3, 1) = "C" Then
MsgBox "Yes"
Else
MsgBox "No"
End If
(2)
# 使用If语句
Dim x As Single, y As Single
x = Val(InputBox("x="))
If x >20 Then
y = x ^ 2 + 3 * x + 2
ElseIf x >= 10 Then
y = Sqr(3 * x) - 2
ElseIf x >0 Then
y = 1 / x + Abs(x)
End If
Print "y="y
# 使用Select Case语句
Dim x As Single, y As Single
x = Val(InputBox("x="))
Select Case x
Case Is >20
y = x ^ 2 + 3 * x + 2
Case Is >= 10
y = Sqr(3 * x) - 2
Case Is >0
y = 1 / x + Abs(x)
End Select
Print "y="y
(3)
# 使用If语句
Dim x As Single, y As Single, z As Single, Max As Single
x = Val(InputBox("x="))
y = Val(InputBox("y="))
z = Val(InputBox("z="))
Max = x
If y >Max Then Max = y
If z >Max Then Max = z
Print "Max="Max
# 使用IIF函数
x = Val(InputBox("x="))
y = Val(InputBox("y="))
z = Val(InputBox("z="))
Max = IIf(x >y, x, y)
Max = IIf(z >Max, z, Max)
Print "Max="Max
9. 计算循环次数
(1) 6
(2)19
(3)0
(4)死循环直至溢出
10. 40号语句执行 4次;第50 号语句执行12次;
执行第90号语句输出的结果是: 13,0,2
说明:该程序为嵌套循环,其中外循环由j值变化(1,4,7,10)控制执行4次,当j值为13时结束循环;内循环由k值变化(6,4,2)控制执行3次,当k值为0时结束循环。第40 行是外循环的循环体,故执行4次;第50 行是内循环的循环体,故执行4*3=12次。
11. 可以定一个较大的循环次数,在循环体中根据条件用Exit For退出。
但这种情况通常用Do While循环控制。
12. 编程(并非唯一正确答案)
(1)
Dim i As Integer, s As Integer
For i = 1 To 10
s = s + (i + 1) * (2 * i + 1)
Next i
Print "s="s
(2)
Dim i As Integer, n3 As Integer, n7 As Integer
For i = 1 To 100
If i Mod 3 = 0 Then n3 = n3 + 1
If Int(i / 7) = i / 7 Then n7 = n7 + 1
Next i
Print "1-100中3的倍数有"n3"个"
Print "1-100中7的倍数有"n7"个"
(3)
Dim s1 As String, s2 As String, i As Integer
s1 = InputBox("Input String")
s2 = ""
For i = 1 To Len(s1)
s2 = Mid(s1, i, 1) + s2
Next i
Print "原序:"s1
Print "反序:"s2
或
For i = Len(s1) To 1 Step -1
s2 = s2 + Mid(s1, i, 1)
Next i
13. 输出字符串“10100”。该程序功能是将十进制数转化为二进制。
说明:要理解该程序需要了解数制转换的计算方法(有兴趣者参看百度百科http://baike.baidu.com/view/1426817.htm)。48是字符"0"的ASCII码。
14. 运行时输出 22 484
该程序功能是求x和y最大公约数和最小公倍数。
说明:此算法称为“辗转相减法”。可对照例4.17的辗转相除(辗转求余)法。
15.[50,100]间的20个随机数,求最大值、最小值、平均值。
Dim x As Integer, sum As Integer, aver As Single
Dim n%, i%, max%, min%
Randomize
max = 50: min = 100: n = 20
For i = 1 To n
x = Int(Rnd * 51 + 50)
List1.AddItem x
sum = sum + x
If x >max Then max = x
If x <min Then min = x
Next i
aver = sum / n
Print "最大值:"max, "最小值:"min, "平均值:"aver
习题五
1. 指定数组的默认下界 Option Base 1
2.合理的数组声明
(1)错。定义数组不可用变量(教材99页)。
(2)正确。该数组下标为0-11。
(3)错。VB中数组下标用圆括号。
(4)正确。三维数组三个下标分别为0-1,0-1,0-2,共12个元素。
(5)错误。非动态数组,不可重定义。
(6)错误。动态数组重定义时不可改变数据类型。
(7)正确。二维数组两个下标分别为0-2,0-3,共12个元素。
(8)语法错误,二维数组定义中漏写逗号——可能是印刷错误,加上此逗号则正确。
3.当引用数组元素时下标值小于定义的最小下标,或大于最大下标时,会发生“下标越界”错误。
4.数组名:a ;数组类型:Single(单精度浮点型);维数:二维;
各维的上下界:第一维下界(最小下标)为 -1,上界(最大下标)为2,
第二维下界(最小下标)为 0,上界(最大下标)为3;
数组的大小:4行4列共16个元素
以矩阵的格式输出二维数组:
For i = -1 To 2
For j = 0 To 3
Print a(i, j)
Next j
Next i
或写成更加通用的代码形式:
For i = LBound(a, 1) To UBound(a, 1)
For j = LBound(a, 2) To UBound(a, 2)
Print Tab(j * 8)a(i, j)
Next j
Next i
6.一维字符数组
Dim a(1 To 20) As String
Private Sub Command1_Click() '(1)随机产生字符串
Dim i As Integer, j As Integer, n As Integer, c As String * 1
Randomize
For i = 1 To 20
a(i) = "" '将第i个元素清空
n = Int(Rnd * 10 + 1)'产生[1,10]的随机数
For j = 1 To n 'a(i)中有n个字符
c = Chr(Int(Rnd * 26 + 97)) '随机产生字母97是字母a的ASCII码
a(i) = a(i) + c
Next j
Next i
End Sub
Private Sub Command2_Click()'(2)输出字符串
Dim i As Integer
For i = 1 To 20
Print Tab(((i - 1) Mod 5) * 11)a(i)
If i Mod 5 = 0 Then Print
Next i
End Sub
Private Sub Command3_Click() '(3)最长的字符串
Dim i As Integer, imax As Integer
imax = 1
For i = 2 To 20
If Len(a(i)) >Len(a(imax)) Then
imax = i
End If
Next i
Print "最长的字符串:"a(imax)
End Sub
第7,8题答案在教材中找。
第9题“自定义变量”含义不明,暂时无法回答。
第5,10 题 [暂略]
习题六
第1,2,6-8题答案可在教材中找到。
3.指出过程说明中的错误
(1)Sub子过程不应该定义类型
(2)函数与形式参数不应该同名
(3)数组作为形式参数时,应使用传地址方式,不可使用传值(ByVal)
(4)形式参数应该是变量或数组名,不可以是一个数组元素
4.指出调用过程语句的错误
(1)无语法错误,但因形参sum所对应的实参是常量3,故计算结果无法传递给主调程序。
(2)实参变量c与形参sum的类型不一致。
(3)类似于(1),形参sum所对应的实参是表达式a+b,故计算结果无法传递给主调程序。
(4)类似于(1)和(2),形参sum所对应的实参是表达式Sqr(c),故计算结果无法传递给主调程序。另外srq(a)存在语法错误(拼写错)。
(5)与(2)相同,实参c与形参sum的类型不一致。
5.迭代法求平方根
(1)自定义函数的定义及调用
Function FSqr1(a As Single) As Single
Dim x0 As Single, x As Single
x = a
Do
x0 = x
x = (x0 + a / x0) / 2
Loop While Abs(x - x0) >0.00001
FSqr1 = x
End Function
Private Sub Command1_Click()
Dim x!, y!
x = Val(InputBox("x="))
If x >= 0 Then
y = FSqr1(x)
Print y
End If
End Sub
(2)自定义子过程的定义及调用
Sub FSqr2(a As Single, x As Single)
Dim x0 As Single
x = a
Do
x0 = x
x = (x0 + a / x0) / 2
Loop While Abs(x - x0) >0.00001
End Sub
Private Sub Command2_Click()
Dim x!, y!
x = Val(InputBox("x="))
If x >= 0 Then
Call FSqr2(x, y)
Print y
End If
End Sub
(3)递归函数及调用 [略]
习题七
第1-9题,答案在教材上找;第10,12-14题,略。
11.检测Ctrl和F3同时按下的代码:
Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
If Shift = 2 And KeyCode = 114 Then MsgBox "HAHA"
End Sub
习题八
第1,2,6,7,9题答案可阅读教材找到。
3.写Open语句
(1) Open "Seqnew.dat" For Output As #1'重写
或 Open "Seqnew.dat" For Append As #1 '添加
(2)Open "Seqold.dat" For Input As #2
(3)Open "Seqappend.dat" For Append As FreeFile
4.编程,将文件Text.dat 读入变量strTest。
Dim strTest As String
Open "Text.dat" For Input As #2
Do While Not EOF(2)
strTest = strTest + Input(1, #2)
Loop
8.本课程不涉及二进制文件。故此处以顺序文件读写方式编程。另外合并的结果可以是合并到其中某一个文件,也可以是合并到一个新的文件,此处代码是合并到其中一个文件F1.txt。
'方法一,在2号文件一次读一个字符并写入1号文件
Dim strTemp As String * 1
Open "d:\F1.txt" For Append As #1
Open "d:\F2.txt" For Input As #2
Do While Not EOF(2)
strTemp = Input(1, #2)
Print #1, strTemp'注意结尾有分号,否则每个字符一行
Loop
Close
'方法二,在2号文件一次读一个字符并累加,最后将累加结果写入1号文件
Dim strTemp As String '注意方法一变量定义的区别
Open "d:\F1.txt" For Append As #1
Open "d:\F2.txt" For Input As #2
strTemp = ""
Do While Not EOF(2)
strTemp = strTemp + Input(1, #2)
Loop
Print #1, strTemp
Close
习题九
答案在教材上找。
习题十
答案在教材上找
河北地区的市财政局有关负责人介绍说,补贴资金的发放将实行“乡级审核、乡级兑付”或“乡级审核、县级兑付”两种方式。对农民申报材料进行审核后,符合补贴要求的,乡镇或县级财政部门将在规定时间内将补贴资金直接拨付到购买人储蓄存折账户;不符合补贴要求的,在购买人申报时立即告知当事人。
在向乡镇财政部门申报补贴资金时,要驾驶所购买的汽车摩托车下乡产品到现场,由乡级财政部门审核汽车摩托车指定位置的下乡标识后,方可将补贴资金拨付给农民车主。
补贴对象:
汽车摩托车下乡财政补贴政策的补贴对象主要是,2009年3月1日至12月31日,将三轮汽车(指原三轮农用车)或低速货车(指原四轮农用车)报废,并换购轻型载货车的农民,可享受新车购买及旧车报废双重补贴,每户限购一辆;市内农民新购冀产轻(微)型载货车,也可享受补贴,每户限购一辆;农民购买1.3升以下排量微型客车可享受补贴,每户限购一辆。2009年2月1日至2013年1月31日,农民购买摩托车可享受补贴,每户限购两辆。
补贴标准:
对将三轮车或低速货车报废并换购轻型载货车的,按换购轻型载货车销售价格10%给予补贴;换购轻型载货车单价5万元以上的,实行定额补贴,每辆补贴5000元。同时,对报废三轮汽车或低速货车实行定额补贴;报废三轮汽车每辆给予补贴2000元,报废低速货车每辆给予补贴3000元。对购买微型客车,其中包括河北长安汽车有限公司产品,按销售价格10%给予补贴,购买微型客车单价5万元以上的,实行定额补贴,每辆补贴5000元。对购买冀产轻(微)型载货车,已享受换购补贴政策的除外,单价5万元以上的,每辆定额补贴2000元。对购买摩托车,按销售价格13%给予补贴,购买摩托车单价5000元以上的,实行定额补贴,每辆补贴650元。
获得补贴程序:
在申报补贴资金时,购买补贴类产品的农民,须向户口所在地乡镇财政部门提供新购车辆的机动车销售发票、公安交通管理部门出具的机动车行驶证,或jidongchedengjizheng书及加盖本辖区车辆管理部门业务公章的“中华人民共和国机动车整车出厂合格证”复印件,购买摩托车者除外;购买人本人的居民身份z、户口簿或公安部门出具的户籍证明;购买人储蓄存折,也可以用粮食直补专用存折。将三轮汽车或低速货车报废并换购轻型货车的农民,除提供以上材料外,还须提供已报废车辆的报废汽车回收证明及机动车注销证明。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)