2000年11月20日 月曜日 午前 12:48:37
A-takは悩んだ。
「いれたてJAVA」をテキストに進めていくのはいいが、それをWebに公表していいものかと?
この本は著者の著作物である。これを勝手にWebに載せるわけにはいかんわけである。まあ、文章をそのまま載せているわけではないのだが、前回のソースはほぼ同じだし(あの内容は他の書き方はないぐらいシンプルではあったけど)。
そんなわけで、ちょっと考えた。
・基本は「いれたてJAVA」をテキストにしてA-takは学習を進めていく
・いれたてJAVAで引っかかった点は細かく説明していく
・逆にいれたてJAVAを読めば分かるようなことは説明しない
・例題はA-takが新たに考える
これで、行くことにしよう。
A-takとしては、例題を考えて説明できれば「ちゃんと理解できている」ということになるので、重要なのだな。
前回で、なんとかコマンドプロンプトから実行して結果が表示されるプロクラムを実行するまでできた。
予告ではアプレットやウィンドウのプログラムをやる予定であったが、これはJAVAクラスライブラリやオブジェクト指向を理解してからの方が良いと思ったので、今回はやめる。
A-takもソースの内容を説明できない。
ようするに、「ちゃんと理解できていない」ってことです。
そんなわけで・・・いきなり予定変更!!
まずは、プログラムの基本的なところから行きましょう。
どのようにしてプログラムが作られていくのか、今までプログラムをやったことない人にはさっぱりわからないでしょうから。
A-takは考えました。
例題と言ってもそう簡単には出てこないっすから。会社でたばこ休憩しながらも考えた結果、「一日に吸うたばこの本数と日数を設定して、それだけで合計何本吸って、いくらたばこ代がかかってしまうのか、わかっちゃうとたばこも控えめになるかも!?」ということで、名付けて「禁煙支援プログラム2000」!!。これを例題とすることにします。
これぐらいならまあ、計算機使えば計算できるけど、やってみましょうか?
A-takは一日3本たばこを吸うとして、それを一週間で換算してみましょ。たばこは一箱20本入りで260円です。
((3×7)÷20)×260
かけ算わり算のところは前から計算するのでカッコは必要ないけど、わかりやすくするために付けてみました。
これをJAVAプログラムにすると・・・
public class Doriru {
public static void main(String args[]) {
int cost;
cost = ((3 * 7) / 20) * 260;
System.out.println(cost);
}
}
プログラムは基本的に上から順番に実行されますんで、上から説明します。
計算ドリルと言うことで「Doriru」というクラス名にしてます(綴りがあっているかは不明(*^_^*))
二行目はお約束の行です。
三行目でcostという変数を定義しています。変数というのはデータを記憶しておく、箱のようなものです。箱の名前はある程度自由に決められますので、今回はたばこ代ということでcostという変数名にして、中にはたばこ代のトータル金額を入れることにします。
intというのは変数の型を整数型にする指定です。intで指定すると小数点のある数値は入れられません。小数点を含む場合は実数型のdoubleを指定します。
じゃあ、doubleで指定した場合は1とか4とかの整数は入れられないのかというと、それも入ります。「じゃあ、全部doubleにすればいいじゃん」と思うかもしれませんが、double型は小数点やかなり大きい数字を扱える代わりに、コンピューターの負荷も大きいのです。メモリは整数型に比べると多く消費するし、計算も遅くなります。だから、整数しか使わない場合はintにしておいた方がいいわけです。
四行目で変な式が出てます。
cost = ((3 * 7) / 20) * 260
「普通、"="は右なんじゃない?あんた常識無いの?」と思わないように(*^_^*)。
この"="は数学の"="とは意味が違うんだな。これは「代入する」という意味を表しているのだな。これの場合は「右辺の計算式の結果をcostという変数に入れなさい」ということを意味してます。
あ、ちなみに"*"は"×"で"/"は"÷"のことですぜ。さらに、この"/"は小数点が出たら切り捨てて、整数にしてしまうみたいです。余りの出し方や小数点まできっちりだす方法はいずれ紹介すると思います。
五行目では四行目でcostに代入された計算結果を表示しています。
こんな感じです。これを第一回の手順でコンパイルして実行すれば、結果の「260」が画面に表示されます。
ん?
260?
それはおかしいんじゃないかい?だって、タバコは一週間で21本吸っているわけで、二箱目を購入しているはずではないか!
そう、このプログラムには間違いがあります。まあ、これも仕様ミスとでもいうのでしょうか(笑)。本職の人がこんな間違いしたら恥ずかしいよな~たぶん。
正解
public class Doriru {
public static void main(String args[]) {
int cost;
cost = (((3 * 7) / 20)+1) * 260;
System.out.println(cost);
}
}
なんで、+1が入っているかというと、たばこは最初に購入した段階でお金を払います。全部20本吸い終わって金を払う物じゃないので、先に+1して正しく金額が出るようにしています。試しに+1しないで計算するとわかるでしょう。
たとえば、一日一本で計算すると一週間で七本、それを20で割って、箱数を計算すると1を下回ってしまう。"/"で計算すると小数点以下は切り捨てるので、結局一箱も買ってないことになり、金額も0。
どうりで、金額がおかしかったわけだ(笑)。
さっきのプログラムを機能強化して、次の週には累計でたばこ代がいくらになるのか?も同時に出してみるぞ。
public class Doriru2 {
public static void main(String args[]) {
int cost;
cost = (((3 * 7) / 20)+1) * 260;
System.out.println(cost);
cost = (((3 * 14) / 20)+1) * 260;
System.out.println(cost);
}
}
これでもいいけど、これだとたとえば、最初の結果を一週間後じゃなくて二週間後に変えたいときは、その下は三週間後の結果を出すことになるので、14を21に変える、というようにあちこち修正しないといけない。
もっと変数を使いまくって、このプログラムを改造する。
名付けて「ドリル2改」
public class Doriru2kai {
public static void main(String args[]) {
int cost;
int honsu;
int day;
int price;
honsu = 3;
day = 14;
price = 260;
cost = ((honsu * day) / 20) * price;
System.out.println(cost);
cost = ((honsu * (day + 7)) / 20) * price;
System.out.println(cost);
}
}
新たに変数を3つ追加してみた。
honsuは一日に吸うたばこの本数で、dayは何日後という日数を記録する変数。priceはたばこ一箱の価格を入れておく。
こうしておけば、一カ所それぞれの変数に代入している部分を変更するだけで、プログラムをあちこち修正しなくても良い。国が喫煙者に厳しくなって税率が上がりたばこの値段が変われば、priceの行を変更すればいいし、三週間後の結果と次の週の結果を知りたければ、dayを21に変えるだけでいい。次の週の日にちは(day
+ 7)という風に7日足して自動で計算してくれる。同じ要領でさらに次の週の結果を表示することも可能だ。
ただ、honsuかdayに0を入れないように。0に対して割り算することになるので、たぶんエラーが出ます。
(本来は0が入ってる場合の処理も作るべき。それは「エラー処理」ということで、だいぶ後でやるかもしれません)
こんな感じで変数を使うとプログラムに汎用性が出てくる。計算内容が変わったら、変数を書き換えるだけでOKだし。
これで、変数の使い方はOKでしょ?
自分としては分かり切っているところでもあるので、すっ飛ばそうかと思ったけど、改めて自分で考えて作ってみると、しっかり理解できますな。
ただ、この文章量は疲れる・・・。
今回のまとめ
・"/"は小数点は出さない
・変数を活用する(なるべく途中に数字を直接入れておかない)
・あんまり夜更かしするな!俺みたいに(笑)
以上!!
次はこれまた基本事項のループや条件分岐などに行く予定。
まだまだオブジェクト指向的な作り方になってないけど、基本から行きますんでよろしく。