HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
0212
tolt電卓作成に苦戦。6解決


tolt

リンク

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になってしまいます。
誰かご教授願います。



この記事に返信する


cats

リンク

2012/2/12(Sun) 18:51:28|NO.44813

省略されているラベルが無いとよく分かりません。
あと、見た目が長いと思うのならば、
(例)

screen 5 width 300,300


screen 5 :width 300,300
の様にして短く見せれば良いと思います。



check

リンク

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
という意味の有効なスクリプトだからです。
( + - * / についても同様 )



tolt

リンク

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



ONION software Copyright 1997-2023(c) All rights reserved.