ソフトウェア工学(4) 2012.11.14 [email protected] ソフトウェア工学 4. プログラミングの基礎(3)(復習) 配列とループの★補足★ 2012年11月14日 慶應義塾大学 理工学部 管理工学科 飯島 正 ([email protected]) 1 ソフトウェア工学(4) 2012.11.14 [email protected] [課題-03b]: 更に拡張:最低点を取った人(複数名)を表示する • 最低点を取る人は1名とは限りません. • 最悪,全員が同点なら,全員が最低点 (最高点)を取ったことになります. • 最低点を取った人が複数いる場合, 全員の学籍番号を表示するプログラム K003Min3.java を作って下さい. 2 ソフトウェア工学(4) 2012.11.14 [email protected] 配列の使い方 • 配列の使い方 – 始めから,サイズが決まっている場合 • 必要なサイズを確保する – 可変長のリストを作るとき • 最大サイズを確保し,どこまで使っているかを示す, 添字ポインタ(もしくは,要素数のカウンタ)を併用する. • (参考)この目的ならば, Javaの場合,ArrayListクラスの方が便利 3 ソフトウェア工学(4) 2012.11.14 [email protected] [課題-03b]: 更に拡張:最低点を取った人(複数名)を表示する public class K003Min3 { public static void main( String args[] ) { int tokuten[] = {5,7,5,3,8,3,9,3}; int minId[] = new int[tokuten.length]; //最低点取得者の学籍番号リスト int min = tokuten[0]; // 最低点の候補 int numMin = 1; // 最低点取得者数 System.out.println( "最低点は" + min ); for ( int i = 0; i < numMin; i++ ) { System.out.println( "最低点をとったのは" + minId[i] ); } } } 4 ソフトウェア工学(4) 2012.11.14 [email protected] [課題-03b]: 更に拡張:最低点を取った人(複数名)を表示する > java K003Min3 学籍番号1番の人の得点 = 5 学籍番号2番の人の得点 = 7 学籍番号3番の人の得点 = 3 学籍番号4番の人の得点 = 5 学籍番号5番の人の得点 = 8 学籍番号6番の人の得点 = 3 学籍番号7番の人の得点 = 9 学籍番号8番の人の得点 = 3 最低点 = 3 最低点得点者の学籍番号 = {3,6,8,} > 5 課題のヒント ソフトウェア工学(4) 2012.11.14 [email protected] [課題-03b]: 更に拡張:最低点を取った人(複数名)を表示する public class K003Min3 { public static void main( String args[] ) { int[] tokuten = {5,7,5,3,8,3,9,3}; int[] minId = new int[tokuten.length]; //最低点取得者の学籍番号 (全員同点の場合,全員が最低点) int numMin = 0; // 配列minIdで使用中の範囲の最後の添え字+1(最低点得点者の人数) // int min = tokuten[0]; // 最低点の候補(最初の仮定) for ( int i = 0; i < tokuten.length; i++ ) { System.out.println( "学籍番号"+ (i + 1) + "番の人の得点 = " + tokuten[i] ); if ( tokuten[i] ?? min ) { 最低点の更新, min = tokuten[i]; 最低点候補よりも minId[0] = i+1; 最低点取得者 numMin = 1; 低い点を取った人がいないか, リストのリセット } else if ( tokuten[i] ?? min ) { 同じ最低点を取っている人はいるか, numMin++; 最低点取得者 をチェックする. minId[numMin-1] = i + 1; リストへの追加 } } System.out.println( "最低点 = " + min ); // System.out.print( "最低点得点者の学籍番号 = {" ); for ( int i = 0; i < numMin; i++ ) { System.out.print( minId[i] + "," ); } System.out.println( "}" ); } } 6 ソフトウェア工学(4) 2012.11.14 [email protected] [課題-03b]: 更に拡張:最低点を取った人(複数名)を表示する Min 1 [0] 2 [1] 3 [2] 4 [3] 5 [4] 6 [5] 7 [6] 8 [7] 5 7 5 3 8 3 9 3 最低点 の候補 5 初期値設定 (変数min) 最低点 取得者 numMin の人数 1 最低点取得者候補の学籍番号リストminId 1 0 添字: numMin-1 0 0 0 0 0 0 無視する 添字 学籍番号 7 ソフトウェア工学(4) 2012.11.14 [email protected] [課題-03b]: 更に拡張:最低点を取った人(複数名)を表示する Min 1 [0] 2 [1] 3 [2] 4 [3] 5 [4] 6 [5] 7 [6] 8 [7] 5 7 5 3 8 3 9 3 最低点 の候補 5 最低点 取得者 numMin の人数 1 tokuten[i] の方がmin よりも大きい 更新しない 増やさない 最低点取得者候補の学籍番号リストminId 1 0 0 添字: numMin-1 0 0 0 0 0 無視する 追加しない 添字 学籍番号 8 ソフトウェア工学(4) 2012.11.14 [email protected] [課題-03b]: 更に拡張:最低点を取った人(複数名)を表示する Min 1 [0] 2 [1] 3 [2] 4 [3] 5 [4] 6 [5] 7 [6] 8 [7] 5 7 5 3 8 3 9 3 最低点 の候補 5 tokuten[i] とminが 等しい 最低点 取得者 numMin の人数 1 最低点取得者候補の学籍番号リストminId 1 0 添字: numMin-1 更新しない 人数の追加 0 0 0 0 0 0 無視する 学籍番号3番の追加 添字 学籍番号 9 ソフトウェア工学(4) 2012.11.14 [email protected] [課題-03b]: 更に拡張:最低点を取った人(複数名)を表示する Min 1 [0] 2 [1] 3 [2] 4 [3] 5 [4] 6 [5] 7 [6] 8 [7] 5 7 5 3 8 3 9 3 最低点 の候補 5 最低点 取得者 numMin の人数 2 tokuten[i] とminが 等しい 更新しない 人数の追加後 最低点取得者候補の学籍番号リストminId 1 3 0 添字: numMin-1 0 0 0 0 0 無視する 学籍番号3番の追加後 添字 学籍番号 10 ソフトウェア工学(4) 2012.11.14 [email protected] [課題-03b]: 更に拡張:最低点を取った人(複数名)を表示する Min 1 [0] 2 [1] 3 [2] 4 [3] 5 [4] 6 [5] 7 [6] 8 [7] 5 7 5 3 8 3 9 3 添字 最低点 の候補 5 最低点 取得者 numMin の人数 2 tokuten[i] よりminの 方が小さい 最小値候補 minの更新 最低点取得者候補の学籍番号リストminId 1 3 0 添字: numMin-1 人数の リセット 0 0 0 0 0 無視する リストのリセット 学籍番号 11 ソフトウェア工学(4) 2012.11.14 [email protected] [課題-03b]: 更に拡張:最低点を取った人(複数名)を表示する Min 1 [0] 2 [1] 3 [2] 4 [3] 5 [4] 6 [5] 7 [6] 8 [7] 5 7 5 3 8 3 9 3 添字 最低点 の候補 3 最低点 取得者 numMin の人数 1 最低点取得者候補の学籍番号リストminId 4 3 添字: numMin-1 最小値候補 人数の minの更新後 リセット後 0 0 0 0 0 0 無視する リストのリセット後 学籍番号 12 ソフトウェア工学(4) 2012.11.14 [email protected] [課題-03b]: 更に拡張:最低点を取った人(複数名)を表示する Min 1 [0] 2 [1] 3 [2] 4 [3] 5 [4] 6 [5] 7 [6] 8 [7] 5 7 5 3 8 3 9 3 最低点 の候補 3 最低点 取得者 numMin の人数 1 tokuten[i] の方がmin よりも大きい 添字 更新しない 増やさない 最低点取得者候補の学籍番号リストminId 4 3 0 添字: numMin-1 0 0 0 0 0 無視する 追加しない 学籍番号 13 ソフトウェア工学(4) 2012.11.14 [email protected] [課題-03b]: 更に拡張:最低点を取った人(複数名)を表示する Min 1 [0] 2 [1] 3 [2] 4 [3] 5 [4] 6 [5] 7 [6] 8 [7] 5 7 5 3 8 3 9 3 最低点 の候補 3 最低点 取得者 numMin の人数 1 tokuten[i] とminが 等しい 最低点取得者候補の学籍番号リストminId 4 3 添字: numMin-1 0 0 0 0 0 0 無視する 添字 人数の追加 学籍番号 更新しない 学籍番号6番の追加 14 ソフトウェア工学(4) 2012.11.14 [email protected] [課題-03b]: 更に拡張:最低点を取った人(複数名)を表示する Min 1 [0] 2 [1] 3 [2] 4 [3] 5 [4] 6 [5] 7 [6] 8 [7] 5 7 5 3 8 3 9 3 最低点 の候補 3 最低点 取得者 numMin の人数 2 最低点取得者候補の学籍番号リストminId 4 6 0 添字: numMin-1 0 0 0 0 0 無視する 添字 学籍番号 人数の追加後 学籍番号6番の追加後 15 ソフトウェア工学(4) 2012.11.14 [email protected] [課題-03b]: 更に拡張:最低点を取った人(複数名)を表示する Min 1 [0] 2 [1] 3 [2] 4 [3] 5 [4] 6 [5] 7 [6] 8 [7] 5 7 5 3 8 3 9 3 最低点 の候補 3 最低点 取得者 numMin の人数 2 tokuten[i] の方がmin 添字 よりも大きい 学籍番号 更新しない 増やさない 最低点取得者候補の学籍番号リストminId 4 6 0 添字: numMin-1 0 0 0 0 0 無視する 追加しない 16 ソフトウェア工学(4) 2012.11.14 [email protected] [課題-03b]: 更に拡張:最低点を取った人(複数名)を表示する Min 1 [0] 2 [1] 3 [2] 4 [3] 5 [4] 6 [5] 7 [6] 8 [7] 5 7 5 3 8 3 9 3 最低点 の候補 3 最低点 取得者 numMin の人数 2 添字 tokuten[i] とminが 学籍番号 等しい 更新しない 人数の追加 最低点取得者候補の学籍番号リストminId 4 6 0 添字: numMin-1 0 0 0 0 0 無視する 学籍番号6番の追加 17 ソフトウェア工学(4) 2012.11.14 [email protected] [課題-03b]: 更に拡張:最低点を取った人(複数名)を表示する 最低点 の候補 1 [0] 2 [1] 3 [2] 4 [3] 5 [4] 6 [5] 7 [6] 8 [7] 5 7 5 3 8 3 9 3 3 最低点 取得者 の人数 3 添字 tokuten[i] とminが 学籍番号 等しい 更新しない 人数の追加後 最低点取得者候補の学籍番号リスト 4 6 8 0 添字: numMin-1 0 0 0 0 無視する 学籍番号6番の追加後 18 ソフトウェア工学(4) 2012.11.14 [email protected] [課題-03b]: 更に拡張:最低点を取った人(複数名)を表示する Min 1 [0] 2 [1] 3 [2] 4 [3] 5 [4] 6 [5] 7 [6] 8 [7] 最低点 の候補 最低点 取得者 numMin の人数 最低点取得者候補の学籍番号リストminId 5 7 5 3 8 3 9 3 添字 学籍番号 最低点を 取った人の 学籍番号 (変数minId) 3 最小値 (変数min) 3 最低点を 取った人の 人数 (変数numMin) 4 6 8 0 添字: numMin-1 0 0 0 0 無視する 19 ソフトウェア工学(4) 2012.11.14 [email protected] [課題-03b]: 課題の提出(複数の最低点を取った 人の学籍番号を表示する) • メールで送ってください – 宛先: [email protected] – 件名: [SE-009] 各自の学科内ID番号 氏名 • 件名欄は,氏名以外はすべて半角文字でお願いします – 本文 • 学籍番号と氏名 • 授業の感想 – 添付 • k003Min3.javaを添付ファイルで送ってください 20 課題のヒント ソフトウェア工学(4) 2012.11.14 [email protected] [課題-03b]: 更に拡張:最低点を取った人(複数名)を表示する public class K003Min3 { public static void main( String args[] ) { int[] tokuten = {5,7,5,3,8,3,9,3}; int[] minId = new int[tokuten.length]; //最低点取得者の学籍番号 (全員同点の場合,全員が最低点) int numMin = 0; // 配列minIdで使用中の範囲の最後の添え字+1(最低点得点者の人数) // int min = tokuten[0]; // 最低点の候補(最初の仮定) for ( int i = 0; i < tokuten.length; i++ ) { System.out.println( "学籍番号"+ (i + 1) + "番の人の得点 = " + tokuten[i] ); if ( tokuten[i] < min ) { 最低点の更新, min = tokuten[i]; 最低点候補よりも minId[0] = i+1; 最低点取得者 numMin = 1; 低い点を取った人がいないか, リストのリセット } else if ( tokuten[i] == min ) { 同じ最低点を取っている人はいるか, minId[numMin-1] = i + 1; 最低点取得者 をチェックする. numMin++; リストへの追加 } } System.out.println( "最低点 = " + min ); // System.out.print( "最低点得点者の学籍番号 = {" ); for ( int i = 0; i < numMin; i++ ) { System.out.print( minId[i] + "," ); } System.out.println( "}" ); } } 21 参考 可変長配列(ArrayListを使う) ソフトウェア工学(4) 2012.11.14 [email protected] [課題-032c]: 拡張:最低点を取った人(複数名)を表示 // K003Min.java 2012.11.07 iijima import java.util.ArrayList; // 可変長配列ArrayListを使う(以下のパッケージのimportが必要) public class K003Min { public static void main( String args[] ) { int[] tokuten = {5,7,3,5,8,3,9,3}; ArrayList<Integer> minId = new ArrayList<Integer>(); // 最低点得点者候補のリスト // int min = tokuten[0]; // 最低点の候補(最初の仮定) for ( int i = 0; i < tokuten.length; i++) { // 添字0から全成績をチェック→仮説更新 System.out.println( "学籍番号"+ (i + 1) + "番の人の得点 = " + tokuten[i] ); if ( tokuten[i] < min ) { min = tokuten[i]; // 最低点候補の更新 minId.clear(); // 最低点得点者候補のクリア minId.add( i + 1 ); // 最低点得点者候補の追加 } else if ( tokuten[i] == min ) { minId.add( i + 1 ); // 最低点得点者候補の追加 } } // System.out.println( "最低点 = " + min ); // System.out.print( "最低点得点者の学籍番号 = {" ); for ( int x : minId) { // ArrayListの全要素に対してループする System.out.print( x + "," ); } System.out.println( "}" ); } } 22 ソフトウェア工学(4) 2012.11.14 [email protected] [課題-032b2]: 拡張:最低点を取った人(複数名)を表示 > java K003Min3 学籍番号1番の人の得点 = 5 学籍番号2番の人の得点 = 7 学籍番号3番の人の得点 = 3 学籍番号4番の人の得点 = 5 学籍番号5番の人の得点 = 8 学籍番号6番の人の得点 = 3 学籍番号7番の人の得点 = 9 学籍番号8番の人の得点 = 3 最低点 = 3 最低点得点者の学籍番号 = {3,6,8,} > {3, 6, 8, } 最後の,が余分 23 ソフトウェア工学(4) 2012.11.14 [email protected] [課題-032b2]: 拡張:最低点を取った人(複数名)を表示 System.out.print( "最低点得点者の学籍番号 = {" ); for ( int i = 0; i < numMin; i++ ) { System.out.print( minId[i] + "," ); } System.out.println( "}" ); int lastIndex = numMin - 1; System.out.print( "最低点得点者の学籍番号 = {" ); for ( int i = 0; i < lastIndex; i++ ) { System.out.print( minId[i] + "," ); } System.out.print( minId[lastIndex] ); System.out.println( "}" ); 24 参考 可変長配列(ArrayListを使う) ソフトウェア工学(4) 2012.11.14 [email protected] [課題-032c2]: 拡張:最低点を取った人(複数名)を表示 System.out.print( "最低点得点者の学籍番号 = {" ); for ( int x : minId) { // ArrayListの全要素に対してループする System.out.print( x + "," ); } System.out.println( "}" ); int lastIndex = minId.size()-1; System.out.print( "最低点得点者の学籍番号 = {" ); for ( int i = 0; i < lastIndex; i++ ) { //配列と同じように添字でアクセスする場合 System.out.print( minId.get(i) + "," ); } System.out.print( minId.get(lastIndex) ); System.out.println( "}" ); 25
© Copyright 2025 ExpyDoc