プログラミング基礎I(再) 山元進.

Slides:



Advertisements
Similar presentations
山元進.  今日 総合的な演習  来週  中間試験  期末と中間両方受けて初めて成績が付く  どちらかを欠席したら 成績表は X  期末試験:適切な理由があれば追試が受けられる  適切な理由であるかの判定のため、診断書などを持参せ よ  対外試合に参加、などの理由は基本的に認めない.
Advertisements

山元進.  for 文  while 文  do ~ while 文  文のネスト  break 文  continue 文.
プログラミング実習 1 ・ 2 ク ラス 第 2 週目 担当教員 : 渡邊 直樹. 課題 2 ● 2 × 2型行列の固有値, 固有ベクトルを求め る EigMatrix.java というプログラムを作成せ よ。 ● 行列の各要素はコマンド・プロンプトから入力 ● 計算した結果もコマンド・プロンプトに表示.
Generic programming と STL
プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
アルゴリズムとデータ構造 2012年6月27日
プログラミング基礎I(再) 山元進.
プログラミング基礎I(再) 山元進.
~手続き指向からオブジェクト指向へ(Ⅰ)~
Ex7. Search for Vacuum Problem
プログラミング基礎I(再) 山元進.
Advanced Unix Commands
アルゴリズムとプログラミング (Algorithms and Programming)
プログラミング基礎I(再) 山元進.
プログラミング基礎I(再) 山元進.
基礎プログラミング 第13回(2007年5月28日) 「関数」の補足説明 Report-Fの解説.
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
String - 文字列 2009年10月9日 7ADD2116 佐藤洋輔.
プログラミング演習II 2004年10月19日(第1回) 理学部数学科・木村巌.
第8回 プログラミングⅡ 第8回
担当:青木義満 情報工学科 3年生対象 専門科目 システムプログラミング システムプログラミング プロセス間通信(パイプ) 担当:青木義満
プログラミング実習 1・2 クラス 第 1 週目 担当教員:  渡邊 直樹.
繰り返し プログラミング 第4回 繰り返し プログラミング第4回.
湘南工科大学 2013年12月10日 プログラミング基礎1 湘南工科大学情報工学科 准教授 小林 学.
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
第20章 Flyweight ~同じものを共有して無駄をなくす~
アルゴリズムとデータ構造 2011年6月20日
精密工学科プログラミング基礎Ⅱ 第3回資料 今回の授業で習得してほしいこと: 2次元配列の使い方 (前回の1次元配列の復習もします.)
情報処理技法 (Javaプログラミング)2 第2回 前期の復習(2)
第9章 例外処理,パッケージ 9.1 例外処理 9.2 ガーベッジコレクション.
Cプログラミング演習 第7回 メモリ内でのデータの配置.
オブジェクト指向 プログラミング 第十四回 知能情報学部 新田直也.
アルゴリズムとプログラミング (Algorithms and Programming)
第1回 プログラムの基本 他人が読めるプログラムを書く.
P n ポインタの基礎 5 q m 5 7 int* p; int 型の変数を指すポインタ int* q; int 型の変数を指すポインタ int n=5, m=7; int 型の変数 int array[3]; int* pArray[3]; p = &n; ポインタにアドレスを代入しているのでOK.
アルゴリズムとデータ構造1 2005年6月24日
アルゴリズムとデータ構造 2010年6月21日
Ex7. Search for Vacuum Problem
オブジェクト指向 プログラミング 第十ニ回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
計算機プログラミングI 第5回 配列 文字列(Stringクラス) mainの引数 配列の利用例
オブジェクト・プログラミング 第8回.
コンパイラ 2011年10月20日
アルゴリズムとデータ構造1 2006年7月11日
アルゴリズムとデータ構造 2011年6月23日
統計ソフトウエアRの基礎.
アルゴリズムとプログラミング (Algorithms and Programming)
文字列へのポインタの配列 static char *lines[MAXLINES]; lines[0] NULL
データ構造とアルゴリズム (第5回) 静岡大学工学部 安藤和敏
アルゴリズムとデータ構造 2012年7月2日
計算機プログラミングI 木曜日 1時限・5時限 担当: 増原英彦 第1回 2002年10月10日(木)
計算機プログラミングI 第3回 プリミティブ値 クラスメソッド クラス変数 式と演算 変数の利用
アルゴリズムとプログラミング (Algorithms and Programming)
アルゴリズムとデータ構造 2011年6月28日
計算機プログラミングI 第4回 2002年10月31日(木) 問題解決とアルゴリズム クラスメソッドと手続きの抽象化 最大公約数
アルゴリズムとデータ構造 2013年7月2日
精密工学科プログラミング基礎 第7回資料 (11/27実施)
アルゴリズムとデータ構造 2012年6月25日
アルゴリズムとデータ構造 2012年6月21日
参考:大きい要素の処理.
精密工学科プログラミング基礎Ⅱ 第2回資料 今回の授業で習得してほしいこと: 配列の使い方 (今回は1次元,次回は2次元をやります.)
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
関数と再帰 教科書13章 電子1(木曜クラス) 2005/06/22(Thu.).
第10回 関数と再帰.
プログラミング演習II 2004年11月 2日(第3回) 理学部数学科・木村巌.
プログラミング入門2 第5回 配列 変数宣言、初期化について
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
計算機プログラミングI 第2回 2002年10月17日(木) 履習登録 複習 ライブラリの利用 (2.6-7) 式・値・代入 (2.6-8)
計算機プログラミングI 第10回 2002年12月19日(木) メソッドの再定義と動的結合 クイズ メソッドの再定義 (オーバーライド)
計算機プログラミングI 第5回 2002年11月7日(木) 配列: 沢山のデータをまとめたデータ どんなものか どうやって使うのか
Presentation transcript:

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

