関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdiu.h> #define InFile "data.txt" #define OutFile "surted.txt" #def

Similar documents
関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdio.h> #define InFile "data.txt" #define OutFile "sorted.txt" #def

今回のプログラミングの課題 ( 前回の課題で取り上げた )data.txt の要素をソートして sorted.txt というファイルに書出す ソート (sort) とは : 数の場合 小さいものから大きなもの ( 昇順 ) もしくは 大きなものから小さなもの ( 降順 ) になるよう 並び替えること

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

今までの復習 プログラムで最低限必要なもの 入力 ( キーボードから ファイルから ) 出力 ( 画面へ ファイルへ ) 条件分岐 : 条件の成立 不成立により 異なる動作をする 繰り返し : 一定の回数の繰返し 条件成立の間の繰返し 関数の定義 関数の呼び出し C ではそれ以外に ポインタ データ

Microsoft PowerPoint - 計算機言語 第7回.ppt

プログラミング実習I

CプログラミングI

Microsoft PowerPoint - 4.pptx

/*Source.cpp*/ #include<stdio.h> //printf はここでインクルードして初めて使えるようになる // ここで関数 average を定義 3 つの整数の平均値を返す double 型の関数です double average(int a,int b,int c){

プログラミング基礎

kiso2-03.key

情報処理Ⅰ

PowerPoint Presentation

Taro-ファイル処理(公開版).jtd

情報処理演習 B8クラス

Microsoft PowerPoint - C言語の復習(配布用).ppt [互換モード]

プログラミング方法論 II 第 14,15 回 ( 担当 : 鈴木伸夫 ) 問題 17. x 座標と y 座標をメンバに持つ構造体 Point を作成せよ 但し座標 は double 型とする typedef struct{ (a) x; (b) y; } Point; 問題 18. 問題 17 の

Microsoft PowerPoint - kougi7.ppt

Microsoft PowerPoint - 第3回目.ppt [互換モード]

Taro-再帰関数Ⅲ(公開版).jtd

C プログラミング 1( 再 ) 第 4 回 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ 1

Microsoft PowerPoint - 11.pptx

memo

Microsoft PowerPoint ppt

Cプログラミング1(再) 第2回

FORTRAN( と C) によるプログラミング 5 ファイル入出力 ここではファイルからデータを読みこんだり ファイルにデータを書き出したりするプログラムを作成してみます はじめに テキスト形式で書かれたデータファイルに書かれているデータを読みこんで配列に代入し 標準出力に書き出すプログラムを作り

<4D F736F F D20438CBE8CEA8D758DC03389F0939A82C282AB2E646F63>

プログラム言語及び演習Ⅲ

演算増幅器

Microsoft Word - 3new.doc

Prog1_12th

