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 クラスを実行する 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(); 売上金額を整数型の変数 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-- 店舗番号 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; 売上の割合 ( パーセント表示 ) を計算するためには 売上金額 sum[i] を合計金額 total で割り 100 を掛ければよいが そのまま計算してしまうと すべて整数型のために整数の精度での演算が行われ 正しい答えが計算できない 精度を実数型にするために sum[i] の前に (double) をつけて実数型に変換してから計算を行う必要がある なお 選択肢の 3 番では 100 のかわりに 100.0( これは実数である ) を掛けているが これでは正しい答えは得られない それは 先に sum[i]/total が計算され その後で 100.0 が掛けられることになるが sum[i]/total は整数の精度で計算されてしまい この段階で答えが間違ってしまうからである