Microsoft PowerPoint - kougi11.ppt

Similar documents
Microsoft PowerPoint - kougi6.ppt

Microsoft PowerPoint - kougi10.ppt

Microsoft PowerPoint - kougi9.ppt

Microsoft PowerPoint - kougi7.ppt

Microsoft PowerPoint - kougi8.ppt

memo

memo

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

V

Microsoft PowerPoint - kougi4.ppt

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

Microsoft PowerPoint - lec10.ppt

Microsoft PowerPoint - kougi2.ppt

Microsoft PowerPoint - 05.pptx

情報処理演習 B8クラス

ポインタ変数

Microsoft Word - no206.docx

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

Prog1_10th

memo

ファイル入出力

2006年10月5日(木)実施

ファイル入出力

DVIOUT

Prog1_12th

PowerPoint Presentation

Microsoft Word - NonGenTree.doc

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

Prog1_15th

PowerPoint プレゼンテーション

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

第2回

Microsoft Word - no205.docx

gengo1-12

文字列 2 前回の授業ではコンピュータ内部での文字の取り扱い 文字型の変数 文字型変数への代入方法などを学習した 今回は 前回に引き続き 文字処理を学習する 内容は 標準入出力 ( キーボード ディスプレイ ) での文字処理 文字のファイル処理 文字を取り扱うライブラリ関数である 標準入出力 Lin

gengo1-12

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

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

memo

memo

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

プログラミング基礎

gengo1-12

memo

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

プログラミング基礎

Microsoft Word - 13

PowerPoint プレゼンテーション

program7app.ppt

ポインタ変数

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

演算増幅器

DVIOUT

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

02: 変数と標準入出力

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

Prog2_10th

Microsoft Word - no15.docx

Microsoft Word - no204.docx

PowerPoint プレゼンテーション

memo

プログラミングI第10回

A/B (2018/10/19) Ver kurino/2018/soft/soft.html A/B

Microsoft Word - 12

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

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

02: 変数と標準入出力

問 2 ( 型変換 ) 次のプログラムを実行しても正しい結果が得られない 何が間違いかを指摘し 正しく修正せよ ただし int サイズが 2 バイト long サイズが 4 バイトの処理系での演算を仮定する #include <stdio.h> int main( void ) { int a =

ポインタ変数

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

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

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

PowerPoint プレゼンテーション

データ構造

Microsoft Word - cpro_m_13.doc

Microsoft Word - no12.doc

練習&演習問題

PowerPoint プレゼンテーション

PG13-6S

プログラミング基礎

ポインタ変数

プログラミング及び演習 第1回 講義概容・実行制御

DVIOUT

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

データ構造

テキスト処理第 2 回 田中哲産業技術総合研究所情報技術研究部門 akira/textprocess/

Microsoft PowerPoint - guidance.ppt

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

cp-7. 配列

PowerPoint プレゼンテーション

slide4.pptx

memo

ポインタ変数

Microsoft PowerPoint - C_Programming(3).pptx

二分木の実装

Prog1_6th

alg2015-6r3.ppt

PowerPoint プレゼンテーション

情報工学実験 C コンパイラ第 2 回説明資料 (2017 年度 ) 担当 : 笹倉 佐藤

PowerPoint プレゼンテーション

Transcription:

C プログラミング演習 中間まとめ 2 1

ソフトウエア開発の流れ 機能設計 外部仕様 ( プログラムの入力と出力の取り決め ) 構成設計 詳細設計 論理試験 内部データ構造や関数呼び出し方法などに関する取り決めソースプログラムの記述正しい入力データから正しい結果が得られるかテスト関数単位からテストをおこなう 耐性試験 異常な入力データに対して, 異常を検出できるかテスト異常終了することはないかテスト 2

機能設計 外部仕様 ( プログラムの入力と出力の取り決め ) 入力 出力 データファイル, 外部から与える動作など プログラム データファイル, 外部に出すメッセージなど what を定める ( how とは段階を分ける ) 3

