山元進 今日 来週 総合的な演習 中間試験 期末と中間両方受けて初めて成績が付く 期末試験:適切な理由があれば追試が受けられる どちらかを欠席したら 成績表は 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 点であることを忘れるな。
© Copyright 2025 ExpyDoc