Java第1-3章 総合練習問題【前半】記事の解答及び解説記事です。
プログラムの解答はあくまでも一例です。問題によっては違う記述方法もあります。
変数と型と演算
変数と型と演算に関する練習問題です。
【Java】変数と型と演算 練習問題
以下の指示と実行結果に従ってプログラムを行ってください。workフォルダ内に「Exam17.java」で保存してください。
保存後、コンパイルおよび実行を行ってください。
【指示】
以下の変数を作成し、表示には作成した変数を利用してください。
変数名 | 型 | 初期値 | 概要 |
---|---|---|---|
number01 | int | 25 | 数値を保存する |
number02 | int | 2 | 数値を保存する |
operator | String | “/” | 演算の種類を保存する |
プログラム 解答例
1 2 3 4 5 6 7 8 9 10 11 12 |
class Exam17{ public static void main(String[] args){ //変数宣言 int number01 = 25; int number02 = 2; String operator = "/"; //宣言した変数を利用して表示 System.out.print(number01 + operator + number02 + "="); System.out.println(number01 / (double)number02); } } |
実行結果
C:\work>javac Exam17.java
C:\work>java Exam17
25/2=12.5
【Java】変数と型と演算 練習問題の解説
ポイント1 表示(出力)処理
1 2 |
System.out.print(number01 + operator + number02 + "="); System.out.println(number01 / (double)number02); |
Sysoutは1回のみでも問題ありません。解答例では1行目のSysoutでは「int+String+int+String」で出力しています。すべて+の為、左から順序良く演算されます。以下のように演算され改行なしで出力されます。
- int+Stringの結果はString(結果は”25/”という文字列になる)
- String+intの結果はString(結果は”25/2″という文字列になる)
- String+Stringの結果はString(結果は”25/2=”という文字列になる)
ポイント2 演算と型変換
1 |
System.out.println(number01 / (double)number02); |
「number01 / number02」という演算ではどちらもint型の為(int / int)、演算結果もintとなってしまいます。そこで、number02をキャストでdouble型に型変換してから演算(int / double)を行うことで小数の結果を表示するようにしています。
【Java】変数と型と演算 練習問題
以下の指示と実行結果に従ってプログラムを行ってください。workフォルダ内に「Exam18.java」で保存してください。
保存後、コンパイルおよび実行を行ってください。
【指示】
以下の変数を作成し、表示には作成した変数を利用してください。また、税込み金額は小数部分を切り捨てて表示してください。
変数名 | 型 | 初期値 | 概要 |
---|---|---|---|
price | int | 980 | 金額を保存する |
tax_rate | int | 8 | 消費税率を保存する |
プログラム 解答例
1 2 3 4 5 6 7 8 9 10 11 12 |
class Exam18{ public static void main(String[] args){ //変数宣言 int price = 980; int tax_rate = 8; //宣言した変数を利用して表示 System.out.println("商品の金額は" + price + "円です"); System.out.println("消費税率は"+ tax_rate + "%です"); System.out.println("税込み金額は" + (int)(price + (price * tax_rate * 0.01)) + "円です"); } } |
実行結果
C:\work>javac Exam18.java
C:\work>java Exam18
商品の金額は980円です
消費税率は8%です
税込み金額は1058円です
【Java】変数と型と演算 練習問題の解説
ポイント キャストのタイミング
1 |
System.out.println("税込み金額は" + (int)(price + (price * tax_rate * 0.01)) + "円です"); |
Sysoutの()内は「String+キャストと算術演算+String」となっています。算術演算は()で囲まれているため、算術演算が先に実行されます。つまり、(int)(price + (price * tax_rate * 0.01))の部分のマーカー部分が先に実行され、次にキャストや+演算子が実行されます。
- 「(price + (price * tax_rate * 0.01)」が処理され1058.4となる
- 「”税込み金額は” + (int)1058.4 + “円です”」となり、次にマーカー部分のキャストが行われる
- String+int+Stringとなり、すべて+演算の為、左から順に演算が行われる
「”税込み金額は” + 1058」は「”税込み金額は1058″」となり「”税込み金額は1058″+”円です”」は「”税込み金額は1058円です”」となる
【Java】変数と型と演算 練習問題
以下の指示と実行結果に従ってプログラムを行ってください。workフォルダ内に「Exam19.java」で保存してください。
保存後、コンパイルおよび実行を行ってください。
【指示】
変数名 | 型 | 初期値 | 概要 |
---|---|---|---|
price | int | 9260 | 金額を保存する |
discount_rate | int | 33 | 割引率を保存する |
プログラム 解答例
1 2 3 4 5 6 7 8 9 10 11 12 |
class Exam19{ public static void main(String[] args){ //変数宣言 int price = 9260; int discount_rate = 33; //宣言した変数を利用して表示 System.out.println("商品の金額は" + price + "円です"); System.out.println("割引率は"+ discount_rate + "%です"); System.out.println("割引される金額は" + price * discount_rate * 0.01 + "円です"); } } |
実行結果
C:\work>javac Exam19.java
C:\work>java Exam19
商品の金額は9260円です
割引率は33%です
割引される金額は3055.8円です
条件分岐
条件分岐を利用した練習問題です。
【Java】条件分岐 練習問題
「Exam19.java」をコピーして、「Exam20.java」をworkフォルダ内に作成してください。
また、以下の指示と実行結果に従ってプログラムを追加および編集してください。保存後、コンパイルおよび実行を行ってください。
【指示】
以下の変数を追加してください。
変数名 | 型 | 初期値 | 概要 |
---|---|---|---|
day_of_week | char | ‘土’ | 曜日を保存する |
day_of_month | int | 1 | 日を保存する |
以下のような条件でプログラムを分岐処理させてください。
条件 | 処理 |
---|---|
曜日が’土’の場合 | 割引率を1.2倍し、以下を追加表示 「土曜日は割引率アップ!」 |
曜日が’土’でかつ、5の付く日の場合 (5日、15日、25日) |
割引率を1.5倍 「5の付く日で土曜日は割引率更にアップ!!」 |
プログラム 解答例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
class Exam20{ public static void main(String[] args){ //変数宣言 int price = 9260; int discount_rate = 33; int day_of_month = 1; char day_of_week = '土'; //宣言した変数を利用して表示 System.out.println("今日は" + day_of_month + "日(" + day_of_week + ")"); System.out.println("商品の金額は" + price + "円です"); if( (day_of_month == 5 || day_of_month == 15 || day_of_month == 25) && day_of_week == '土' ){ discount_rate *= 1.5; System.out.println("5の付く日で土曜日は割引率更にアップ!!"); }else if(day_of_week == '土'){ discount_rate *= 1.2; System.out.println("土曜日は割引率アップ!"); } System.out.println("割引率は"+ discount_rate + "%です"); System.out.println("割引される金額は" + price * discount_rate * 0.01 + "円です"); } } |
実行結果
C:\work>javac Exam20.java
C:\work>java Exam20
今日は1日(土)
商品の金額は9260円です
土曜日は割引率アップ!
割引率は39%です
割引される金額は3611.4円です
C:\work>java Exam20.java
C:\work>java Exam20
今日は5日(土)
商品の金額は9260円です
5の付く日で土曜日は割引率更にアップ!!
割引率は49%です
割引される金額は4537.400000000001円です
※コンパイルおよび実行は2回行っています。2回目はday_of_monthの値を5に変更しています。
【Java】条件分岐 練習問題の解説
ポイント1 条件
1 |
(day_of_month == 5 || day_of_month == 15 || day_of_month == 25) && day_of_week == '土' |
条件はまず以下の2つに大別でき、以下の2つの条件が&&で繋がっています。
- (day_of_month == 5 || day_of_month == 15 || day_of_month == 25)
- day_of_week == ‘土’
1の条件(左側の条件)はday_of_manthが5か10か25の時となります。2の条件(右側の条件)はday_of_weekが’土’の時となります。
その2つの条件のどちらも当てはまるときのみ、ifブロック内の処理が行われます。
ポイント2 条件の順序
ifとelse ifは必ず先にifの条件が判定されます。ifの条件で「day_of_week == ‘土’」を先に判定してしまうと、day_of_manthがどんな値であろうとifブロックが実行されてしまいます。
下は図による説明です。緑の部分をifで設定すると水色の部分が含まれています。つまり、水色の部分を先に判定してから緑の部分を判定する必要があります。
if-else ifで条件を設定する場合は、上から条件を確認して、条件が重複する部分がないか確認しましょう。
【Java】条件分岐 練習問題
「Exam17.java」をコピーして、「Exam21.java」をworkフォルダ内に作成してください。
また、以下の指示と実行結果に従ってプログラムを追加および編集してください。保存後、コンパイルおよび実行を行ってください。
【指示】
以下のような条件でプログラムを分岐処理させてください。
条件 | 処理 |
---|---|
operatorが”/”の場合 | 割り算の計算式と結果を表示 |
operatorが”*”の場合 | 掛け算の計算式と結果を表示 |
operatorが”+”の場合 | 足し算の計算式と結果を表示 |
operatorが”-“の場合 | 引き算の計算式と結果を表示 |
プログラム 解答例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
class Exam21{ public static void main(String[] args){ //変数宣言 int number01 = 25; int number02 = 2; String operator = "-"; System.out.print(number01 + operator + number02 + "="); if(operator.equals("/")){ System.out.println(number01 / (double)number02); }else if(operator.equals("*")){ System.out.println(number01 * (double)number02); }else if(operator.equals("+")){ System.out.println(number01 + (double)number02); }else if(operator.equals("-")){ System.out.println(number01 - (double)number02); } } } |
実行結果
C:\work>javac Exam21.java
C:\work>java Exam21
25/2=12.5
C:\work>javac Exam21.java
C:\work>java Exam21
25*2=50.0
C:\work>javac Exam21.java
C:\work>java Exam21
25+2=27.0
C:\work>javac Exam21.java
C:\work>java Exam21
25-2=23.0
※コンパイルおよび実行は4回行っています。それぞれの実行はoperatorのデータを/から*+-に変えて行っています。
【Java】条件分岐 練習問題
以下の指示と実行結果に従ってプログラムを行ってください。workフォルダ内に「Exam22.java」で保存してください。
保存後、コンパイルおよび実行を行ってください。
【指示】
以下の変数を追加してください。
変数名 | 型 | 初期値 | 概要 |
---|---|---|---|
money | int | 8000 | 手持ち金額を保存する |
meal_price | int | 2300 | 食事に使った金額 |
上記の手持ち金額から食事に使った金額を引いてください。さらに、元々の手持ち金額と残金を比べ、以下のような条件でプログラムを分岐処理させてください。
条件 | 処理 |
---|---|
残金が60%以上の場合 | 残金の表示に追加して「残金には余裕があります」と表示 |
残金が59-30%の場合 | 残金の表示に追加して「残金が少なくなっています」と表示 |
残金が29%以下の場合 | 残金の表示に追加して「残金があと少しです」と表示 |
プログラム 解答例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
class Exam22{ public static void main(String[] args){ //変数宣言 int money = 8000; int meal_price = 2300; int current_money = money - meal_price; //宣言した変数を利用して表示 System.out.println("残金は" + current_money + "円です"); //条件分岐 if(current_money >= money * 0.6){ System.out.println("残金には余裕があります"); }else if(current_money >= money * 0.3){ System.out.println("残金が少なくなっています"); }else{ System.out.println("残金があと少しです"); } } } |
実行結果
C:\work>javac Exam22.java
C:\work>java Exam22
残金は5700円です
残金には余裕があります
C:\work>javac Exam22.java
C:\work>java Exam22
残金は3000円です
残金が少なくなっています
C:\work>javac Exam22.java
C:\work>java Exam22
残金は1000円です
残金があと少しです
※コンパイルおよび実行は3回行っています。2回目はmeal_priceを5000に変更しています。3回目はmeal_priceを7000に変更しています。
【Java】条件分岐 練習問題の解説
ポイント 条件の順序
先の問題でも説明にあったとおりifとelse ifは必ず先にifの条件が判定されます。ifの条件に当てはまらなかった場合、else ifに処理が移行します。また、複数else ifがある場合は、上から順に判定していくため、下の条件には記述されている条件にプラスして上の条件で当てはまらないという条件も含まれることになります。
図で説明すると、緑の部分がifの条件に当てはまる範囲です。
else ifの条件は単体でみると緑の部分も含まれます。しかし、ifの条件に当てはまらなかった場合にelse ifに移行するため、青の部分が条件に当てはまる範囲となります。
また、緑にも青にも含まれなかった部分がelseの条件に当てはまる範囲(黄色)となります。
if-else if-elseで条件を設定する場合は、上から条件を確認して、必要に応じて図を描いて確認してみましょう。
配列および繰り返し処理
配列や繰り返し処理を利用した練習問題です。
【Java】配列と繰り返し処理 練習問題
以下の指示と実行結果に従ってプログラムを行ってください。workフォルダ内に「Exam23.java」で保存してください。
保存後、コンパイルおよび実行を行ってください。
【指示】
以下のような配列および変数を作成してください。配列はnewでも初期化子でもかまいません。
変数名および配列名 | 型 | 初期値 | 概要 |
---|---|---|---|
numbers | int[] | 10,18,33,92,47 | 乗算に利用する数値 |
result | int | 1 | 乗算結果を保存する |
上記配列内の数値を全て乗算して結果を表示するプログラムを作成してください。
プログラム 解答例
1 2 3 4 5 6 7 8 9 10 11 12 |
class Exam23{ public static void main(String[] args){ //変数宣言 int[] numbers = {10,18,33,92,47}; int result = 1; for(int i = 0; i < numbers.length; i++){ result *= numbers[i]; } System.out.println("計算結果は" + result + "です"); } } |
実行結果
計算結果は25684560です
【Java】配列と繰り返し処理 練習問題の解説
ポイント1 繰り返し条件と配列要素数
1 |
for(int i = 0; i < numbers.length; i++){ |
配列の要素数分で繰り返しを行う場合は、「配列名.length」を利用します。もちろん配列の要素数を数えて(今回は5)もよいですが、配列の要素数が増減した場合に記述を変更しなくてもよいというメリットがあります。
ポイント2 ループと乗算
1 |
result *= numbers[i]; |
上記の記述は以下のような記述と同様になります。
1 |
result = result * number[i] ; |
1回目のループ
resultが1、iは0で初期化されます。条件は「i < numbers.length」、値に置き換えると「0 < 5」となり、条件に当てはまり処理が行われます。配列はnumber[0]で値は10となります。1回目の処理の変数や配列を数値に置き換えると以下のようになります。
result = 1 * 10 ;
結果としてresultには10が代入されます。
※初期値を0にすると、最初の乗算で0となってしまうため、1としています。
2回目のループ
resultが10、i++でインクリメントされiは1となります。条件は「i < numbers.length」、値に置き換えると「1 < 5」となり、条件に当てはまり処理が行われます。配列はnumber[1]で値は18となります。2回目の処理の変数や配列を数値に置き換えると以下のようになります。
result = 10 * 18 ;
結果としてresultには180が代入されます。
3回目のループ
resultが180、i++でインクリメントされiは2となります。条件は「i < numbers.length」、値に置き換えると「2 < 5」となり、条件に当てはまり処理が行われます。配列はnumber[2]で値は33となります。3回目の処理の変数や配列を数値に置き換えると以下のようになります。
result = 180 * 33;
結果としてresultには5940が代入されます。
4回目のループ
resultが5940、i++でインクリメントされiは3となります。条件は「i < numbers.length」、値に置き換えると「3 < 5」となり、条件に当てはまり処理が行われます。配列はnumber[3]で値は92となります。4回目の処理の変数や配列を数値に置き換えると以下のようになります。
result = 5940 * 92;
結果としてresultには546480が代入されます。
5回目のループ
resultが546480、i++でインクリメントされiは4となります。条件は「i < numbers.length」、値に置き換えると「4 < 5」となり、条件に当てはまり処理が行われます。配列はnumber[4]で値は47となります。resultが546480です。4回目の処理の変数や配列を数値に置き換えると以下のようになります。
result = 546480 * 47;
結果としてresultには25684560が代入されます。
i++でiが5になり、i < 5の条件(値に置き換えると 5 < 5)が当てはまらない為、ループが終了します。その後、表示を行います。
【Java】配列と繰り返し処理 練習問題
「Exam23.java」をコピーして、「Exam24.java」をworkフォルダ内に作成してください。以下の指示と実行結果に従ってプログラムを行ってください。
保存後、コンパイルおよび実行を行ってください。
【指示】
以下の変数を追加してください。
変数名および配列名 | 型 | 初期値 | 概要 |
---|---|---|---|
power | int | 3 | 累乗する回数 |
numbersの各数値をpower回数分だけ累乗して、その結果を表示してください。
プログラム 解答例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
class Exam24{ public static void main(String[] args){ //変数宣言 int[] numbers = {10,18,33,92,47}; int result = 1; int power = 3; for(int i = 0; i < numbers.length; i++){ result = 1; for(int j = 0; j < power; j++){ result *= numbers[i]; } System.out.print(result + " "); } } } |
実行結果
C:\work>javac Exam24.java
C:\work>java Exam24
1000 5832 35937 778688 103823
【Java】配列と繰り返し処理 練習問題の解説
ポイント1 繰り返し文のネスト
1 2 3 4 5 6 7 |
for(int i = 0; i < numbers.length; i++){ result = 1; for(int j = 0; j < power; j++){ result *= numbers[i]; } System.out.print(result + " "); } |
外側1回目のループ
1 |
for(int i = 0; i < numbers.length; i++){ |
【説明1】iは0で初期化されます。条件は「i < numbers.length」、値に置き換えると「0 < 5」となり、条件に当てはまるため、処理が行われます。
1 |
result = 1; |
【説明2】処理の1行にはresultへ1を代入しています。
1 |
for(int j = 0; j < power; j++){ |
【説明3】次の処理ではforがネストで記述されており、jは0で初期化されます。条件は「j < power」、値に置き換えると「0 < 3」となり、条件に当てはまるため、処理が行われます。
1 |
result *= numbers[i]; |
【説明4】resultには1、iには0が代入されており、配列はnumber[0]で値は10となります。値に置き換えると「result = 1 * 10」となり、resultには10が代入されます。
1 2 3 |
for(int j = 0; j < power; j++){ result *= numbers[i]; } |
【説明5】「result *= numbers[i]」の処理が終了すると、内側のループが先に行われるため、j ++され、jが1となります。次に条件を確認し「j < power」、値に置き換えると「1 < 3」となり、条件に当てはまるため、処理が行われます。
ここからは説明4と説明5の部分でループが行われます。
次に【説明4】の処理が行われ、resultには10、iには0が代入されており、配列はnumber[0]で値は10となります。値に置き換えると「result = 10 * 10」となり、resultには100が代入されます。
次に【説明5】と同様に処理が終了すると、内側のループが先に行われるため、j ++され、jが2となります。次に条件を確認し「j < power」、値に置き換えると「2 < 3」となり、条件に当てはまるため、処理が行われます。
再度【説明4】の処理が行われ、resultには100、iには0が代入されており、配列はnumber[0]で値は10となります。値に置き換えると「result = 100 * 10」となり、resultには1000が代入されます。
次に【説明5】と同様に処理が終了すると、内側のループが先に行われるため、j ++され、jが3となります。次に条件を確認し「j < power」、値に置き換えると「3 < 3」となり、条件に当てはまらず、処理が終了します。
上図②の部分を終了後、③のSysoutを行いresultの1000が表示されます。
そして、外側のループ上部に戻ります。
外側2回目のループ
1 |
for(int i = 0; i < numbers.length; i++){ |
【説明6】iは1で初期化されます。条件は「i < numbers.length」、値に置き換えると「1 < 5」となり、条件に当てはまるため、処理が行われます。
1 |
result = 1; |
【説明7】処理の1行にはresultへ1を代入しています。
1 |
for(int j = 0; j < power; j++){ |
【説明8】次の処理ではforがネストで記述されており、再度jは0で初期化されます。条件は「j < power」、値に置き換えると「0 < 3」となり、条件に当てはまるため、処理が行われます。
1 |
result *= numbers[i]; |
【説明9】resultには1、iには1が代入されており、配列はnumber[1]で値は18となります。値に置き換えると「result = 1 * 18」となり、resultには18が代入されます。
1 2 3 |
for(int j = 0; j < power; j++){ result *= numbers[i]; } |
【説明10】「result *= numbers[i]」の処理が終了すると、内側のループが先に行われるため、j ++され、jが1となります。次に条件を確認し「j < power」、値に置き換えると「1 < 3」となり、条件に当てはまるため、処理が行われます。
ここからは説明9と説明10の部分でループが行われます。
次に【説明9】の処理が行われ、resultには18、iには1が代入されており、配列はnumber[1]で値は18となります。値に置き換えると「result = 18 * 18」となり、resultには324が代入されます。
次に【説明10】と同様に処理が終了すると、内側のループが先に行われるため、j ++され、jが2となります。次に条件を確認し「j < power」、値に置き換えると「2 < 3」となり、条件に当てはまるため、処理が行われます。
再度【説明9】の処理が行われ、resultには324、iには1が代入されており、配列はnumber[1]で値は18となります。値に置き換えると「result = 324 * 18」となり、resultには5832が代入されます。
次に【説明10】と同様に処理が終了すると、内側のループが先に行われるため、j ++され、jが3となります。次に条件を確認し「j < power」、値に置き換えると「3 < 3」となり、条件に当てはまらず、処理が終了します。
上図②の部分を終了後、③のSysoutを行いresultの5832が表示されます。
そして、外側のループ上部に戻ります。
外側3回目のループ、外側4回目のループ、外側3回目のループと繰り返され、条件が「i < numbers.length」、値に置き換えると「5 < 5」となった際に、外側のループも終了します。