プログラミング基礎I(再)

山元進
今日
 来週
総合的な演習


中間試験

期末と中間両方受けて初めて成績が付く


期末試験:適切な理由があれば追試が受けられる




どちらかを欠席したら 成績表は X
適切な理由であるかの判定のため、診断書などを持参せよ
対外試合に参加、などの理由は基本的に認めない
中間試験:適切な理由があれば欠席を認める
再来週以降 総合的な演習

データを記憶するメモリ領域に、名前(識別子)
を対応づけたもの
整数のデータ
10
データ読み出し
10
データ書き込み
int a;
どこかのメモリと対応している
対応は計算機が自動的に管理
変数をまとめて一つの名前で扱う
 添字(index) によりどの要素か指定
 添字は名前の後につける[ ]の中に書く
 添字は整数型の変数でも良い

b[0]
b[1]
b[2]
b[3]
int[ ] b = new int[4];
b という名前で 4 つの変数をまとめて扱う b.length → 4

条件が成り立つかどうかで処理を変える
if ( 条件 ) {
 条件成立時の処理
 } else {
 条件不成立時の処理
 }


switch ( 変数 ) { case … } という親戚もいる
for( int i=0; i < 10; i++) {
繰り返す処理 ( この例では i=0, i=1, i=2, …
i=9 まで 10 回繰り返す)
}
while( 条件 ){
条件が成立している間繰り返す処理
}
do { … } while (条件); という親戚もいる
繰り返し・配列・条件分岐の組み合わせが大事
 組み合わせ方は、たくさんプログラムを書かない
と、多分覚えられない(身に付かない)


さらには、メソッドの使い方が大事になる

プログラミング基礎 II で

一般的にはそのクラスの性質を表すデータを
記憶する変数

プログラミング基礎Iでは、クラスを本格的に使わ
ないので、単に変数として使うことも多い
メソッドは特定の機能をはたす
 メソッドには引数と戻り値がある
 引数と戻り値には型がある



ある程度まとまった機能ならメソッドにする


まとまった機能の例
素数かどうか判定する機能
フィールドへのアクセス(読み・書き)


特別な型として void 型
プログラミング基礎Iでは、クラスを本格的に使わ
ないので、いまはそれほど気にしなくてよい
特別なメソッド : main メソッド

仮想マシン起動時、最初に実行される
p. 203
int tmp = test[t]; //1 行目
test[t] = test[s]; // 2 行目
test[s] = tmp;
// 3 行目
 この部分の動作を確かめよう


i = 1, j = 3 の例
test[s]
3
tmp の値は関知しない
test[t]
6
= 演算子(代入)
tmp
?
1 行目が実行されると tmp が 6 になる
test[s]
3
test[t]
6
= 演算子(代入)
2 行目が実行されると test[t] が 3 になる
tmp
6
test[s]
3
test[t]
3
= 演算子(代入)
3 行目が実行されると test[s] が 6 になる
tmp
6
test[s]
6
test[t]
3
tmp
6
下の、始まる前と比べると、test[s], test[t] の値が入れ替わっている
test[s]
3
test[t]
6
前の for 文により、t > s であることに注意
if(test[t] > test[s]){
「test[t] と test[s] の値の入れ替え」
}
test[s] と test[t] を比べて後ろが大きかったら
データを入れ替える
→ 前の方に大きな値が格納される
(test[s] >= test[t] が保証される)
for(int t=s+1; t<test.length; t++){
「test[s] >= test[t] となるように入れ替え」
}
for 文で、この操作を test[s] より後の全ての test[t] に対して行う
この for 文が完了すると、 test[s] >= test[t] が、test[s] より後ろの
全ての test[t] に対して成り立つ
→ test[s] が test[s] から test[test.length-1] の最大値
for(int s=0; s<test.length; s++){
「test[s] から test[test.length-1] までの最
大値が test[s] になるよう並べ替え」
}
この for 文が終わると、値の大きい順に並べ替
えられる



ソートのような複雑な操作も、1 ステップ 1 ス
テップ、全ての配列と変数の値を紙に書いて
みれば、必ず動作が理解できる。
慣れれば、全部書かなくても分かるようになる
こういう仕組みを理解するように努力しないと、
決してプログラムが書けるようにならない

単位を取るのに苦労するし、なにより卒研で困る


Report1 : ak = ak-1 + ak -2 (k>2) , a1 = 1, a2 =
1 とする。 an を画面に出力するプログラムを作
成せよ。 n は各自の学籍番号の各ケタの数の和
とする。ただし、 n <10 の場合、さらに10 を足せ。
Report2 : n を引数として渡すと 戻り値として an
を返すメソッドを作成せよ。 メソッド名は a とする。
aメソッドを for 文の中で呼び出し、 a1 から a30
までを画面に出力するプログラムを作成せよ。


ただし、a メソッドを main メソッドから呼び出せるよう、
static int a(int n) と宣言すること。
注意: このメソッドを素直に実装すると、何度も同じ計
算をすることになり効率が悪い。実用的なプログラム
を書くときには工夫すべき。
mainメソッドがあるクラス名は Report3
 A, J, Q, K と書かれたカード 1 枚ずつと、 2
から10までの数字が書かれたカード 1 枚ず
つ、計 13 枚のカードを使ってゲームをする。
ルールは以下の通りとする。

カード2枚を同時に引き、合計点を競う。
 ただし、Aは 11 点、 J, Q, K は 10 点、数字の札
は、書かれた数字を点数とする。
 (今回使わないが、合計点 21 点を超えたら 0 点)


2枚のカードの全ての組み合わせをしらべ、点数の
頻度分布を書き出せ。


k 点となるカードの順列は Nk 通りだとして、N0, N1, N2,
… , N最高点 までを全て書き出すこと
ヒント






カードを 1 ~ 13 の整数と対応させる
2枚のカードは2つの変数に対応させる
for 文を使うと、1 ~ 13 全ての場合を調べることができる
引くカードは2枚だから、2重にネストした for 文を使うと…
頻度を配列に記憶する。最高点を p 点とすれば、配列の
長さは p+1 になる。
A は 11 点、J, Q, K は 10 点であることを忘れるな。