16進電卓を作ってみよう3

   2012/05/08

慣れないうちは、「自分の作ったプログラムが正しいのだろうか?」
「一応動いたけれど、これでいいのだろうか?」と悩んだりします。

毎度、管理人イガジーです。

狙ったとおりに動けば、それは正しいプログラムです。
少しくらい冗長でも、もっと上手な書き方があるかもしれないと思っても
まずは正しい結果が出るプログラムを作りましょう。

動いてナンボ。いくら壮大な構想を描いても、動かないプログラムは
(あるいは未完成のプログラムは)価値がありません。
まずは正しく動くようにしてから、細部を悩みましょう。
経験を積めば、だんだんきれいなコード(プログラム)が書けるようになりますからね。

さて、今日は「ハリボテの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

この記事へのコメントはこちら

メールアドレスは公開されませんのでご安心ください。
また、* が付いている欄は必須項目となりますので、必ずご記入をお願いします。

内容に問題なければ、下記の「コメント送信」ボタンを押してください。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)