基本情報技術者

【基本情報技術者試験】平成21年秋期java過去問

LadioCast設定方法

javaでクラスで別クラスを呼び出すのが苦手

この記事はほぼ自分が考えをまとめる用に記事にしたものです。

至らない点がありましたら申し訳ありません。

私はjavaに関してはざざっと文法を学んだのですが、実践や問題を読み解くとなると全く歯が立ちませんでした。

うまく言えないのですが、英語で例えるならば単語とかなんとなく文章のニュアンスはわかるけど、きちんと読解出来ているかというと微妙で、テストの点数がブレブレで安定しないというような感じです。

特にクラスとクラスの結びつきがごちゃついてわけがわからなくなるのです。

YouTubeやネットで色々調べたのですが、皆こんなところでは躓かないのか?なかなか解説がないので自分なりに同じコードを打って理解することに努めました。

問題の全体構成

この問題は携帯電話のプランについてです。
クラス名や説明文を見て、これはパケット料金これは電話代の料金に関するクラスかなーと捉えます。

次にメインのあるクラスに注目します。
newされている箇所が沢山あるのでどのクラスとどのクラスの関連があるのかを考えます。
CellPhonePlannerクラスの中でCallingPlan・PacketPlan・CellPhonePlanが出てきます。

さらに細かくみてみると、
PacketPlanはMeasuredとTieredに別れていることがわかります。PacketPlanはインターフェースなのでimprementsされるかなあと気付きます。
CellPhonePlanはCallingPlan+PacketPlanを組み合わせているなとわかります。

設問1

a : callingRate * minutes – included
b : callingCharge < 0
 aとbは通話料金の計算についての空欄です。CellPhonePlannerのnewされているところと表1を見ると、basicChargeは基本料金、includedは無料通話代、callingRateは1分あたりの通話料を指していることがわかります。
通話料金はreturn basicCharge + callingCharge;より、基本料金+通話料金と推測できます。
aには通話料金を求める選択肢が入るので、通話時間✖️1分あたりの料金−無料通話代を意味するものとなります。
bは、もし選択肢だったら通話料金を0とする、とあります。通話料金が0になるのは無料通話代に収まっている場合ですよね。例えばプランAで20分通話したら20✖️4-1000で−200となるのでそれは、通話料金としては0円を意味します。
ぱっと見だと、イのcallingCharge < includedも雰囲気で似たような意味に思えます。しかしながら適当な数字で当てはめてみると、30✖️4-1000つまり200<1000の時は0とする。200円通話料金はかかるはずなのでこの選択肢は変なことになります。従って、callingCharge < 0です。

c: implements PacketPlan
cはインターフェースの時に使う言葉です。なのでimplementsが入ります。

d: packets – allowance + 99
dはTieredについてです。Tieredは問題文にあるようにパケット料金割引サービスS1を表します。このプランの場合の料金の出し方についてdは問われています。文章よりパケットは計算するとき100単位に切り上げて計算します。表2とメインクラスからサービス料金が1,000円、allowanceが10,000つまり無料パケット分。packetRateが100パケットあたりの金額。
chargeにbasicChargeつまり1000円をまず入れる。その後packets>allowance(パケット10,000を超えた)なら、packetRate * ((d)/100)の処理をし、それをchargeとする。それを元に選択肢を検討しますが、packets – allowanceが他の選択肢にない時点で答えがエに絞られます。+99は100パケットあたりに繰り上げる処理になります。

e : Integer.MAX_VALUE
f : cellPhonePlan.calculateCharge(minutes, packets)
eとfは、メインメソッドについての問題です。eとfはおすすめプランを出すメソッドについての問題です。
簡単にメインメソッドの流れを確認します。

static final CallingPlan[] callingPlans = {
        new CallingPlan("A", 2000, 1000, 40),  、、、、

とあります。これはcallingPlansという名の配列にそれぞれの電話料金プランのデータを格納しています。

static final PacketPlan[] packetPlans = {
        new Measured(20),  、、、、

同じようにこれはpacketPlansという名の配列にパケットプランのデータを格納しています。

static final CellPhonePlan[] cellPhonePlans = {
        new CellPhonePlan(callingPlans[0], packetPlans[0])、、、

これはcellPhonePlansという配列に先程作った2つの配列を入れ込んでいます。
callingPlans[0], packetPlans[0]つまりプランAでパケットS1サービスなし。となります。

空欄efについて考えていきましょう。

int minCharge = e ;
CellPhonePlan recommended = null;
for (CellPhonePlan cellPhonePlan : cellPhonePlans) {
int charge = f ;
if (charge <= minCharge) {
recommended = cellPhonePlan;
minCharge = charge;
}
}

拡張for文があります。拡張for文とは、
for(基本/参照型 変数名 : 配列変数名){処理内容 } を意味します。
配列の要素を一つずつ取り出して{}内の処理をする事になります。

for以下の箇所にあるfには配列の要素分繰り返す処理が入ります。それは何かと考えると、料金をそれぞれのプランで出す作業が当てはまります。その時点でエとオに絞れると思うのですが、recommendedにはnullを代入しているので、エのrecommended.calculateCharge(minutes, packets)だと、ぬるぽになるなと判断します。なのでオがしっくりくるなと判断します。
次にeのminChargeを考えてみます。
if箇所よりminChargeがcharge以上ならrecommendedにそのプランを入れてminChargeの値を更新する処理となります。まず[0][0]のchargeを出し、charge <= minChargeなら値とプランを更新。その後更新された値と[0]を比較。ifに当てはまればプランを変更。[0],の時と処理を繰り返します。
選択肢アの0だと、ifの処理が起こらないので違う。
イとウの選択肢ですが、
Integer.MAX_VALUE・・・int型の最大値を設定
Integer.MIN_VALUE・・・int型の最小値を設定。負の数になる。
0と同様にInteger.MIN_VALUEだと、ifが起こらないので答えはInteger.MAX_VALUE。

設問2

g : extends Tiered
superが出てくるので、継承だよなと考えます。S1プランの内容に付け加えを行なっているのでイが答えになります。

i : maxCharge
iを先に説明します。もしiよりchargeが大きければ、chargeはmaxChargeにする。とあります。これは50,000パケットを超えた際に一律5000円とする処理と気付きます。なので、iはmaxChargeとなります。

h : super.calculateCharge(packets)
次にhですが、hはchargeに代入する選択肢です。iの流れよりパケット通信量から料金を出す処理と考えます。ざざっと見てエ・カ・キあたりまで絞れます。
エだとパケット量に応じた金額の式がないのでダメです。キのthis.calculateCharge(packets)だと、再起呼び出しになるので違います。なので、継承したTieredのメソッドにアクセスするsuper.calculateCharge(packets)が正しいです。

最後に

なかなか時間がかかりましたが、実際に自分でコードを写経して考えてみるとわかりやすかったです。アルゴリズムも苦手だから、ときつつjavaでプログラム考えて載せる作業とかもしてみようかな。

ABOUT ME
ぽる
ぽると申します。 今は事務職を辞めて家でブログを書いたり、資格の勉強をしたり、試行錯誤の毎日を送っています。 暮らしに役立つ情報を発信していきます。