関数の中で宣言された変数の有効範囲はその関数の中だけです さっきの rectangle _s で宣言されている変数 s は他の関数では使用できません ( 別の関数で同じ名前の変数を宣言することはできますが 全く別の変数として扱われます このように ある関数の中で宣言されている変数のことをその関数の

<4D F736F F D20438CBE8CEA8D758DC F0939A82C282AB2E646F63>

2006年10月5日(木)実施

memo

Microsoft PowerPoint - 09.pptx

Microsoft PowerPoint - program.ppt [互換モード]

4 分岐処理と繰返し処理 ( 教科書 P.32) プログラムの基本的処理は三つある. (1) 順次処理 : 上から下に順番に処理する ぶんきそろ (2) 分岐処理 : 条件が揃えば, 処理する はんぷく (3) 反復処理 : 条件が揃うまで処理を繰り返す 全てのプログラムは (1) から (3) の

Microsoft PowerPoint - prog04.ppt

講習No.12

Microsoft Word - no202.docx

ファイル入出力

Microsoft Word - Cプログラミング演習(9)


Microsoft PowerPoint - kougi6.ppt

Microsoft PowerPoint - C4(反復for).ppt

ポインタ変数

第2回講義:まとめ

Microsoft Word - Training10_プリプロセッサ.docx

今後の予定 6/29 パターン形成第 11 回 7/6 データ解析第 12 回 7/13 群れ行動 ( 久保先生 ) 第 13 回 7/17 ( 金 ) 休講 7/20 まとめ第 14 回 7/27 休講?

< F2D837C E95CF CF68A4A94C5816A2E6A>

C 2 2.1? 3x 2 + 2x + 5 = 0 (1) 1

memo

Microsoft PowerPoint - ca ppt [互換モード]

PowerPoint Presentation

次に示す数値の並びを昇順にソートするものとする このソートでは配列の末尾側から操作を行っていく まず 末尾の数値 9 と 8 に着目する 昇順にソートするので この値を交換すると以下の数値の並びになる 次に末尾側から 2 番目と 3 番目の 1

PowerPoint プレゼンテーション

Microsoft PowerPoint - exp2-02_intro.ppt [互換モード]

PowerPoint プレゼンテーション

cp-7. 配列

PowerPoint プレゼンテーション

Microsoft PowerPoint - å®�æ−•è©¦é¨fi3ㆮ対ç�Œ.pptx

メソッドのまとめ

PowerPoint プレゼンテーション - 物理学情報処理演習

gengo1-12

データ構造

02: 変数と標準入出力

Taro-再帰関数Ⅱ(公開版).jtd

ファイル入出力

ゲームエンジンの構成要素

Microsoft PowerPoint - kougi2.ppt

Prog1_10th

02: 変数と標準入出力

kiso2-06.key

プログラミング基礎

Microsoft Word - Cプログラミング演習(10)

Microsoft PowerPoint - 説明3_if文switch文(C_guide3)【2015新教材対応確認済み】.pptx

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

Microsoft PowerPoint - prog06.ppt

C 言語講座 Vol 年 5 月 29 日 CISC

フローチャートの書き方

Microsoft Word - Cプログラミング演習(12)

スライド 1

memo

Microsoft Word - 03

Prog1_15th

memo

slide5.pptx

program7app.ppt

プログラミング基礎

Microsoft PowerPoint - lec4.ppt

プログラミング基礎

4 月 東京都立蔵前工業高等学校平成 30 年度教科 ( 工業 ) 科目 ( プログラミング技術 ) 年間授業計画 教科 :( 工業 ) 科目 :( プログラミング技術 ) 単位数 : 2 単位 対象学年組 :( 第 3 学年電気科 ) 教科担当者 :( 高橋寛 三枝明夫 ) 使用教科書 :( プロ

コンピュータ工学講義プリント (7 月 17 日 ) 今回の講義では フローチャートについて学ぶ フローチャートとはフローチャートは コンピュータプログラムの処理の流れを視覚的に表し 処理の全体像を把握しやすくするために書く図である 日本語では流れ図という 図 1 は ユーザーに 0 以上の整数 n

Taro-リストⅠ(公開版).jtd

gengo1-6

gengo1-12

数値計算

Microsoft PowerPoint - kougi9.ppt

Transcription:

C プログラミング演習 1( 再 ) 6 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdiu.h> #define InFile "data.txt" #define OutFile "surted.txt" #define NUM 1000 // ここに findminvalue と findandreplace の関数 // 定義を書く // 選択ソート : 配列 arr[0] から arr[n-1] までをソート vuid selectiunsurt(int arr[ ], int n) { int i; fur ( i=0 ; i<n; i++) findandreplace(arr,i,n); int main(vuid) { int i, n=0, arr[num]; FILE *fp; // ファイルを読み込み配列 arr に記憶 fp = fupen(infile,"r"); while (fscanf(fp,"%d", &arr[n])!= EOF) { n++; fcluse(fp); // n 個の要素を持つ配列をソート selectiunsurt(arr, n); // arr の中身をファイルに書出す fp = fupen(outfile,"w"); fur (i=0; i<n; i++) { fprintf(fp, "%d n", array[i]); fcluse(fp); return 0;

今までの復習 プログラムで最低限必要なもの 入力 ( キーボードから ファイルから ) 出力 ( 画面へ ファイルへ ) 条件分岐 : 条件の成立 不成立により 異なる動作をする 繰り返し : 一定の回数の繰返し 条件成立の間の繰返し 関数の定義 関数の呼び出し C ではそれ以外に ポインタ データ構造 ( 配列や自作の構造 ) ライブラリの利用 (C++ ではクラス ) が必要

アルゴリズム アルゴリズムとは料理で言えばレシピ要するに 処理の段取りどのような処理をどのような順で行うか アルゴリズムによって処理効率に大きな違いがあることも

クイックソート (Quick sort) クイックソート : 関数名 quicksort 入力 : 数を要素とする配列 array 先頭の要素のインデックス (int) f 最後の要素のインデックス (int) l 出力 : 昇順にソートされた配列 (array の中身を書き換えるので不要 ) 手順 : 1) f >= l ならば終了 2) m =array[ (f+l)/2] i=f, j=l とする 3) j > i の間以下を繰り返す 以下を繰り返す ( 無限ループ ) 疑問 : これで本当にソートを実現できるのか? (1) array[i] < m かつ i < l の間 i=i+1を繰り返す (2) array[j] > m かつ j > f の間 j=j-1 を繰り返す (3) j > <= i i ならば array[i] 繰り返し終了とarray[j] をswap ( 値を取り替え ) し さもなくば i=i+1 および array[i] j=j-1 とarray[j] を行うをswap ( 値を取り替え ) し i=i+1 と j=j-1を行う 4) quicksort(array, f,j) と quicksort(array, j+1,l) を行って終了

