スタッフブログ

【速攻Program】第10回_電卓の四則演算

投稿日:

皆さん、こんにちは!社員のBです。

今日は一か月振りの投稿です。更新が止まってしまい申し訳ございませんでした!
また一から気合入れて投稿していこうと思います。

さて電卓の作成ですが、前回までで数値の入力ができる状態となっていると思います。
しかし[ 00 ]ボタンと[ = , 四則演算 ]ボタンの挙動がおかしいのではないでしょうか?

[ 00 ]ボタンを押下すると[ 0 ]としか入力されず本来の機能を満たしていません。
また、[ = , 四則演算 ]ボタンをについても一発目に入力をした場合に表示されてしまう為、
そのあたりについても修正を行う必要がありそうですね

それが終わったらついに四則演算の機能を入れていきたいと思います。
電卓の根幹となる機能であるため、ベースをきっちり決めていかなくてはいけません。

まずは、[ 00 ]ボタンの正確な状況を整理しましょう。
私が確認したところ、1回目のボタン押下には反応してないように見えてました。
しかし、二回目から打てるようになっており、0の後ろに000・・・・と続く様でした。
また数値の後に入力しても0としか反応しないため、機能部分と処理部分両方とも修正する必要がありそうですね。

なぜこのようなことになってしまっているかというと確かにボタンでは[ 00 ] と表示をしてますが、
これを数値に直したときに、 00 = 0 → 0 とコンピュータが機転を利かせてくれているわけです。

これは頭に0がいくつあろうと同じなのですが、0を連打した時には [ 000… ]と表示されます。
これは数値から文字列に変換を行っているから "0" + "0" = "00"ということになります。
その処理を書いているのが以下の部分です。(1回目の入力を行う際の数値側の処理)

if(i >= 0){textField.setText(String.valueOf(i));}
String.valueOfは後ろのカッコ内(今後引数と言います。)に入る数値を文字に変換をしてくれる役割(今後関数と言います。)をしてくれています。
このString.valueOf関数の引数は必ず数値(実数、整数両方とも可能)でないといけません。

[例]
String.valueOf(2021) => "2021"

なぜこのような処理をしているかというとtextField.setText関数の引数は必ず文字列でないといけないからです。
[例]
textField.setText(2021) => 引数が数値のため、コンパイルエラー
textField.setText("2021") => 正常にコンパイル可能

この様に引数には入れられるデータ型が決まっておりうまくその型に当てはめてあげる必要があります。
この変換を行う事をキャストと言います。
おいおい学習しますが、以下の処理も同じような考え方で数値を取得しています。

btn_Click関数でボタンが何を押されたか判定しているのですが、
引数にある(ActionEvent e)のeという部分にボタンに関する様々な情報が格納されており
その中からgetActionCommand()というメソッドを使用してボタンに表示されている文字列を取得しています。
ここでは変数の役割とメソッドの役割を簡単に説明しておきます。

この写真の5行目に登場する[ i ]は整数を格納できるint型の変数です。
i には 整数型しか入らないため、getActionCommand(string型)を直接入れることはできません。
そこで、文字列を数値に変えてあげる必要があります。
そのため。Integer.parseInt(カッコ内は文字列型を指定)というメソッドを使用して文字列を数値にしているわけです。
取得した文字を数値としてiに代入しているのがこの5行目の処理となるのです。
上記で説明した00が0になってしまうのはここが原因です。
ただここを直すとなるとブログ的に相当面倒なこととなりそうなので今回はスルーさせてください。

次にこの写真の10行目のsymbolですがこれは文字が入るchar型となります。
今度はボタンを取得した際に文字を取得して1文字であればsymbolに代入をしています。

上記のプログラムから、テキストフィールドに数値が表示されるようになっています。

とりあえず上の写真で全てを[ . ](ドット)以外の文字の入力をreturnさせることで入力ができないようになりました。

それでは四則演算部分を入れていきましょう使用する変数は以下になります。

まず、申し訳ないですがライブラリにいらないのまで含まれておりますが、今回はこのまま進めさせてもらおうと思います。
変数を順番に説明させていただきます(記載順)。
JTextField とは 文字を表示させるためのテキストフィールド(今回で言う文字を表示している部分)です。
ここではCalculatorFormクラスのテキストフィールドを呼び出し、変数textFieldに代入しています。
次にboolean isFirstとsymbolFlagですが、booleanは真偽値を取る型です。
真偽値とは、[はい, いいえ] , [Yes, No]などのわかりやすく言うならスイッチのようなものです。
ここではフラグとして使用しています。
isFirstは入力が1文字目かどうかの判定に使用しています。
symbolFlagは演算子が入力された際にフラグを立てて再入力を制限するために作っています。