授業評価アンケート 初めにアンケートに答える時間をとる 自由記入欄にも積極的に書きこまれたし

先週の課題の解説 出力を各ケタごとに縦に見ると、7周期に同じ数字が繰り返すケタと、3周期に同じ数字を繰り返すケタとに分かれる グループA: 3周期のケタが3つ グループB: 7周期のケタが7つ 基本的なルールは グループAの中で巡回置換 グループBの中で巡回置換 の2つで、これを実装すれば"良い解答"になる

良い解答を実装するのは、若干難しい そもそも、画面の出力だけみても巡回置換とは分からないので、動作をチェックするプログラムを作る必要がある 画面出力だけから判断すると、特定の数字の下に表示される数字は決まっている それを実装したのが"普通の解答"

id=999; の場合の変換規則 0123456789 1行目は、繰り返し処理の前に実行した print で印字されたもの 8901564237 繰り返し処理 1 回目 3789645012 繰り返し処理 2 回目 1237456890 繰り返し処理 3 回目 9012564378 7890645123 2378456901 0123564789 8901645237 3789456012 1237564890 規則の明文化の例 0→8 9012645378 1→9 7890456123 2→0 2378564901 3→1 0123645789 4→5 8901456237 5→6 3789564012 6→4 1237645890 7→2 9012456378 8→3 7890564123 9→7 2378645901 0123456789 繰り返し処理 21 回目 ここで元の並びに戻ったので繰り返し終了 Finished. 終わったしるしに "Finished." と印字

