• 検索結果がありません。

Microsoft PowerPoint - kougi11.ppt

N/A
N/A
Protected

Academic year: 2021

シェア "Microsoft PowerPoint - kougi11.ppt"

Copied!
15
0
0

読み込み中.... (全文を見る)

全文

(1)

1

C

プログラミング演習

(2)

2

ソフトウエア開発の流れ

機能設計

構成設計

詳細設計

論理試験

耐性試験

外部仕様(プログラムの入力と出力の取り決め

外部仕様(プログラムの入力と出力の取り決め

外部仕様(プログラムの入力と出力の取り決め

外部仕様(プログラムの入力と出力の取り決め)

内部データ構造や関数呼び出し方法などに関す

内部データ構造や関数呼び出し方法などに関す

内部データ構造や関数呼び出し方法などに関す

内部データ構造や関数呼び出し方法などに関す

る取り決め

る取り決め

る取り決め

る取り決め

ソースプログラムの記述

ソースプログラムの記述

ソースプログラムの記述

ソースプログラムの記述

正しい入力データから正しい結果が得られるか

正しい入力データから正しい結果が得られるか

正しい入力データから正しい結果が得られるか

正しい入力データから正しい結果が得られるか

テスト

テスト

テスト

テスト

関数単位からテストをおこなう

関数単位からテストをおこなう

関数単位からテストをおこなう

関数単位からテストをおこなう

異常な入力データに対して,異常を検出できる

異常な入力データに対して,異常を検出できる

異常な入力データに対して,異常を検出できる

異常な入力データに対して,異常を検出できる

かテスト

かテスト

かテスト

かテスト

異常終了することはないかテスト

異常終了することはないかテスト

異常終了することはないかテスト

異常終了することはないかテスト

・・・

・・・

・・・

・・・

・・・

・・・

・・・

・・・

・・・

・・・

・・・

・・・

・・・

・・・

・・・

・・・

・・・

・・・

・・・

・・・

(3)

3

機能設計

外部仕様(プログラムの入力と出力の取り

外部仕様(プログラムの入力と出力の取り

外部仕様(プログラムの入力と出力の取り

外部仕様(プログラムの入力と出力の取り

決め

決め

決め

決め)

プログラム

入力

データファイル,

外部から与える動作など

出力

what

」を定める

(「

how

」とは段階を分ける)

データファイル,

外部に出すメッセージなど

(4)

4

機能設計の例

入力

入力

入力

入力

出力

出力

出力

出力

下記に定める

「名簿ファイル」

を入力とする

1.

テキストファイル形式

2.

氏名,生年月日,住所,電話番号が並び,半角の空白文字

で区切られる.

氏名,住所,電話番号は最大で100バイトとする.

生年月日は,西暦年,月,日が「

/

」で区切られている

3.

ファイル名は

z:¥Address.txt

「名簿ファイル」

の中身を,

氏名でソートして表示

1.

氏名の順序は,

c

の文字列比較関数

strcmp()

での順序

に従う

金子邦彦

1200/01/01

福岡市東区箱崎3丁目

392-123-8234

○○××

1300/12/31

福岡市東区貝塚団地

492-252-7188

●●■■

0800/05/31

福岡市東区香椎浜1丁目

592-824-7144

(5)

5

構成設計

プログラムの内部

プログラムの内部仕様

プログラムの内部

プログラムの内部

仕様

仕様を定める

仕様

を定める

を定める

を定める

外部仕様を実現するのに最も適した手段を定める

外部仕様を実現するのに最も適した手段を定める

外部仕様を実現するのに最も適した手段を定める

外部仕様を実現するのに最も適した手段を定める

ファイル

プログラムのメモリ空間

fgets

で読み込み

氏名をキーとする

2分探索木を構成

in-order

で辿り

ながら表示

内部仕様の概要の例

(6)

6

お断り

コピー/ペーストしやすいように

1ページに収めています

print_person_data

関数

new_person_node

関数

insert_person_node

関数

read_file_and_create_tree

関数

構造体

Person

の定義(

説明は後述

構造体

BTNode

の定義(

説明は後述

#include "stdafx.h" #include <math.h> 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", >person.name, >person.birth_year, >person.birth_month, >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( 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; }

(7)

7

(8)

8

構造体の例

phone

address

birth_day

birth_month

birth_year

name

例題1の

構造体

Person

これで1つの

データ

char

の配列(

100

バイト)

char

の配列(

100

バイト)

char

の配列(

100

バイト)

int

int

int

(9)

9

二分探索木の各ノードを

C

言語の構造体で表現

struct

BTNode

{

BTNode *left;

BTNode *right;

Person person;

};

struct

BTNode

{

BTNode *left;

BTNode *right;

Person person;

};

left

right

person

left

right

person

left

right

person

1個の

構造体

Person person

の部分は,格納

すべきデータに応じて変わる

Person

構造体を

中に

含む

(10)

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;

}

ファイル

プログラムのメモリ空間

fgets

で読み込み

氏名をキーとする

2分探索木を構成

ファイルオープンに失敗した

ときのみ実行される部分

ファイルオープンに失敗したら,

プログラムが終わる

(11)

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;

}

ファイル

プログラムのメモリ空間

fgets

で読み込み

氏名をキーとする

2分探索木を構成

while

による繰り返し部分

テキストファイルの1行読み込み

(12)

12

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分探索木を構成

木の構成のために

insert_person_node

を繰り返し呼び出す

木の

ROOT

(根)

を作る

(そのメモリアドレスを,変数

root

にセット)

(13)

13

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

で「辞書順」での比較

(14)

14

通りがけ順

(

in

-order traversal)

1.

左の子節点以下を処理

左部分木を辿る

2.

親節点について処理

根を辿る

3.

右の子節点以下を処理

右部分木を辿る

A

B

C

D

E

F

G

D, B, E, A, F, C, G

の順に処理を行う

①左部分木を辿る

②根を辿る

③右部分木を辿る

(15)

15

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,

>person.birth_month,

>person.birth_day, >person.address,

root->person.phone );

if ( root->right != NULL ) {

print_person_data( root->right );

}

}

表示を行う関数(

in-order

での表示)

左部分木

右部分木

参照

関連したドキュメント

⑥ニューマチックケーソン 職種 設計計画 設計計算 設計図 数量計算 照査 報告書作成 合計.. 設計計画 設計計算 設計図 数量計算

発行日 2005.10.1 改訂番号 - 大成基礎設計株式会社

2号機原子炉建屋への入力地震動は、「福島第一原子力発電所  『発電用原子炉施設に 関する耐震設計審査指針』の改訂に伴う耐震安全性評価結果  中間報告書」(原管発官1 9第603号  平成

処理水 バッファ タンク ろ過水 タンク 3号機 原子炉圧力容器. 処理水より 補給用 補給用

充電器内のAC系統部と高電圧部を共通設計,車両とのイ

Abstract: This study analyzed the topography of an experimental basin in the Tama campus of Kokushikan University, which is located next to Tama New Town in Tokyo, by expressing

RPV 代替温度計は N-10 ノズル内、 RPV 外側壁面より 5cm 程度内 側に設置→既設 RPV 底部温度計と同様に、 RPV

1号機原子炉建屋への入力地震動は,「福島第一原子力発電所  『発電用原子炉施設に関す る耐震設計審査指針』の改訂に伴う耐震安全性評価結果  中間報告書」(原管発官19第60 3号  平成