次にint num1,num2ですがこれは、入力された文字を保持しておくための変数です。
便宜上 int num1,num2=0;と記載しておりますが、
int num1 = 0;
int num2 = 0;
と全く同様の意味となります。
int i については前述したとおりボタン入力が数値だった場合に格納される変数です。
char symbol についても先程説明しました演算子や小数点を代入する為に作成しています。

つぎにenumというものを使用しています。
これは列挙型というもので今回はこんなものがあるんだなくらいに思っていただければ大丈夫です。

使い方としては、プルダウン的な選択肢が複数個ある時に処理を分ける際に使用したりします。
今回は演算子の計算部分をわかりやすくするために使用してます。

変数の宣言については以上です。
続いて2文字目以降の処理についてみていきましょう。

まず2文字目以降の処理に入ってきたら入力が文字列なのか数値なのかをif文で見ています。
if(symbol != '?' && i == -1)
これはsymbolが'?'ではなく(symbolに何か代入された状態)かつiが-1である場合(数値は入力されていない)の処理を表しています。
つまりは文字列が格納されている状態の事です。
処理に入るといきなりswitch文にぶち当たります。ちなみにスイッチは複数の選択肢によって処理を分ける制御構文です。
switchの後ろの()の中に記載されているのが条件です。今回はsymbolの中身は何かを見ています。
次にsymbolの中に入る文字で処理を振り分けます。その場合にはcase 条件 : break;で記載します。
因みにbreak;はここの処理はここまでです的な感じです。

一番最初が[ . ]の時の処理です。
この時テキストフィールドに[ . ]がある場合には処理を行わないようにしてあげる必要があるためindexOf関数で判定をしています。
indexOf関数は引数で指定した文字列を検索することができ、引っかかった場合のみその文字位置を数値で返してくれます。
検索に引っかからない場合は-1を返すため、-1だった場合は[ . ] がないと考えてテキストフィールドに[ . ]を追加しています。

次に各演算子を押した際の処理です。

中身はほぼ同じ内容となってますのでADD(+)のなかみのみ説明させていあ抱きます。
status = Status.ADDは最初に宣言した列挙型でstatusをADDの状態にしています。
これは計算を行う際に必要となるためここで処理を行っています。
num1に現在のテキストフィールドの文字列を数値化して代入しています。
これも計算を行う際に必要となります。
次の数値を一番最初の文字として読み込むようにisFirstをtrueとして、symbolFlagを折ります。
これで演算子を押された際にnum1に数値を残しつつ初期状態に戻り、かつ演算子の入力を規制しています。

最後にイコールを押した際の処理です。

ここではイコールが押されたらすぐにnum2にテキストフィールドの文字列を数値化して代入しています。
次のスイッチ文では先ほど記録しておいたstatusを使用して処理を分けています。
statusがADDだった場合は足し算を行い、SUBだった場合は引き算を行います。
それを再度num1に格納して最後にテキストフィールドに表示させることで電卓として四則演算ができています。
最後に次の計算を連続でできるようにsymbolFlagを折って処理を終わらせます。

これでだいぶ電卓に近くなったのではないでしょうか?
今回の内容はかなり難しかったかもしれませんが、キャストなどはかなり使うので、
早めに覚えておくことをオススメします。

長くなってしまいましたが、今回はここまでにします。
今日は資格取得制度についてです。

 

「資格取得制度」について

ウインズでは「資格取得制度」をご用意し、IT・エンジニア系の対象資格の取得を目指す方に受験費用負担(※同一資格の場合は初回受験時のみ)、また資格を取得された方には「報奨金」の支給をしています。ご自身のスキルアップに、ぜひご活用ください。
尚、報奨金の支給対象となる条件については以下のとおりとなります。
・当社に入社後、申請手続きを経て受験・取得された方

 

認定機関資格名称報奨金
情報処理推進機構(IPA)プロジェクトマネージャ試験
ITサービスマネージャ試験
ネットワークスペシャリスト試験
データベーススペシャリスト試験
情報処理安全確保支援士試験
応用情報技術者試験
情報セキュリティマネジメント試験
基本情報技術者試験
ITパスポート試験
70,000
70,000
70,000
70,000
70,000
30,000
20,000
15,000
5,000
シスコ技術者認定(Cisco)CCNP(Cisco Certified Network Professional)
CCNA(Cisco Certified Network Associate)
50,000
30,000
NTTコミュニケーションズドットコムマスター・アドバンス(★★)
ドットコムマスター・アドバンス(★)
15,000
10,000
LPI-Japan
LinuC-3 (レベル3)
LinuC-2 (レベル2)
LinuC-1 (レベル1)
50,000
30,000
15,000
Linux Professional Institute(LPI)LPIC-3
LPIC-2
LPIC-1
50,000
30,000
15,000

次回はバグを簡単に直して、その次の回では変な機能を付けたいですね。
では、今回もお疲れ様でした!

Copyright© 株式会社ウインズ SES・ITアウトソーシング事業 , 2024 All Rights Reserved Powered by AFFINGER5.