普通の解答例 (id=999) class Ex01 { public static void permutation(int in[]){ int[] permList = {8,9,0,1,5,6,4,2,3,7}; for(int i=0; i<10; i++){ in[i]=permList[in[i]]; // ここがポイント } public static boolean samePerm(int[] in1, int[] in2){ if(in1.length != in2.length ) return false; boolean flag=true; for(int i=0; i<in1.length; i++) if(in1[i]!=in2[i]) flag=false; return flag; // 一つでも違う数値があったら false を返す public static void main(String[] args){ int[] input1={0,1,2,3,4,5,6,7,8,9}; int[] input2={0,1,2,3,4,5,6,7,8,9}; int id=999; do{ Perm.permutation(id,input1); permutation(input2); if(!samePerm(input1,input2)){ System.out.println("Differ!"); Perm.print(input1); Perm.print(input2); }while(!Perm.isIdentity(input1));

今日は 0~9 の数字を並べて作る順列の生成法を題材にする 良い解答の解答例は示さない permutation メソッドと Perm.permutation メソッドが、どの入力に対しても 一致することを示すためには、入力の生成方法を考える必要あり 入力は、長さ10の整数配列であればなんで良いわけではなく、0~9の数字を並べて作る順列である 今日は 0~9 の数字を並べて作る順列の生成法を題材にする

今日も課題を解くのがメイン 指示をよく読むこと 後の課題で先週利用した Perm.class を使うので、今日の課題プログラムを作成するディレクトリにコピーしておく 学籍番号の下3ケタを 999 と仮定しているサンプルがあるので、それは自分の学籍番号の下3ケタに書きかえる

課題1 (下準備) 0~3 の数字を並べて作る順列(先頭の数字が0である場合を含める)を、小さい順に全てあげよ (解答の最初の3項まで) 0123, 0132, 0213, … 次ページのEx02.java をどう書き換えれば上の並びを出力するようになるか、説明せよ Ex02は、001, 002, 003, という並びを生成して、同じ数字が繰り返し出てきたら排除している この方法は、簡単だが桁数を変えるのが面倒 上のケタから順に数字を決めてゆく際、使った数字のリストを作り、重複を排除すると、もうすこしまし 発想が難しいが、プログラムが短くなる方法もある

0~2 の数字を並べてできる順列を、小さい順に全て表示するプログラム(工夫なし版) class Ex02 { public static void main(String[] args){ int[] input=new int[3]; for(int i0=0; i0<3; i0++){ input[0]=i0; for(int i1=0; i1<3; i1++){ if(i1==i0) continue; input[1]=i1; for(int i2=0; i2<3; i2++){ if(i2==i0 || i2==i1) continue; input[2]=i2; Perm.print(input); }

課題2(出力チェック) 1) 0~5 の数字を並べ替えてできる順列を全てあげるプログラムを作成せよ。ただし順列は、長さ6の整数配列として表されるものとする。 2) この順列は 6! = 720 通りある。1行に1つ順列を表示するとすれば、720行になる。人手で出力をチェックするには行数が多いので、 linux のコマンドを利用してチェックする方法を考えよ。 sort, uniq (, diff, wc) を使えばできる 3) 実際に出力をチェックせよ

課題3(問題の規模拡大) 0~9 の数字を並べ替えてできる順列を全てあげるプログラムを作成せよ。ただし、順列は長さ10の整数配列として表されるものとする。 この課題の出力は 328800 行。人手でのチェックは無理。

課題4(本題) 1) 課題3では、生成した順列を画面(標準出力)に出力した。この課題では、画面に出力するかわりに、次の2つメソッドの入力として使え。 このパワーポイントの6ページにあげた permutation メソッドを、自分の id 用に書き換えたもの 先週の Perm.class の Perm.permutation 注意: メソッドの引数として与えた配列は、上の各メソッドによって書き換えられてしまう。書き換えは、後の操作に支障をきたす。それを避けるため、各メソッドの入力として2つの新たな配列を作り、値をコピーしてから各メソッドの引数とせよ。

課題4(続) 2) 1) 2つのメソッドから戻ってきた後(書き変わった後の)の整数配列を比較し、各要素の値が完全に一致する場合が何通りあるか数えるプログラムをつくれ。

以下はヒント

sort は、ある欄の値をキーにして辞書式に並べ替えるコマンド uniq は、隣り合う行が重複する場合、重複を取り除くコマンド 全ての順列が過不足なく印字されているならば、並べ替えた時に重複する行はないはず 他に有用なコマンド1 : wc 語数を数えるコマンド。 -l オプションをつけると行の数を数える 他に有用なコマンド2 : diff 2つのファイルの違いを画面に表示する

Ex02.java を書き換えて、0~2 の数字を並べて作った順列のうち、210 という順列が何番目の順列かを表示するプログラム class Ex03 { public static boolean equiv(int[] in1, int[] in2){ // このメソッドは引数を書き変えない if(in1.length != in2.length ) return false; boolean flag=true; for(int i=0; i<in1.length; i++) if(in1[i]!=in2[i]) flag=false; return flag; } public static void main(String[] args){ int[] input=new int[3]; int[] ref={2,1,0}; int count=0; for(int i0=0; i0<3; i0++){ input[0]=i0; for(int i1=0; i1<3; i1++){ if(i1==i0) continue; input[1]=i1; for(int i2=0; i2<3; i2++){ if(i2==i0 || i2==i1) continue; input[2]=i2; count++; if(equiv(input,ref)){ System.out.print(count+"番目の順列が"); for(int i=0; i<3; i++) System.out.print(ref[i]); System.out.println("になりました。");

int[] copy1 = input.clone(); 整数配列のコピー int[] copy1 = input.clone(); copy1 が input のコピー(clone)になる copy1 は input とは独立したメモリを確保している copy1 の値を書き換えても input への影響はない int[] alias=input; でも alias が整数配列として扱われるが、データを確保するメモリは input と共有。つまり、alias[i] を書き換えると、 input[i] も同じ値になる。

今回の課題では、 int[] copy1 = input.clone(); int[] copy2 = input.clone(); Perm.permutation(id,copy1); permutation(copy2); if(equiv(copy1,copy2)){ …. } といった使い方を想定している。