入力 出力 機能設計の例 下記に定める 名簿ファイル を入力とする 1. テキストファイル形式 2. 氏名, 生年月日, 住所, 電話番号が並び, 半角の空白文字で区切られる. 氏名, 住所, 電話番号は最大で 100 バイトとする. 生年月日は, 西暦年, 月, 日が / で区切られている 3. ファイル名は z: Address.txt 例 金子邦彦 1200/01/01 福岡市東区箱崎 3 丁目 392-123-8234 1300/12/31 福岡市東区貝塚団地 492-252-7188 0800/05/31 福岡市東区香椎浜 1 丁目 592-824-7144 名簿ファイル の中身を, 氏名でソートして表示 1. 氏名の順序は,c の文字列比較関数 strcmp() での順序に従う 4

構成設計 プログラムの内部仕様仕様を定める 外部仕様を実現するのに最も適した手段を定める 内部仕様の概要の例 プログラムのメモリ空間 ファイル in-order で辿りながら表示 fgets で読み込み 氏名をキーとする 2 分探索木を構成 5

#include "stdafx.h" #include <math.h> struct Person { char name[100]; int birth_year; int birth_month; int birth_day; char address[100]; 構造体 Person の定義 ( 説明は後述 ) char phone[100]; ; struct BTNode { BTNode *left; BTNode *right; 構造体 BTNode の定義 ( 説明は後述 ) Person person; ; void print_person_data( struct BTNode *root ) { if ( root->left!= NULL ) { print_person_data( root->left ); printf( "%s, t%d/%d/%d, t%s, t%s n", root->person.name, root->person.birth_year, root->person.birth_month, root->person.birth_day, root- >person.address, root->person.phone ); if ( root->right!= NULL ) { print_person_data( root->right ); print_person_data 関数 struct BTNode *new_person_node(person *p, struct BTNode *y, struct BTNode *z) { struct BTNode *w = new BTNode(); strcpy( w->person.name, p->name); w->person.birth_year = p->birth_year; w->person.birth_month = p->birth_month; w->person.birth_day = p->birth_day; strcpy( w->person.address, p->address ); strcpy( w->person.phone, p->phone ); w->left y; w->right = z; return w; struct BTNode *insert_person_node(struct BTNode *node, Person *p) { if ( node == NULL ) { return new_person_node(p, NULL, NULL); else if ( strcmp( p->name, node->person.name ) < 0 ) { node->left = insert_person_node(node->left, p); return node; else if ( strcmp( p->name, node->person.name ) > 0) { node->right = insert_person_node(node->right, p); return node; else { return node; BTNode* read_file_and_create_tree( char* file_name ) { FILE *in_file; char line[sizeof(person)]; Person p; BTNode *root; in_file = fopen(file_name, "r"); if ( in_file == NULL ) { return 0; root = NULL; while( fgets( line, sizeof(person), in_file )!= NULL ) { sscanf( line, "%s %d/%d/%d %s %s", &(p.name), &(p.birth_year), &(p.birth_month), &(p.birth_day), &(p.address), &(p.phone) ); if ( root == NULL ) { root = new_person_node( &p, NULL, NULL ); else { insert_person_node( root, &p ); fclose(in_file); return root; int _tmain(int argc, _TCHAR* argv[]) { BTNode *root; int ch; root = read_file_and_create_tree( "z: Address.txt" ); print_person_data( root ); printf( "Enter キーを 1,2 回押してください. プログラムを終了します n"); ch getchar(); ch = getchar(); return 0; new_person_node 関数 insert_person_node 関数 read_file_and_create_tree 関数 お断りコピー / ペーストしやすいように 1 ページに収めています 6

実行結果の例 7

構造体の例 char の配列 (100バイト) int int int char の配列 (100バイト) char の配列 (100バイト) name birth_year birth_month birth_day address phone これで 1 つのデータ 例題 1 の構造体 Person 8

