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

Slides:



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

山元進.  for 文  while 文  do ~ while 文  文のネスト  break 文  continue 文.
プログラミング第5回 1 while ループ 文字列の操作
プログラミング実習 1 ・ 2 ク ラス 第 2 週目 担当教員 : 渡邊 直樹. 課題 2 ● 2 × 2型行列の固有値, 固有ベクトルを求め る EigMatrix.java というプログラムを作成せ よ。 ● 行列の各要素はコマンド・プロンプトから入力 ● 計算した結果もコマンド・プロンプトに表示.
プログラミング 平成24年1月11日 森田 彦.
プログラムのパタン演習 解説.
プログラミング基礎I(再) 山元進.
2006年11月22日 植田龍男 Webサービス II (第9回) 年11月22日 植田龍男.
アルゴリズムとデータ構造 2012年6月27日
プログラミング基礎I(再) 山元進.
IO - 入出力 小西 亨.
総評 野田久順.
プログラミング基礎I(再) 山元進.
~手続き指向からオブジェクト指向へ(Ⅰ)~
プログラミング基礎I(再) 山元進.
アルゴリズムとプログラミング (Algorithms and Programming)
プログラミング基礎I(再) 山元進.
プログラミング基礎I(再) 山元進.
C言語 配列 2016年 吉田研究室.
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
String - 文字列 2009年10月9日 7ADD2116 佐藤洋輔.
プログラミング実習 1・2 クラス 第 1 週目 担当教員:  渡邊 直樹.
繰り返し プログラミング 第4回 繰り返し プログラミング第4回.
湘南工科大学 2013年12月10日 プログラミング基礎1 湘南工科大学情報工学科 准教授 小林 学.
プログラミングIII演習 第1回目.
第20章 Flyweight ~同じものを共有して無駄をなくす~
インタフェース プログラミング 第14回 インタフェース プログラミング第14回.
情報処理技法 (Javaプログラミング)2 第2回 前期の復習(2)
JAVA入門② 変数と型 式と演算子 制御文.
11.6 ランダムアクセスファイル 11.7 StreamTokenizerクラス
プログラミング言語入門 手続き型言語としてのJava
JAVA入門.
第9章 例外処理,パッケージ 9.1 例外処理 9.2 ガーベッジコレクション.
オブジェクト指向 プログラミング 第八回 知能情報学部 新田直也.
独習JAVA 6.8 コンストラクタの修飾子 6.9 メソッドの修飾子 6.10 ObjectクラスとClassクラス 11月28日(金)
オブジェクト指向 プログラミング 第十一回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第十三回 知能情報学部 新田直也.
暗号技術 ~JAVAプログラム③~ (7週目)
オブジェクト指向 プログラミング 第二回 知能情報学部 新田直也.
繰り返し計算 while文, for文.
アルゴリズムとプログラミング (Algorithms and Programming)
暗号技術 ~JAVAプログラム①~ (5週目)
第1回 プログラムの基本 他人が読めるプログラムを書く.
プログラムの制御構造 配列・繰り返し.
アルゴリズムとデータ構造1 2005年6月24日
ソフトウェア制作論 平成30年11月21日.
プログラム理解におけるThin sliceの 統計的調査による有用性評価
オブジェクト指向 プログラミング 第十ニ回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
計算機プログラミングI 第5回 配列 文字列(Stringクラス) mainの引数 配列の利用例
オブジェクト・プログラミング 第8回.
プログラミングⅠ 平成31年1月7日 森田 彦.
アルゴリズムとデータ構造 2011年6月23日
オブジェクト プログラミング 第2回 プログラムの基本.
アルゴリズムとプログラミング (Algorithms and Programming)
プログラミング言語論 第十一回 理工学部 情報システム工学科 新田直也.
プログラミングⅡ 第2回.
計算機プログラミングI 木曜日 1時限・5時限 担当: 増原英彦 第1回 2002年10月10日(木)
暗号技術 ~JAVAプログラム②~ (6週目)
計算機プログラミングI 第4回 2002年10月31日(木) 問題解決とアルゴリズム クラスメソッドと手続きの抽象化 最大公約数
アルゴリズムとデータ構造 2012年6月25日
JAVA入門⑥ クラスとインスタンス.
プログラミング基礎演習 第4回.
オブジェクト指向 プログラミング 第四回 知能情報学部 新田直也.
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
ねらい 数値積分を例題に、擬似コードのアルゴリズムをプログラムにする。
計算機プログラミングI 第2回 2002年10月17日(木) 履習登録 複習 ライブラリの利用 (2.6-7) 式・値・代入 (2.6-8)
計算機プログラミングI 第5回 2002年11月7日(木) 配列: 沢山のデータをまとめたデータ どんなものか どうやって使うのか
情報処理技法(Javaプログラミング)1 第8回 同じ処理を何回も繰り返すには?
Presentation transcript:

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

