Newer
Older
Ruby / keisan3.rb
@SAITO Azuma SAITO Azuma on 5 Jan 3 KB 2026-01-05 23:41:20
#!/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