まずは手で動作を確かめよう 配列を {3 や {2,0,-5 や {2, 3, -5, 0 として どのようにこのアルゴリズムが動くか紙に書いて確かめてみよう それで納得できたら プログラムにしてみよう

アルゴリズムからプログラムへ ソートを例題として ある書式で書かれたアルゴリズムをどのようにプログラムにするか 学ぼう アルゴリズムの名称 関数名 関数の引数 関数の返り値 関数本体 ( ブロックの中身 )

アルゴリズムからプログラムへ アルゴリズムの名称 関数名 関数の引数 条件分岐 関数の返り値 関数本体 ( ブロックの中身 ) 順番通りにコードにする 繰り返し --- while? for? 繰り返し --- while? for? swap( 変数の値の交換 ) 返り値

アルゴリズムからプログラムへ void quicksort(int array[], int f, int l) { int m; int i,j, temp; if (f >= l) return; m = array[(f+l)/2]; i=f; j=l; while (1) { if (j <= i) break; temp = array[i]; array[i] = array[j]; ならない array[j]=temp; i++; j--; quicksort(array, f, j); quicksort(array, j+1, l); 関数名関数の引数 ( 文字列を含む ) 配列を戻り値とする場合 while ((array[i] < m) && (i < l)) i++; ( ポインタを学んでいないため while ((array[j] > m) && (j > f)) j--; ) void を関数の型とする インデックスは必ず整数 (int) でなければ

アルゴリズムからプログラムへ void quicksort(int array[], int f, int l) { int m; int i,j, temp; if (f >= l) return; m = array[(f+l)/2]; i=f; j=l; while (1) { while ((array[i] < m) && (i < l)) i++; while ((array[j] > m) && (j > f)) j--; if (j <= i) break; temp = array[i]; array[i] = array[j]; array[j]=temp; i++; j--; quicksort(array, f, j); quicksort(array, j+1, l); 関数関数の引数 ここには 変数宣言 が入るこの関数で用いる ( 引数以外の ) 変数の型と変数名を書く

アルゴリズムからプログラムへ void quicksort(int array[], int f, int l) { int m; int i,j, temp; if (f >= l) return; m = array[(f+l)/2]; i=f; j=l; while (1) { while ((array[i] < m) && (i < l)) i++; while ((array[j] > m) && (j > f)) j--; if (j <= i) break; temp = array[i]; array[i] = array[j]; array[j]=temp; i++; j--; quicksort(array, f, j); quicksort(array, j+1, l); 関数関数の引数

アルゴリズムからプログラムへ void quicksort(int array[], int f, int l) { int m; int i,j, temp; if (f >= l) return; m = array[(f+l)/2]; i=f; j=l; while (1) { while ((array[i] < m) && (i < l)) i++; while ((array[j] > m) && (j > f)) j--; if (j <= i) break; temp = array[i]; array[i] = array[j]; array[j]=temp; i++; j--; quicksort(array, f, j); quicksort(array, j+1, l); 関数関数の引数 while(1) {. は無限繰返しのパタン

アルゴリズムからプログラムへ void quicksort(int array[], int f, int l) { int m; int i,j, temp; if (f >= l) return; m = array[(f+l)/2]; i=f; j=l; while (1) { while ((array[i] < m) && (i < l)) i++; while ((array[j] > m) && (j > f)) j--; if (j <= i) break; temp = array[i]; array[i] = array[j]; array[j]=temp; i++; j--; quicksort(array, f, j); quicksort(array, j+1, l); 関数関数の引数

アルゴリズムからプログラムへ void quicksort(int array[], int f, int l) { int m; int i,j, temp; if (f >= l) return; m = array[(f+l)/2]; i=f; j=l; while (1) { while ((array[i] < m) && (i < l)) i++; while ((array[j] > m) && (j > f)) j--; if (j <= i) break; temp = array[i]; array[i] = array[j]; array[j]=temp; i++; j--; quicksort(array, f, j); quicksort(array, j+1, l); 関数関数の引数 break によって繰り返しから抜ける

アルゴリズムからプログラムへ void quicksort(int array[], int f, int l) { int m; int i,j, temp; if (f >= l) return; m = array[(f+l)/2]; i=f; j=l; while (1) { while ((array[i] < m) && (i < l)) i++; while ((array[j] > m) && (j > f)) j--; if (j <= i) break; temp = array[i]; array[i] = array[j]; array[j]=temp; i++; j--; quicksort(array, f, j); quicksort(array, j+1, l); return ; 最後の return はなくてもよい 関数関数の引数

Quick sort 関数の完成

関数の呼び出し ( クイックソート ) 先の quicksort 関数が書けたならば 次のようにして全体のプログラムを完成させる : #include <stdiu.h> #define InFile "data.txt" #define OutFile "surted.txt" #define NUM 1000 // ここに quicksurt 関数定義を書く int main(vuid) { int i, n=0, arr[num]; FILE *fp; // ファイルを読み込み配列 arr に記憶 fp = fupen(infile,"r"); while (fscanf(fp,"%d", &arr[n])!= EOF) { n++; fcluse(fp); // arr[0] からarr[n-1] までをソート quicksurt(arr, 0, n-1); // arr の中身をファイルに書出す fp = fupen(outfile,"w"); fur (i=0; i<n; i++) { fprintf(fp, "%d n", arr[i]); fcluse(fp); return 0;

実行時間計測 #include <stdio.h> #include <time.h> int main(void) { clock_t start, end; start = clock(); /* ここに処理すべきものを書く */ end = clock(); printf( " 処理時間 :%d[ms] n", end - start ); 時間のためのヘッダファイル 時間の記憶用の型と変数 処理前の時点の時間 ( プロセス時間 ) を記憶 処理後の時点の時間 ( プロセス時間 ) を記憶 return 0; この差が処理時間 (ms 単位 )

時間計測 :2 つの方式の比較 timeselectionsort.c --- 選択ソートの処理時間の計測 (80000 個のデータのソート ) 白井の PC では 2012ms timequicksort.c --- クイックソートの処理時間の計測 (80000 個のデータのソート ) 白井の PC では 250ms ( ただし 100 回分 ) したがって 80000 個のデータの場合 2000 : 2.5 800:1

アルゴリズムによる実行時間の違い

方程式の根を求める (1) 変数 x の関数 f(x) に対し f(x)=0 となる x の値を求めることを考える ここで 関数 f(x) は微分可能とする つまり f (x) が存在するとする このとき x の付近に適当な値 x 0 をとり 次の漸化式によって x に収束する数列を得ることができる場合が多い 問題 : これはなんという手法か? WikiPedia から引用

方程式の根を求める (1) 方程式の根を求めるアルゴリズム入力 : 関数 f(x) その一階微分 df(x) 解にできるだけ近い値 x 0 閾値 th 繰り返し回数制限 imax 出力 : f(x)=0 となる根の近似値手順 : 1) x=x 0, i=0 とする 2) i <= imax ならば以下を繰り返す (1) i = i+1 とする (2) y = x - f(x)/df(x) (3) (y - x)/x の絶対値が閾値 th 以下なら y を返り値として終了 (4) x = y とする 3) 収束しない として異常終了 注意 : C では関数を引数にする関数は作れないので 関数の引数リストから外しておく 課題 1. 関数名を solve として以下を考えよ ( 適切なものにせよ ) (1) 引数リストは? (2) 返り値は? 課題 2. 手順 をコード化せよ ただし収束しない場合は その旨表示してから 0.0 を返り値とするものとする 変数と関数の型に注意せよ

方程式の根を求める (1) 課題 3: solve 関数のプログラムができたら 次のコードで試してみよ #include <stdio.h> #include <math.h> double f(double x) { // x^2 3 return (x*x 3.0); double df(double x) { // 2*x return(2.0*x); // ここに作成した solve 関数を // 書き込む int main(void) { double ans, th=1.0e-8, x0 = 1.0; int imax = 100; ans = solve(x0,th,imax); printf( 方程式の根 =%10.3f n,ans); return(0);

方程式の根を求める (1) 先のプログラムが予想通り動いたならば いろいろな方程式の根を求めてみよ ( つまり 適切な f と df 関数を与える ) 例 : (1) f(x) = x 5 +3x 2-9x - 10 (2) f(x) = 3sinx+8cos3x+1 (3) f(x) = (2x+3)log x - 3

方程式の根を求める (2) 今の方法よりも効率は劣るが 連続な関数 fに対して f(x)=0 の近似解を 求める方法がある f(a) * f(b) < 0 となる適当な a と b という 2 つの値を初期値とするここでは簡単のため f(a) <0, f(b) >0 と仮定するある閾値 th に対し a b > th である間以下を繰り返す : c=(a+b)/2 f(c) < 0 ならば a=c, さもなくば b=c とする問題 : これはなんという手法か?

方程式の根を求める (2) 方程式の根を求めるアルゴリズム入力 : 関数 f(x) f(a) < 0 f(b)>0 となる初期値 a, b, 閾値 th 出力 : f(x)=0 となる根の近似値手順 : 1) a-b >th ならば以下を繰り返す (1) c=(a+b)/2 とする (2) f(c) < 0 ならば a=c さもなくば b=c 2) c を返す 注意 : C では関数を引数にする関数は作れないので 関数の引数リストから外しておく 課題 4. 関数名を search として以下を考えよ ( 適切なものにせよ ) (1) 引数リストは? (2) 返り値は? 課題 5. 手順 をコード化せよ なぜ 繰り返しの回数制限をしていないのだろうか? 変数と関数の型に注意せよ

方程式の根を求める (2) 課題 6: search 関数のプログラムができたら 次のコードで試してみよ #include <stdio.h> #include <math.h> double f(double x) { // x*x 3 return (x*x 3.0); double df(double x) { // 2*x return(2.0*x); // ここに作成した search 関数を // 書き込む int main(void) { double ans, th=1.0e-5, a=1.0. b=2.0; ans = solve(a, b,th); printf( 方程式の根 =%10.3f n,ans); return(0);

方程式の根を求める (2) 先のプログラムが予想通り動いたならば いろいろな方程式の根を求めてみよ そして方程式の根を求める方法 (1) による解と比較してみよ 例 : (1) f(x) = x 5 +3x 2-9x - 10 (2) f(x) = 3sinx+8cos3x+1 (3) f(x) = (2x+3)log x - 3