易码技术论坛

 找回密码
 加入易码
搜索
查看: 266401|回复: 6

用BAS配平化学方程式

[复制链接]
发表于 2006-11-26 10:52:50 | 显示全部楼层
怀念高中学化学的时候...
强烈支持一下!!
发表于 2006-11-26 12:34:21 | 显示全部楼层
虽然大学不学化学了,但还是支持一下
发表于 2006-12-1 18:38:33 | 显示全部楼层
不错啊.很好用的!
发表于 2006-12-27 12:39:47 | 显示全部楼层
什么机型啊
 楼主| 发表于 2006-12-28 17:40:15 | 显示全部楼层
我没有用任何系统中断,理论上NC系列都应该可以用的。
本程序的不足之处在于有些方程式无法配平,一种可能是化学元素的顺序问题,如Fe+H2SO4是可以配的,但H2SO4+Fe就不可以,因为S和O总是以SO4的形式存在,构建方程式时只能当一个未知数来看,否则就是一个不定方程。本程序没有那么智能,把S和O当两个未知数,因此无法配平。第二种可能是出现同种元素的不同单质分别出现在反应物和生成物中,这也是无法解的。
发表于 2007-4-7 20:33:56 | 显示全部楼层
好象不是 BASIC把3 不会是LAVA吧 不会用啊
 楼主| 发表于 2006-11-25 23:32:38 | 显示全部楼层 |阅读模式
  这是用到的汇编代码:

