#pragma rtGlobals=1 // Use modern global access method. ////////////// Calculator //////////////////// /////////// 使い方 // Ctrl+Alt+Shift+5 起動 // Alt+"C" 入力のみクリア // Alt+"sin" arcsin (他も同様) // "=" 結果を履歴に表示 // Alt+"=" 逆演算(x/y -> y/x etc)して、結果を履歴に表示 // /////////// ボタンの説明 // Num Button 0-9 // 数値を入力 // PeriodButton . // それ以降の入力は小数点以下 // ClearButton C // 結果、入力ともクリア // Alt+C=入力のみクリア // Func Button sin, cos, tan, exp, ^2 // 現在表示されている数値について計算 // Alt+Func=逆関数 // Ope Button +, -, *, /, = // その前に入力されたOpe に従ってAnswer + Input etc. の2項演算を行い、 // 新たに入力されたものをOpe に記憶する // Alt+Ope = Input + Answer etc. // "=" の場合、履歴に結果を出力。計算結果はリセットされる /////////// 変数の説明 // Input :入力中の数値 // Answer :これまでの計算結果 // Period :現在入力する数値の小数点以下の桁数 // Flag :現在の状態 // 0 -> 数値入力中 Num, Func, Ope 可 // 1 -> 結果表示 Num, Func, Ope 可 // 2 -> Func 実行済  Func, Ope 可 // Ope :直近に入力されたOpe /////////// 拡張方法 /////// Ope = 2項演算子 // 1. Buttonを追加。名称は[・・・]Button。 // 2. 定義をCalculation に書き加える。 // /////// Func = 関数 // 1. Buttonを追加。名称は[・・・]Button。 // 2. 定義をFuncButtonProc に書き加える。 // //////////////////////////////////////// Menu "Macros" "Calculator/SO5",CalPanel() End Function CalPanel() String folder folder=GetDataFolder(1) NewDataFolder/O/S root:Calc Variable/G Input,Answer,Flag,Period String/G Operator Answer=0 Flag=0 Input=0 Period=0 Operator="Equal" SetDataFolder $folder DoWindow/K Calculator NewPanel/W=(50,50,250,220) DoWindow/C Calculator SetVariable SetAnswer fsize=15,limits={-Inf,Inf,0},pos={10,10},size={110,40},title=" ",value=Input //数値入力 Button Num1Button pos={10,40},proc=NumButtonProc,size={20,20},title="1" Button Num2Button pos={40,40},proc=NumButtonProc,size={20,20},title="2" Button Num3Button pos={70,40},proc=NumButtonProc,size={20,20},title="3" Button Num4Button pos={10,70},proc=NumButtonProc,size={20,20},title="4" Button Num5Button pos={40,70},proc=NumButtonProc,size={20,20},title="5" Button Num6Button pos={70,70},proc=NumButtonProc,size={20,20},title="6" Button Num7Button pos={10,100},proc=NumButtonProc,size={20,20},title="7" Button Num8Button pos={40,100},proc=NumButtonProc,size={20,20},title="8" Button Num9Button pos={70,100},proc=NumButtonProc,size={20,20},title="9" Button Num0Button pos={40,130},proc=NumButtonProc,size={20,20},title="0" //特殊キー Button ClearButton pos={130,10},proc=ClearButtonProc,size={20,20},title="C" Button PeriodButton pos={10,130},proc=PeriodButtonProc,size={20,20},title="." //2項演算実行 Button EqualButton pos={70,130},proc=OpeButtonProc,size={20,20},title="=" Button PlusButton pos={100,100},proc=OpeButtonProc,size={20,20},title="+" Button MinusButton pos={100,130},proc=OpeButtonProc,size={20,20},title="-" Button TimesButton pos={130,100},proc=OpeButtonProc,size={20,20},title="*" Button DivideButton pos={130,130},proc=OpeButtonProc,size={20,20},title="/" Button PowerButton pos={160,100},proc=OpeButtonProc,size={20,20},title="^" //関数実行 Button SinButton pos={100,40},proc=FuncButtonProc,size={20,20},title="sin" Button CosButton pos={100,70},proc=FuncButtonProc,size={20,20},title="cos" Button TanButton pos={130,40},proc=FuncButtonProc,size={20,20},title="tan" Button ExpButton pos={130,70},proc=FuncButtonProc,size={20,20},title="exp" Button SqrButton pos={160,40},proc=FuncButtonProc,size={20,20},title="^2" End Function ClearButtonProc(ctrlName) : ButtonControl String ctrlName NVar Flag=root:Calc:Flag NVar Input=root:Calc:Input NVar Period=root:Calc:Period NVar Answer=root:Calc:Answer SVar Operator=root:Calc:Operator Input=Answer Period=0 String key key=KeyboardState("") if(str2num(key[1])) Flag=1 else Answer=0 Flag=0 Operator="=" endif End Function NumButtonProc(ctrlName) : ButtonControl String ctrlName NVar Flag=root:Calc:Flag NVar Input=root:Calc:Input NVar Period=root:Calc:Period switch(Flag) case 2: return 0 break case 1: Period=0 Input=0 Flag=0 break endswitch if(Period==0) Input=Input*10+str2num(ctrlName[3]) else Input=Input+str2num(ctrlName[3])*0.1^Period Period+=1 endif End Function PeriodButtonProc(ctrlName) : ButtonControl String ctrlName NVar Period=root:Calc:Period NVar Input=root:Calc:Input NVar Flag=root:Calc:Flag switch(Flag) case 0: Period=1 break case 1: Period=1 Input=0 Flag=0 break endswitch End Function FuncButtonProc(ctrlName) : ButtonControl String ctrlName NVar Flag=root:Calc:Flag NVar Input=root:Calc:Input Flag=2 String key key=KeyboardState("") strswitch(ctrlName) case "SinButton": if(str2num(key[1])) Input=asin(Input) else Input=sin(Input) endif Break case "CosButton": if(str2num(key[1])) Input=acos(Input) else Input=cos(Input) endif Break case "TanButton": if(str2num(key[1])) Input=atan(Input) else Input=tan(Input) endif Break case "ExpButton": if(str2num(key[1])) Input=ln(Input) else Input=exp(Input) endif Break case "SqrButton": if(str2num(key[1])) Input=sqrt(Input) else Input=Input^2 endif Break endswitch End Function OpeButtonProc(ctrlName) : ButtonControl String ctrlName NVar Flag=root:Calc:Flag NVar Answer=root:Calc:Answer NVar Input=root:Calc:Input SVar Operator=root:Calc:Operator if(Flag==1) Operator=ReplaceString("Button",ctrlName,"") Answer=Input return 0 endif String key key=KeyboardState("") if(str2num(key[1])) Answer=Calculation(Input,Operator,Answer) else Answer=Calculation(Answer,Operator,Input) endif Input=Answer Flag=1 Operator=ReplaceString("Button",ctrlName,"") if(StringMatch(Operator,"Equal")) print Answer Answer=0 endif End Function Calculation(num1,operator,num2) Variable num1,num2 String operator strswitch(operator) case "Plus": num2=num1+num2 break case "Minus": num2=num1-num2 break case "Times": num2=num1*num2 break case "Divide": num2=num1/num2 break case "Power": num2=num1^num2 break endswitch return num2 End