|
|
|||||||||||||||||||||||||||||
| サンプルプログラム(電卓) |
H.Kamifuji . |
|
今までの復習も兼ねて簡単な電卓を作ってみましょう。 当ページでは、Linux CentOS7 の Gnome で動作テストしています。 現在(2021/08)では、JDK-16.0.2 にアップされています。一部、上位互換について、見直しを行っていきます。 現在(2021/11)では、JDK-17.0.1 にアップされています。一部、上位互換について、見直しを行っていきます。 現在(2023/04)では、JDK-20.0.1 にアップされています。一部、上位互換について、見直しを行っていきます。 現在(2024/10)では、JDK-23 にアップされています。一部、上位互換について、見直しを行っていきます。 |
|
|
|
では簡単な電卓を作っていきます。プログラムの実行時に指定した計算式をプログラム側で計算して結果を表示するようにしましょう。 プログラムの実行時に指定する引数は3つにします。数字、演算子、数字の3つです。例えば「java dentaku 4 * 10」のような感じにしてみましょう。まずは引数の処理だけを行うプログラムを作成します。 サンプルプログラム下記のサンプルを実行してみよう。
class dentaku1{
public static void main(String args[]){
int val1 = 0; /* 最初の数字 */
int val2 = 0; /* 次の数字 */
String ope; /* 演算子 */
if (args.length != 3){
System.out.println("Usage : java dentaku 数値 演算子 数値");
System.out.println("演算子は kake waru tasu hiku の4つです");
System.exit(0); /* プログラムを終了する */
}
val1 = Integer.parseInt(args[0]);
val2 = Integer.parseInt(args[2]);
ope = args[1];
System.out.println("入力された式は " + val1 + " " + ope + " " + val2 + " です");
}
}
上記では実行時に入力された値を取り出し、画面に表示しているだけです。数字に該当する1番目と3番目の引数の値は、数値型の値に変換して変数に格納しています。 今まで出てこなかった「System.exit(0)」という文があると思います。この文を実行するとプログラムがそこで強制的に終了となります。上記ではプログラムの実行時に引数が3個で無かった場合は、使い方を画面に表示した上で強制終了しています。 演算子の部分には"* / + -"の4つを使いたかったのですが、コマンドプロンプト上で"*"は特別な意味を持っているので、"kake"、"waru"、"tasu"、"hiku"の4つにしました。 実行結果は下記のようになります。 [xxxxxxxx@dddddddddd Sample1]$ javac dentaku1.java [xxxxxxxx@dddddddddd Sample1]$ java dentaku1 2 kake 8 入力された式は 2 kake 8 です [xxxxxxxx@dddddddddd Sample1]$取り合えず入力された値だけは取り出しましたので、次は演算子が正しいかどうかをチェックします。 |
|
次に入力された2番目の引数である演算子が"kake"、"waru"、"tasu"、"hiku"のどれかであるかをチェックして、違っていたら使い方を再度表示してプログラムを終了させてみます。
class dentaku2{
public static void main(String args[]){
int val1 = 0; /* 最初の数字 */
int val2 = 0; /* 次の数字 */
String ope; /* 演算子 */
if (args.length != 3){
System.out.println("Usage : java dentaku 数値 演算子 数値");
System.out.println("演算子は kake waru tasu hiku の4つです");
System.exit(0); /* プログラムを終了する */
}
val1 = Integer.parseInt(args[0]);
val2 = Integer.parseInt(args[2]);
ope = args[1];
boolean errFlag = true;
if (ope.equals("kake")){
errFlag = false;
}
if (ope.equals("waru")){
errFlag = false;
}
if (ope.equals("tasu")){
errFlag = false;
}
if (ope.equals("hiku")){
errFlag = false;
}
if (errFlag == true){
System.out.println("演算子は kake waru tasu hiku の4つです");
System.exit(0); /* プログラムを終了する */
}
System.out.println("入力された式は " + val1 + " " + ope + " " + val2 + " です");
}
}
演算子のチェックの仕方は色々考えられますが、一番分かりやすい書き方をしてみました。if文をまとめてしまって下記のように記述してもいいかと思います。
boolean errFlag = false;
if (!ope.equals("kake")){
if (!ope.equals("waru")){
if (!ope.equals("tasu")){
if (!ope.equals("hiku")){
errFlag = true;
}
}
}
}
if (errFlag == true){
System.out.println("演算子は kake waru tasu hiku の4つです");
System.exit(0); /* プログラムを終了する */
}
又はif文の条件式の中にまとめて記述してしまう手もあります。
boolean errFlag = true;
if (ope.equals("kake") || ope.equals("waru") || ope.equals("tasu") || ope.equals("hiku")){
errFlag = false;
}
if (errFlag == true){
System.out.println("演算子は kake waru tasu hiku の4つです");
System.exit(0); /* プログラムを終了する */
}
上記の場合はif文の中でどれかの文字列比較が正しかった場合にはエラーでは無いということになります。 又は配列を使って下記のように記述してもいいです。
String opeStr[] = {"kake", "waru", "tasu", "hiku"};
boolean errFlag = true;
for (int i = 0 ; i < 4 ; i++){
if (ope.equals(opeStr[i])){
errFlag = false;
}
}
if (errFlag == true){
System.out.println("演算子は kake waru tasu hiku の4つです");
System.exit(0); /* プログラムを終了する */
}
今回は最後の配列を使う方法を使ってみましょう。 サンプルプログラム下記のサンプルを実行してみよう。
class dentaku2{
public static void main(String args[]){
int val1 = 0; /* 最初の数字 */
int val2 = 0; /* 次の数字 */
String ope; /* 演算子 */
if (args.length != 3){
System.out.println("Usage : java dentaku 数値 演算子 数値");
System.out.println("演算子は kake waru tasu hiku の4つです");
System.exit(0); /* プログラムを終了する */
}
val1 = Integer.parseInt(args[0]);
val2 = Integer.parseInt(args[2]);
ope = args[1];
String opeStr[] = {"kake", "waru", "tasu", "hiku"};
boolean errFlag = true;
for (int i = 0 ; i < 4 ; i++){
if (ope.equals(opeStr[i])){
errFlag = false;
}
}
if (errFlag == true){
System.out.println("演算子は kake waru tasu hiku の4つです");
System.exit(0); /* プログラムを終了する */
}
System.out.println("入力された式は " + val1 + " " + ope + " " + val2 + " です");
}
}
上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd Sample1]$ java dentaku2 5 kakeru 8 演算子は kake waru tasu hiku の4つです [xxxxxxxx@dddddddddd Sample1]$次は数値のチェックを行います。 |
|
次に入力された1番目と3番目の引数が数値かどうかをチェックします。 引数で文字列として渡されたきた値を数値型の変数に格納する時に下記の処理を行っていましたが、もしこの値が数値を表すような文字列でなかった場合は"例外"というものが発生します。 int val1 = 0; /* 最初の数字 */ int val2 = 0; /* 次の数字 */ val1 = Integer.parseInt(args[0]); val2 = Integer.parseInt(args[2]);前回のサンプルを使って、数値以外の値を入力してみましょう。 [xxxxxxxx@dddddddddd Sample1]$ java dentaku2 go kakeru 8 Exception in thread "main" java.lang.NumberFormatException: For input string: "go" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) at java.lang.Integer.parseInt(Integer.java:580) at java.lang.Integer.parseInt(Integer.java:615) at dentaku2.main(dentaku2.java:13) [xxxxxxxx@dddddddddd Sample1]$ 上記のように、数値の形式をしていない文字列を、数値型の値に変換しようとした場合は、これは数値に変換できないよ、というエラー表示が出るわけです。問題となるのは、このエラー表示はプログラムを作っている人には分かりますけど、利用者の方はこのエラーが出てもチンプンカンプンだということです。 そこで、このエラー(正確には例外が発生したと言うのですけど、あまり気にしないで下さい。例外については別途詳しく見ていきます)が発生したら、この表示が出てプログラムが強制終了する前に、こちらの意図した表示を行うように変更してみましょう。
try{
val1 = Integer.parseInt(args[0]);
val2 = Integer.parseInt(args[2]);
}catch(NumberFormatException e){
System.out.println("Usage : java dentaku 数値 演算子 数値");
System.out.println("数値でない値が入力されています");
System.exit(0); /* プログラムを終了する */
}
詳しい"例外"の説明は改めて行いますので、ここではこんな感じなんだということだけ見ておいて下さい。何か例外が起こりそうな処理を"try"と"catch"の間に記述します。そして、発生するであろう例外名(ここでは先ほどの実験で見たとおりNumberFormatExceptionという例外が発生する可能性があります)を"catch"の後に記述して、その後の"{"と"}"の間に例外が発生した時の処理を書いておきます。ではこの処理をサンプルに追加して見ます。 サンプルプログラム下記のサンプルを実行してみよう。
class dentaku3{
public static void main(String args[]){
int val1 = 0; /* 最初の数字 */
int val2 = 0; /* 次の数字 */
String ope; /* 演算子 */
if (args.length != 3){
System.out.println("Usage : java dentaku 数値 演算子 数値");
System.out.println("演算子は kake waru tasu hiku の4つです");
System.exit(0); /* プログラムを終了する */
}
try{
val1 = Integer.parseInt(args[0]);
val2 = Integer.parseInt(args[2]);
}catch(NumberFormatException e){
System.out.println("Usage : java dentaku 数値 演算子 数値");
System.out.println("数値でない値が入力されています");
System.exit(0); /* プログラムを終了する */
}
ope = args[1];
String opeStr[] = {"kake", "waru", "tasu", "hiku"};
boolean errFlag = true;
for (int i = 0 ; i < 4 ; i++){
if (ope.equals(opeStr[i])){
errFlag = false;
}
}
if (errFlag == true){
System.out.println("演算子は kake waru tasu hiku の4つです");
System.exit(0); /* プログラムを終了する */
}
System.out.println("入力された式は " + val1 + " " + ope + " " + val2 + " です");
}
}
上記をコンパイルした後で実行すると次のように表示されます。[xxxxxxxx@dddddddddd Sample1]$ java dentaku3 5 kake 6 入力された式は 5 kake 6 です [xxxxxxxx@dddddddddd Sample1]$ java dentaku3 5 kake roku Usage : java dentaku 数値 演算子 数値 数値でない値が入力されています [xxxxxxxx@dddddddddd Sample1]$上記のように数値ではない値が入力された場合でも、先ほどのようにエラーコードがだらだらと表示されずに、こちらの意図した表示だけが行われてプログラムが終了しています。 では最後に計算結果を表示させてみましょう。 |
|
では最後に計算結果を表示させてみましょう。 注意する点としては、割り算をする時に、割る方の数が0ですとエラーが発生しますので、それをチェックしています。また色々なチェックをして何か合った場合にエラー表示をしてプログラムを終了させる部分はメソッドにまとめてみました。 下記が完成版です。 サンプルプログラム下記のサンプルを実行してみよう。
class dentaku4{
public static void main(String args[]){
int val1 = 0; /* 最初の数字 */
int val2 = 0; /* 次の数字 */
String ope; /* 演算子 */
int kekka; /* 結果を格納 */
if (args.length != 3){
errDisp("引数は3個入力して下さい");
}
try{
val1 = Integer.parseInt(args[0]);
val2 = Integer.parseInt(args[2]);
}catch(NumberFormatException e){
errDisp("数値でない値が入力されています");
}
ope = args[1];
String opeStr[] = {"kake", "waru", "tasu", "hiku"};
boolean errFlag = true;
for (int i = 0 ; i < 4 ; i++){
if (ope.equals(opeStr[i])){
errFlag = false;
}
}
if (errFlag == true){
errDisp("演算子は kake waru tasu hiku の4つです");
}
if (ope.equals("kake")){
kekka = val1 * val2;
}else if (ope.equals("tasu")){
kekka = val1 + val2;
}else if (ope.equals("hiku")){
kekka = val1 - val2;
}else{
if (val2 == 0){
errDisp("0 で割ろうとしました");
}
kekka = val1 / val2;
}
System.out.println("入力された式は " + val1 + " " + ope + " " + val2 + " です");
System.out.println("計算結果は " + kekka + " です");
}
private static void errDisp(String errStr){
System.out.println("Usage : java dentaku 数値 演算子 数値");
System.out.println(errStr);
System.exit(0); /* プログラムを終了する */
}
}
上記をコンパイルした後で実行すると次のように表示されます。[xxxxxxxx@dddddddddd Sample1]$ java dentaku4 2 kake 8 入力された式は 2 kake 8 です 計算結果は 16 です [xxxxxxxx@dddddddddd Sample1]$ java dentaku4 15 tasu 98 入力された式は 15 tasu 98 です 計算結果は 113 です [xxxxxxxx@dddddddddd Sample1]$ java dentaku4 43 hiku 25 入力された式は 43 hiku 25 です 計算結果は 18 です [xxxxxxxx@dddddddddd Sample1]$ java dentaku4 89 waru 15 入力された式は 89 waru 15 です 計算結果は 5 です [xxxxxxxx@dddddddddd Sample1]$ java dentaku4 89 waru 0 Usage : java dentaku 数値 演算子 数値 0 で割ろうとしました [xxxxxxxx@dddddddddd Sample1]$あまり使い道がなさそうなプログラムではありますけど、全てのプログラムはこういった簡単なプログラムをより複雑にしていったものになります。何か1つでも簡単なサンプルが作れるようになっているかどうかは大きな違いだと思いますので、これまでの復習もかねて何か是非作ってみて下さい。 |
|