中間試験の解説 最高点 94 点 最低点 0 点 多くの人は、もうすこし頑張る必要がある 最低点 0 点 多くの人は、もうすこし頑張る必要がある 基本的に、プログラミングの基礎を学びとった者に単位が与えられる 再履修クラスだからと言って採点基準をあまくする理由は何もない

講評 猿まねは、所詮猿まねでしかない サンプルプログラムの動作を理解し、(前提1) 望みの動作をするよう変更できなければ、(2) 単位は取れない (結論) カーゴ・カルト ・プログラミング(cargo cult programming) 意味を考えないでただ形だけ真似(コピー&ペースト)するプログラミングスタイル 問7 (特に(1),(3)) などが分からない人の書いたプログラムは、端的にいうと役に立たない

各問題の解説

問1 基本的に、講義で全く話題に上らなかったことが出るはずがない 選択肢 仮想マシンを起動して中間コードを実行する。 中間コードをアセンブルする。 (1)で答えたファイルに[プログラム]を書き込む。 ソースコードをリンクする。 java コンパイラに[プログラム]を作らせる。 java コンパイラに中間コードを生成させる。 java コマンドを起動してソースコードを読み込む。

import java.io.*; class Ex2 { public static void main(String args[]) throws IOException System.out.println("整数を3つ入力。"); BufferedReader br = 【空欄】 BufferedReader( 【空欄】 InputStreamReader(System.in)); // 基本型でない変数が出てきたら、最初に new しないとデータを記録できない // ここから String str1=br.readLine(); String str2=br.readLine(); String str3=br.readLine(); int sum=0; sum += Integer.parseInt(str1); sum += Integer.parseInt(str2); sum += Integer.parseInt(str3); // ここまで System.out.println("合計は"+sum+"です。"); }

元のコードを見れば、3回数字を読み込んで、sum に足しこんでいる。 [代替コード] int 【空欄A】 = 0; for(int i=0; i<3; 【空欄B】){ sum += Integer.parseInt(br.【空欄C】()); }

class Ex3 { public static void main(String args[]) for(int i=0; i<10; i++){ System.out.print((i%3>0)?'T':'F'); } i は 0 で始まって for の直後の { } の中身を実行するたびに 1 ずつ増える。 i == 10 になったら for 文を抜ける。 (i==10 のときは、{ } のなか実行せず)  { } のなかみ       画面に T, F のどちらかを出力 (i が 3 で割ったあまりが 0 より大きければ T, そうでなければ F )

for(int i=0; i<10; i++){ 【空欄A】 【空欄B】 【空欄C】 【空欄D】 } [選択肢] while(i%3==0){ }else{ // if 文の条件が満たされなければ, 次の { } を実行 break; System.out.print('F'); // この2つが必須なのは考えるまでもない System.out.print('T'); // return(i%3); continue; do { if(i%3>0){ // もし i%3 >0 なら 次の { } を実行

class Ex4 { public static void main(String[] args) int[] test1 = {80,60,47,4}; int[] test2 = test1; for(int i=0; i< test2.length; i++){ System.out.print(test2[i]);// ここ } class Ex4 { public static void main(String[] args) int[] test1 = {80,60,47,4}; int[] test2 = test1; for(int i=0; i< test2.length; i++){ System.out.print(test2[test2.length-i-1]); // -i なので、逆順 }

class Ex5 { // 2 行 public static void main(String[] args) { // 4 行 int[] test ={70,55,85,90,70}; for(int i = 0; i <= test.length; ){ // i <= test.length では、 // インデックスが上限を超えてしまう。 System.out.println( // 7行 (i+1)"番目の人の点数は"+ // (i+1) の後に + がない。 test[i++]+"です。"); // 普通forにあるi++ がここにきている。無問題 } // 10行 System.out.println( "テストの受験者は"+ test.length+"人です。"); } // 14行 }

[問7] int[] test = new int[5]; int k=3; for(int i=0; i<test.length; i++){ // ここの場所での各変数の値を表Aに書く k = (k * 5) % 7; // k の値が変わるのはここだけ test[i] = k; System.out.print(k); // ここの場所での各変数の値を表Bに書く } 表A i = 1 2 3 4 k = 5 6 test[i] 表B i = 1 2 3 4 k = 5 6 test[i]

[問7] 次の部分は並べ替え for(int i=0; i<test.length; i++){ for(int j=i+1; j<test.length; j++){ // test[i]に、test[i]~test[4] の最大値 if(test[j] > test[i]){ // が入るように並べ替え int tmp = test[j]; test[j] = test[i]; test[i] = tmp; } // この場所での test[ ] の中身を下の表に書く }  test[0] test[1] test[2] test[3] test[4] for の前 1 6 4 5 2 i=0 i=1 i=2 i=3 i=4

[問7] int k=6; if(test[j] < test[i]){ と書き換え後も同様。 int[] test = new int[5]; int k=6; for(int i=0; i<test.length; i++){ // ここの場所での各変数の値を表Aに書く k = (k * 5) % 7; // k の値が変わるのはここだけ test[i] = k; System.out.print(k); // ここの場所での各変数の値を表Bに書く } 前の例と見比べれば気づくかも? k は 1, 5, 4, 6, 2, 3 の繰り返し 表A i = 1 2 3 4 k = 6 5 test[i] 表B i = 1 2 3 4 k = 5 test[i]

[問7] 次の部分は並べ替え for(int i=0; i<test.length; i++){ for(int j=i+1; j<test.length; j++){ // test[i]に、test[i]~test[4] の最大値 if(test[j] > test[i]){ // が入るように並べ替え int tmp = test[j]; test[j] = test[i]; test[i] = tmp; } // この場所での test[ ] の中身を下の表に書く }  test[0] test[1] test[2] test[3] test[4] forの前 2 3 1 5 4 i=0 i=1 i=2 i=3 i=4

課題 次のプログラムについて、問に答えよ。 class Ex1 { static int scramble(int input, int keynum){ // 上の static の意味は考えなくて良い。計算を追うのに支障ない。基礎IIの範囲。 int NP1 = 10000; int[] key = {137,73}; return (input * key[keynum] % NP1); } public static void main(String[] args) { int data = 【初期値】; for(int n=0; n<10; n++){ data=scramble(data,0); for(int n=0; n<【?】; n++){ data=scramble(data,1); System.out.println(data);

問1 プログラムを入力して動かす前に、まず次のことを考えよ。 【初期値】を各人の学籍番号の下3ケタとしたとき、最初の for 文(赤色に着色した部分)中での、変数 data の値の変化を表にせよ。 問3 プログラムを動かして動作を確認せよ。

問4 Ex1.java の scramble メソッドをコピーして、以下の機能を持つEx2.java を作成せよ。 scramble(scramble(k,0),1) != k 1<= k かつ k<10000 となる整数 k を探しだして印字する。そのようなkがなければ"見つからない" と表示する。 また、Ex2.java をコンパイル、実行して実際にそのような整数 k を答えよ。(そのような k はない、という答えもありうる)