ITPub博客

首页 > Linux操作系统 > Linux操作系统 > linux下的dc计算器

linux下的dc计算器

Linux操作系统 作者:weixiaobao7 时间:2015-01-27 10:49:01 0 删除 编辑

linux下的dc计算器

dc采用逆波兰式计算表达式,计算过程是对栈的手动维护。逆波兰式看起来很别扭,但跑起来当然是很有效率的。

乱七八糟的东西就不说了,直接切入script正题

负号在dc里用_表示而非-,因为-是二元运算符“减号”

打印类命令:

p            :打印栈顶元素并换行

n            : 打印栈顶元素并将其弹出栈,完毕后不换行

P            : putchar ( int(栈顶元素) % 256) 并弹栈顶,不换行

f            : 从栈顶至栈底打印栈中所有值,每个一行

算数运算符:

+            : 依次弹出w1与w2,将w2+w1压栈。精度为结果值精度

-            : 依次弹出w1与w2,将w2-w1压栈

*            : 依次弹出w1与w2,将w2*w1压栈。精度为结果值精度与precision中较大值

/            : 依次弹出w1与w2,将w2/w1压栈。精度为precision

%            : 依次弹出w1与w2,将w2-w2/w1*w1压栈

~            : 依次弹出w1与w2,依次将w2/w1与w2%w1压栈

^            : 依次弹出w1与w2,将w2^((int)w1)压栈。精度为w2精度与precision中较大值

|            : 依次弹出w1 w2与w3,将 w3 ^ ((int)w2) (mod w1) 压栈。w1 w3 需为整数

v            : 弹出w1,将sqrt(v)压栈。精度为precision

栈操作:

c            : 清空栈

d            : 将栈顶元素复制并压栈

r            : 交换栈顶两元素 XXX

寄存器操作:

dc提供至少256个寄存器,分别用256个字符表示。一般用'a'..'z',不够可以用123ABC!@#,再不够就用\x00..\xff

除了主栈外,每个寄存器都是独立的栈,寄存器栈顶的值被称为这个寄存器的值

sr           : 弹出主栈顶元素w1,若r栈为空,则将w1压入r栈,否则将r栈顶元素改为w1

lr           : 将r寄存器的值压入主栈

Sr           : 弹出主栈顶元素w1,压入r栈

Lr           : 弹出r栈顶元素w1并将其压入主栈

参数:

dc有三个参数:输入进制 输出进制与precision(精度)。precision永远被作为10进制来看。

i            : 弹出栈顶w1并将其作为输入进制

o            : 弹出栈顶w1并将其作为输出进制

k            : 弹出栈顶w1并将其作为precision

I            : 将输入进制压栈

O            : 将输出进制压栈

K            : 将precision压栈

字符串:

dc寄存器可以存放字符串,字符串可以被打印或被作为dc命令去执行

[characters] : 将字符串characters压栈。characters中可以包含任何字符,除了[]需两两匹配

a            : 若栈顶w1是数字,则将栈顶修改为(char)((int)(w1)%256),否则将w1首字母入栈

x            : 若栈顶w1是数字,则什么都不做,否则将其弹出并将w1作为命令交给dc执行

>r           : 依次弹出w1与w2,若w1>w2则执行r寄存器中的命令

!>r          : 依次弹出w1与w2,若w1<=w2则执行r寄存器中的命令

!=w2则执行r寄存器中的命令

=r           : 依次弹出w1与w2,若w1==w2则执行r寄存器中的命令

!=r          : 依次弹出w1与w2,若w1!=w2则执行r寄存器中的命令

?            : 从标准输入读入一条命令并将其交给dc执行

q            : 终止当前dc与当前dc的调用dc

Q            : 弹出栈顶w1,终止w1层dc。当w1大于当前dc层数时会报错,因此Q不会使主dc退出

状态查询:

Z            : 弹出栈顶w1,将w1长度压栈

X            : 弹出栈顶w1,若w1为数字,则将w1小数位数压栈,否则将0压栈

z            : 将当前栈深度压栈

其他:

!            : 将!之后的部分作为命令交给sh执行。若命令以'>' '='开头,则需在!后加上空格

#            : 将#之后的部分作为注释

:r           : 依次弹出w1与w2,r[w1]=w2

;r           : 弹出栈顶w1,将r[w1]压栈

真正的精髓好像是通过x与opr进行的流程控制,等着再看吧

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/30096468/viewspace-1416542/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2015-01-07

  • 博文量
    47
  • 访问量
    63628