Week 1 理解度確認クイズ 解答・解説
【問題1】(4×2 点=8 点)以下の各問いに答えよ。
【問題1-1】32bit 版の Windows8.1 に Java をインストールする時、必要なパッケージはどれか。但し、 Java のコンパイルができる環境をインストールするものとする。 1. jdk-8u65-windows-i586.exe 2. jre-8u65-windows-i586.exe 3. jdk-8u65-linux-i586.rpm 4. jdk-8u65-windows-x64.exe 5. jre-8u65-windows-x64.exe 正解:1
Java をコンパイルできる環境が必要なことから、JRE ではなく JDK が必要。Windows の 32bit 版であ るので、windows-i586 を選択する。 【問題1-2】“javac Hello.java”というコマンドは、何を実行しているのか。 1. Hello.java が実行できるように、java をインストールしている 2. Hello.java が実行できるように、環境変数の設定をしている 3. Hello.java という名前のファイルを編集しようとしている 4. Hello.java という名前のプログラムをコンパイルしている 5. Hello.java というファイルに含まれる Hello クラスを実行する 正解:4 javac は、プログラムをコンパイルするためのコマンド。実行するのは java。
【問題1-3】以下に示す while 文と同じ動きをするプログラムを for 文を用いて作成した。【空欄 ア】の 中身として適切なものを選べ。 --- while 文によるプログラム --- int i=10; while(i>=1){ 何かのプログラム i = i - 1; } --- --- for 文によるプログラム --- int i; for( 【空欄 ア】 ){ 何かのプログラム } --- 1. i=10;i==0;i-- 2. i==10;i>0;i-- 3. i=10;i>0;i-- 4. i=9;i>=0;i-- 5. i=0;i<10;i++ 正解:3
while 文では i が 10 から 1 ずつ減りながら、1 まで繰り返されているため、for 文でも同じように、i=10 を初期値とし、1 ずつ減らしながら、i>0 まで(i=1 まで)繰り返すように指定すればよい。
【問題1-4】以下のプログラムを実行すると、何が出力されるか。 ---
class CalcSum{
public static void main(String []args){ int i=0, sum=0;
while (i<10){ sum = sum + i; } System.out.printf("合計:%d¥n", sum); } } ---
1. 「合計:1」と出力する 2. 「合計:10」と出力する 3. 「合計:45」と出力する 4. 「合計:55」と出力する 5. 何も出力せず、プログラムが終わらない 正解:5 0 から 9 までの合計を計算させようとしているようだが、while 文の中で i の値が変更されていないため、 いつまでたってもi=0 のままである。そのため、while 文が終了せず、無限ループとなってしまう。正常 に計算させる場合は、while 文のループの中で、i=i+1; とする必要がある。 【問題2】(6×2 点=12 点) 以下のプログラムは、3 店舗ある店舗別の売上伝票を集計し、売上全体に対する各店舗の割合を計算する プログラムである。売上伝票は、ひとつの店舗に対して複数枚あるため、プログラム内部で同じ店舗に 対する売上金額の合計を計算している。データの入力は、店舗番号(1~3)と売上金額を整数で入力し ていき、すべての伝票(枚数は固定ではない)の入力が終わったら、店舗番号として 0 を入力すること になっている。 入力系列と、その時の出力の例は、以下のとおりである。 --- 店舗番号と売上金額は? 1 200 店舗番号と売上金額は? 2 500 店舗番号と売上金額は? 3 100 店舗番号と売上金額は? 1 200 店舗番号と売上金額は? 3 1000 店舗番号と売上金額は? 0 店舗番号1:シェア 20.00% 店舗番号2:シェア 25.00% 店舗番号3:シェア 55.00% ---
このプログラムが正しく動くように、各空欄に最も適切なコードを選択せよ。 ---
import java.util.Scanner; class CalcShare{
public static void main(String []args){ 【空欄 イ】
int i, j, total=0;
Scanner scan=new Scanner(System.in); 【空欄 ウ】{ System.out.println("店舗番号と売上金額は?"); i=scan.nextInt(); if (i==0){ 【空欄 エ】 } 【空欄 オ】 sum[i] = sum[i] + j; total = total + j; } for(【空欄 カ】){ 【空欄 キ】 System.out.printf("店舗番号 %d : シェア %.2f%%¥n", i, s); } } } --- 【問題2-1】【空欄 イ】 1. int sum; 2. int sum[];
3. int sum[] = new int[]; 4. int sum[] = {0,0,0}; 5. int sum[] = {0,0,0,0};
正解:5
整数型の配列sum を準備し、すべて 0 で初期化しておく。店舗は 3 店舗だが、店舗番号(1~3)をその まま配列の添字として使用するため、um[3]まで使えるように、要素数は 4 個(sum[0]~sum[3])必要 となる。なお、こうした実装は(sum[0]が使われないので)無駄があるため、配列 sum は要素数 3 個(sum[0] ~sum[2])で宣言しておき、値の入力や出力の時に、sum[i]ではなく、sum[i-1]とするのが正しい実装 である。但し、こうした実装をすると添字の値が 1 つずれるため、プログラムを書く方が混乱してしま い、バグを作り出してしまう場合が多い。そのため、慣れないうちは、多少の無駄があっても直感的に わかりやすい形でプログラムを書く方がよい。 【問題2-2】【空欄 ウ】 1. while() 2. while(true) 3. while(false) 4. while(1) 5. while(100000) 正解:2 売上伝票が何枚あるかわからないため、店舗番号として 0 が入力されるまで無限にループさせる必要が ある。そのため、常に真(=true)を条件として指定すればよい。 【問題2-3】【空欄 エ】 1. break; 2. continue; 3. jump; 4. next; 5. skip; 正解:1
while 文等のループを抜け出すためには break 文を使う。なお、continue 文を使うと、ループの最後ま での実行をスキップし、次のループへと実行を移す。
【問題2-4】【空欄 オ】 1. j=scan(); 2. j=scan.scan(); 3. j=scan.next(); 4. j=scan.nextInt(); 5. j=scan.nextDouble(); 正解:4 売上金額を整数型の変数 j に代入するので、整数を読みとる nextInt()を使用する。 【問題2-5】【空欄 カ】 1. i=1;i<3;i++ 2. i=0;i<4;i++ 3. i=0;i<sum.length;i++ 4. i=1;i<sum.length;i++ 5. i=sum.length;i<0;i-- 正解:4
店舗番号1~3 をループさせればよいので、i=1~i=3 までのループを作る。sum.length は配列 sum の要 素数(4 個)であるから、それ未満、という条件で i=3 までとなる。なお、今回は店舗数が 3 と決まって いたため、for(i=1;i<4;i++) としても同じであるが、今後店舗数が変更になった時、わざわざ値を変更し なくてすむよう、4 という固定の数字ではなく、sum.length を使っておく方がよい。 【問題2-6】【空欄 キ】 1. double s=sum/total*100; 2. double s=sum[i]/total*100; 3. double s=sum[i]/total*100.0; 4. double s=(double)sum[i]/total*100; 5. double s=sum/(double)total*100; 正解:4 売上の割合(パーセント表示)を計算するためには、売上金額sum[i]を合計金額 total で割り、100 を掛 ければよいが、そのまま計算してしまうと、すべて整数型のために整数の精度での演算が行われ、正し い答えが計算できない。精度を実数型にするために、sum[i]の前に(double)をつけて実数型に変換してか ら計算を行う必要がある。なお、選択肢の3 番では、100 のかわりに 100.0(これは実数である)を掛け ているが、これでは正しい答えは得られない。それは、先に sum[i]/total が計算され、その後で 100.0 が掛けられることになるが、sum[i]/total は整数の精度で計算されてしまい、この段階で答えが間違って しまうからである。