ELEMENT_LENGTH=$7f
ELEMENT_INDEX=$7c
ELEMENT_BUF=$85 ;$85~$86
ELEMENT_AMOUNT=$87
NUMBER_LENGTH=$88
NUMBER_BUF=$1002
OFFSET_1=$89
DATA=$1100
DATA_LENGTH=$1000
TEMP=$80 ;$80~$83
MAT_INDEX=$84
TABLE=$1200
MULTIPLE=$7E
BRACKET_ENABLED=$7D
;;;;;;;;;;;;;;;;;;;
;This program is to
;analyze the formula
;;;;;;;;;;;;;;;;;;;
.org $32c8
MAIN:
lda #$00
sta ELEMENT_INDEX
lda #$ff
sta BRACKET_ENABLED
ldx #$f0
lda #$00
MAIN_1: sta TABLE-1,x
dex
bne MAIN_1
LOOP:
jsr GetNewElement
bcs END
jsr SearchElement
jmp LOOP
END:
rts
;;;;;;;;;
GetNewElement:
lda #$00
sta OFFSET_1
sta ELEMENT_LENGTH
GNE_MAIN:
ldx OFFSET_1
lda DATA,x
jsr CheckIfBC
bcs GNE_3
sta ELEMENT_BUF
inx
lda DATA,x
jsr CheckIfSC
bcs GNE_1
sta ELEMENT_BUF+1
inc ELEMENT_LENGTH
GNE_1:
inc ELEMENT_LENGTH
inc ELEMENT_INDEX
clc
rts
GNE_3:
inc OFFSET_1
lda OFFSET_1
cmp DATA_LENGTH
beq GNE_2
jmp GNE_MAIN
GNE_2: sec
rts
;;;;;;;;;;;;;
SearchElement:
lda #$01
sta MAT_INDEX
lda #$00
sta OFFSET_1
SE_MAIN:
ldx OFFSET_1
lda DATA,x
cmp #$2B ;'+'
beq SE_1
cmp #$2d ;'-'
bne SE_2
SE_1:
inc MAT_INDEX
jmp SE_6
SE_2:
cmp #$28 ;#'('
bne SE_3
lda #$00
sta BRACKET_ENABLED
jmp SE_6
SE_3:
cmp #$29 ;')'
bne SE_4
lda #$ff
sta BRACKET_ENABLED
jmp SE_6
SE_4:
cmp ELEMENT_BUF
bne SE_6
inx
lda DATA,x
jsr CheckIfSC
bcs SE_5
ldy ELEMENT_LENGTH
cpy #$02
bne SE_6
cmp ELEMENT_BUF+1
beq SE_PROCESS
jmp SE_6
SE_5:
ldy ELEMENT_LENGTH
cpy #$01
beq SE_PROCESS
SE_6:
inc OFFSET_1
lda OFFSET_1
cmp DATA_LENGTH
beq SE_END
jmp SE_MAIN
SE_END:
rts
SE_PROCESS:
lda #$00
sta TEMP+3
lda #$01
sta ELEMENT_AMOUNT
ldx OFFSET_1
lda ELEMENT_LENGTH
cmp #$01
beq SE_PRO_1
inx
SE_PRO_1:
inx
jsr GetNumber
bcs SE_PRO_5
lda NUMBER_LENGTH
sta TEMP+3
lda NUMBER_BUF
sta ELEMENT_AMOUNT
SE_PRO_5:
lda BRACKET_ENABLED
bne SE_PRO_3
jsr GetMultiple
ldy MULTIPLE
lda #$00
clc
SE_PRO_2:
adc ELEMENT_AMOUNT
dey
bne SE_PRO_2
sta ELEMENT_AMOUNT
SE_PRO_3:
jsr WriteTable
lda ELEMENT_LENGTH
clc
adc TEMP+3
tax
lda #$ff
ldy OFFSET_1
SE_PRO_4:
sta DATA,y
iny
dex
bne SE_PRO_4
jmp SE_6
;;;;;;;;;;;;
WriteTable:
lda #<TABLE
sta TEMP
lda #>TABLE
sta TEMP+1
ldx MAT_INDEX
WT_2:
dex
beq WT_3
clc
lda #$14
adc TEMP
sta TEMP
bcc WT_1
inc TEMP+1
WT_1:
jmp WT_2
WT_3:
ldy #$00
WT_4:
lda (TEMP),y
beq WT_5
iny
bne WT_4
WT_5:
lda ELEMENT_INDEX
sta (TEMP),y
iny
lda ELEMENT_AMOUNT
sta (TEMP),y
rts
;;;;;;;;;;;
GetNumber:
LDY #$00
GN_1: LDA DATA,X
CMP #$30
BCC GN_4
CMP #$3A
BCS GN_4
SEC
SBC #$30
STA TEMP,Y
INX
INY
BNE GN_1
GN_4: CPY #$00
BEQ GN_5
STY NUMBER_LENGTH
DEY
LDA TEMP,Y
DEY
BMI GN_8
LDX TEMP,Y
BEQ GN_7
CLC
GN_2: ADC #$0A
DEX
BNE GN_2
GN_7: DEY
BMI GN_8
LDX TEMP,Y
BEQ GN_8
CLC
GN_3: ADC #$64
DEX
BNE GN_3
GN_8: STA NUMBER_BUF
GN_6: CLC
RTS
GN_5: SEC
RTS
;;;;;;;;;;;
CheckIfBC:
cmp #$41
bcc CIB_FAIL
cmp #$5b
bcs CIB_FAIL
clc
rts
CIB_FAIL:
sec
rts
;;;;;;;;;;
CheckIfSC:
cmp #$61
bcc CIS_FAIL
cmp #$7b
bcs CIS_FAIL
clc
rts
CIS_FAIL:
sec
rts
;;;;;;;;;;
GetMultiple:
ldx OFFSET_1
GM_2:
inx
lda DATA,x
cmp #$29 ;&#39;)&#39;
beq GM_1
jmp GM_2
GM_1: inx
jsr GetNumber
lda NUMBER_BUF
sta MULTIPLE
rts



上面代码是用来解析未配平的方程式的,以构建方程,BAS其实就是解这个方程。
输入是这样:O2-O3,配平显示3O2=2O3
本程序最多支持12个反应物加生成物,化合物下标最大255
详细的今天无法解释,我被父母逼着关电脑……

analyze.rar

2 KB, 下载次数: 702

程序

您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2024-4-20 07:41 , Processed in 0.017551 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表