|
|
|
2012/2/12(Sun) 14:49:53|NO.44811
screen 5
width 300,300
title "電卓"
k01 = 0
k02 = 0
ks = 0
k11 = 0
k12 = 0
objsize 50,50
pos 20,80
button "1",*n1
button "4",*n4
button "7",*n7
button "Close",*nn
pos 70,80
button "2",*n2
button "5",*n5
button "8",*n8
button "0",*n0
pos 120,80
button "3",*n3
button "6",*n6
button "9",*n9
pos 170,80
button "÷",*nw
button "×",*nx
button "−",*np
button "+",*nm
pos 220,80
objsize 50,200
button "=",*ne
pos 20,283
font "",12
mes "2ケタまでにしてやってください。それ以上は受け付けない。"
font "",70
stop
*n1
if k11 > 0 : k12 + 1 : pos 180,5 : mes k12
if ks > 0 : if k11 = 0 : k11 + 1 : pos 140,5 : mes k11
if k01 > 0 : if k02 = 0 : k02 + 1 : pos 50,5 : mes k02
if k01 = 0 : k01 + 1 : pos 10,5 : mes k01
stop
*n2
if k11 > 0 : k12 + 2 : pos 180,5 : mes k12
if ks > 0 : if k11 = 0 : k11 + 2 : pos 140,5 : mes k11
if k01 > 0 : if k02 = 0 : k02 + 2 : pos 50,5 : mes k02
if k01 = 0 : k01 + 2 : pos 10,5 : mes k01
stop
〜長いので*n3から*n0まで省略〜
*nw
if k01+k02 > 0{
ks = 1
pos 80,5
mes "÷"
}
stop
〜上記と同様で*nxから*nmまで省略〜
*ne
if k01 + k02 > 0{
if ks > 0{
if ks = 1 : ka = "÷"
if ks = 2 : ka = "×"
if ks = 3 : ka = "+"
if ks = 4 : ka = "−"
if k11 + k12 > 0{
if ks = 1{
k01 = k01 * 10
k12 * 10 = k12
k01 + k02 = k03
k11 + k12 = k13
k03 / k13 = kk
color 255,255,255 : boxf : color 0,0,0
pos 10,5
font "",25
mes "" + k03 +"÷"+ k13 + "=\n"+kk
}
if ks = 2{
k01 = k01 * 10
k11 = k11 * 10
k01 + k02 = k03
k11 + k12 = k13
k03 * k13 = kk
color 255,255,255 : boxf : color 0,0,0
pos 10,5
font "",25
mes "" + k03 +"×"+ k13 + "=\n"+kk
}
if ks = 3{
k01 = k01 * 10
k11 = k11 * 10
k01 + k02 = k03
k11 + k12 = k13
k03+k13 = kk
color 255,255,255 : boxf : color 0,0,0
pos 10,5
font "",25
mes "" + k03 +"+"+ k13 + "=\n"+kk
}
if ks = 4{
k01 = k01 * 10
k11 = k11 * 10
k01 + k02 = k03
k11 + k12 = k13
k03-k13 = kk
color 255,255,255 : boxf : color 0,0,0
pos 10,5
font "",25
mes "" + k03 +"−"+ k13 + "=\n"+kk
}
}
}
}
stop
*nn
buffer 5
gsel 0
以上のスクリプトで電卓を作ろうとしたのですが、答えが0になってしまいます。
誰かご教授願います。
| |
|
2012/2/12(Sun) 18:51:28|NO.44813
省略されているラベルが無いとよく分かりません。
あと、見た目が長いと思うのならば、
(例)
screen 5
width 300,300
↓
screen 5 :width 300,300
の様にして短く見せれば良いと思います。
|
|
2012/2/12(Sun) 20:37:00|NO.44817
こんな読みづらいスクリプトは読む気にならない。
buttonのジャンプをgosubにして、サブルーチンを組む、
計算結果はそのあとにrepeat〜loop間に入れて繰り返し描画させる。
そして、gosubのラベルを並べてサブルーチンを書く。
これくらいしないとわけが分からなくなる。
あと、質問なら掲示板の質問カテゴリーを選べ。
|
|
2012/2/13(Mon) 02:53:42|NO.44822
勢いで作ってしまいました
これを使うぐらいなら
windows に標準で付いてくる calc.exe を使った方がいいと思います。
#include"user32.as"
#const ISOBJ_NUM 0x00010000 // それが数字Objectである事を表す
#const ISOBJ_CODE 0x00020000 // それが式の符号である事を表す
#const ISOBJ_PROC 0x00030000 // それが固有処理である事を表す
#const ISOBJ_SKIP 0xFFFF0000 // ボタンの位置を位置を計算するが、ボタンは表示しない
#const VKEY_WARU 0xBF // ヴァーチャルキーコード
#const VKEY_KAKE 0xBA
#const VKEY_HIKU 0xBD
#const VKEY_TASU 0xBB
#const VKEY_ENTER 0x0D
#const INLINEBUTTONTOTAL 4 // 一行に有するボタンの数
#const LINETOTAL 4 // 行数
onkey gosub *key
WINSIZE_X=300:WINSIZE_Y=200:MARGIN=5
screen 0,WINSIZE_X,WINSIZE_Y:title"mcalc":syscolor 0x4:boxf //ウィンドウ初期化
px=MARGIN:py=MARGIN:sx=WINSIZE_X-(MARGIN*2):sy=40
objsize sx,sy:pos px,py:txt_mesbox="":mesbox txt_mesbox,,,0:ID_INPUT=stat // MessageBox
py+=MARGIN+sy
sx=(WINSIZE_X-MARGIN*(INLINEBUTTONTOTAL+1))/INLINEBUTTONTOTAL
sy=(WINSIZE_Y-(py+MARGIN*LINETOTAL))/LINETOTAL
cbn'7':cbn'8':cbn'9':cbc"/",VKEY_WARU
cbn'4':cbn'5':cbn'6':cbc"*",VKEY_KAKE
cbn'1':cbn'2':cbn'3':cbc"-",VKEY_HIKU
cbn'0':cbtt "C",ISOBJ_PROC|'C':cbc "=",VKEY_ENTER:cbc "+",VKEY_TASU
stop
// ボタンを配置します
#deffunc cbn int num_ , int add_
cbtt strf("%c",num_),ISOBJ_NUM|num_ , add_:return
#deffunc cbc str tx_ , int prm_
cbtt tx_,ISOBJ_CODE|prm_:return
#deffunc cbtt str txt_ , int dt_ , int add_
#const INLINEBUTTONTOTALM1 (INLINEBUTTONTOTAL-1)
if(dt_&ISOBJ_SKIP)!=ISOBJ_SKIP{
objsize sx,sy:pos px,py:button gosub txt_,*btt
SetWindowLong objinfo_hwnd(stat),0xFFFFFFEB/*GWL_USERDATA*/,dt_}
total+=limit(add_,1,0x7FFFFFFF)
if((total\INLINEBUTTONTOTAL)=0){py+=sy+MARGIN:px=MARGIN}else{px+=sx+MARGIN}
return
*key
if(wparam>='0' and wparam<='9') {calcproc ISOBJ_NUM,wparam}
else:if(wparam=='C') {calcproc ISOBJ_PROC,wparam}
else:if(wparam==VKEY_WARU or wparam==VKEY_KAKE or wparam==VKEY_HIKU or wparam==VKEY_TASU or wparam==VKEY_ENTER){
calcproc ISOBJ_CODE,wparam}
return
*btt
gsel 0:GetWindowLong objinfo_hwnd(stat),0xFFFFFFEB/*GWL_USERDATA*/
calcproc stat&0xFFFF0000,stat&0xFFFF:return
#deffunc calcproc int sign_,int var_
if(sign_==ISOBJ_NUM){
b = txt_mesbox
if(flg_immcalc){b=strf("%c",var_):flg_immcalc=0}else{b+=strf("%c",var_)}
setipt b
}else:if(sign_==ISOBJ_CODE){
if(flg_immcalc==0){
cb=int(beforeinput):cc=int(txt_mesbox)
if(beforecode==VKEY_WARU) {if(cc){ans=cb/cc}else{ans=cb}}
else:if(beforecode==VKEY_KAKE) {ans=cb*cc}
else:if(beforecode==VKEY_HIKU) {ans=cb-cc}
else:if(beforecode==VKEY_TASU) {ans=cb+cc}
else {ans=cc}
beforeinput=str(ans)
flg_immcalc=1
objprm ID_INPUT , beforeinput
}
beforecode = var_
}else:if(sign_==ISOBJ_PROC){
if(var_=='C'):beforeinput=0:beforecode=0:flg_immcalc=0:objprm ID_INPUT,""
}
return
#deffunc setipt str tx_
if(strlen(str(0x80000000))>=strlen(tx_)){objprm ID_INPUT,tx_}return
| |
|
2012/2/13(Mon) 03:36:18|NO.44823
check さんのレスに加えて、
「button でジャンプしたときの stat の値 (そのボタンのオブジェクトIDの値が入る)」
ということもご参考に。
button を使うなら。
散見される「k01 + k02 = k03」のような文は、
おそらく k01 + k02 の値を変数 k03 に代入したいのだと思いますが、
代入文では、変数が = の左側、値が右側でなくてはいけません。
つまり「k03 = k01 + k02」が正しいです。
ちなみに何故エラーにならないかというと、次のようなスクリプト
a + b
は、
a = a + b
という意味の有効なスクリプトだからです。
( + - * / についても同様 )
|
|
2012/2/14(Tue) 19:28:35|NO.44870
いろいろとすみません・・・
まだまだ未熟でした。
catsさん、checkさん、ご指摘ありがとうございます。
ヂオンさん、レノスさん、活用させていただきます。
ありがとうございました!
|
|
2012/2/26(Sun) 01:56:00|NO.45056
初心者です、作ってみました。
難しかったです。
参考になればどうぞ
title "HSP電卓"
//初期設定
Scr_X = 300 : Scr_Y = 200 //ウインドウサイズ
But_W = 54 : But_H = 30 //ボタンのサイズ
clear = 5 //ボタンとボタンの隙間
But_Y = int(Scr_Y-But_H-clear) //ボタン配置Y座標
But_X = int(clear) //ボタン配置X座標
Flag=1 //計算式2度押し禁止フラグ
//画面初期化
cls 0 : width Scr_X,Scr_Y
//ボタンの配置
sdim N_Button,3,20 //配列の初期設定
N_Button = "0","AC","C","+","1","2","3","-","4","5","6","*","7","8","9","/","="
for n,0,16,1
if But_X>=(clear+But_W)*4 { //1行ボタン4つ分で折り返し、行上がり条件
But_X = int(clear)
But_Y = But_Y-But_H-clear
}
pos But_X,But_Y
objsize But_W,But_H
button gosub N_button(n),*B_push
But_X = But_X+clear+But_W //次描画のためボタンX座標をを横に1個ずらす
next
pos But_X,But_Y
objsize But_W,But_H*4+clear*3
button gosub N_button(16),*B_push //=ボタンだけは個別に表示
pos 10,10 :font "",30
mes "0" //初期表示のためのダミー
stop
//ボタンが押されたときの動作
*B_push
h1=double(h1): h4=double(h4): h5=double(h5) //h1,h4,h5を実数型に
h2=N_Button(stat) //ボタンの入力読み込み
h3=int(h2) //ボタン情報を整数として読み込む
if stat==0 or h3>0{h1=h1*10+h3:h4=h1:Flag=0} //数字ボタンが押されたときの動作
else:if h2=="C"{h1=0:h4=h5:if h6=="="{h4=0}} //Cボタンの動作
else:if h2=="AC"{h1=0:h4=0:h5=0:c1=0:Flag=1} //ACボタンの動作
else:if Flag=0{:gosub *calc} //数式ボタンの動作
Decimal = int( h4 * 100000 ) \ 100000 //小数点5桁切捨て&小数点が無い時は整数表示
if Decimal==0{h7 = int( h4 )}
else{h7=str(int(h4))+"."+str(Decimal)}
color 255,255,255 : boxf : color 0,0,0 //mes表示のクリア
pos 10,10: font "",30
mes h7 //入力結果表示
return
//計算
*calc c1=c1+1 //数式ボタンカウンタ
h4=double(h4)
if c1!=1 { //数式ボタン1回目は数式ボタンの情報だけ取得
if h6=="+"{h4=h5+h4} //2回目以降計算を行う
else:if h6=="-"{h4=h5-h4}
else:if h6=="*"{h4=h5*h4}
else:if h6=="/"{h4=h5/h4}
}:Flag=1:h6=h2
if h6=="="and c1>1{:c1=0:h5=0:Flag=0} //=ボタンの動作
h5=h4 :h1=0
return
| |
|