二分探索木の各ノードを C 言語の構造体で表現 Person 構造体を中に含む person left person right person 1 個の構造体 struct BTNode { BTNode *left; BTNode *right; Person person; ; ; left right left right Person person の部分は, 格納すべきデータに応じて変わる 9

BTNode* read_file_and_create_tree( char* file_name ) { FILE *in_file; char line[sizeof(person)]; Person p; BTNode *root; in_file = fopen(file_name, "r"); if ( in_file == NULL ) { return 0; root = NULL; while( fgets( line, sizeof(person), in_file )!= NULL ) { sscanf( line, "%s %d/%d/%d %s %s", &(p.name), &(p.birth_year), &(p.birth_month), &(p.birth_day), &(p.address), &(p.phone) ); if ( root == NULL ) { root = new_person_node( &p, NULL, NULL ); else { insert_person_node( root, &p ); fclose(in_file); return root; ファイルオープンに失敗したときのみ実行される部分 ファイルオープンに失敗したら, プログラムが終わる プログラムのメモリ空間 ファイル fgets で読み込み 氏名をキーとする 2 分探索木を構成 10

BTNode* read_file_and_create_tree( char* file_name ) { FILE *in_file; char line[sizeof(person)]; Person p; BTNode *root; in_file = fopen(file_name, "r"); if ( in_file == NULL ) { return 0; root = NULL; while( fgets( line, sizeof(person), in_file )!= NULL ) { sscanf( line, "%s %d/%d/%d %s %s", &(p.name), &(p.birth_year), &(p.birth_month), &(p.birth_day), &(p.address), &(p.phone) ); if ( root == NULL ) { root = new_person_node( &p, NULL, NULL ); else { insert_person_node( root, &p ); fclose(in_file); return root; while による繰り返し部分 プログラムのメモリ空間 テキストファイルの 1 行読み込み ファイル fgets で読み込み 氏名をキーとする 2 分探索木を構成 11

BTNode* read_file_and_create_tree( char* file_name ) { FILE *in_file; char line[sizeof(person)]; Person p; BTNode *root; in_file = fopen(file_name, "r"); if ( in_file == NULL ) { return 0; root = NULL; while( fgets( line, sizeof(person), in_file )!= NULL ) { sscanf( line, "%s %d/%d/%d %s %s", &(p.name), &(p.birth_year), &(p.birth_month), &(p.birth_day), &(p.address), &(p.phone) ); if ( root == NULL ) { root = new_person_node( &p, NULL, NULL ); else { insert_person_node( root, &p ); fclose(in_file); return root; プログラムのメモリ空間 木の ROOT ( 根 ) を作る ( そのメモリアドレスを, 変数 root にセット ) 木の構成のために insert_person_node を繰り返し呼び出す ファイル fgets で読み込み 氏名をキーとする 2 分探索木を構成 12

挿入を行う関数 struct BTNode *insert_person_node(struct BTNode *node, Person *p) { if ( node == NULL ) { return new_person_node(p, NULL, NULL); else if ( strcmp( p->name, node->person.name ) < 0 ) { node->left = insert_person_node(node->left, p); return node; else if ( strcmp( p->name, node->person.name ) > 0) { node->right = insert_person_node(node->right, p); return node; else { return node; p->name 挿入データの name フィールド node->person.name 探索中の部分木の根にある name フィールド strcmp で 辞書順 での比較 13

通りがけ順 (in-order traversal) 1. 左の子節点以下を処理 ( 左部分木を辿る ) 2. 親節点について処理 ( 根を辿る ) 3. 右の子節点以下を処理 ( 右部分木を辿る ) A 2 根を辿る B C D E F G D, B, E, A, F, C, G の順に処理を行う 1 左部分木を辿る 3 右部分木を辿る 14

表示を行う関数 (in-order での表示 ) void print_person_data( struct BTNode *root ) { if ( root->left!= NULL ) { print_person_data( root->left ); printf( "%s, t%d/%d/%d, t%s, t%s n", root->person.name, root->person.birth_year, root->person.birth_month, root- >person.birth_day, root->person.address, root- >person.phone ); if ( root->right!= NULL ) { print_person_data( root->right ); 左部分木 根 右部分木 15