ソフトウェア工学

ソフトウェア工学(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