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

Slides:



Advertisements
Similar presentations
オブジェクト指向言語・ オブジェクト指向言語演習 中間試験回答例. Jan. 12, 2005 情報処理技術基礎演習 II 2 オブジェクト指向言語 中間試験解説 1  (1) 円柱の体積(円柱の体積 = 底面の円の面積 x 高さ) を求めるプログラムを作成しなさい。ただし、出力結果は、入 力した底面の円の半径.
Advertisements

基本情報技術概論 I 演習(第5回) 埼玉大学 理工学研究科 堀山 貴史
2分探索.
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
数理情報工学演習第一C プログラミング演習 (第3回 ) 2014/04/21
アルゴリズムとデータ構造 2013年6月18日
アルゴリズムとデータ構造 2010年7月5日
システムプログラミング 第5回 情報工学科 篠埜 功 ヒアドキュメント レポート課題 main関数の引数 usageメッセージ
基礎プログラミングおよび演習 第9回
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
アルゴリズムとデータ構造 2012年6月14日
データ構造とアルゴリズム 第7回 木 ~ データ構造(3)~.
大岩 元 慶応大学環境情報学部 二分木 データ構造とプログラミング(10) 大岩 元 慶応大学環境情報学部
アルゴリズムとデータ構造 2011年6月14日
構造体 構造体, 構造体とポインタの組み合わせ,.
二分探索木によるサーチ.
第2回 Microsoft Visual Studio C++ を使ってみよう
情報工学科 3年生対象 専門科目 システムプログラミング 第5回、第6回 ヒアドキュメント レポート課題 情報工学科 篠埜 功.
ちょっとした練習問題① 配列iroを['R', 'W', 'R', 'R', 'W' , 'W' , 'W']を宣言して、「W」のときの配列の番号をprintfで表示するようなプログラムを記述しなさい。
Cプログラミング演習 第6回 ファイル処理と配列.
プログラミング 2 ファイル処理.
プログラミング論 ファイル入出力
アルゴリズムとデータ構造 2012年6月28日
アルゴリズムとデータ構造 2011年6月27日
EVENT プログラミングのスタイル 手続き型: ある決められた場所から開始され, その後は純粋に上から下に流れて行く方式. 実行したいことを, 順番に記述してゆく. 逐次処理形式コーディングの方法である。 今までの授業(情報処理2や3)で 行ってきたプログラミングの演習 bcc32やmake 手続き型.
Cプログラミング演習.
iioLoadFile()とiioMallocImageBuffer()の補足
Cプログラミング演習 第7回 メモリ内でのデータの配置.
アルゴリズムとデータ構造1 2006年7月4日
iioLoadFile()とiioMallocImageBuffer()の補足
iioLoadFile()とiioMallocImageBuffer()の補足
木の走査.
プログラミング演習I 行列計算と線形方程式の求解
プログラミング論 ファイル入出力
第11回 プログラミングⅡ 第11回
Cの実行モデル.
四則演算,変数 入力文,出力文,代入文, ライブラリ関数
データ構造と アルゴリズム 第七回 知能情報学部 新田直也.
データ構造と アルゴリズム 第六回 知能情報学部 新田直也.
離散数学 07. 木 五島.
Cプログラミング演習 第10回 二分探索木.
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
プログラミング 4 木構造とヒープ.
15.cons と種々のデータ構造.
アルゴリズムとデータ構造 第3章 ヒープ 5月31日分の復習
情報数理Ⅱ 第11章 データ構造 平成29年1月18日.
データ構造とアルゴリズム (第5回) 静岡大学工学部 安藤和敏
vc-3. ダンプリスト,配列 (Visual Studio C++ の実用知識を学ぶシリーズ)
ファイルの読み込み, ファイルからのデータの取り出し, ファイルの書き出し
アルゴリズムとデータ構造 2013年7月1日
情報工学概論 (アルゴリズムとデータ構造)
アルゴリズムとデータ構造1 2009年7月2日
ネットワーク・プログラミング Cプログラミングの基礎.
高度プログラミング演習 (11).
vc-3. ダンプリスト,配列 (Visual Studio C++ の実用知識を学ぶシリーズ)
cp-1. クラスとメソッド (C++ オブジェクト指向プログラミング入門)
ファイル操作について (1).
cp-3. 計算 (C プログラミング演習,Visual Studio 2019 対応)
モジュール分割.
プログラミング 4 文字列.
Cp-1. Microsoft Visual Studio 2019 C++ の使い方 (C プログラミング演習,Visual Studio 2019 対応) 金子邦彦.
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
プログラミング演習I 2003年6月11日(第9回) 木村巌.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
四則演算,変数 入力文,出力文,代入文, ライブラリ関数
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
7.木構造 7-1.データ構造としての木 7-2.2分探索木 7-3.高度な木.
高度プログラミング演習 (10).
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
Presentation transcript:

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

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

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

機能設計の例 入力 出力 下記に定める「名簿ファイル」を入力とする テキストファイル形式 氏名,生年月日,住所,電話番号が並び,半角の空白文字 で区切られる. 氏名,住所,電話番号は最大で100バイトとする. 生年月日は,西暦年,月,日が「/」で区切られている ファイル名は 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() での順序     に従う

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

構造体 Person の定義(説明は後述) 構造体 BTNode の定義(説明は後述) print_person_data 関数 #include "stdafx.h" #include <math.h> #include <string.h> #pragma warning(disable:4996) struct Person { char name[100]; int birth_year; int birth_month; int birth_day; char address[100]; char phone[100]; }; struct BTNode { BTNode *left; BTNode *right; 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 ); struct BTNode *new_person_node(Person *p, struct BTNode *y, struct BTNode *z) struct BTNode *w = new BTNode(); strcpy_s( 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_s( w->person.address, p->address ); strcpy_s( 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); else { 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_s( 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 ); insert_person_node( root, &p ); fclose(in_file); return root; int _tmain() int ch; root = read_file_and_create_tree( "z:\\Address.txt" ); print_person_data( root ); printf( "Enter キーを1,2回押してください. プログラムを終了します\n"); ch = getchar(); お断り コピー/ペーストしやすいように 1ページに収めています print_person_data 関数 new_person_node 関数 insert_person_node 関数 read_file_and_create_tree 関数 構造体 Person の定義(説明は後述) 構造体 BTNode の定義(説明は後述)

実行結果の例

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

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

ファイルオープンに失敗した ときのみ実行される部分 ファイル ファイルオープンに失敗したら, プログラムが終わる fgets で読み込み 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_s( 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分探索木を構成

while による繰り返し部分 ファイル fgets で読み込み 氏名をキーとする 2分探索木を構成 テキストファイルの1行読み込み 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_s( 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分探索木を構成

ファイル fgets で読み込み 氏名をキーとする 2分探索木を構成 木の ROOT (根) を作る (そのメモリアドレスを,変数 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_s( 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分探索木を構成

挿入を行う関数 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); else { p->name ・・・ 挿入データの name フィールド node->person.name ・・・ 探索中の部分木の根                にある name フィールド strcmp で「辞書順」での比較

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

表示を行う関数(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 ); 左部分木 根 右部分木