16進電卓を作ってみよう3
慣れないうちは、「自分の作ったプログラムが正しいのだろうか?」
「一応動いたけれど、これでいいのだろうか?」と悩んだりします。
毎度、管理人イガジーです。
狙ったとおりに動けば、それは正しいプログラムです。
少しくらい冗長でも、もっと上手な書き方があるかもしれないと思っても
まずは正しい結果が出るプログラムを作りましょう。
動いてナンボ。いくら壮大な構想を描いても、動かないプログラムは
(あるいは未完成のプログラムは)価値がありません。
まずは正しく動くようにしてから、細部を悩みましょう。
経験を積めば、だんだんきれいなコード(プログラム)が書けるようになりますからね。
さて、今日は「ハリボテの16進電卓」に処理を入れていきます。
まずは数字キーですが、昨日紹介したような数字キーボタン(nBtn)を
格納することにします。
ただ、他のボタンもあるので、数字キーならnBtnを、それ以外は通常のButtonを
入れるようにしてみましょう。
その判定用に配列を用意します。
int fn[]={
10,11,12,13,
7, 8, 9,14,
4, 5, 6,15,
1, 2, 3,-1,
0,-2,-3,-4
};
これはキーのラベル配列の
String lb[]={
"A","B","C","D",
"7","8","9","E",
"4","5","6","F",
"1","2","3","CLR",
"0","+","-","="
};
に対応させています。
0以上なら数字キー(nBtn)で、マイナスなら機能(演算)キーとします。
こうすると、Panel keysに格納する部分は
for (int i=0;i<20;++i) {
if (fn[i]>=0) btn[i]=new nBtn(lb[i],fn[i]);
else {
btn[i]=new Button(lb[i]);
}
btn[i].setFont(fmid);
keys.add(btn[i]);
}
という風に書けます。
動かしてみると、数字キーを押せば表示エリアにそれっぽく
表示されると思います。
ただ、[A]を押すと、10が、[B]を押すと11が入ったりしますし
[CLR]キーに処理が入っていないので消せません。
数字キーも、10進数状態なら「10倍して足す」で済みますが
16進数状態の時には、16倍して足す必要があります。
表示も、16進数状態の時は、Integer.toHexString()を使うように
しなければなりません。
と、少し動くと、「うわぁ、あれもこれも対処しなきゃ(大変だ)」と
パニックになるかもしれませんが、落ち着いてひとつずつ片付けてゆきましょう。
まず、10進数状態か、16進数状態か、を示す変数 radix を用意します。
int radix=10;
結果表示は次のような関数にしてみます。
void display(){
String rs;
if (radix==10) rs=Integer.toString(result);
else rs=Integer.toHexString(result).toUpperCase();
dsp.setText(rs);
}
そして、nBtn では「10倍して足す」のではなく、「radixを掛けて足す」に
改良します。また、[A]〜[F]キーは、10進数状態の時は「何もしない」ように
(逆に言うと、16進数状態の時だけ処理をするように)します。
class nBtn extends Button implements ActionListener {
private static final long serialVersionUID = 1L;
int nn;
nBtn(String lb,int v){
super(lb);
nn=v;
this.addActionListener(this);
}
@Override
public void actionPerformed(ActionEvent e) {
if ((radix==16)||(nn<10)) {
result=result*radix+nn;
display();
}
}
}
この例では、nBtnで[0]〜[9]も[A]〜[F]も処理していますが
[A]〜[F]は別のクラスにしてしまう手もあります。
(分けると、(nn<10)の判定が不要になるぶん簡単になりますが、
Panel keysに格納する時の条件が増えるので、好き好きです。)
今日は素材の提供だけで、全コードはあえて掲載しません。
ぜひ、自分でトライしてみてください。
明日は、[CLR]キーの処理と10進←→16進の切り替え(ラジオボタンの
ItemListener)を組み込み、全コードを掲載する予定です。
16進電卓を作ってみよう1
16進電卓を作ってみよう2
16進電卓を作ってみよう3(this)
16進電卓を作ってみよう4
16進電卓を作ってみよう5
16進電卓を作ってみよう6
16進電卓を作ってみよう7
16進電卓を作ってみよう8
16進電卓を作ってみよう9
この記事へのコメントはこちら