←前頁 | 次頁→ |
---|
その4(16進電卓2)
前回の、16進の足し算をするプログラムを拡張します。キーボードからの
入力を受け付けるようにし、足し算だけでなく引き算・掛け算・割り算もできる
ようにします。
C言語と同じ構文だということをみて頂ければ、「JAVAおそるるに足らず」
と思えることでしょう。
例によってソースファイル名は、calhex2.javaで作ってくださいね。
/** 16進電卓 使い方:java calhex2 16進数 演算子(+,-,*,/) 16進数 @version 1.0,1999/10/03 @author K.Hattori */ import java.io.*; public class calhex2{ public static void main(String[] args){ //ローカル変数定義 String arg1 = "", arg2 = ""; //計算する数字 String enzan = ""; //演算子 +,-,*,/ //キー入力の為には以下の準備が必要 BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); //引数があったそれを計算する if( args.length >= 3){ arg1 = args[0]; arg2 = args[2]; enzan = args[1]; }else{ try{ System.out.print("16進数1->"); arg1 = in.readLine(); for( enzan=""; CheckEnzan(enzan)==false;){ System.out.print("演算子(+,-,*,/)->"); enzan = in.readLine(); } System.out.print("16進数2->"); arg2 = in.readLine(); }catch( IOException e){ System.out.println("入力エラー:" + e.getMessage()); } } //C++のようにその場で変数定義も可 int result = 0; switch( enzan.charAt(0)){ case '+': result = Integer.parseInt(arg1,16) + Integer.parseInt(arg2,16); break; case '-': result = Integer.parseInt(arg1,16) - Integer.parseInt(arg2,16); break; case '*': result = Integer.parseInt(arg1,16) * Integer.parseInt(arg2,16); break; case '/': result = Integer.parseInt(arg1,16) / Integer.parseInt(arg2,16); break; default: System.out.println("演算子異常:" + enzan); return; } //結果出力 System.out.println( arg1 + enzan + arg2 + "=" + Integer.toHexString(result)); } /** 指定された演算子をチェックする @param 演算子文字列 @return +,-,*,/の時はtrue。それ以外はfalse */ static boolean CheckEnzan(String enzan){ if( enzan.equals("+") || enzan.equals("-") || enzan.equals("*") || enzan.equals("/") ){ return true; }else{ return false; } } }制御構造について
- JAVAでは、C言語とほぼ同じ制御構造が使用できます。
- do,while,for,if,else,switch,case文の使い方は同じです。
- ループ制御のcontinue,breakも同様に使用できます。
(JAVAは、若干拡張されていて、2重ループを1回のbreak文で抜ける書き方ができます。)- goto文は使えません。
入出力について
- JAVAでの入出力はちょっと複雑(私も完全に理解していない)
- とくにキー入力は、いろんな過程を経て BufferdReaderのクラスを作成しなければなりません。
- (JAVAはUnicodeを扱うので入力を何段階にもする必要があるらしい。)
- 入出力関係のプログラムは、頭で import java.io.*; が必要です。
- 入出力のロジックは、例外IOExceptionをcatchする必要があります。
- とりあえず例文をそのまま使ってください。
演算子について
- 演算子もC言語とほぼ同じものが使用できます。
- ++、--、+=等の代入演算子、論理(&&、||、==、!=)、ビット(&、|、!、^) 等々が使えます。
- JAVAにはポインタはないので ポインタ関連の演算子は使えません。
(->とか、ポインタ型にする & とか、ポインタの内容を表す * とか)- 型変換(cast)は使えますが、C言語より制限が厳しい(らしい)。
文字列の扱いについて
- String型は、実際はクラスなので、C言語のchar* と同じようには扱えません。
- 文字列の比較には、== ではなく、equals()メソッドを使用します。
(このほかにも、compareTo()などのメッソドもあり、使い分けはまだよくわからない)- case文には、Stringは書けないので、文字を比較するときはchar型の定数を書きます。
- String型から特定の位置の文字の値(char型)を求めるのが、charAt()メッソドです。
変数の宣言について
- C++と同様に、変数はどの位置でも定義できます。
- 変数は、宣言と同時に初期化もできます。
- C++と同様に変数は宣言されたブロック内でしか有効でありません。
- if文のブロック内で宣言された変数は、if文の外では無効になってしまいます。
- try-catch構文の中で変数を定義する場合は、特に注意。
- JAVAの例題を見ていると、変数は使う直前に定義するのが普通らしい。
(関数の頭で全部定義するという考えは古いのかも)- JAVAに限らないけど、変数定義がやたら多いプログラムはバグも多いので (新人のプログラムはその傾向が強い)変数は少なく使ってください。
サブルーチンについて
- 上記例題では、CheckEnzan()というサブルーチンを定義していますが、 この方法は、JAVAとしてはよくありません。
(処理を分離するという意味では正しい)- オブジェクト思考を貫くのならば、Stringクラスを拡張して演算子クラスを 定義し、そのメソッドとして定義すべきです。
ポインタ:
←前頁 次頁→
- C言語を学ぶものが一度はつまづく難解な概念。
- 狩猟犬の一種。獲物を指し示す(ポイントする)能力に長けている ところから付いた名。C言語のポインタも犬の一種だと思えば分かり易い???