A calculator
今天在某网站上发现了一个javascript的计算器,很有创意,而且功能也很强大。具体哪一个网站记不清了,代码纯为了学习研究,请作者见谅。
<
HTML
><
HEAD
><
TITLE
>
科学计算器
</
TITLE
>
< META http - equiv = Content - Type content = " text/html; charset=gb2312 " ><!-- written by GoldHuman li hai --><!-- 2000.8 -->
< STYLE > BODY {
FONT - SIZE: 9pt; BACKGROUND - ATTACHMENT: fixed; COLOR: #0001fc; FONT - FAMILY: " 宋体 " , " Arial " , " Times New Roman " ; BACKGROUND - COLOR: #edf0e1
}
TD {
FONT - SIZE: 9pt; FONT - FAMILY: " 宋体 " , " Arial Narrow " , " Times New Roman " ; font - color: # 000000
}
</ STYLE >
< SCRIPT language = javascript >
<!--
var endNumber = true
var mem = 0
var carry = 10
var hexnum = " 0123456789abcdef "
var angle = " d "
var stack = ""
var level = " 0 "
var layer = 0
// 数字键
function inputkey(key)
{
var index = key.charCodeAt( 0 );
if ((carry == 2 && (index == 48 || index == 49 ))
|| (carry == 8 && index >= 48 && index <= 55 )
|| (carry == 10 && (index >= 48 && index <= 57 || index == 46 ))
|| (carry == 16 && ((index >= 48 && index <= 57 ) || (index >= 97 && index <= 102 ))))
if (endNumber)
{
endNumber = false
document.calc.display.value = key
}
else if (document.calc.display.value == null || document.calc.display.value == " 0 " )
document.calc.display.value = key
else
document.calc.display.value += key
}
function changeSign()
{
if (document.calc.display.value != " 0 " )
if (document.calc.display.value.substr( 0 , 1 ) == " - " )
document.calc.display.value = document.calc.display.value.substr( 1 )
else
document.calc.display.value = " - " + document.calc.display.value
}
// 函数键
function inputfunction(fun,shiftfun)
{
endNumber = true
if (document.calc.shiftf.checked)
document.calc.display.value = decto(funcalc(shiftfun,(todec(document.calc.display.value,carry))),carry)
else
document.calc.display.value = decto(funcalc(fun,(todec(document.calc.display.value,carry))),carry)
document.calc.shiftf.checked = false
document.calc.hypf.checked = false
inputshift()
}
function inputtrig(trig,arctrig,hyp,archyp)
{
if (document.calc.hypf.checked)
inputfunction(hyp,archyp)
else
inputfunction(trig,arctrig)
}
// 运算符
function operation(join,newlevel)
{
endNumber = true
var temp = stack.substr(stack.lastIndexOf( " ( " ) + 1 ) + document.calc.display.value
while (newlevel != 0 && (newlevel <= (level.charAt(level.length - 1 ))))
{
temp = parse(temp)
level = level.slice( 0 , - 1 )
}
if (temp.match( /^ (. * \d[\ + \ - \ * \ / \ % \ ^ \ & \ | x]) ? ([ +- ] ? [ 0 - 9a - f\.] + )$ / ))
document.calc.display.value = RegExp.$ 2
stack = stack.substr( 0 ,stack.lastIndexOf( " ( " ) + 1 ) + temp + join
document.calc.operator.value = " " + join + " "
level = level + newlevel
}
// 括号
function addbracket()
{
endNumber = true
document.calc.display.value = 0
stack = stack + " ( "
document.calc.operator.value = " "
level = level + 0
layer += 1
document.calc.bracket.value = " (= " + layer
}
function disbracket()
{
endNumber = true
var temp = stack.substr(stack.lastIndexOf( " ( " ) + 1 ) + document.calc.display.value
while ((level.charAt(level.length - 1 )) > 0 )
{
temp = parse(temp)
level = level.slice( 0 , - 1 )
}
document.calc.display.value = temp
stack = stack.substr( 0 ,stack.lastIndexOf( " ( " ))
document.calc.operator.value = " "
level = level.slice( 0 , - 1 )
layer -= 1
if (layer > 0 )
document.calc.bracket.value = " (= " + layer
else
document.calc.bracket.value = ""
}
// 等号
function result()
{
endNumber = true
while (layer > 0 )
disbracket()
var temp = stack + document.calc.display.value
while ((level.charAt(level.length - 1 )) > 0 )
{
temp = parse(temp)
level = level.slice( 0 , - 1 )
}
document.calc.display.value = temp
document.calc.bracket.value = ""
document.calc.operator.value = ""
stack = ""
level = " 0 "
}
// 修改键
function backspace()
{
if ( ! endNumber)
{
if (document.calc.display.value.length > 1 )
document.calc.display.value = document.calc.display.value.substring( 0 ,document.calc.display.value.length - 1 )
else
document.calc.display.value = 0
}
}
function clearall()
{
document.calc.display.value = 0
endNumber = true
stack = ""
level = " 0 "
layer = ""
document.calc.operator.value = ""
document.calc.bracket.value = ""
}
// 转换键
function inputChangCarry(newcarry)
{
endNumber = true
document.calc.display.value = (decto(todec(document.calc.display.value,carry),newcarry))
carry = newcarry
document.calc.sin.disabled = (carry != 10 )
document.calc.cos.disabled = (carry != 10 )
document.calc.tan.disabled = (carry != 10 )
document.calc.bt.disabled = (carry != 10 )
document.calc.pi.disabled = (carry != 10 )
document.calc.e.disabled = (carry != 10 )
document.calc.kp.disabled = (carry != 10 )
document.calc.k2.disabled = (carry <= 2 )
document.calc.k3.disabled = (carry <= 2 )
document.calc.k4.disabled = (carry <= 2 )
document.calc.k5.disabled = (carry <= 2 )
document.calc.k6.disabled = (carry <= 2 )
document.calc.k7.disabled = (carry <= 2 )
document.calc.k8.disabled = (carry <= 8 )
document.calc.k9.disabled = (carry <= 8 )
document.calc.ka.disabled = (carry <= 10 )
document.calc.kb.disabled = (carry <= 10 )
document.calc.kc.disabled = (carry <= 10 )
document.calc.kd.disabled = (carry <= 10 )
document.calc.ke.disabled = (carry <= 10 )
document.calc.kf.disabled = (carry <= 10 )
}
function inputChangAngle(angletype)
{
endNumber = true
angle = angletype
if (angle == " d " )
document.calc.display.value = radiansToDegress(document.calc.display.value)
else
document.calc.display.value = degressToRadians(document.calc.display.value)
endNumber = true
}
function inputshift()
{
if (document.calc.shiftf.checked)
{
document.calc.bt.value = " deg "
document.calc.ln.value = " exp "
document.calc.log.value = " expd "
if (document.calc.hypf.checked)
{
document.calc.sin.value = " ahs "
document.calc.cos.value = " ahc "
document.calc.tan.value = " aht "
}
else
{
document.calc.sin.value = " asin "
document.calc.cos.value = " acos "
document.calc.tan.value = " atan "
}
document.calc.sqr.value = " x^.5 "
document.calc.cube.value = " x^.3 "
document.calc.floor.value = " 小数 "
}
else
{
document.calc.bt.value = " d.ms "
document.calc.ln.value = " ln "
document.calc.log.value = " log "
if (document.calc.hypf.checked)
{
document.calc.sin.value = " hsin "
document.calc.cos.value = " hcos "
document.calc.tan.value = " htan "
}
else
{
document.calc.sin.value = " sin "
document.calc.cos.value = " cos "
document.calc.tan.value = " tan "
}
document.calc.sqr.value = " x^2 "
document.calc.cube.value = " x^3 "
document.calc.floor.value = " 取整 "
}
}
// 存储器部分
function clearmemory()
{
mem = 0
document.calc.memory.value = " "
}
function getmemory()
{
endNumber = true
document.calc.display.value = decto(mem,carry)
}
function putmemory()
{
endNumber = true
if (document.calc.display.value != 0 )
{
mem = todec(document.calc.display.value,carry)
document.calc.memory.value = " M "
}
else
document.calc.memory.value = " "
}
function addmemory()
{
endNumber = true
mem = parseFloat(mem) + parseFloat(todec(document.calc.display.value,carry))
if (mem == 0 )
document.calc.memory.value = " "
else
document.calc.memory.value = " M "
}
function multimemory()
{
endNumber = true
mem = parseFloat(mem) * parseFloat(todec(document.calc.display.value,carry))
if (mem == 0 )
document.calc.memory.value = " "
else
document.calc.memory.value = " M "
}
// 十进制转换
function todec(num,oldcarry)
{
if (oldcarry == 10 || num == 0 ) return (num)
var neg = (num.charAt( 0 ) == " - " )
if (neg) num = num.substr( 1 )
var newnum = 0
for ( var index = 1 ;index <= num.length;index ++ )
newnum = newnum * oldcarry + hexnum.indexOf(num.charAt(index - 1 ))
if (neg)
newnum =- newnum
return (newnum)
}
function decto(num,newcarry)
{
var neg = (num < 0 )
if (newcarry == 10 || num == 0 ) return (num)
num = "" + Math.abs(num)
var newnum = ""
while (num != 0 )
{
newnum = hexnum.charAt(num % newcarry) + newnum
num = Math.floor(num / newcarry)
}
if (neg)
newnum = " - " + newnum
return (newnum)
}
// 表达式解析
function parse(string)
{
if (string.match( /^ (. * \d[\ + \ - \ * \ / \ % \ ^ \ & \ | x\ < ]) ? ([ +- ] ? [ 0 - 9a - f\.] + )([\ + \ - \ * \ / \ % \ ^ \ & \ | x\ < ])([ +- ] ? [ 0 - 9a - f\.] + )$ / ))
return (RegExp.$ 1 + cypher(RegExp.$ 2 ,RegExp.$ 3 ,RegExp.$ 4 ))
else
return (string)
}
// 数学运算和位运算
function cypher(left,join,right)
{
left = todec(left,carry)
right = todec(right,carry)
if (join == " + " )
return (decto(parseFloat(left) + parseFloat(right),carry))
if (join == " - " )
return (decto(left - right,carry))
if (join == " * " )
return (decto(left * right,carry))
if (join == " / " && right != 0 )
return (decto(left / right,carry))
if (join == " % " )
return (decto(left % right,carry))
if (join == " & " )
return (decto(left & right,carry))
if (join == " | " )
return (decto(left | right,carry))
if (join == " ^ " )
return (decto(Math.pow(left,right),carry))
if (join == " x " )
return (decto(left ^ right,carry))
if (join == " < " )
return (decto(left << right,carry))
alert( " 除数不能为零 " )
return (left)
}
// 函数计算
function funcalc(fun,num)
{
with (Math)
{
if (fun == " pi " )
return (PI)
if (fun == " e " )
return (E)
if (fun == " abs " )
return (abs(num))
if (fun == " ceil " )
return (ceil(num))
if (fun == " round " )
return (round(num))
if (fun == " floor " )
return (floor(num))
if (fun == " deci " )
return (num - floor(num))
if (fun == " ln " && num > 0 )
return (log(num))
if (fun == " exp " )
return (exp(num))
if (fun == " log " && num > 0 )
return (log(num) * LOG10E)
if (fun == " expdec " )
return (pow( 10 ,num))
if (fun == " cube " )
return (num * num * num)
if (fun == " cubt " )
return (pow(num, 1 / 3 ))
if (fun == " sqr " )
return (num * num)
if (fun == " sqrt " && num >= 0 )
return (sqrt(num))
if (fun == " ! " )
return (factorial(num))
if (fun == " recip " && num != 0 )
return ( 1 / num)
if (fun == " dms " )
return (dms(num))
if (fun == " deg " )
return (deg(num))
if (fun == " ~ " )
return ( ~ num)
if (angle == " d " )
{
if (fun == " sin " )
return (sin(degressToRadians(num)))
if (fun == " cos " )
return (cos(degressToRadians(num)))
if (fun == " tan " )
return (tan(degressToRadians(num)))
if (fun == " arcsin " && abs(num) <= 1 )
return (radiansToDegress(asin(num)))
if (fun == " arccos " && abs(num) <= 1 )
return (radiansToDegress(acos(num)))
if (fun == " arctan " )
return (radiansToDegress(atan(num)))
}
else
{
if (fun == " sin " )
return (sin(num))
if (fun == " cos " )
return (cos(num))
if (fun == " tan " )
return (tan(num))
if (fun == " arcsin " && abs(num) <= 1 )
return (asin(num))
if (fun == " arccos " && abs(num) <= 1 )
return (acos(num))
if (fun == " arctan " )
return (atan(num))
}
if (fun == " hypsin " )
return ((exp(num) - exp( 0 - num)) * 0.5 )
if (fun == " hypcos " )
return ((exp(num) + exp( - num)) * 0.5 )
if (fun == " hyptan " )
return ((exp(num) - exp( - num)) / (exp(num) + exp( - num)))
if (fun == " ahypsin " | fun == " hypcos " | fun == " hyptan " )
{
alert( " 对不起,公式还没有查到! " )
return (num)
}
alert( " 超出函数定义范围 " )
return (num)
}
}
function factorial(n)
{
n = Math.abs(parseInt(n))
var fac = 1
for (;n > 0 ;n -= 1 )
fac *= n
return (fac)
}
function dms(n)
{
var neg = (n < 0 )
with (Math)
{
n = abs(n)
var d = floor(n)
var m = floor( 60 * (n - d))
var s = (n - d) * 60 - m
}
var dms = d + m / 100 + s * 0.006
if (neg)
dms =- dms
return (dms)
}
function deg(n)
{
var neg = (n < 0 )
with (Math)
{
n = abs(n)
var d = floor(n)
var m = floor((n - d) * 100 )
var s = (n - d) * 100 - m
}
var deg = d + m / 60 + s / 36
if (neg)
deg =- deg
return (deg)
}
function degressToRadians(degress)
{
return (degress * Math.PI / 180 )
}
function radiansToDegress(radians)
{
return (radians * 180 / Math.PI)
}
// 界面
// -->
</ SCRIPT >
<!-- written by GoldHuman li hai --><!-- 2000.8 -->
< META content = " MSHTML 5.50.4134.100 " name = GENERATOR ></ HEAD >
< BODY leftmargin = " 0 " topmargin = " 0 " >
< DIV align = center >
< FORM name = calc >
< TABLE height = 250 width = 500 border = 1 >
< TBODY >
< TR >
< TD height = 50 >
< TABLE width = 500 >
< TBODY >
< TR >
< TD > </ TD >
< TD >
< DIV align = center >< INPUT readOnly size = 40 value = 0 name = display >
</ DIV ></ TD ></ TR ></ TBODY ></ TABLE ></ TD ></ TR >
< TR >
< TD >
< TABLE width = 500 >
< TBODY >
< TR >
< TD width = 290 >< INPUT onclick = inputChangCarry( 16 ) type = radio
name = carry > 十六进制 < INPUT onclick = inputChangCarry( 10 ) type = radio
CHECKED name = carry > 十进制 < INPUT onclick = inputChangCarry( 8 ) type = radio
name = carry > 八进制 < INPUT onclick = inputChangCarry( 2 ) type = radio
name = carry > 二进制 </ TD >
< TD ></ TD >
< TD width = 135 >< INPUT onclick = " inputChangAngle('d') " type = radio
CHECKED value = d name = angle > 角度制 < INPUT
onclick = " inputChangAngle('r') " type = radio value = r name = angle > 弧度制
</ TD ></ TR ></ TBODY ></ TABLE >
< TABLE width = 500 >
< TBODY >
< TR >
< TD width = 170 >< INPUT onclick = inputshift() type = checkbox
name = shiftf > 上档功能 < INPUT onclick = inputshift() type = checkbox
name = hypf > 双曲函数 </ TD >
< TD >< INPUT style = " BACKGROUND-COLOR: lightgrey " readOnly size = 3
name = bracket > < INPUT style = " BACKGROUND-COLOR: lightgrey " readOnly
size = 3 name = memory > < INPUT style = " BACKGROUND-COLOR: lightgrey "
readOnly size = 3 name = operator > </ TD >
< TD width = 183 >< INPUT style = " COLOR: red " onclick = backspace() type = button value = " 退格 " >
< INPUT style = " COLOR: red " onclick = " document.calc.display.value = 0 " type = button value = " 清屏 " >
< INPUT style = " COLOR: red " onclick = clearall() type = button value = " 全清 " >
</ TD ></ TR ></ TBODY ></ TABLE >
< TABLE width = 500 >
< TBODY >
< TR >
< TD >
< TABLE >
< TBODY >
< TR align = middle >
< TD >< INPUT style = " COLOR: blue " onclick = " inputfunction('pi','pi') " type = button value = " PI " name = pi >
</ TD >
< TD >< INPUT style = " COLOR: blue " onclick = " inputfunction('e','e') " type = button value = " E " name = e >
</ TD >
< TD >< INPUT style = " COLOR: #ff00ff " onclick = " inputfunction('dms','deg') " type = button value = d.ms name = bt >
</ TD ></ TR >
< TR align = middle >
< TD >< INPUT style = " COLOR: #ff00ff " onclick = addbracket() type = button value = " ( " >
</ TD >
< TD >< INPUT style = " COLOR: #ff00ff " onclick = disbracket() type = button value = " ) " >
</ TD >
< TD >< INPUT style = " COLOR: #ff00ff " onclick = " inputfunction('ln','exp') " type = button value = " ln " name = ln >
</ TD ></ TR >
< TR align = middle >
< TD >< INPUT style = " COLOR: #ff00ff " onclick = " inputtrig('sin','arcsin','hypsin','ahypsin') " type = button value = " sin " name = sin >
</ TD >
< TD >< INPUT style = " COLOR: #ff00ff " onclick = " operation('^',7) " type = button value = " x^y " >
</ TD >
< TD >< INPUT style = " COLOR: #ff00ff " onclick = " inputfunction('log','expdec') " type = button value = " log " name = log >
</ TD ></ TR >
< TR align = middle >
< TD >< INPUT style = " COLOR: #ff00ff " onclick = " inputtrig('cos','arccos','hypcos','ahypcos') " type = button value = " cos " name = cos >
</ TD >
< TD >< INPUT style = " COLOR: #ff00ff " onclick = " inputfunction('cube','cubt') " type = button value = " x^3 " name = cube >
</ TD >
< TD >< INPUT style = " COLOR: #ff00ff " onclick = " inputfunction('!','!') " type = button value = " n! " >
</ TD ></ TR >
< TR align = middle >
< TD >< INPUT style = " COLOR: #ff00ff " onclick = " inputtrig('tan','arctan','hyptan','ahyptan') " type = button value = " tan " name = tan >
</ TD >
< TD >< INPUT style = " COLOR: #ff00ff " onclick = " inputfunction('sqr','sqrt') " type = button value = " x^2 " name = sqr >
</ TD >
< TD >< INPUT style = " COLOR: #ff00ff " onclick = " inputfunction('recip','recip') " type = button value = " 1/x " >
</ TD ></ TR ></ TBODY ></ TABLE ></ TD >
< TD width = 30 ></ TD >
< TD >
< TABLE >
< TBODY >
< TR >
< TD >< INPUT style = " COLOR: red " onclick = putmemory() type = button value = " 储存 " >
</ TD ></ TR >
< TR >
< TD >< INPUT style = " COLOR: red " onclick = getmemory() type = button value = " 取存 " >
</ TD ></ TR >
< TR >
< TD >< INPUT style = " COLOR: red " onclick = addmemory() type = button value = " 累存 " >
</ TD ></ TR >
< TR >
< TD >< INPUT style = " COLOR: red " onclick = multimemory() type = button value = " 积存 " >
</ TD ></ TR >
< TR >
< TD height = 33 >< INPUT style = " COLOR: red " onclick = clearmemory() type = button value = " 清存 " >
</ TD ></ TR ></ TBODY ></ TABLE ></ TD >
< TD width = 30 ></ TD >
< TD >
< TABLE >
< TBODY >
< TR align = middle >
< TD >< INPUT style = " COLOR: blue " onclick = " inputkey('7') " type = button value = " 7 " name = k7 >
</ TD >
< TD >< INPUT style = " COLOR: blue " onclick = " inputkey('8') " type = button value = " 8 " name = k8 >
</ TD >
< TD >< INPUT style = " COLOR: blue " onclick = " inputkey('9') " type = button value = " 9 " name = k9 >
</ TD >
< TD >< INPUT style = " COLOR: red " onclick = " operation('/',6) " type = button value = " / " >
</ TD >
< TD >< INPUT style = " COLOR: red " onclick = " operation('%',6) " type = button value = 取余 >
</ TD >
< TD >< INPUT style = " COLOR: red " onclick = " operation('&',3) " type = button value = " 与 " >
</ TD ></ TR >
< TR align = middle >
< TD >< INPUT style = " COLOR: blue " onclick = " inputkey('4') " type = button value = " 4 " name = k4 >
</ TD >
< TD >< INPUT style = " COLOR: blue " onclick = " inputkey('5') " type = button value = " 5 " name = k5 >
</ TD >
< TD >< INPUT style = " COLOR: blue " onclick = " inputkey('6') " type = button value = " 6 " name = k6 >
</ TD >
< TD >< INPUT style = " COLOR: red " onclick = " operation('*',6) " type = button value = " * " >
</ TD >
< TD >< INPUT style = " COLOR: red " onclick = " inputfunction('floor','deci') " type = button value = 取整 name = floor >
</ TD >
< TD >< INPUT style = " COLOR: red " onclick = " operation('|',1) " type = button value = " 或 " >
</ TD ></ TR >
< TR align = middle >
< TD >< INPUT style = " COLOR: blue " onclick = " inputkey('1') " type = button value = " 1 " >
</ TD >
< TD >< INPUT style = " COLOR: blue " onclick = " inputkey('2') " type = button value = " 2 " name = k2 >
</ TD >
< TD >< INPUT style = " COLOR: blue " onclick = " inputkey('3') " type = button value = " 3 " name = k3 >
</ TD >
< TD >< INPUT style = " COLOR: red " onclick = " operation('-',5) " type = button value = " - " >
</ TD >
< TD >< INPUT style = " COLOR: red " onclick = " operation('<',4) " type = button value = 左移 >
</ TD >
< TD >< INPUT style = " COLOR: red " onclick = " inputfunction('~','~') " type = button value = " 非 " >
</ TD ></ TR >
< TR align = middle >
< TD >< INPUT style = " COLOR: blue " onclick = " inputkey('0') " type = button value = " 0 " >
</ TD >
< TD >< INPUT style = " COLOR: blue " onclick = changeSign() type = button value =+/->
</ TD >
< TD >< INPUT style = " COLOR: blue " onclick = " inputkey('.') " type = button value = " . " name = kp >
</ TD >
< TD >< INPUT style = " COLOR: red " onclick = " operation('+',5) " type = button value = " + " >
</ TD >
< TD >< INPUT style = " COLOR: red " onclick = result() type = button value = " = " >
</ TD >
< TD >< INPUT style = " COLOR: red " onclick = " operation('x',2) " type = button value = 异或 >
</ TD ></ TR >
< TR align = middle >
< TD >< INPUT style = " COLOR: blue " disabled onclick = " inputkey('a') " type = button value = " A " name = ka >
</ TD >
< TD >< INPUT style = " COLOR: blue " disabled onclick = " inputkey('b') " type = button value = " B " name = kb >
</ TD >
< TD >< INPUT style = " COLOR: blue " disabled onclick = " inputkey('c') " type = button value = " C " name = kc >
</ TD >
< TD >< INPUT style = " COLOR: blue " disabled onclick = " inputkey('d') " type = button value = " D " name = kd >
</ TD >
< TD >< INPUT style = " COLOR: blue " disabled onclick = " inputkey('e') " type = button value = " E " name = ke >
</ TD >
< TD >< INPUT style = " COLOR: blue " disabled onclick = " inputkey('f') " type = button value = " F " name = kf >
</ TD ></ TR ></ TBODY ></ TABLE ></ TD ></ TR ></ TBODY ></ TABLE ></ TD ></ TR ></ TBODY ></ TABLE ></ FORM ></ DIV ></ BODY ></ HTML >
< META http - equiv = Content - Type content = " text/html; charset=gb2312 " ><!-- written by GoldHuman li hai --><!-- 2000.8 -->
< STYLE > BODY {
FONT - SIZE: 9pt; BACKGROUND - ATTACHMENT: fixed; COLOR: #0001fc; FONT - FAMILY: " 宋体 " , " Arial " , " Times New Roman " ; BACKGROUND - COLOR: #edf0e1
}
TD {
FONT - SIZE: 9pt; FONT - FAMILY: " 宋体 " , " Arial Narrow " , " Times New Roman " ; font - color: # 000000
}
</ STYLE >
< SCRIPT language = javascript >
<!--
var endNumber = true
var mem = 0
var carry = 10
var hexnum = " 0123456789abcdef "
var angle = " d "
var stack = ""
var level = " 0 "
var layer = 0
// 数字键
function inputkey(key)
{
var index = key.charCodeAt( 0 );
if ((carry == 2 && (index == 48 || index == 49 ))
|| (carry == 8 && index >= 48 && index <= 55 )
|| (carry == 10 && (index >= 48 && index <= 57 || index == 46 ))
|| (carry == 16 && ((index >= 48 && index <= 57 ) || (index >= 97 && index <= 102 ))))
if (endNumber)
{
endNumber = false
document.calc.display.value = key
}
else if (document.calc.display.value == null || document.calc.display.value == " 0 " )
document.calc.display.value = key
else
document.calc.display.value += key
}
function changeSign()
{
if (document.calc.display.value != " 0 " )
if (document.calc.display.value.substr( 0 , 1 ) == " - " )
document.calc.display.value = document.calc.display.value.substr( 1 )
else
document.calc.display.value = " - " + document.calc.display.value
}
// 函数键
function inputfunction(fun,shiftfun)
{
endNumber = true
if (document.calc.shiftf.checked)
document.calc.display.value = decto(funcalc(shiftfun,(todec(document.calc.display.value,carry))),carry)
else
document.calc.display.value = decto(funcalc(fun,(todec(document.calc.display.value,carry))),carry)
document.calc.shiftf.checked = false
document.calc.hypf.checked = false
inputshift()
}
function inputtrig(trig,arctrig,hyp,archyp)
{
if (document.calc.hypf.checked)
inputfunction(hyp,archyp)
else
inputfunction(trig,arctrig)
}
// 运算符
function operation(join,newlevel)
{
endNumber = true
var temp = stack.substr(stack.lastIndexOf( " ( " ) + 1 ) + document.calc.display.value
while (newlevel != 0 && (newlevel <= (level.charAt(level.length - 1 ))))
{
temp = parse(temp)
level = level.slice( 0 , - 1 )
}
if (temp.match( /^ (. * \d[\ + \ - \ * \ / \ % \ ^ \ & \ | x]) ? ([ +- ] ? [ 0 - 9a - f\.] + )$ / ))
document.calc.display.value = RegExp.$ 2
stack = stack.substr( 0 ,stack.lastIndexOf( " ( " ) + 1 ) + temp + join
document.calc.operator.value = " " + join + " "
level = level + newlevel
}
// 括号
function addbracket()
{
endNumber = true
document.calc.display.value = 0
stack = stack + " ( "
document.calc.operator.value = " "
level = level + 0
layer += 1
document.calc.bracket.value = " (= " + layer
}
function disbracket()
{
endNumber = true
var temp = stack.substr(stack.lastIndexOf( " ( " ) + 1 ) + document.calc.display.value
while ((level.charAt(level.length - 1 )) > 0 )
{
temp = parse(temp)
level = level.slice( 0 , - 1 )
}
document.calc.display.value = temp
stack = stack.substr( 0 ,stack.lastIndexOf( " ( " ))
document.calc.operator.value = " "
level = level.slice( 0 , - 1 )
layer -= 1
if (layer > 0 )
document.calc.bracket.value = " (= " + layer
else
document.calc.bracket.value = ""
}
// 等号
function result()
{
endNumber = true
while (layer > 0 )
disbracket()
var temp = stack + document.calc.display.value
while ((level.charAt(level.length - 1 )) > 0 )
{
temp = parse(temp)
level = level.slice( 0 , - 1 )
}
document.calc.display.value = temp
document.calc.bracket.value = ""
document.calc.operator.value = ""
stack = ""
level = " 0 "
}
// 修改键
function backspace()
{
if ( ! endNumber)
{
if (document.calc.display.value.length > 1 )
document.calc.display.value = document.calc.display.value.substring( 0 ,document.calc.display.value.length - 1 )
else
document.calc.display.value = 0
}
}
function clearall()
{
document.calc.display.value = 0
endNumber = true
stack = ""
level = " 0 "
layer = ""
document.calc.operator.value = ""
document.calc.bracket.value = ""
}
// 转换键
function inputChangCarry(newcarry)
{
endNumber = true
document.calc.display.value = (decto(todec(document.calc.display.value,carry),newcarry))
carry = newcarry
document.calc.sin.disabled = (carry != 10 )
document.calc.cos.disabled = (carry != 10 )
document.calc.tan.disabled = (carry != 10 )
document.calc.bt.disabled = (carry != 10 )
document.calc.pi.disabled = (carry != 10 )
document.calc.e.disabled = (carry != 10 )
document.calc.kp.disabled = (carry != 10 )
document.calc.k2.disabled = (carry <= 2 )
document.calc.k3.disabled = (carry <= 2 )
document.calc.k4.disabled = (carry <= 2 )
document.calc.k5.disabled = (carry <= 2 )
document.calc.k6.disabled = (carry <= 2 )
document.calc.k7.disabled = (carry <= 2 )
document.calc.k8.disabled = (carry <= 8 )
document.calc.k9.disabled = (carry <= 8 )
document.calc.ka.disabled = (carry <= 10 )
document.calc.kb.disabled = (carry <= 10 )
document.calc.kc.disabled = (carry <= 10 )
document.calc.kd.disabled = (carry <= 10 )
document.calc.ke.disabled = (carry <= 10 )
document.calc.kf.disabled = (carry <= 10 )
}
function inputChangAngle(angletype)
{
endNumber = true
angle = angletype
if (angle == " d " )
document.calc.display.value = radiansToDegress(document.calc.display.value)
else
document.calc.display.value = degressToRadians(document.calc.display.value)
endNumber = true
}
function inputshift()
{
if (document.calc.shiftf.checked)
{
document.calc.bt.value = " deg "
document.calc.ln.value = " exp "
document.calc.log.value = " expd "
if (document.calc.hypf.checked)
{
document.calc.sin.value = " ahs "
document.calc.cos.value = " ahc "
document.calc.tan.value = " aht "
}
else
{
document.calc.sin.value = " asin "
document.calc.cos.value = " acos "
document.calc.tan.value = " atan "
}
document.calc.sqr.value = " x^.5 "
document.calc.cube.value = " x^.3 "
document.calc.floor.value = " 小数 "
}
else
{
document.calc.bt.value = " d.ms "
document.calc.ln.value = " ln "
document.calc.log.value = " log "
if (document.calc.hypf.checked)
{
document.calc.sin.value = " hsin "
document.calc.cos.value = " hcos "
document.calc.tan.value = " htan "
}
else
{
document.calc.sin.value = " sin "
document.calc.cos.value = " cos "
document.calc.tan.value = " tan "
}
document.calc.sqr.value = " x^2 "
document.calc.cube.value = " x^3 "
document.calc.floor.value = " 取整 "
}
}
// 存储器部分
function clearmemory()
{
mem = 0
document.calc.memory.value = " "
}
function getmemory()
{
endNumber = true
document.calc.display.value = decto(mem,carry)
}
function putmemory()
{
endNumber = true
if (document.calc.display.value != 0 )
{
mem = todec(document.calc.display.value,carry)
document.calc.memory.value = " M "
}
else
document.calc.memory.value = " "
}
function addmemory()
{
endNumber = true
mem = parseFloat(mem) + parseFloat(todec(document.calc.display.value,carry))
if (mem == 0 )
document.calc.memory.value = " "
else
document.calc.memory.value = " M "
}
function multimemory()
{
endNumber = true
mem = parseFloat(mem) * parseFloat(todec(document.calc.display.value,carry))
if (mem == 0 )
document.calc.memory.value = " "
else
document.calc.memory.value = " M "
}
// 十进制转换
function todec(num,oldcarry)
{
if (oldcarry == 10 || num == 0 ) return (num)
var neg = (num.charAt( 0 ) == " - " )
if (neg) num = num.substr( 1 )
var newnum = 0
for ( var index = 1 ;index <= num.length;index ++ )
newnum = newnum * oldcarry + hexnum.indexOf(num.charAt(index - 1 ))
if (neg)
newnum =- newnum
return (newnum)
}
function decto(num,newcarry)
{
var neg = (num < 0 )
if (newcarry == 10 || num == 0 ) return (num)
num = "" + Math.abs(num)
var newnum = ""
while (num != 0 )
{
newnum = hexnum.charAt(num % newcarry) + newnum
num = Math.floor(num / newcarry)
}
if (neg)
newnum = " - " + newnum
return (newnum)
}
// 表达式解析
function parse(string)
{
if (string.match( /^ (. * \d[\ + \ - \ * \ / \ % \ ^ \ & \ | x\ < ]) ? ([ +- ] ? [ 0 - 9a - f\.] + )([\ + \ - \ * \ / \ % \ ^ \ & \ | x\ < ])([ +- ] ? [ 0 - 9a - f\.] + )$ / ))
return (RegExp.$ 1 + cypher(RegExp.$ 2 ,RegExp.$ 3 ,RegExp.$ 4 ))
else
return (string)
}
// 数学运算和位运算
function cypher(left,join,right)
{
left = todec(left,carry)
right = todec(right,carry)
if (join == " + " )
return (decto(parseFloat(left) + parseFloat(right),carry))
if (join == " - " )
return (decto(left - right,carry))
if (join == " * " )
return (decto(left * right,carry))
if (join == " / " && right != 0 )
return (decto(left / right,carry))
if (join == " % " )
return (decto(left % right,carry))
if (join == " & " )
return (decto(left & right,carry))
if (join == " | " )
return (decto(left | right,carry))
if (join == " ^ " )
return (decto(Math.pow(left,right),carry))
if (join == " x " )
return (decto(left ^ right,carry))
if (join == " < " )
return (decto(left << right,carry))
alert( " 除数不能为零 " )
return (left)
}
// 函数计算
function funcalc(fun,num)
{
with (Math)
{
if (fun == " pi " )
return (PI)
if (fun == " e " )
return (E)
if (fun == " abs " )
return (abs(num))
if (fun == " ceil " )
return (ceil(num))
if (fun == " round " )
return (round(num))
if (fun == " floor " )
return (floor(num))
if (fun == " deci " )
return (num - floor(num))
if (fun == " ln " && num > 0 )
return (log(num))
if (fun == " exp " )
return (exp(num))
if (fun == " log " && num > 0 )
return (log(num) * LOG10E)
if (fun == " expdec " )
return (pow( 10 ,num))
if (fun == " cube " )
return (num * num * num)
if (fun == " cubt " )
return (pow(num, 1 / 3 ))
if (fun == " sqr " )
return (num * num)
if (fun == " sqrt " && num >= 0 )
return (sqrt(num))
if (fun == " ! " )
return (factorial(num))
if (fun == " recip " && num != 0 )
return ( 1 / num)
if (fun == " dms " )
return (dms(num))
if (fun == " deg " )
return (deg(num))
if (fun == " ~ " )
return ( ~ num)
if (angle == " d " )
{
if (fun == " sin " )
return (sin(degressToRadians(num)))
if (fun == " cos " )
return (cos(degressToRadians(num)))
if (fun == " tan " )
return (tan(degressToRadians(num)))
if (fun == " arcsin " && abs(num) <= 1 )
return (radiansToDegress(asin(num)))
if (fun == " arccos " && abs(num) <= 1 )
return (radiansToDegress(acos(num)))
if (fun == " arctan " )
return (radiansToDegress(atan(num)))
}
else
{
if (fun == " sin " )
return (sin(num))
if (fun == " cos " )
return (cos(num))
if (fun == " tan " )
return (tan(num))
if (fun == " arcsin " && abs(num) <= 1 )
return (asin(num))
if (fun == " arccos " && abs(num) <= 1 )
return (acos(num))
if (fun == " arctan " )
return (atan(num))
}
if (fun == " hypsin " )
return ((exp(num) - exp( 0 - num)) * 0.5 )
if (fun == " hypcos " )
return ((exp(num) + exp( - num)) * 0.5 )
if (fun == " hyptan " )
return ((exp(num) - exp( - num)) / (exp(num) + exp( - num)))
if (fun == " ahypsin " | fun == " hypcos " | fun == " hyptan " )
{
alert( " 对不起,公式还没有查到! " )
return (num)
}
alert( " 超出函数定义范围 " )
return (num)
}
}
function factorial(n)
{
n = Math.abs(parseInt(n))
var fac = 1
for (;n > 0 ;n -= 1 )
fac *= n
return (fac)
}
function dms(n)
{
var neg = (n < 0 )
with (Math)
{
n = abs(n)
var d = floor(n)
var m = floor( 60 * (n - d))
var s = (n - d) * 60 - m
}
var dms = d + m / 100 + s * 0.006
if (neg)
dms =- dms
return (dms)
}
function deg(n)
{
var neg = (n < 0 )
with (Math)
{
n = abs(n)
var d = floor(n)
var m = floor((n - d) * 100 )
var s = (n - d) * 100 - m
}
var deg = d + m / 60 + s / 36
if (neg)
deg =- deg
return (deg)
}
function degressToRadians(degress)
{
return (degress * Math.PI / 180 )
}
function radiansToDegress(radians)
{
return (radians * 180 / Math.PI)
}
// 界面
// -->
</ SCRIPT >
<!-- written by GoldHuman li hai --><!-- 2000.8 -->
< META content = " MSHTML 5.50.4134.100 " name = GENERATOR ></ HEAD >
< BODY leftmargin = " 0 " topmargin = " 0 " >
< DIV align = center >
< FORM name = calc >
< TABLE height = 250 width = 500 border = 1 >
< TBODY >
< TR >
< TD height = 50 >
< TABLE width = 500 >
< TBODY >
< TR >
< TD > </ TD >
< TD >
< DIV align = center >< INPUT readOnly size = 40 value = 0 name = display >
</ DIV ></ TD ></ TR ></ TBODY ></ TABLE ></ TD ></ TR >
< TR >
< TD >
< TABLE width = 500 >
< TBODY >
< TR >
< TD width = 290 >< INPUT onclick = inputChangCarry( 16 ) type = radio
name = carry > 十六进制 < INPUT onclick = inputChangCarry( 10 ) type = radio
CHECKED name = carry > 十进制 < INPUT onclick = inputChangCarry( 8 ) type = radio
name = carry > 八进制 < INPUT onclick = inputChangCarry( 2 ) type = radio
name = carry > 二进制 </ TD >
< TD ></ TD >
< TD width = 135 >< INPUT onclick = " inputChangAngle('d') " type = radio
CHECKED value = d name = angle > 角度制 < INPUT
onclick = " inputChangAngle('r') " type = radio value = r name = angle > 弧度制
</ TD ></ TR ></ TBODY ></ TABLE >
< TABLE width = 500 >
< TBODY >
< TR >
< TD width = 170 >< INPUT onclick = inputshift() type = checkbox
name = shiftf > 上档功能 < INPUT onclick = inputshift() type = checkbox
name = hypf > 双曲函数 </ TD >
< TD >< INPUT style = " BACKGROUND-COLOR: lightgrey " readOnly size = 3
name = bracket > < INPUT style = " BACKGROUND-COLOR: lightgrey " readOnly
size = 3 name = memory > < INPUT style = " BACKGROUND-COLOR: lightgrey "
readOnly size = 3 name = operator > </ TD >
< TD width = 183 >< INPUT style = " COLOR: red " onclick = backspace() type = button value = " 退格 " >
< INPUT style = " COLOR: red " onclick = " document.calc.display.value = 0 " type = button value = " 清屏 " >
< INPUT style = " COLOR: red " onclick = clearall() type = button value = " 全清 " >
</ TD ></ TR ></ TBODY ></ TABLE >
< TABLE width = 500 >
< TBODY >
< TR >
< TD >
< TABLE >
< TBODY >
< TR align = middle >
< TD >< INPUT style = " COLOR: blue " onclick = " inputfunction('pi','pi') " type = button value = " PI " name = pi >
</ TD >
< TD >< INPUT style = " COLOR: blue " onclick = " inputfunction('e','e') " type = button value = " E " name = e >
</ TD >
< TD >< INPUT style = " COLOR: #ff00ff " onclick = " inputfunction('dms','deg') " type = button value = d.ms name = bt >
</ TD ></ TR >
< TR align = middle >
< TD >< INPUT style = " COLOR: #ff00ff " onclick = addbracket() type = button value = " ( " >
</ TD >
< TD >< INPUT style = " COLOR: #ff00ff " onclick = disbracket() type = button value = " ) " >
</ TD >
< TD >< INPUT style = " COLOR: #ff00ff " onclick = " inputfunction('ln','exp') " type = button value = " ln " name = ln >
</ TD ></ TR >
< TR align = middle >
< TD >< INPUT style = " COLOR: #ff00ff " onclick = " inputtrig('sin','arcsin','hypsin','ahypsin') " type = button value = " sin " name = sin >
</ TD >
< TD >< INPUT style = " COLOR: #ff00ff " onclick = " operation('^',7) " type = button value = " x^y " >
</ TD >
< TD >< INPUT style = " COLOR: #ff00ff " onclick = " inputfunction('log','expdec') " type = button value = " log " name = log >
</ TD ></ TR >
< TR align = middle >
< TD >< INPUT style = " COLOR: #ff00ff " onclick = " inputtrig('cos','arccos','hypcos','ahypcos') " type = button value = " cos " name = cos >
</ TD >
< TD >< INPUT style = " COLOR: #ff00ff " onclick = " inputfunction('cube','cubt') " type = button value = " x^3 " name = cube >
</ TD >
< TD >< INPUT style = " COLOR: #ff00ff " onclick = " inputfunction('!','!') " type = button value = " n! " >
</ TD ></ TR >
< TR align = middle >
< TD >< INPUT style = " COLOR: #ff00ff " onclick = " inputtrig('tan','arctan','hyptan','ahyptan') " type = button value = " tan " name = tan >
</ TD >
< TD >< INPUT style = " COLOR: #ff00ff " onclick = " inputfunction('sqr','sqrt') " type = button value = " x^2 " name = sqr >
</ TD >
< TD >< INPUT style = " COLOR: #ff00ff " onclick = " inputfunction('recip','recip') " type = button value = " 1/x " >
</ TD ></ TR ></ TBODY ></ TABLE ></ TD >
< TD width = 30 ></ TD >
< TD >
< TABLE >
< TBODY >
< TR >
< TD >< INPUT style = " COLOR: red " onclick = putmemory() type = button value = " 储存 " >
</ TD ></ TR >
< TR >
< TD >< INPUT style = " COLOR: red " onclick = getmemory() type = button value = " 取存 " >
</ TD ></ TR >
< TR >
< TD >< INPUT style = " COLOR: red " onclick = addmemory() type = button value = " 累存 " >
</ TD ></ TR >
< TR >
< TD >< INPUT style = " COLOR: red " onclick = multimemory() type = button value = " 积存 " >
</ TD ></ TR >
< TR >
< TD height = 33 >< INPUT style = " COLOR: red " onclick = clearmemory() type = button value = " 清存 " >
</ TD ></ TR ></ TBODY ></ TABLE ></ TD >
< TD width = 30 ></ TD >
< TD >
< TABLE >
< TBODY >
< TR align = middle >
< TD >< INPUT style = " COLOR: blue " onclick = " inputkey('7') " type = button value = " 7 " name = k7 >
</ TD >
< TD >< INPUT style = " COLOR: blue " onclick = " inputkey('8') " type = button value = " 8 " name = k8 >
</ TD >
< TD >< INPUT style = " COLOR: blue " onclick = " inputkey('9') " type = button value = " 9 " name = k9 >
</ TD >
< TD >< INPUT style = " COLOR: red " onclick = " operation('/',6) " type = button value = " / " >
</ TD >
< TD >< INPUT style = " COLOR: red " onclick = " operation('%',6) " type = button value = 取余 >
</ TD >
< TD >< INPUT style = " COLOR: red " onclick = " operation('&',3) " type = button value = " 与 " >
</ TD ></ TR >
< TR align = middle >
< TD >< INPUT style = " COLOR: blue " onclick = " inputkey('4') " type = button value = " 4 " name = k4 >
</ TD >
< TD >< INPUT style = " COLOR: blue " onclick = " inputkey('5') " type = button value = " 5 " name = k5 >
</ TD >
< TD >< INPUT style = " COLOR: blue " onclick = " inputkey('6') " type = button value = " 6 " name = k6 >
</ TD >
< TD >< INPUT style = " COLOR: red " onclick = " operation('*',6) " type = button value = " * " >
</ TD >
< TD >< INPUT style = " COLOR: red " onclick = " inputfunction('floor','deci') " type = button value = 取整 name = floor >
</ TD >
< TD >< INPUT style = " COLOR: red " onclick = " operation('|',1) " type = button value = " 或 " >
</ TD ></ TR >
< TR align = middle >
< TD >< INPUT style = " COLOR: blue " onclick = " inputkey('1') " type = button value = " 1 " >
</ TD >
< TD >< INPUT style = " COLOR: blue " onclick = " inputkey('2') " type = button value = " 2 " name = k2 >
</ TD >
< TD >< INPUT style = " COLOR: blue " onclick = " inputkey('3') " type = button value = " 3 " name = k3 >
</ TD >
< TD >< INPUT style = " COLOR: red " onclick = " operation('-',5) " type = button value = " - " >
</ TD >
< TD >< INPUT style = " COLOR: red " onclick = " operation('<',4) " type = button value = 左移 >
</ TD >
< TD >< INPUT style = " COLOR: red " onclick = " inputfunction('~','~') " type = button value = " 非 " >
</ TD ></ TR >
< TR align = middle >
< TD >< INPUT style = " COLOR: blue " onclick = " inputkey('0') " type = button value = " 0 " >
</ TD >
< TD >< INPUT style = " COLOR: blue " onclick = changeSign() type = button value =+/->
</ TD >
< TD >< INPUT style = " COLOR: blue " onclick = " inputkey('.') " type = button value = " . " name = kp >
</ TD >
< TD >< INPUT style = " COLOR: red " onclick = " operation('+',5) " type = button value = " + " >
</ TD >
< TD >< INPUT style = " COLOR: red " onclick = result() type = button value = " = " >
</ TD >
< TD >< INPUT style = " COLOR: red " onclick = " operation('x',2) " type = button value = 异或 >
</ TD ></ TR >
< TR align = middle >
< TD >< INPUT style = " COLOR: blue " disabled onclick = " inputkey('a') " type = button value = " A " name = ka >
</ TD >
< TD >< INPUT style = " COLOR: blue " disabled onclick = " inputkey('b') " type = button value = " B " name = kb >
</ TD >
< TD >< INPUT style = " COLOR: blue " disabled onclick = " inputkey('c') " type = button value = " C " name = kc >
</ TD >
< TD >< INPUT style = " COLOR: blue " disabled onclick = " inputkey('d') " type = button value = " D " name = kd >
</ TD >
< TD >< INPUT style = " COLOR: blue " disabled onclick = " inputkey('e') " type = button value = " E " name = ke >
</ TD >
< TD >< INPUT style = " COLOR: blue " disabled onclick = " inputkey('f') " type = button value = " F " name = kf >
</ TD ></ TR ></ TBODY ></ TABLE ></ TD ></ TR ></ TBODY ></ TABLE ></ TD ></ TR ></ TBODY ></ TABLE ></ FORM ></ DIV ></ BODY ></ HTML >