#!/usr/bin/env ruby
# -*- coding:utf-8 -*-
require 'curses'
include Curses
init_screen
noecho
def numlen(str,i)
j=0
while str[i+j]!=")"
j+=1
end
j
end
def numload(str,i)
j=""
if str[i]=="("
j=keisan("+","-",keisan("*","/",str[(i+1)..(str.length-1)]))
len=numlen(str,i)+1
else
while str[i]!="+" && str[i]!="-" && str[i]!="*" && str[i]!="/" && str[i]!=nil && str[i]!=")"
j+=str[i]
i+=1
end
len=j.length
end
[j.to_f,len]
end
def keisan(a,b,n)
i=0
l="n"
while i<n.length
if n[i]==")"
n=n[0..(i-1)]
break
elsif l=="n"
num1=numload(n,i)
i+=num1[1]
l="t"
elsif l=="t" && (n[i]==a || n[i]==b)
l=n[i]
i+=1
elsif l=="t"
i+=1
l="n"
else
num2=numload(n,i)
n2=""
i-=1
m=0
num3=num1[0]
num4=num2[0]
while m<n.length
if m<i-num1[1] || m>i+num2[1]
n2+=n[m]
m+=1
else
if l=="+"
num3+=num4
elsif l=="-"
num3-=num4
elsif l=="*"
num3*=num4
else
num3/=num4
end
n2+=num3.to_s
m+=num1[1]+num2[1]+1
end
end
n=n2
i-=num1[1]
num1[0]=num3
num1[1]=num3.to_s.length
i+=num1[1]
l="t"
end
end
n
end
def henkan(str)
if str=="*"
str="×"
elsif str=="/"
str="÷"
end
str
end
setsumei=[" 〜説明〜 "," ","この電卓は、キーを打って計算内容を入力します","すべて半角で入れてください","","まず数字は数字キーで13527などとそのまま打ちます。","足し算、引き算も + や - キーでそのまま打ちます。","しかし、掛け算は *(アスタリスク) で打ちます。","割り算は/(スラッシュ)で打ちます。","ここは気をつけてください。","","この電卓は括弧も使うことができます。","そのまま ( や ) で打ちます。","負の数も使えますが、例えば-5を入れたいときは少し難しく(0-5)と書きます。","そのまま-5と入力すると結果がおかしくなるので気をつけてください。","結果を見たいときはEnterを押してください。","何の計算かわかりにくくなるので*や/と入力しても×や÷などと表示されます。","","この電卓は15桁までしか扱えないので16桁以上になると結果がおかしくなります。","","このルールは覚えにくいので、あらかじめどう入力するかメモしておくといいと思います。","見終わったらEnterキーを押してください。"]
begin
setpos(0,0)
addstr("これは電卓プログラムです")
setpos(1,0)
addstr("使い方を見たい人はmキーを押してください")
setpos(2,0)
addstr("見なくてもいい人はEnterキーを押してください")
refresh
if getch=="m"
for i in (0..(setsumei.length-1))
setpos(i,0)
addstr(setsumei[i])
end
refresh
getch
end
ensure
close_screen
end
init_screen
keisannaiyou=""
hyoujinaiyou=""
get=""
begin
while get!="=" && get!=10
if get!=8
keisannaiyou+=get
hyoujinaiyou+=henkan(get)
elsif keisannaiyou.length>1
keisannaiyou=keisannaiyou[0..(keisannaiyou.length-2)]
hyoujinaiyou=hyoujinaiyou[0..(hyoujinaiyou.length-2)]
else
keisannaiyou=""
hyoujinaiyou=""
end
setpos(lines/2,0)
addstr(" ")
setpos(lines/2,(cols-hyoujinaiyou.length)/2)
addstr(hyoujinaiyou)
refresh
get=getch
end
ans=keisan("+","-",keisan("*","/",keisannaiyou))
setpos(lines/2+1,(cols-ans.length-1)/2)
addstr("="+ans)
refresh
ensure
close_screen
end