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

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

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

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

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

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

CプログラミングI

プログラミング基礎

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

プログラミング実習I

Microsoft PowerPoint - 4.pptx

情報処理演習 B8クラス

PowerPoint Presentation

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

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

情報処理Ⅰ

kiso2-03.key

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

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

演算増幅器

Microsoft PowerPoint - 11.pptx

memo

Microsoft PowerPoint - kougi7.ppt

ファイル入出力

memo

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

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

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

フローチャートの書き方

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

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

Microsoft PowerPoint ppt

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

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

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

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

<4D F736F F D20438CBE8CEA8D758DC03389F0939A82C282AB2E646F63>

Microsoft Word - no202.docx

ファイル入出力

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

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

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

Prog1_12th

Microsoft PowerPoint - prog04.ppt

PowerPoint プレゼンテーション

Microsoft PowerPoint - 09.pptx

2006年10月5日(木)実施

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

Microsoft PowerPoint - C4(反復for).ppt

gengo1-12

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

Microsoft PowerPoint - prog06.ppt

PowerPoint プレゼンテーション

Microsoft Word - 3new.doc

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

memo

第2回講義:まとめ

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

Prog1_10th

Microsoft PowerPoint - kougi6.ppt

PowerPoint プレゼンテーション

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

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

Microsoft PowerPoint - kougi11.ppt

02: 変数と標準入出力

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

cp-7. 配列

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

PowerPoint Presentation

Microsoft PowerPoint - kougi9.ppt

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

Microsoft PowerPoint - kougi2.ppt

02: 変数と標準入出力

講習No.12

memo

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

プログラミング基礎

PowerPoint プレゼンテーション


ポインタ変数

Microsoft Word - 03

gengo1-12

Taro-数値計算の基礎Ⅱ(公開版)

スライド 1

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

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

データ構造

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

プログラミング基礎

memo

プログラミング基礎

演習課題No12

データ構造

< F2D837C E95CF CF68A4A94C5816A2E6A>

Prog1_15th

スライド 1

slide5.pptx

1 return main() { main main C 1 戻り値の型 関数名 引数 関数ブロックをあらわす中括弧 main() 関数の定義 int main(void){ printf("hello World!!\n"); return 0; 戻り値 1: main() 2.2 C main

PowerPoint プレゼンテーション

C言語講座 ~ファイル入出力編~

Taro-最大値探索法の開発(公開版

Transcription:

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

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

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