「基礎講座java」特別付録「練習してみよう」解答例3 chapter3...

29
1 「基礎講座 Java」特別付録「練習してみよう」解答例 Chapterにある「 してみよう」 ります。(ファイル : )にあるプログラムコード http://book.mycom.co.jp/support/pc/kiso java/kisojava.zip より きます。

Upload: others

Post on 01-Sep-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 「基礎講座Java」特別付録「練習してみよう」解答例3 Chapter3 3-3「練習してみよう」解説 (076~078ページ) 例題1 (ファイル名: Practice3

1

「基礎講座Java」特別付録「練習してみよう」解答例

各章(Chapter)の最後にある「練習してみよう」の解説になります。(ファイル名: )にあるプログラムコードは

http://book.mycom.co.jp/support/pc/kiso java/kisojava.zip

より入手できます。

Page 2: 「基礎講座Java」特別付録「練習してみよう」解答例3 Chapter3 3-3「練習してみよう」解説 (076~078ページ) 例題1 (ファイル名: Practice3

3

Chapter3 3-3「練習してみよう」解説(076~078ページ)

例題1 (ファイル名: Practice3 1.java)

このプログラムでは、以下のように変数を利用しています。

applePrice りんごの値段

appleNum りんごの個数

bananaPrice バナナの値段

bananaNum バナナの個数

totalPrice 支払う金額

値段や個数はすべて整数の値なので、変数はすべて int型です。そして、それぞれの変数に、値段や個数の具

体的な値を代入し、支払う金額を計算しています。

例題2 (ファイル名: Practice3 2.java)

このプログラムでは、以下のように変数を利用しています。

people りんごを配ることのできる人数

remainder 余るりんごの個数

りんごを配ることのできる人数も、余るりんごの個数も整数なので、変数はすべて int型です。そして、りん

ごを配ることのできる人数は、「りんごの個数 ÷1人あたりに配る個数」です。従って「100 / 3」で人数を計算

することができます。余るりんごの個数は、「りんごの個数 ÷1人あたりに配る個数」の余りになるので、余りを計算する「%」を使って「100 % 3」で計算することができます。

例題3 (ファイル名: Practice3 3.java)

このプログラムでは、以下のように変数を利用しています。

language 国語の点数

math 数学の点数

english 英語の点数

society 社会の点数

science 理科の点数

average 平均点

Page 3: 「基礎講座Java」特別付録「練習してみよう」解答例3 Chapter3 3-3「練習してみよう」解説 (076~078ページ) 例題1 (ファイル名: Practice3

4

各科目の点数はすべて整数の値なので、各科目の点数の変数はすべて int型です。また、13-4節で説明していますが、int型の値の計算は、int型で結果が出てしまいます。平均を計算するなど、int型の値を使った割り算

の計算で、小数で結果を出したい場合には、13-4節の「キャスト」というテクニックを使う必要があります。そこで、ここでは、平均点も int型にしています。

そして、5教科の得点を合計し、その合計を 5で割って、平均を計算しています。

例題4 (ファイル名: Practice3 4.java)

このプログラムでは、以下のように変数を利用しています。

milk 牛乳の在庫数

牛乳の在庫数は、牛乳のパック数であるため、整数です。従って、int型です。

そして、3-1節で説明したとおり、代入を表す「=」の両側で、同じ変数が使われているとき、「=」の右側の変

数の値を利用して計算し、その計算結果でその変数の値を更新します。このテクニックを利用し、ある日の開店時

の在庫を変数 milkに代入しておき、その日に補充した在庫数を足し、閉店までに販売した数を引くと、その日の

閉店時の在庫数を計算できます。

例題5 (ファイル名: Practice3 5.java)

このプログラムでは、以下のように変数を利用しています。

radius 円の半径

area 円の面積

円の半径は 6cmと、整数であるため、半径は int型としています。また、この例題では、円周率が小数なので、

小数で円の面積を計算したいと考えたため、円の面積は、変数を double型にしています。

そして、「半径 ×半径 ×円周率」の計算方法で、円の面積を計算しています。

例題6 (ファイル名: Practice3 6.java)

このプログラムでは、以下のように変数を利用しています。

people 総人口

area 国土面積

density 人口密度

総人口と国土面積は整数であるため、変数も int型としています。また、13-4節で説明していますが、int型

の計算は、int型で結果が出てしまうため、人口密度も int型としています。小数で計算したい場合は、これら

の変数を float型か double型で宣言すると良いでしょう。

そして、人口密度を「総人口 / 国土面積」で計算しています。

Page 4: 「基礎講座Java」特別付録「練習してみよう」解答例3 Chapter3 3-3「練習してみよう」解説 (076~078ページ) 例題1 (ファイル名: Practice3

5

例題7 (ファイル名: Practice3 7.java)

このプログラムでは、以下のように変数を利用しています。

area 国土面積

hokkaido, aomori, akita, iwate, fukushima, miyagi, yamagata それぞれ、北海道・青森県・秋田県・岩

手県・福島県・宮城県・山形県の面積

hokkaidoRate, aomoriRate, akitaRate, iwateRate, fukushimaRate, miyagiRate, yamagataRate それぞ

れ、北海道・青森県・秋田県・岩手県・福島県・宮城県・山形県の面積が、日本全体に占める割合(パーセ

ンテージ)

totalRate 北海道・青森県・秋田県・岩手県・福島県・宮城県・山形県を合わせた面積が、日本全体に占める割

合(パーセンテージ)

13-4節で説明していますが、int型の計算は、int型で結果が出てしまいます。この例題では、北海道と各県の

面積が日本全体に占める割合を計算するため、計算結果を小数で出したいと考え、すべての変数を double型とし

ています。

そして、「北海道・各県の面積 / 国土面積」で、北海道と各県の面積が日本全体に占める割合を計算しています。また、「北海道と各県の面積の合計 / 国土面積」で、北海道と各県の合計面積が日本全体に占める割合を計算しています。

例題8

077ページの例題 07に下に記載のある「図 3.17のプログラムは..」の解答は以下になります。

public class Trapezoid {

public static void main(String[] args) {

double upper = 12, lower = 20.5, height = 7.8;

double area;

area = (upper + lower) * height / 2;

}

}

Page 5: 「基礎講座Java」特別付録「練習してみよう」解答例3 Chapter3 3-3「練習してみよう」解説 (076~078ページ) 例題1 (ファイル名: Practice3

7

Chapter4 4-5「練習してみよう」解説(111~113ページ)

例題1

この文字列は、下図のように、変数と単なる文字列に分解できます。

そこで、単なる文字列の部分を「"」で囲み、変数 payの部分と「+」でつなげたものを変数 resultMessageに

代入します。

例題2

この文字列は、下図のように、変数と単なる文字列に分解でき、またエスケープシーケンスを使います。

そして、エスケープシーケンスの部分を「Y”」や「Yn」に置き換え、単なる文字列の部分を「"」で囲み、変

数 toNameと変数 fromNameの部分と「+」でつなげたものを変数 greetingに代入します。

例題3 (ファイル名: Practice4 3.java)

このプログラムでは、りんご・バナナ・キャベツ・にんじんの個数をそれぞれ ppleNum・bananaNum・cabbageNum・

carrotNum という変数にしています。また、それぞれの値段も applePrice・bananaPrice・cabbagePrice・

carrotPriceという変数にしています。これらの変数を使って品物の合計金額を計算し、ポイント分(変数: point)を引いて、支払う金額(変数: totalPrice)を計算しています。そして、支払う金額を表す文章を変数 resultMessageに代入しています。この文章は、「ありがとうございま

す。」の後に改行があるので、エスケープシーケンス「Yn」を使っています。また、金額は変数であり、それ以前は単なる文字列であるため、「<」以前の部分と「>」以降の部分を「"」で囲み、金額の変数 totalPriceとを

「+」でつなげています。

Page 6: 「基礎講座Java」特別付録「練習してみよう」解答例3 Chapter3 3-3「練習してみよう」解説 (076~078ページ) 例題1 (ファイル名: Practice3

8

例題4 (ファイル名: Practice4 4.java)

このプログラムでは、変数 dateに代入されている日付の「年」・「月」・「日」をすべて「.」に変更します。そのため、「年」・「月」・「日」のインデックスをそれぞれ yearIndex・monthIndex・dayIndexという変数にしていま

す。これらのインデックスを、indexOfメソッドを使って求めています。

次に、これらのインデックスをもとに、substringメソッド使って、変数 dateに代入されている日付から、年

(2010)、月(10)、日(1)を取り出し、それぞれ year・month・dayという変数に代入しています。

最後に、これら year・month・dayの値を、「.」でつなげて変数 modifiedDateに代入しています。

例題5 (ファイル名: Practice4 5.java)

このプログラムでは、変数 asciiに代入されている 0と 1の並びが、「Java」という 4文字に ASCIIコードです。この ASCIIコードを 4等分する必要があるため、まず、変数 asciiの値の長さを lengthメソッドで求め、

それを 4で割った数を変数 bitNumに代入します。この変数 bitNumの値が、「Java」という文字列の 1文字分の0と 1の並びの長さになります。また、変数 asciiの値を 4つに分割するために、substringメソッドを使って

部分文字列として分割します。

そこで、この変数 bitNumの値を、substringメソッドで利用する変数 asciiの値のインデックスを求めるた

めに利用します。また、このインデックスについては、substringメソッドの 1つ目の引数となるインデックスを変数 index1、2つ目の引数となるインデックスを変数 index2としています。

変数 asciiの値から、「Java」の 4つの文字に相当する 0と 1の並びを取り出してくるために、substringメ

ソッドに与える引数(1つ目: 変数 index1、2つ目: 変数 index2)は、下図のとおりです。

つまり、変数 index1について、1文字目「J」の場合は、変数 index1の値は 0です。そして、2文字目以降については、1つ前の文字の変数 index2の値が、その文字の変数 index1の値になっています。つまり、例えば 2文字目であれば、1文字目の変数 index2の値が、2文字目の変数 index1の値になっています。そこで、1文字目の「J」については、変数 index1に 0を代入し、2文字目以降は、1つ前の文字の変数 index2の値を、変数 index1

に代入しています。

次に変数 index2については、「Java」の 4つの文字の 1文字分の 0と 1の並びの長さが変数 bitNumなので、

変数 index1に変数 bitNumの値を足した数が、変数 index2の値になります。このようにして変数 index2の値

を計算すると、この値は、次の文字の先頭の文字のインデックスになります(例えば、1文字目「J」を考えると、変数 index2の値は「8」となり、「8」という値は、2文字目「a」の、変数 asciiの値の中での先頭の文字のイン

デックスです)。しかし、substringメソッドでは、1つ目の引数のインデックスの文字は部分文字列に含まれますが、2つ目のインデックスの文字は含まれないため、変数 index2の値は、substringメソッドで取り出してく

るときの 2つ目の引数になります。このようにして 1文字目「J」の分の変数 index1と変数 index2の値を求め、substringメソッドを使って 0と 1の並びを取り出します。次に 2文字目「a」の分の変数 index1と変数 index2の値を求め、substringメソッ

ドを使って 0と 1の並びを取り出します。この処理を 3文字目、4文字目と行っていきます。ただし、4文字目に関しては、引数が 1つだけの substringメソッド(その引数のインデックス以降すべての部分を部分文字列とし

て取り出すメソッド)を使っているため、4文字目に関しては、変数 index2の値は求めていません。

そして、1文字目「J」~4文字目「a」を 0と 1で表現したASCIIコードを、それぞれ firstCode・secondCode・

thirdCode・fourthCodeという変数に代入しています。ただし、これらの変数の値には、出力したときに「Java」

Page 7: 「基礎講座Java」特別付録「練習してみよう」解答例3 Chapter3 3-3「練習してみよう」解説 (076~078ページ) 例題1 (ファイル名: Practice3

9

のどの文字にどのような 0と 1の並びが割り当てられているかをわかりやすくするために、それぞれの文字に「:」を付けたもの(1文字目であれば「J:」)を先頭に付加しています。

例題6 (ファイル名: Practice4 6.java)

このプログラムでは、変数 drinkDataに代入されている値を、「,」で分解します。「,」の位置を求めるために

indexOfメソッド、分解するために substringメソッドを使っています。substringメソッドの 1つ目の引数となるインデックスを変数 index1、2つ目の引数となるインデックスを変数 index2としています。

1つ目のデータである飲み物の名前については、変数 index1の値は 0になります。そのため、変数 index1には 0を代入しています。変数 index2の値は、変数 drinkDataの 1つ目の「,」のインデックスになります(substring

メソッドでは、1つ目の引数のインデックスの文字は部分文字列に含まれるが、2つ目のインデックスの文字は含まれないため)。そこで、「,」だけを引数として indexOfメソッドを使い、この結果を変数 index2に代入してい

ます。

2つ目以降の飲み物の分類・分量・値段の場合は、変数 index1の値は、変数 drinkDataの値ににおいて、「,」の1つ後のインデックスになります。つまり、1つ前のデータの変数 index2の値に 1を足したもの(例えば飲み物の分類であれば、1つ前の飲み物の名前を取り出すために使った変数 index2の値に 1を足したもの)になります。

2つ目以降の飲み物の分類・分量・値段での変数 index2の値は、変数 drinkDataの値の中で、それぞれのデー

タでの変数 index1以降、初めて出てくる「,」のインデックス(例えば飲み物の分類であれば、飲み物の分類をsubstringメソッドで取り出すための変数 index1の値以降、初めて出てくる「,」のインデックス)になります。

そこで、「,」を 1つ目の引数、変数 index1の値を 2つ目の引数にして、indexOfメソッドを使い、この結果を

変数 index2に代入しています。

このようにして 1つ目のデータである飲み物の名前の分の変数 index1と変数 index2の値を求め、substring

メソッドを使って飲み物の名前を取り出します。次に飲み物の分類の分の変数 index1と変数 index2の値を求め、

substringメソッドを使って飲み物の分類を取り出します。この処理を分量、値段と行っていきます。ただし、値

段に関しては、引数が 1つだけの substringメソッド(その引数のインデックス以降すべての部分を部分文字列

として取り出すメソッド)を使っているため、値段に関しては、変数 index2の値は求めていません。

そして、飲み物の名前・飲み物の分類・分量・値段のデータを、それぞれ name・type・quantity・priceとい

う変数に代入しています。ただし、これらの変数の値には、出力したときにそれぞれのデータが何を表している

かをわかりやすくするために、それぞれのデータの意味に「:」を付けたもの(飲み物の名前であれば「飲み物の

名前:」)を先頭に付加しています。

Page 8: 「基礎講座Java」特別付録「練習してみよう」解答例3 Chapter3 3-3「練習してみよう」解説 (076~078ページ) 例題1 (ファイル名: Practice3

11

Chapter5 5-5「練習してみよう」解説(141~143ページ)

例題1 (ファイル名: Practice5 1.java)

このプログラムでは、まず、標準出力で、Javaのファイルの名前を入力するという指示を出力しています。そして標準入力で入力されたファイル名を、変数 javaFileNameに代入しています。

変数 javaFileNameの値について、ファイル名の拡張子「.java」のインデックスを lastIndexOfメソッドを使っ

て求め、このインデックスをもとに、substringメソッドを使って、拡張子なしのファイル名を求めています。そ

して、この拡張子なしのファイル名に、拡張子「.class」を付加しています。最後に、拡張子を変更したファイル名がどうなったかを標準出力で出力しています。

例題2 (ファイル名: Practice5 2.java)

このプログラムでは、まず、標準出力で、このプログラムで何をするかと、そして文字列を 2つ入力するという指示を出力しています。そして、標準入力で文字列を 2つ入力し、1つ目の文字列を変数 firstString、2つ目の文字列を変数 secondStringに代入しています。文字列を 2つ入力するため、readLineメソッドを 2回使っています。

そして、2つの文字列が同じであるかどうかの判定結果について、trueと falseの意味の説明を標準出力で出

力し、判定結果も標準出力で出力しています。2つの文字列が同じであるかどうかの判定には、equalsメソッド

を使っています。

例題3 (ファイル名: Practice5 3.java)

このプログラムでは、まず、標準出力で、「xxxx-xxxx-xxxx」という形式の電話番号を入力するという指示を

出力しています。そして標準入力で入力された電話番号を、変数 telNumberに代入しています。

変数 telNumberの値から、「-」を取り除いたものを作成したいため、まず、「-」のインデックスを求めていま

す。「-」は、変数 telNumberの値の中に 2つあるため、1つ目を indexOfメソッド、2つ目を lastIndexOfメ

ソッドで求め、それぞれ変数 index1と変数 index2に代入しています。

次に、変数 telNumberの値を「-」で substringメソッドを使って 3つに分割し、分割した 1つ目の文字列を変数 firstNum、2つ目の文字列を変数 middleNum、3つ目の文字列を変数 lastNumに代入しています。そして、変

数 firstNum、変数 middleNum、変数 lastNumをつなげた文字列を変数 modifiedTelNumberに代入しています。

この変数 modifiedTelNumberが、「-」なしの電話番号になります。

最後に、形式の変更をした電話番号を標準出力で出力しています。

例題4 (ファイル名: Practice5 4.java)

このプログラムでは、まず、標準出力で、円の半径を入力するという指示を出力しています。そして標準入力で

円の半径を、変数 radiusInputに代入しています。

標準入力で入力された値は String型であるため、変数 radiusInputも String型です。そこで、円の円周の

長さや面積を計算するため、この変数 radiusInputの値を、parseDoubleメソッドを使って double型の値の変

Page 9: 「基礎講座Java」特別付録「練習してみよう」解答例3 Chapter3 3-3「練習してみよう」解説 (076~078ページ) 例題1 (ファイル名: Practice3

12

換し、変数 radiusに代入しています。そして、円周の長さを計算して変数 circleLengthに代入し、円の面積を

計算して変数 circleAreaに代入しています。

最後に、計算した円の円周の長さと面積を標準出力で出力しています。

例題5 (ファイル名: Practice5 5.java)

このプログラムでは、まず、標準出力で、ドルとユーロの為替レートと、両替したい日本円の金額を入力すると

いう指示を出力しています。そして、ドルの為替レート、ユーロの為替レート、両替したい日本円の金額を標準入

力で入力し、それぞれ変数 dollerRateInput、変数 euroRateInput、変数 yenInputに代入しています。

標準入力で入力された値はString型であるため、変数dollerRateInput、変数euroRateInput、変数yenInput

も String 型です。そこで、両替した金額を計算するため、変数 dollerRateInput と変数 euroInput の値を

parseDoubleメソッドで double型の値に、変数 yenInputの値を parseIntメソッドで int型の値の値に変換

し、それぞれ変数 dollerRate、変数 euroRate、変数 yenに代入しています。

そして、変数 yenの値を変数 dollerRateと変数 euroRateの値で割ったものを、それぞれ変数 exchangeDoller

と変数 exchangeEuroに代入しています。この変数 exchangeDollerと変数 exchangeEuroの値が、それぞれ、日

本円をドルとユーロに両替した金額になります。

最後に、両替後のドルとユーロの金額を標準出力で出力しています。

例題6 (ファイル名: Practice5 6.java)

このプログラムでは、まず、標準出力で、購入する品物の個数を入力するという指示を出力しています。そして、

りんご・バナナ・キャベツ・にんじんの個数を標準入力で入力し、それぞれ変数 appleInput、変数 bananaInput、

変数 cabbageInput、変数 carrotInputに代入しています。

標準入力で入力された値は String型であるため、変数 appleInput、変数 bananaInput、変数 cabbageInput、

変数 carrotInputも String型です。そこで、品物の合計金額を計算するため、これらの変数の値を、parseInt

メソッドで int型の値に変換し、それぞれ変数 appleNum、変数 bananaNum、変数 cabbageNum、変数 carrotNum

に代入しています。

そして、品物の合計金額を計算し、変数 totalPriceに代入しています。

最後に、買い物に対するお礼と、合計金額を知らせるメッセージを出力しています。

例題7 (ファイル名: Practice5 7.java)

このプログラムでは、標準出力で、何を入力するかを 1つ 1つ出力しています。そして標準入力で入力された現在の時間(時)、現在の時間(分)、目的地までの距離、予想される平均時速、予想される休憩時間の合計を、そ

れぞれ変数 hourInput、変数 minuteInput、変数 distanceInput、変数 speedInput、変数 restInputに代入し

ています。

標準入力で入力された値は String型であるため、変数 hourInput、変数 minuteInput、変数 distanceInput、

変数 speedInput、変数 restInputも String型です。そこで、党略予定の時間を計算するために、これらの変

数の値を、parseIntメソッドで int型の値に変換し、それぞれ変数 hour、変数 minute、変数 distance、変数

speed、変数 restに代入しています。

そして、まず、時速をもとに分速を計算し、変数 speedMinuteに代入しています。次に、変数 distanceと変数

speedMinute、変数 restの値をもとに、目的地までにかかる時間を分で計算し、requiredTimeHourに代入しています。その次に、変数 minuteの値と変数 requiredTimeHourの値を足して、分のみの党略予定時刻を(何日後

の何時という部分は考慮されていない)、変数 resultMinuteに代入し、この変数 resultMinuteの値と変数 hour

の値を使って、到着予定時刻(時)(現在の時刻から何日後かは考慮されていない)を計算し、変数 resultHour

に代入しています。

Page 10: 「基礎講座Java」特別付録「練習してみよう」解答例3 Chapter3 3-3「練習してみよう」解説 (076~078ページ) 例題1 (ファイル名: Practice3

13

そして、変数 resultMinuteの値を使って、到着予定時刻(分)を計算し、変数 resultMinuteの値を更新し

ています。その次に、変数 resultHourの値を使って、現在から何日後に到着するかを計算し、変数 resultDay

に代入しています。それから、変数 resultHourの値を使って、到着予定時刻(時)(24時間表記)を計算し、変数 resultHourの値を更新しています。変数 resultDay、変数 resultHour、変数 resultMinuteの値が、現在の

時刻から何日後の何時何分に到着するかを表しています。

最後に、現在の時刻から何日後の何時何分に到着するかを標準出力で出力しています。

Page 11: 「基礎講座Java」特別付録「練習してみよう」解答例3 Chapter3 3-3「練習してみよう」解説 (076~078ページ) 例題1 (ファイル名: Practice3

15

Chapter6 6-5「練習してみよう」解説(173~176ページ)

例題1 (ファイル名: Practice6 1.java)

このプログラムでは、まず標準入力から 2つ文字列を入力し、それぞれ変数 firstStringと変数 secondString

に代入しています。そして、equalsメソッドを使ってこの 2つの文字列が同じであるかどうかを判定しています。equalsメソッドの結果が「true」である、ということを if文の条件とし、この条件が成り立てば「Same!」、成り立たなければ「Different!」と標準出力で出力しています。

例題2 (ファイル名: Practice6 2.java)

このプログラムでは、まず標準入力から 2つ文字列を入力し、それぞれ変数 firstStringと変数 secondString

に代入しています。そして、indexOfメソッドを使って、2つ目の文字列が 1つ目の文字列に含まれているかどうかを判定しています。indexOfメソッドの結果が「-1」ではない、ということを if文の条件とし、この条件が成

り立てば、2つ目の文字列が 1つ目の文字列に含まれている、と判定しています。この条件が成り立たなければ、2つ目の文字列が 1つ目の文字列に含まれていない、と判定しています。

例題3 (ファイル名: Practice6 3.java)

このプログラムでは、まず、標準入力から IDとパスワードを入力し、それぞれ変数inputIdと変数inputPassword

に代入しています。そして、変数 correctIdに代入されいている正しい IDと、変数 correctPasswordに代入さ

れている正しいパスワードと、equalsメソッドを使って照合をします。

変数 correctIdと変数 inputIdの値が同じであり、かつ変数 correctPasswordと変数 inputPasswordの値

が同じである、ということを if文の 1つ目の条件としています。この条件が成り立てば、ログインに成功したことを標準出力で出力しています。

if文の1つ目の条件が成り立たない場合に、変数correctIdと変数inputIdの値が異なり、かつ変数correctPassword

と変数 inputPasswordの値が異なる、ということを if文の 2つ目の条件としています。この条件が成り立てば、IDもパスワードも間違っていることを標準出力で出力しています。if文の 2つ目の条件が成り立たない場合に、変数 correctIdと変数 inputIdの値が異なる、ということを if

文の 3つ目の条件としています。この条件が成り立てば、IDが間違っていることを標準出力で出力しています。if文の 3つ目の条件が成り立たない場合に、変数 correctPasswordと変数 inputPasswordの値が異なる、と

いうことを if文の 4つ目の条件としています。この条件が成り立てば、パスワードが間違っていることを標準出力で出力しています。

例題4 (ファイル名: Practice6 4.java)

このプログラムでは、ジュースに番号を付けて標準出力で提示し、購入したいジュースの番号を標準入力で入

力しています。そして、入力された番号を変数 juiceInputに代入しています。

Page 12: 「基礎講座Java」特別付録「練習してみよう」解答例3 Chapter3 3-3「練習してみよう」解説 (076~078ページ) 例題1 (ファイル名: Practice3

16

変数 juiceInputの値とジュースの番号を equalsメソッドを使って比較し、この比較結果を if文の条件とし

ています。この t if文の条件により、入力されたジュースの番号に応じて、変数 priceにジュースの値段を代入

し、ジュースの値段を標準出力で出力しています。

次に、ジュースの支払金額を標準入力で入力し、おつりを計算します。最後に、おつりを標準出力で出力してい

ます。

例題5 (ファイル名: Practice6 5.java)

このプログラムでは、「年/月/日」という形式の日付を標準入力で入力し、変数 dateに代入しています。そし

て、indexOfメソッドと substringメソッドを使って、この変数 dateの値を、年と月と日に分解し、それぞれ

変数 yearString、変数 monthString、変数 dayStringに代入しています。

次に、月を英語に変換するために、月の番号が何番であるかを比較し、この比較結果を t if文の条件としています。このとき、標準入力で入力された日付によっては、変数 monthStringには、1~9月については 1桁で代入されている場合と 2桁で代入されている場合が考えられます(例えば 2010年 9月 1日であれば、「2010/9/1」と入力される場合と、「2010/09/01」と入力される場合が考えられます。前者の場合には変数 monthStringには「9」、後者の場合には「09」が代入されています)。従って、このままでは、1~9月については、例えば「9」と「09」の 2種類の値と、変数 monthStringを比較する必要があります。

そこで、if 文での条件の設定を単純化するために、変数 monthString の値を、parseInt メソッドを使って

int型に変換し、変数 monthに代入しています。この変数 monthに、1~12のどの数が代入されいてるかということを調べ、その結果を if文の条件としています。そして、それぞれの月の番号に対応する英語の月名を、変数

monthStringに代入しています(例えば、変数 monthの値が「9」であれば、変数 monthStringに「September」を代入しています)。

そして、日にちも、1~9日に関しては 1桁で出力するため、変数 dayStringの値を、parseIntメソッドを使っ

て int型に変換し、変数 dayに代入しています。最後に、変数 monthString、変数 day、変数 yearStringの値

を「.」でつなげて、変数 modifiedDateに代入し、標準出力で出力しています。

例題6 (ファイル名: Practice6 6.java)

このプログラムでは、まず、乱数を発生させ、その乱数を変数 numに代入しています。次に、標準入力から数

を 1つ入力し、入力された数を、変数 guessInputに代入しています。この変数 guessInputの値を parseIntメ

ソッドを使って int型に変換し、変数 guessに代入しています。

そして、変数 guessの値と変数 numの値が同じである、ということを if文の 1つ目の条件としています。この条件が成り立てば、ピタリ賞と標準出力で出力しています。

この条件が成り立たず、変数 guessの値が「変数 numの値 - 100 <= 変数 guessの値 <= 変数 numの値 + 100」の範囲である、ということを if文の 2つ目の条件としています。この条件が成り立てば、ニアピン賞と標準出力で出力しています。

1つ目の条件も 2つ目の条件も成り立たない場合には、ブービー賞と標準出力で出力しています。

例題7 (ファイル名: Practice6 7.java)

このプログラムでは、まず、0と 1の 15文字を標準入力で入力し、変数 binaryStringに代入しています。次

に、変数 binaryStringの値を、substringメソッドを使って、3文字ずつ 5つに分解し、それぞれ変数 first、

変数 second、変数 third、変数 fourth、変数 fifthに代入しています。

そして、変数 firstの値が、000・001・010・011・100・101・110・111のどれと一致するかを、equalsメソッ

ドで判定し、その判定結果を if文の条件としています。この条件判定の結果、000・001・010・011・100・101・110・111に対応する文字を、変数 firstに代入しています(例えば、if文の条件判定時に、変数 firstの値が

Page 13: 「基礎講座Java」特別付録「練習してみよう」解答例3 Chapter3 3-3「練習してみよう」解説 (076~078ページ) 例題1 (ファイル名: Practice3

17

「000」であれば、変数 firstに「a」を代入しています)。この処理を、変数 second、変数 third、変数 fourth、

変数 fifthでも同様に行っています。

最後に、変数 first、変数 second、変数 third、変数 fourth、変数 fifthの値をつなげて変数 alphabetに

代入し、標準出力で出力しています。

Page 14: 「基礎講座Java」特別付録「練習してみよう」解答例3 Chapter3 3-3「練習してみよう」解説 (076~078ページ) 例題1 (ファイル名: Practice3

19

Chapter7 7-5「練習してみよう」解説(191~194ページ)

例題1 (ファイル名: Practice7 1.java)

このプログラムでは、標準入力で支出金額を入力していきます。支出金額の入力は、何度行われるかわからない

ため、while文を使って繰り返し行ってます。入力された支出金額を、変数 moneyStringに代入しています。こ

の変数 moneyStringの値を parseIntメソッドを使って int型に変換し、支出金額の合計を計算していきます。

支出金額の合計は、変数 totalに代入しています。

そして、「End」と入力されたら、入力の繰り返しを終了するため、equalsメソッドを使って、入力された値を

「End」と比較をしています。この比較の結果を while文を繰り返す条件とし、この条件が成り立てば、支出金額

の入力を繰り返します。

ただし、while文を実行する前に変数 moneyStringに値が入っていなければ、while文での 1回目の条件判定ができないため、while文の実行前に、1度だけ、標準入力から支出金額を入力しています。

例題2 (ファイル名: Practice7 2.java)

このプログラムでは、mと nの 2つの数を標準入力で入力し、それぞれ変数 mNumStringと変数 nNumStringに

代入しています。そしてこれらを parseIntメソッドを使って、int型の値に変換し、それぞれ変数 mNumと nNum

に代入しています。

そして、mnを計算するには、mを n回かけ算することになり、かけ算を繰り返す回数は n回と、回数が決まって

いるため、for文を使っています。for文を使ってかけ算を行い、かけ算の結果を変数 timesに代入しています。

ただし、かけ算の繰り返しが終了したときに、本来の計算結果(例えば、手作業で計算した結果)と、プログ

ラムでの計算結果が異なる結果になってはなりません。かけ算では、「1」には何をかけてもかけ算の結果が変わらないので、変数 timesの初期値を「1」としています。

例題3 (ファイル名: Practice7 3.java)

このプログラムは、購入する品物の個数を入力し、品物の合計金額を計算するまでは、5章の「練習しよう」の 6題目のプログラムと同じです。その後は、支払金額を標準入力で入力します。入力された支払金額を変数moneyInput

に代入し、変数 maneyInputの値を parseIntメソッドで int型に変換し、変数 moneyに代入しています。

そして、この変数 moneyの値が、品物の合計金額である、変数 totalPriceの値よりも小さい間、さらに金額

を標準入力から入力し、変数 moneyの値に足して、変数 moneyの値を更新する、という処理を繰り返します。何

回金額を入力すれば、変数 totalPriceの値以上になるかはわからないため、while文を使って繰り返し処理をし

ています。変数 moneyの値が変数 totalPriceの値よりも小さい、ということを while文の条件としています。

例題4 (ファイル名: Practice7 4.java)

このプログラムでは、最初に何種類の飲み物の情報を登録するかを、標準入力で入力しています。入力された値

を変数 drinkNumStringに代入し、変数 drinkNumStringの値を parseIntメソッドで int型に変換して、変数

drinkNumに代入しています。

Page 15: 「基礎講座Java」特別付録「練習してみよう」解答例3 Chapter3 3-3「練習してみよう」解説 (076~078ページ) 例題1 (ファイル名: Practice3

20

そして、変数 drinkNumの値分だけ、飲み物の情報(商品名と飲み物の分類、分量、金額、在庫数)を標準入力

から入力しています。そして、最終的に標準出力で出力する飲み物の情報一覧を、変数 drinkRecordsの値とし、

入力された商品名と飲み物の分類、分量、金額、在庫数を、「,」で区切って、変数 drinkRecordsに追加してい

きます。

飲み物の情報の入力を繰り返す回数は、変数 drinkNumの値です。つまり繰り返す回数はわかっているため、for

文を使って繰り返し処理をしています。

また、変数 drinkRecordsは、for文の処理が終了した後で、飲み物の情報一覧を出力するための変数であるた

め、for文の処理において、エスケープシーケンス「Yn」で、1種類 1種類の飲み物の情報を区切るようにしています。

例題5 (ファイル名: Practice7 5.java)

このプログラムでは、「a×b」の形で九九を標準出力で出力していきます。変数 iを「a」、変数 jを「b」を表す変数としています。そして、for文を使った多重ループの処理で、九九を出力しています。

多重ループでは、外側の for文で、変数 iに 1を代入して変数 iの値を増加させ、内側の for文で変数 jに 1を代入して変数 jの値を増加させています。そして、内側の for文で、「a×b」の形で九九を出力しています。この 2つの for文により、変数 iの値が 1増えると、変数 jの値が 1になり、変数 iの値が変化しない間、変

数 jの値が 1~9まで変化します(例えば、変数 iの値が 1のとき、変数 jの値が 1~9まで変化し、変数 iの値

が 2に増えたとき、変数 jの値が 1になり、また変数 jの値が 1~9まで変化します)。そのため、九九が正しく出力されます。

例題6 (ファイル名: Practice7 6.java)

このプログラムは、例題 5のプログラムを while文で書きなおしたものです。例題 5のプログラムと同様に、「a×b」の形で九九を標準出力で出力しており、変数 iを「a」、変数 jを「b」を表す変数としています。そして、変数 iの初期化を、多重ループの処理の前に行い、内側の while文の前で、変数 jに 1を代入しています。そして、変数 iを増加させる処理を、外側の while文の処理の一番最後に行い、変数 jを増加させる処理

を、内側の while文の処理の一番最後に行っています。

例題7 (ファイル名: Practice7 7.java)

このプログラムは、6章の「練習しよう」の 7題目のプログラムの、15文字の 0と 1の並びを入力する処理を変更したものです。15文字の 0と 1の並びを 1文字ずつ標準入力から入力していきます。入力する文字の個数は15個と決まっているため、入力を繰り返す回数も決まっています。従って、for文を使って繰り返し処理をして

います。

ただし、入力して良いのは 0か 1の 1文字だけであり、それ以外の入力がされた場合には、入力のしなおしをしています。入力しなおすかどうかを判断するために、for文の中で if文を使っています。入力された文字であ

る、変数 inputBinaryの値が 0でもなく 1でもない、ということを equalsメソッド使って判定し、この判定結

果を if文の条件としています。この条件が成り立つ場合には、入力のしなおしをしています。条件が成り立たな

い場合は、適切な文字が入力されたということであるため、変数 inputBinaryの値を変数 binaryStringの値に

つなげています。この変数 binaryStringの値は、最終的に、アルファベットに変換する 15文字の 0と 1の並びになります。

また、入力のしなおしをした場合には、変数 iの値を 1つ減少させています。これは、変数 iは for文におい

て、何回繰り返すかを数えるための変数であり、現在何番目の文字を入力しているかを表しています。入力をしな

おしをした場合、この変数 iの値をそのままにしておくと、その順番の文字が入力されなかったことになってし

まい(例えば、変数 iの値が 5のときに、不適切な入力がされ、変数 iの値はそのままにしたとします。そうす

Page 16: 「基礎講座Java」特別付録「練習してみよう」解答例3 Chapter3 3-3「練習してみよう」解説 (076~078ページ) 例題1 (ファイル名: Practice3

21

ると、入力のしなおしをするときには、変数 iの値は 6になってしまい、5番目の文字が入力されないことになってしまいます)、最終的に、変数 binaryStringの値が、15文字にならないためです。

Page 17: 「基礎講座Java」特別付録「練習してみよう」解答例3 Chapter3 3-3「練習してみよう」解説 (076~078ページ) 例題1 (ファイル名: Practice3

23

Chapter8 8-4「練習してみよう」解説(210~212ページ)

例題1 (ファイル名: Practice8 1.java)

このプログラムでは、5人の生徒の数学・国語・英語・理科・社会の得点を、それぞれ配列 math・language・

english・science・societyに代入しています。この 5つの配列では、添え字が同じものが、同じ生徒の得点です。そして、それぞれの教科の合計点を for文を使って計算し、平均点を計算しています。

例題2 (ファイル名: Practice8 2.java)

このプログラムでは、多次元配列 scoreを使って、5人の生徒の 5教科の得点を表しています。配列 scoreの

1つ目の添え字で教科(0番: 数学、1番: 国語、2番: 英語、3番: 理科、4番: 社会)を表し、2つ目の添え字を各生徒を表しています(例えば、score[3][0]だと、1人目の生徒の理科の得点)。そして、多重ループ(変数 iで教科の番号、変数 jで生徒の番号)を使って合計を計算し、平均点を計算して

配列 averageに代入しています。配列 averageの添え字は、教科を表しています。

最後に、配列 averageの値を標準出力で出力しています。

例題3 (ファイル名: Practice8 3.java)

このプログラムでは、配列 mailAddressに 5つのメールアドレスを代入しています。そして、標準入力から入力された文字が先頭になっているメールアドレスを、for文を使って探しています。

メールアドレスを探すときに、目的のメールアドレスが見つかったときには、そのメールアドレスを標準出力

で出力しています。見つからなかったときには、「none」と出力する必要がありますが、for文の実行中にそれを

判断することはできません。

そこで、flagという変数を用意し、初期値として 0を代入しておきます。そして、for文の実行中に、目的の

メールアドレスが見つかれば、変数 flagに 1を代入します。こうすると、for文の実行修了後に、変数 flagの

値が 0のままであれば、メールアドレスが見つからなかったということになります。そこで、if文で変数 flagの

値が 0であるかどうかを判定し、0である場合には、「none」と標準出力で出力しています。

例題4 (ファイル名: Practice8 4.java)

このプログラムでは、まず、配列 monthNameに旧暦の月の名前を代入しています。このように配列に月の名前

を代入すると、配列の添え字の番号と 1月・2月といった月の番号、そして月の名前は下記の表のような対応付けになります。

添え字の番号 0 1 2 3 4 5 6 7 8 9 10 11

月の番号 1 2 3 4 5 6 7 8 9 10 11 12

月の名前 睦月 如月 弥生 卯月 皐月 水無月 文月 葉月 長月 神無月 霜月 師走

Page 18: 「基礎講座Java」特別付録「練習してみよう」解答例3 Chapter3 3-3「練習してみよう」解説 (076~078ページ) 例題1 (ファイル名: Practice3

24

つまり、月の番号から 1を引いた数が、その月に対応する添え字の番号となります。そこで、標準入力から入力された月の番号を代入した変数 monthについて、「month - 1」を添え字として配列 monthNameに与えています。

つまり、「monthName[month - 1]」が、入力された月の番号に対応する、旧暦の月の名前になります。

例題5 (ファイル名: Practice8 5.java)

このプログラムでは、配列 cakeNameにケーキの名前、配列 cakePriceにケーキの値段を代入しています。そ

して、配列の添え字が同じものを、同じケーキの情報としています。そして、配列の添え字とケーキの人気順位

を、以下の表のように対応付けています。

配列の添え字 0 1 2 3 4

ケーキの順位 1位 2位 3位 4位 5位

つまり、ケーキの順位から 1を引いた数が、そのケーキに対応する添え字の番号となります。そこで、標準入力から入力された順位を代入した変数 rankについて、「rank - 1」を添え字として配列 cakeNameと配列 cakePriceに

与えています。つまり、「cakeName[rank - 1]」が、入力された順位に対応するケーキの名前、「cakePrice[rank

- 1]」がそのケーキの値段になります。

例題6 (ファイル名: Practice8 6.java)

このプログラムでは、まず、配列 numに、発生させた 10個の乱数を代入しています。乱数の発生にも、for文

を使っています。そして、標準入力から入力された数を代入した変数 guessについて、for文を使って配列 num

の要素と 1つ 1つ比較し、同じ数があればピタリ賞、± 100以内であればニアピン賞と、標準出力で出力しています。

このとき、flagという変数を用意しておき、初期値として 0を代入しています。for文での配列 numの要素の

比較において、同じ数があった場合と、± 100以内の数があった場合に、変数 flagに 1を代入しています。こうすると、for文の処理が終わったときに、変数 flagの値が 0のままであれば、ピタリ賞もニアピン賞も出なかったということになります。そこで、そこで、if文で変数 flagの値が 0であるかどうかを判定し、0である場合には、ブービー賞と標準出力で出力しています。

例題7 (ファイル名: Practice8 7.java)

このプログラムは、到着予定時間の計算までは、5 章の「練習しよう」の 7 題目のプログラムと同じです。5章のプログラムに加えて、標準入力で、現在の日付(年・月・日)を入力し、int型に変換して、それぞれ変数

startYear、変数 startMonth、変数 startDayに代入しています。

5章のプログラムまでで、出発してから何日後に到着するか、ということは計算しています。この「何日後」は、変数 resultDayに代入されています。

そこで、到着予定の日付を計算するために、まず、変数 startDayに変数 resultDayの値を足して、変数 day

に代入します。次に、変数 monthに変数 startMonthの値を代入しておきます。そして、変数 dayの値が、その

月の日数を超えていないかを調べます。月の日数は、配列 numberOfDayに、下記の表のような添え字との対応で

代入されています。

添え字の番号 0 1 2 3 4 5 6 7 8 9 10 11

月 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月

Page 19: 「基礎講座Java」特別付録「練習してみよう」解答例3 Chapter3 3-3「練習してみよう」解説 (076~078ページ) 例題1 (ファイル名: Practice3

25

変数 dayの値が、その月の日数より大きければ、変数 dayの値からその日数(numberOfDay[month - 1])を

引いて、変数 dayの値を更新します。また、変数 dayの値が、その月の日数を超えているということは、月をま

たいでいるということなので、変数 monthの値を 1増やして、変数 monthの値を更新します(変数 monthの値が

更新されたら、while文の条件判定などに使われている月の日数(numberOfDay[month - 1])の値も、次の月

の値になります)。1年は 12ヶ月なので、変数 monthの値が 12より大きくなったら、変数 monthの値から 12を引いて、変数 monthの値を更新します。また、変数 monthの値が 12より大きくなるということは、年をまたいでいるということなので、何年またいでいるかを表す変数 yearIncrに 1を足します。この処理を、変数 dayの値が月の日数より小さくなるまで繰り返すと、何年後の何月何日に到着するかが計算

できたことになります。最後に、変数 startYearの値と変数 yearIncrの値を変数 yearに代入します。これによ

り、何年何月何日に到着予定であるかを計算できたことになります(変数 yearが年、変数 monthが月、変数 day

が日を表しています)。

Page 20: 「基礎講座Java」特別付録「練習してみよう」解答例3 Chapter3 3-3「練習してみよう」解説 (076~078ページ) 例題1 (ファイル名: Practice3

27

Chapter9 9-5「練習してみよう」解説(226~228ページ)

例題4 (ファイル名: Practice9 4.java)

このプログラムでは、IDとパスワードの入力しなおしを、while文を使って行っています。IDとパスワードを入力した回数を変数 countで数え、この回数が 3回未満であり、かつ IDまたはパスワードが違っている場合に、IDとパスワードの入力しなおしを要求します。while文の実行が終わるときは、IDとパスワードが正しい組み合わせで入力されているか、または 4回以上、入力間違いをした場合です。そこで、IDとパスワードが正しい組み合わせて入力されていれば、ログインに成功したと出力し、そうでなければ、ログインに失敗したことを出力しています。

例題5 (ファイル名: Practice9 5.java)

このプログラムでは、配列に A~Jの文字と、A~Jの文字に対応する ASCIIの 2進数と 10進数を代入しています。それぞれの配列の添え字が同じものが、対応関係にある文字・2進数・10進数です。そして、入力されたアルファベットが、A~Jの文字を代入した配列の要素のどれかと一致するかどうかを、for文を使って 1つずつチェックしています。一致するものがあれば、対応する 2進数と 10進数を出力しています。また、flagという変数を用意しておき、初期値として 0を代入しています。そして、for文の処理で、入力され

たアルファベットが、配列の要素内に見つかれば、この変数 flagに 1を代入しています。for文の処理を終わったとき、flagの値が 0のままであれば、入力されたアルファベットが、配列の要素内に見つからなかった、つまり A~J以外の文字が入力されたということなので、そのようにメッセージを出力しています。

例題6 (ファイル名: Practice9 6.java)

このプログラムでは、グーを 0、チョキを 1、パーを 2、というようにじゃんけんの 1つ 1つの手に番号を付けています。そしてコンピュータの手を、0・1・2の中からランダムに選択し、自分の手を標準入力で入力しています。そして、自分の手とコンピュータの手が同じであれば(あいこの場合)、while文で、自分の手を入力しなおし、

コンピュータの手を選択しなおしています。自分の手とコンピュータの手が同じである間、何度も入力のしなおし

と選択のしなおしを繰り返します。

自分の手とコンピュータの手が違うものになったとき、if文を使って勝敗を判定しています。自分の手がグー

のときにコンピュータの手はチョキまたはパー、自分の手がチョキのときにコンピュータの手はグーまたはパー、

自分の手がパーのときにコンピュータの手がグーまたはパーとなります。そこで、自分の手がどれであるかを if

文の条件とし、その内側の if文でコンピュータの手がどれであるかを条件として、勝敗の判定を出力しています。

Page 21: 「基礎講座Java」特別付録「練習してみよう」解答例3 Chapter3 3-3「練習してみよう」解説 (076~078ページ) 例題1 (ファイル名: Practice3

29

Chapter10 10-6「練習してみよう」解説(254~256ページ)

例題1 (ファイル名: Practice10 1.java)

このプログラムでは、2つの数を入力し、1つ目の数を 2つ目の数で割った商と余りを計算します。このとき、2つ目の数として「0」が入力されると、割り算をすることができません。そこで、ArithmeticExceptionの例外

処理をしておきます。

例題2 (ファイル名: Practice10 2.java)

このプログラムでは、文字列 1つと数 2つを入力し、2つの数をインデックスとして、入力された文字列の部分文字列を取り出します。このとき、インデックスとしてマイナスの数が入力される、2つ目の数が 1つ目の数より大きい、または 2つ目の数が入力された文字列の最後のインデックスより大きい数である、という場合には、部分文字列を作成することができません。そこで StringIndexOutOfBoundsExceptionの例外処理をしておきます。

例題3 (ファイル名: Practice10 3.java)

このプログラムでは、数を 5つ入力し、その平均を計算します。このとき、数に変換できない文字列が入力されると、計算をすることができません。そこで、NumberFormatExceptionの例外処理をしておきます。

例題4 (ファイル名: Practice10 4.java)

このプログラムでは、用意しておいた配列に、人の名前を代入していきます。名前を入力する人の人数も、標準

入力で決定します。このとき、用意している配列の要素数(10個)より多くの人数の名前を入力することはできません。そこで、ArrayIndexOutOfBoundsExceptionの例外処理をしておきます。

例題5 (ファイル名: Practice10 5.java)

このプログラムでは、用意しておいた配列に、入力された数を代入し、その数の合計を計算します。このとき、

数に変換できない文字列が入力されると、計算をすることができません。そこで、NumberFormatExceptionの例

外処理をしておきます。

また、用意している配列の要素数(5個)よりも多くの個数の数を入力することはできません。そこで、ArrayIndexOutOfBoundsExceptionの例外処理をしておきます。

例題6 (ファイル名: Practice10 6.java)

このプログラムでは、「,」で区切った 3つの距離のデータと、その距離を走破するためにかかった時間のデータを入力し、時速を計算します。このとき、「,」で区切った 1つ 1つのデータに、数に変換できない文字列があると計算をすることができません。そこで、NumberFormatExceptionの例外処理をしておきます。

Page 22: 「基礎講座Java」特別付録「練習してみよう」解答例3 Chapter3 3-3「練習してみよう」解説 (076~078ページ) 例題1 (ファイル名: Practice3

30

また、「,」で区切られたデータが 2つ以下のものが入力された場合、「,」で 3つに区切ることができません。そこで、StringIndexOutOfBoundsExceptionの例外処理をしておきます。

例題7 (ファイル名: Practice10 7.java)

このプログラムでは、入力された数を 7で割った余りをもとに、余りに対応する英語の曜日名を求めます。このとき、数に変換できない文字列が入力されると、計算をすることができません。そこで、NumberFormatException

の例外処理をしておきます。

Page 23: 「基礎講座Java」特別付録「練習してみよう」解答例3 Chapter3 3-3「練習してみよう」解説 (076~078ページ) 例題1 (ファイル名: Practice3

31

Chapter11 11-3「練習してみよう」解説(286~288ページ)

例題1 (ファイル名: Practice11 1.java)

このプログラムでは、「TextFile.txt」という名前のファイルを 1行読んでその行を出力する、ということを、ファイルの終わりに達するまで繰り返します。

例題2 (ファイル名: Practice11 2.java)

このプログラムでは、「TextFile.txt」という名前のファイルを 1行読んで、その行を「CopyFile.txt」という名前のファイルに出力する、ということを、ファイルの終わりに達するまで繰り返します。

例題3 (ファイル名: Practice11 3.java)

このプログラムでは、「AddressBook.csv」という名前のファイルを 1行読んで、その行を名前と住所と電話番号の 3つに分割します。そして、その 3つの情報を標準出力で出力する、ということを、ファイルの終わりに達するまで繰り返します。

例題4 (ファイル名: Practice11 4.java)

このプログラムでは、まず、ファイルの名前を 1つ標準入力から入力しておきます。そして、名前と住所と電話番号を標準入力から入力し、その 3つを「,」で連結して、あらかじめ入力された名前のファイルに出力する、と

いうことを、3人分の名前と住所と電話番号について繰り返します。

例題5 (ファイル名: Practice11 5.java)

このプログラムでは、「StudentScore.csv」という名前のファイルを 1行読んで、その行を数学と国語と英語の点数に分解します。そして、その 3教科の得点の平均点を計算し、標準出力で出力する、ということを、ファイルの終わりに達するまで繰り返します。

例題6 (ファイル名: Practice11 6.java)

このプログラムでは、標準入力から 1行ずつ文章を入力し、入力された 1行の文章を、「Letter.txt」という名前のファイルに出力する、ということを、標準入力から「End」と入力されるまで繰り返します。

Page 24: 「基礎講座Java」特別付録「練習してみよう」解答例3 Chapter3 3-3「練習してみよう」解説 (076~078ページ) 例題1 (ファイル名: Practice3

32

例題7 (ファイル名: Practice11 7.java)

このプログラムでは、入力された飲み物の情報を、商品名、分類、分量、金額、在庫数の順に「,」で区切って

「ItemDatabase.csv」という名前のファイルに出力する、ということを、あらかじめ標準入力で入力されていた飲み物の種類数分だけ繰り返します。ただし、このプログラムでは、FileWriterクラスのコンストラクタに、「true」

という 2つ目の引数が与えられています。こうすることで、すでに保存されていた飲み物の情報を消すことなく、新しい飲み物を登録することができます。

Page 25: 「基礎講座Java」特別付録「練習してみよう」解答例3 Chapter3 3-3「練習してみよう」解説 (076~078ページ) 例題1 (ファイル名: Practice3

33

Chapter12 12-5「練習してみよう」解説(312~314ページ)

例題1 (ファイル名: Practice12 1.java)

このプログラムでは、数 nを標準入力で入力し、1~nまでのかけ算(n!の計算)を行い、出力します。n!は、

calculateFactorialメソッドを使って行っています。mainメソッドで calculateFactorialメソッドに nを引

数として与え、n!の計算結果を返り値として mainメソッドで受け取り、出力をしています。calculateFactorial

メソッドでは、for文を使って n!の計算を行っています。

例題2 (ファイル名: Practice12 2.java)

このプログラムでは、ドルの為替レートと日本円の金額を標準入力で入力し、両替したドルの金額を出力します。

ドルの金額の計算は、calculateDollerメソッドを使って行っています。calculateDollerメソッドに、main

メソッドでドルの為替レートと日本円の金額を引数として与え、ドルの金額を計算し、その結果を返り値として

mainメソッドで受け取り、出力をしています。

例題3 (ファイル名: Practice12 3.java)

このプログラムでは、「xxxx-xxxx-xxxx」という形式の電話番号を標準入力で入力し、「-」がない形式の電話番号に変換し、出力します。電話番号の形式の変換は、modifyTelNumberメソッドを使って行います。mainメソッ

ドで、modifyTelNumberメソッドに、入力された電話番号を引数として与え、形式を変換した電話番号を返り値

として mainメソッドで受け取り、出力をしています。

また、この modifyTelNumberメソッドでは、入力された電話番号の形式が「xxxx-xxxx-xxxx」ではなかった

場合に、StringIndexOutOfBoundsExceptionの例外処理をしています。

modifyTelNumberメソッドの返り値になっている変数は、初期値として「""」が代入されています。このメソッ

ドの実行において例外が発生した場合には、メソッドの返り値が初期値のままとなります。そこで、mainメソッ

ドにおいて、modifyTelNumberメソッドの返り値が「""」でなければ形式の変換後の電話番号を出力し、返り値

が「""」であれば、電話番号の形式を変換できなかったことを出力しています。

例題4 (ファイル名: Practice12 4.java)

このプログラムでは、「年/月/日」という形式の日付を標準入力で入力し、「英語の月 日, 年」という形式の日付に変換し、出力します。日付の形式の変換は、modifyDate メソッドを使って行います。main メソッドで、

modifyDateメソッドに、入力された日付を引数として与え、形式を変換した日付を返り値として mainメソッド

で受け取り、出力をしています。

日付の変換は、まず、あらかじめ、英語の月の名前を配列に代入しておきます。そして、「年/月/日」という形式の日付を年と月と日に分解します。月と英語の月名は、1月は配列の添え字が 0番、2月は配列の添え字が 1番、...というように対応しています。これを利用して、英語の月名を求めます。そして、日付の形式を変換し、modifyDateメソッドの返り値として返しています。

Page 26: 「基礎講座Java」特別付録「練習してみよう」解答例3 Chapter3 3-3「練習してみよう」解説 (076~078ページ) 例題1 (ファイル名: Practice3

34

この modifyDateメソッドでは、入力された電話番号の形式が「xxxx-xxxx-xxxx」ではなかった場合に、

StringIndexOutOfBoundsExceptionの例外処理をしています。また、入力された日付を年と月と日に分解した

とき、月や日として、数値に変換できなかった場合に、NumberFormatExceptionの例外処理をしています。

また、modifyDateメソッドの返り値になっている変数は、初期値として「""」が代入されています。このメソッ

ドの実行において例外が発生した場合には、返り値が初期値のままとなります。そこで、mainメソッドにおいて、

modifyDateメソッドの返り値が「""」でなければ形式の変換後の日付を出力し、返り値が「""」であれば、日付

の形式変換できなかったことを出力しています。

例題5 (ファイル名: Practice12 5.java)

このプログラムでは、名前と住所、電話番号を「,」で区切って 1行に記述したファイルを読み込み、読み込んだ 1行 1行を名前と住所、電話番号に分解して出力します。ファイルを読み込み、読み込んだ行を分解し、出力するための文字列を作成する処理を、readAddressDataメソッドを使って行います。mainメソッドで、このメソッ

ドに、読み込むファイル名を引数として与え、出力するための文字列を返り値として mainメソッドで受け取り、

出力しています。

返り値である文字列は、ファイル内に書かれてある 1人 1人の情報を、「Yn」で区切って 1つの文字列として連結しています。

また、readAddressDataメソッドでは、読み込むファイルが存在しなかった場合に、FileNotFoundExceptionの例外処理をしています。また、ファイルから読み込んだ 1行 1行が、「,」で 3つに分解できなかった場合に、StringIndexOutOfBoundsExceptionの例外処理をしています。

例題6 (ファイル名: Practice12 6.java)

このプログラムでは、ファイルに保存されている生徒の 3教科の得点を読み込み、各生徒の平均点を計算し、出力します。平均点の計算は、calculateAverageメソッドを使って行います。mainメソッドで、このメソッドに、

生徒の 3教科の得点の配列を引数として与え、各生徒の平均点の配列を返り値として mainメソッドで受け取り、

出力しています。

ファイル内では、生徒の 3教科の得点が「,」で区切られて、1人分を 1行として保存されています。mainメ

ソッド内で、ファイルから 1行 1行を読み込み、読み込んだ行を分解し、数学と国語と英語の得点として配列に代入しています。そしてこの配列を、calculateAverageメソッドの引数として与えています。

calculateAverageメソッドの返り値も配列として受け取り、1人分ずつ出力しています。

例題7 (ファイル名: Practice12 7.java)

このプログラムでは、日本円をドルまたはユーロのどちらに両替するかを選択し、両替後の金額を出力してい

ます。両替後の金額の計算は、calculateExchangeメソッドを使って行います。

このプログラムでは、ドルの金額を計算するメソッドと、ユーロの金額を計算するメソッドの 2種類を、どちらも calculateExchangeという名前で定義しています。ドルの金額を計算するメソッドは、ドルの為替レートと

日本円の金額を、どちらも double型で、引数としています。ユーロの金額を計算するメソッドは、ユーロの為替

レートと日本円の金額を、どちらも String型で、引数としています。

mainメソッドにおいて、ドルまたはユーロのどちらに両替するかの選択を入力しています。ドルである「1」でもなく、ユーロである「2」でもない番号が入力された場合は、入力のしなおしを要求しています。そして、ドルが選択された場合には、mainメソッドで、入力された為替レートと日本円の金額を double型に

変換し、calculateExchangeメソッドの引数として与え、返り値を mainメソッドで受け取っています。

ユーロが選択された場合には、mainメソッドで、入力された為替レートと日本円の金額を String型のまま、

calculateExchangeメソッドの引数として与え、返り値を mainメソッドで受け取っています。

そして最後に、両替後の金額を出力しています。

Page 27: 「基礎講座Java」特別付録「練習してみよう」解答例3 Chapter3 3-3「練習してみよう」解説 (076~078ページ) 例題1 (ファイル名: Practice3

35

Chapter13 13-6「練習してみよう」解説(332~336ページ)

例題1 (ファイル名: Practice13 1.java)

このプログラムでは、入力された気温をもとに、平均気温を計算します。入力された気温は int型に変換して

います。そして平均気温は、割り算で計算するため、計算結果は小数になることも考えられます。そこで、キャス

トにより、int型の値を double型に変換して、平均気温を計算しています。

例題2 (ファイル名: Practice13 2.java)

このプログラムでは、2n を int型と double型で計算します。nを標準入力で入力し、for文を n回繰り返すことで、2n を計算しています。計算結果を入れる変数を int型と double型の 2種類用意し、それぞれの変数において、for文において計算していくことで、int型と double型の計算結果を求めることができます。

例題3 (ファイル名: Practice13 3.java)

このプログラムでは、ファイルに保存された、各月の収入と支出のデータを読み込み、収入における支出の割

合と、収入における残高の割合を計算します。

ファイルには、1月分について、月と収入と支出が「,」で区切って、1月 1行で保存されています。これを 1行ずつ読み込み、月と収入と支出に分解し、残高を計算します。収入と支出、残高は int型としています。

収入における支出の割合と残高の割合は、割り算で計算するため、計算結果は小数になることも考えられます。

そこで、キャストにより、int型の値を double型に変換して、それぞれの割合を計算しています。

例題4 (ファイル名: Practice13 4.java)

このプログラムでは、ファイルに保存された、商品の情報を読み込み、商品の在庫数を更新して、ファイルに保

存しなおします。このファイルには、「商品名, 飲み物の分類, 金額, 在庫数」という形式で、1行に 1種類の商品の情報が保存されています。これを読み込み、商品名、飲み物の分類、金額、在庫数に分解して、配列に代入します。

そして、情報を登録されていた飲み物に番号を付けて出力し、在庫を更新する飲み物を選択します。このとき、

「飲み物に付けた番号 - 1」が、対応する飲み物の情報を保存した配列の添え字になっています。次に、選択した飲み物について、その日の販売数と、その日に新しく届いた在庫数を入力します。そして、この

2つの入力をもとに、在庫数を計算をし、対応する在庫数の配列の要素の値を更新します。最後に、すべての飲み物の情報をファイルに書き出しています。

例題5 (ファイル名: Practice13 5.java)

このプログラムでは、ファイルに保存されている住所の登録情報を読み込み、標準入力で入力されたキーワー

ドを含む登録情報を出力します。ファイルには、1行に 1人分の住所情報が登録されており、これを 1行ずつ読み込んで配列に代入します。

Page 28: 「基礎講座Java」特別付録「練習してみよう」解答例3 Chapter3 3-3「練習してみよう」解説 (076~078ページ) 例題1 (ファイル名: Practice3

36

次に、標準入力からキーワードを 1つ入力し、for文を使って、1つ 1つの配列の要素をチェックして、キーワードを含む要素を検索します。検索の結果、見つかった住所情報を、「Yn」で連結して 1つの文字列とします。そして、最後に、見つかった住所情報をすべて出力しています。

例題6 (ファイル名: Practice13 6.java)

このプログラムでは、2進数または 10進数の番号を 1つ入力し、その番号に対応するアルファベットを出力します。入力された番号から、対応するアルファベットを検索する処理は、searchAlphabetメソッドを使って行い

ます。

このプログラムでは、2進数の番号からアルファベットを検索するメソッドと、10進数の番号からアルファベットを検索するメソッドの 2種類のメソッドを、どちらも searchAlphabetという名前で定義しています。2進数をもとに検索するメソッドでは、2進数の番号を String型で引数としています。10進数をもとに検索するメソッドでは、10進数の番号を int型で引数としています。返り値は、どちらのメソッドも、検索したアルファベット

です。

mainメソッドにおいて、番号を 1つ入力します。入力された番号が 1から始まっていれば 2進数、そうでなければ 10進数として扱います(ただしこれは、たまたま 10進数の番号に 1から始まる番号がなかったために利用できる手段です)。そして、入力された番号が 2進数であれば、番号を String型のまま、mainメソッドで、

searchAlphabetメソッドの引数として与えます。入力された番号が 10進数であれば、番号を int型に変換し、

mainメソッドで、searchAlphabetメソッドの引数として与えます。

2つの searchAlphabetメソッドはどちらも、番号と、番号に対応するアルファベットを配列に代入しておき、

for文を使って、入力された番号と、配列に代入されている番号で一致する番号があるかを検索します。一致する

番号があれば、その番号に対応するアルファベットを返り値を入れる変数に入れ、返り値として返しています。

また、どちらの searchAlphabetメソッドも、返り値のアルファベットを入れる変数の初期値を「""」として

います。従って、mainメソッドで、searchAlphabetメソッドを使ったときに、返り値の値が「""」でなければ、

入力された番号に対応するアルファベットが見つかったということであり、返り値の値が「""」であれば、入力

された番号に対応するアルファベットが見つからなかったということになります。そこで、mainメソッドにおい

て、返り値が「""」でなければ、見つかったアルファベットを出力し、返り値が「""」であれば、アルファベッ

トが見つからなかったことを出力しています。

Page 29: 「基礎講座Java」特別付録「練習してみよう」解答例3 Chapter3 3-3「練習してみよう」解説 (076~078ページ) 例題1 (ファイル名: Practice3

37

「基礎講座 Java」特別付録「練習してみよう」解答例ISBN978-4-8399-3515-3

書籍 2010年 10月 1日 初版第 1刷発行

著 者 白銀純子

発行者 中川信行

発行所 株式会社 毎日コミュニケーションズ

http://book.mycom.co.jp/support/pc/kiso java/