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

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

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

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

CプログラミングI

情報処理Ⅰ

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

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

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

memo

cp-7. 配列

プログラミング実習I

Microsoft Word - 3new.doc

プログラミング基礎

<4D F736F F D20438CBE8CEA8D758DC03389F0939A82C282AB2E646F63>

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

プログラミング基礎

7 ポインタ (P.61) ポインタを使うと, メモリ上のデータを直接操作することができる. 例えばデータの変更 やコピーなどが簡単にできる. また処理が高速になる. 7.1 ポインタの概念 変数を次のように宣言すると, int num; メモリにその領域が確保される. 仮にその開始のアドレスを 1

Microsoft PowerPoint - 11.pptx

情報処理演習 B8クラス

PowerPoint プレゼンテーション

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

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

Prog1_10th

memo

画像ファイルを扱う これまでに学んだ条件分岐, 繰り返し, 配列, ファイル入出力を使って, 画像を扱うプログラムにチャレンジしてみよう

データ構造

Microsoft PowerPoint - C4(反復for).ppt

PowerPoint Presentation

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

Microsoft PowerPoint - 5Chap15.ppt

PowerPoint プレゼンテーション

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

Microsoft Word - no15.docx

kiso2-09.key

ポインタ変数

Microsoft PowerPoint - 4.pptx

デジタル表現論・第4回

Microsoft PowerPoint - kougi2.ppt

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

02: 変数と標準入出力

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

Microsoft PowerPoint - prog03.ppt

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

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

Microsoft PowerPoint - 説柔5_間勊+C_guide5ï¼›2015ã•’2015æŒ°æŁŽæš’å¯¾å¿œç¢ºèª“æ¸‹ã†¿ã•‚.pptx

情報処理Ⅰ演習

Prog1_12th

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

< F2D837C E95CF CF68A4A94C5816A2E6A>

PowerPoint プレゼンテーション

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

Microsoft Word - no11.docx

PowerPoint プレゼンテーション

フィルタとは

memo

プログラミング基礎

プログラミングA

第1回 プログラミング演習3 センサーアプリケーション

Microsoft Word - no206.docx

演習課題No12

データ構造

コマンドラインから受け取った文字列の大文字と小文字を変換するプログラムを作成せよ 入力は 1 バイトの表示文字とし アルファベット文字以外は変換しない 1. #include <stdio.h> 2. #include <ctype.h> /*troupper,islower,isupper,tol

02: 変数と標準入出力

gengo1-8

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

PowerPoint Presentation

書式に示すように表示したい文字列をダブルクォーテーション (") の間に書けば良い ダブルクォーテーションで囲まれた文字列は 文字列リテラル と呼ばれる プログラム中では以下のように用いる プログラム例 1 printf(" 情報処理基礎 "); printf("c 言語の練習 "); printf

Microsoft PowerPoint - 05.pptx

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

2

Taro-プログラミングの基礎Ⅱ(公

Microsoft PowerPoint ppt

Taro-2分探索木Ⅱ(公開版).jtd

Microsoft PowerPoint - kougi6.ppt

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード]

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

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

PowerPoint プレゼンテーション

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

ポインタ変数

Microsoft PowerPoint - lec10.ppt

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

PG13-6S

プログラミング入門1

Microsoft Word - VBA基礎(6).docx

2006年10月5日(木)実施

プログラミング基礎

Microsoft Word - COMP-MATH-2016-FULLTEXT.doc

Microsoft Word - no103.docx

Microsoft PowerPoint - chap10_OOP.ppt

物質工学科 田中晋

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

Microsoft PowerPoint - kougi7.ppt

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

メソッドのまとめ

プログラミング入門1

演算増幅器

Microsoft PowerPoint P演習 第10回 関数.ppt [互換モード]

Microsoft Word - no12.doc

Transcription:

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

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

プログラムが作れたら data.txt の中身ソートの結果 : 2 3-5 0 12-10 8-3 -10-3 -5 0 2 3 8 12

プログラムの手順 (1) 入力 : data.txt (2) 処理 : ソート ( いろいろな方法がある ) (3) 出力 : ソートした結果を画面表示する ( ファイルに書出す )

プログラムの手順 (1) 入力 : data.txt ファイルから要素を読み込み 配列に記憶する (2) 処理 : ソート ( いろいろな方法がある ) (3) 出力 : ソートした結果を画面表示する ( ファイルに書出す )

プログラムの手順 (1) 入力 : data.txt ファイルから要素を読み込み 配列に記憶する (2) 処理 : ソート ( いろいろな方法がある ) 適当な大きさの配列を用意するファイルの読み込み準備 ( ファイル変数 ) ファイルから要素を一個ずつ読み込んで 配列に記憶する (3) 出力 : ソートした結果を画面表示する ( ファイルに書出す )

プログラムの手順 (1) 入力 : data.txt ファイルから要素を読み込み 配列に記憶する (2) 処理 : ソート ( いろいろな方法がある ) ここでは 昇順の選択ソート (selection sort) を考えよう 配列の 1 番目以降の要素で最小の要素を探し 1 番目の要素と交換する ( これにより 1 番目の要素が 最小 となる ) 次に配列の 2 番目以降の要素で最小の要素を探し 2 番目の要素と交換する ( これにより 2 番目の要素が 2 番目に最小 となる ) この操作を配列の最後の要素まで繰り返す 注意 : 配列で 1 番目の要素のインデックスは 0 同様に 2 番目の要素のインデックスは 1 (3) 出力 : ソートした結果を画面表示する ( ファイルに書出す )

昇順の選択ソートプログラム 配列の 1 番目以降の要素で最小の要素を探し 1 番目の要素と交換する 次に配列の 2 番目以降の要素で最小の要素を探し 2 番目の要素と交換する この操作を配列の最後の要素まで繰り返す ちょっと難しそう なにをどうしたらよいのか? 考え方 : 何かを繰り返す と書いてあるのだから 繰り返される処理を 関数 として捉える 注意 : 配列で 1 番目の要素のインデックスは 0 同様に 2 番目の要素のインデックスは 1

昇順の選択ソートプログラム 注意 : 配列で 1 番目の要素のインデックスは 0 配列の 1 番目以降の要素で最小の要素を探し 1 番目の要素と交換 次に配列の 2 番目以降の要素で最小の要素を探し 2 番目の要素と交換 この操作を配列の最後の要素まで繰り返す 繰り返される処理を 関数 として捉える 青字 : 入力茶色 : 処理 これに注目 配列の i 番目以降の要素で最小の要素を探し i 番目の要素と交換する 最終的に得られるのは 要素が交換された配列 確認 : この部分でも当てはまる?

昇順の選択ソート 配列の 1 番目以降の要素で最小の要素を探し 1 番目の要素と交換 次に配列の2 番目以降の要素で最小の要素を探し 2 番目の要素と交換 この操作を配列の最後の要素まで繰り返す という方法が実際にうまくいくのか 自分の手で確かめてみる : 2 3-5 0 12-10 8-3 最小 -10 3-5 0 12 2 8-3 最小 -10-5 3 0 12 2 8-3 最小 -10-5 -3 0 12 2 8 3 注意 : 配列で 1 番目の要素のインデックスは 0 2 番目の要素のインデックスは 1... うまくいきそう

昇順の選択ソートプログラム作成 配列の 1 番目以降の要素で最小の要素を探し 1 番目の要素と交換 次に配列の2 番目以降の要素で最小の要素を探し 2 番目の要素と交換 この操作を配列の最後の要素まで繰り返す まず 繰り返される処理を行う関数の名前 入力 処理 出力を定める 関数名を ( 仮に )findandreplace とする 入力 : 整数の配列 int arr[ ] 整数 int i, int n 配列 arr の要素数を n とする 処理 : i 番目以降の要素のうちの最小値を見つけて i 番目の要素と取り替える 出力 : 書き換えられた整数の配列 int arr[ ] あとで修正

昇順の選択ソートプログラム作成 配列の 1 番目以降の要素で最小の要素を探し 1 番目の要素と交換 次に配列の2 番目以降の要素で最小の要素を探し 2 番目の要素と交換 この操作を配列の最後の要素まで繰り返す 処理 : i 番目以降の要素のうちの最小値を見つけて i 番目の要素と取り替える 注意 : 配列で 1 番目の要素のインデックスは 0 2 番目の要素のインデックスは 1... やるべき仕事は 2 つ (1) 配列の i 番目以降の要素から最小値を見つける (2) その要素と i 番目の要素を入れ替える

配列から最小値を求めるプログラム の改訂 配列の 1 番目の要素 ( インデックス 0) から最後の要素 ( インデックス n-1) までの要素のうちの最小値を求めるプログラム は前に作った 今回はこれを元に 配列に対し インデックス i から n-1 までの要素のうちの最小値と最小値の要素の番号 ( インデックス ) を求める 関数 を作る そして 最小値とインデックス i 番目の要素を入れ替える そのために 最小値の要素のインデックスも記憶する! 注意 : 配列で 1 番目の要素のインデックスは 0

配列から最小値を求めるプログラム の改訂 第 2 回目演習で 配列の要素の最小値を求める 関数を作った : これを元に インデックス i から n-1 までの要素のうちの最小値とその番号 ( インデックス ) を求める 関数にするには 以下をどのように変更するかを考えれば良い : (1) 入力 (2) 処理 (3) 出力 注意 :2 つのもの ( ここでは最小値とそのインデックス ) を返す方法はまだ学んでいない しかし! インデックスさえわかれば最小値がなんであるかは分かる! そこで 最小値のインデックス を求める関数を考えてみよう

関数 mininarray 出力 = 記憶した最小要素は int 型 int mininarray { } (int ar[], int n) int min=ar[0]; int i; for (i=1; i< n; i++) { if (min > ar[i]) // 一個ずつmin 値と比較 min = ar[i]; // minxよりも大きければ更新 } return min; 入力 = 整数を要素とする配列 int ar[] と要素数 int n 今まで見た要素の中で最小のものを記憶する 変数を宣言 その変数に初期値を与える 出力 = 最小要素 要素を比較して最小値を求める

配列から最小値を求めるプログラム の改訂 配列に対し インデックス i から n-1 までの要素のうちの最小値とそのインデックスとを求める 関数に作り変えてみよう (1) 入力 (2) 処理 (3) 出力 整数型の配列 変更なし配列の要素数 最小値を求める先頭のインデックス i と最後の要素のインデックス n とするつまり, int arr[ ], int i, int n 処理 最小要素の値に加えてその要素のインデックスを記録 最小要素の値 その要素のインデックスを返すこれにより 最小要素の値を 先頭の要素と取り換え も容易

昇順の選択ソートプログラム作成 配列の 1 番目以降の要素で最小の要素を探し 1 番目の要素と交換 次に配列の2 番目以降の要素で最小の要素を探し 2 番目の要素と交換 この操作を配列の最後の要素まで繰り返す 処理 : インデックス i 以降の要素から (1) 最小値の要素のインデックスを見つけて (2) インデックス i の要素と取り替える (1) 今作った関数の名前を findminvalue とする findminvalue(arr, i n) によりインデックス i 番目から n 番目までの要素のうち 最小値要素のインデックスを返す (2) findminvalue(arr, i, n) の値を k とすると arr[i] と arr[k] の値を取り替える (swap)

配列の要素の値の取替え ( ちょっと落とし穴 ) arr[i] と arr[k] の値を取り替える (swap) についての注意 これは以下のようにすればできる と勘違いする人が時々いる arr[i] = arr[k] arr[k] = arr[i] これではできない! 例 : arr[i]=10, arr[k]=3 とおくと 最初の実行で arr[i]=arr[k]=3 となり arr[i] が持っていた値 10 が消えてしまうからである! 解決策 : 変数をもう一つ用意する (temp とする ) そして temp = arr[i] ; arr[i]=ar[k]; arr[k]=temp とする ( これが動くことを確かめよ ) コツ : 変数をケチらないこと

関数 findandreplace の完成 関数 findminvalue を使う void findandreplace(int arr[ ], int i, int n) { int k, temp; k = findminvalue(arr, i, n); temp = arr[i]; arr[i] = arr[k]; arr[k] = temp; } void となっているのは 書き換えられた配列 を内部で作っているから 配列を出力しなくてよいため

昇順の選択ソートプログラムの作成 整数を要素とする配列 arr そのインデックス 0 から n-1 まで ( 配列の要素数は n) の要素をソートする : // arr には要素が既に入っているとする for (i=0; i < n; i++) { } findandreplace(arr, i, n-1); // この結果 arr の中身はどうなっているだろうか?

全体のプログラムの完成 data.txt の要素をソートして sorted.txt というファイルに書出す #include <stdio.h> // 関数 findminvalue を定義 // 関数 findandreplace を定義 int main(void) { // 必要な変数の定義 // ファイル data.txt から要素を読み込み配列 arr に記憶 // そのとき 読み込んだ要素数も記憶 ( 変数 n の値とする ) // 選択ソートにより 配列 arr の中身を昇順ソート // arr の中身を sotred.txt に書出す return 0; }

課題の提出 プログラムを完成させ 適当なファイル ( 例えば data.txt) を与えてその要素をソートしその結果が sorted.txt ファイルに書き込まれる ことを確認しよう できたらプログラム ( 説明付き ) と実行結果を提出する プログラムは適切にインデントすることをお忘れなく