Microsoft PowerPoint - lec10.ppt

Similar documents
Microsoft PowerPoint - kougi8.ppt

cp-7. 配列

Microsoft PowerPoint - kougi6.ppt

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

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

Microsoft PowerPoint - kougi9.ppt

Microsoft PowerPoint - kougi7.ppt

Microsoft Word - no15.docx

memo

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

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

PowerPoint Presentation

Microsoft PowerPoint - kougi11.ppt

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

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

Microsoft PowerPoint - lec4.ppt

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

PowerPoint プレゼンテーション

memo

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

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

gengo1-11

Microsoft Word - no12.doc

PowerPoint プレゼンテーション

Microsoft PowerPoint - 11.pptx

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

Microsoft Word - no11.docx

Microsoft Word - 3new.doc

Taro-ポインタ変数Ⅰ(公開版).j

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

char int float double の変数型はそれぞれ 文字あるいは小さな整数 整数 実数 より精度の高い ( 数値のより大きい より小さい ) 実数 を扱う時に用いる 備考 : 基本型の説明に示した 浮動小数点 とは数値を指数表現で表す方法である 例えば は指数表現で 3 書く

memo

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

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

プログラミング基礎

PowerPoint プレゼンテーション

情報処理演習 B8クラス

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

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

PowerPoint プレゼンテーション

02: 変数と標準入出力

Microsoft Word - no103.docx

PowerPoint プレゼンテーション

プログラミングI第10回

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

PowerPoint プレゼンテーション

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

演算増幅器

プログラミング基礎

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

演習課題No12

02: 変数と標準入出力

講習No.12

gengo1-2

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

C言語講座 後半

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

02: 変数と標準入出力

02: 変数と標準入出力

Microsoft Word - 第5回 基本データ構造2(連結リスト).doc

演算増幅器

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

Microsoft Word - no204.docx

Microsoft PowerPoint - prog04.ppt

プログラミング実習I

Prog1_15th

program7app.ppt

PowerPoint Template

CプログラミングI

Taro-スタック(公開版).jtd

02: 変数と標準入出力

kiso2-09.key

Prog1_6th

PowerPoint プレゼンテーション

第2回

02: 変数と標準入出力

JavaプログラミングⅠ

Microsoft Word - no202.docx

PowerPoint プレゼンテーション

Microsoft Word - no206.docx

6 関数 6-1 関数とは少し長いプログラムを作るようになると 同じ処理を何度も行う場面が出てくる そのたびに処 理を書いていたのでは明らかに無駄であるし プログラム全体の見通しも悪くなる そこで登場す るのが 関数 である 関数を使うことを 関数を呼び出す ともいう どのように使うのか 実際に見て

RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用

<4D F736F F D2091E63589F182628CBE8CEA8D758DC08E9197BF2E646F6378>

Microsoft PowerPoint - 6.pptx

基礎プログラミング2015

プログラミング実習I

Prog1_10th

講習No.9

memo

Prog1_6th

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

<4D F736F F D20438CBE8CEA8D758DC F0939A82C282AB2E646F63>

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

第2回講義:まとめ

02: 変数と標準入出力

Microsoft Word - no13.docx

memo

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

< F2D837C E95CF CF68A4A94C5816A2E6A>

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

Transcription:

今日の内容, とポインタの組み合わせ, 例題 1. 住所録例題 2. と関数とは. を扱う関数. 例題 3. のリスト とポインタの組み合わせ 今日の到達目標 自分で を定義する 自分で定義したについて, 配列やポインタを作成する データ型 基本データ型 char 文字 (1 文字 ) int 整数 double 浮動小数など その他のデータ型配列 データの並び ( 文字列も, 文字の並び ) ポインタ メモリアドレス いくつかのデータを グループ化 したものなど

データの集まり とは? 住所氏名支店名口座番号 氏名年齢住所 実数部 虚数部 いくつかのデータを, グループ化して, 新しい型の名前を付けたもの 基本データ型 ( 整数, 浮動小数 ) などの組み合わせ 残高 銀行口座 住所録 複素数 例題 1. 住所録 住所録を表示するプログラムを作る #include <stdio.h> struct Person int age; Person の型宣言 住所録データを扱うために, の配列を使う 住所録は, 名前 ( サイズ20の文字の配列 ), 年齢, 住所 ( サイズ40の文字の配列 ) から構成する struct Person a[] = "Ken", 20, "NewYork", "Bill", 32, "HongKong", "Mike", 35, "Paris" int i; for ( i = 0; i < 3; i ++ ) printf( "name=%s, age=%d, address=%s n", a[i].name, a[i].age, a[i].address ); return 0; の配列 a の宣言と初期化 のメンバの読み出し

住所録 実行結果の例 プログラムとデータ メモリ name age address name=ken, age=20, address=newyork name=bill, age=32, address=hongkong name=mike, age=35, address=paris a[i].name a[i].age a[0] a[1] a[2] Ken Bill Mike 20 NewYork 32 HongKong 35 Paris a[i].address の配列から の値の読み出し の型宣言 は, いくつかのデータをグループ化したもの. には, 名前がある それぞれのデータ ( メンバという ) は, 名前と型 ( データの種類のこと ) がある. メンバの読み書き name age address a[0] Ken 20 NewYork a[1] Bill 32 HongKong a[2] Mike 35 Paris struct Person int age; 名前 メンバ 配列の中身を読み書きするときには, のメンバを書く例 ) a[i].name これがメンバ

の使い方 #include <stdio.h> struct Person 1ここで Person を宣言 int age; ( の宣言 ) struct Person a[] = "Ken", 20, "NewYork", "Bill", 32, "HongKong", "Mike", 35, "Paris" int i; for ( i = 0; i < 3; i ++ ) printf( "name=%s, age=%d, address=%s n", a[i].name, a[i].age, a[i].address ); return 0; 2 ここで Person を使って の配列 a を宣言 ( 変数の宣言 ) 3 ここで a を使う 例題 2. と関数 3 人分の住所録を読み込んで, の配列に 格納した後に, 表示するプログラムを作る 住所録データを扱うために, の配列を使う 住所録は, 例題 1 と同じく, 名前 ( サイズ 20 の文字の配列 ), 年齢, 住所 ( サイズ 40 の文字の配列 ) から構成する ここでは, 練習のため,1 人分の住所録を読み込む関数,1 人分の住所録を表示する関数を作る. これら関数への引数として, のポインタを渡すこと. #include <stdio.h> struct Person int age; printf("name="); scanf("%s", a->name ); printf("age="); scanf("%d", &a->age ); printf("address="); scanf("%s", a->address ); Person の型宣言 のポインタ渡しに関係する printf( "name=%s, age=%d, address=%s n", a->name, a->age, a->address ); struct Person a[3]; int i; for ( i = 0; i < 3; i ++ ) read_person( &a[i] ); for ( i = 0; i < 3; i ++ ) print_person( &a[i] ); return 0; のポインタ渡しに関係する

と関数 実行結果の例 name=ken age=20 address=newyork name=bill age=32 address=hongkong name=mike age=35 address=paris name=ken, age=20, address=newyork name=bill, age=32, address=hongkong name=mike, age=35, address=paris main 関数 read_person( &a[i] ); print_person( &a[i] ); の流れ read_person 関数 戻り print_person 関数 戻り プログラム実行順 3 printf("name="); 4scanf("%s", a->name ); read_person 関数 5printf("age="); 6scanf("%d", &a->age ); 7printf("address="); 8scanf("%s", a->address ); 9 戻り 12 printf( "name=%s, age=%d, address=%s n", a->name, a->age, a->address ); 13 戻り struct Person a[3]; main 関数の先頭行 int i; 1for ( i = 0; i < 3; i ++ ) がプログラムの始まり read_person( &a[i] ); 2 10for ( i = 0; i < 3; i ++ ) main 関数 11 print_person( &a[i] ); 14return 0; print_person 関数 main 関数内の return がプログラムの終わり main 関数 read_person( &a[i] ); 1 メモリアドレスを, read_person 関数に渡す print_person( &a[i] ); 4 メモリアドレスを, print_person 関数に渡す データの流れ read_person 関数 型仮引数 型 2メモリアドレスを受け取って, a という名前で使う戻り 3main 関数には, 何も返さない print_person 関数 仮引数 5メモリアドレスを受け取って, a という名前で使う戻り 6main 関数には, 何も返さない

read_person でのデータの流れ name age a[0] Ken 20 NewYork a[1] Bill 32 HongKong a[2] Mike 35 Paris main 関数内で宣言された a main 関数 address read_person( &a[i] ); 1 メモリアドレスを, read_person 関数に渡す a メモリアドレス name age address a[0] Ken 20 NewYork a[1] Bill 32 HongKong a[2] Mike 35 Paris main 関数内で宣言された a と, 仮引数で宣言された a は別のもの read_person 関数 型仮引数 2メモリアドレスを受け取って, a という名前で使う戻り 3main 関数には, 何も返さない 関数へのの受け渡し 呼び出し側 & を付けて, メモリアドレスを, 関数に渡す例 ) read_person( &a[i] ); print_person( &a[i] ); 関数側 a[i] のメモリアドレス という意味 メモリアドレスを受け取ることを宣言しておく例 ) メモリアドレスを受け取って,a として使う という意味 配列とポインタ プログラム例 : read_person( &a[i] ); name age address a[0] Ken 20 NewYork i = 0 ならここ a[1] Bill 32 HongKong i = 1 ならここ a[2] Mike 35 Paris i = 2 ならここ 演算子 -> の意味 メモリアドレスから, メンバにアクセス 例 ) printf("name="); scanf("%s", a->name ); printf("age="); scanf("%d", &a->age ); printf("address="); scanf("%s", a->address ); ここでは, a に入っているのはメモリアドレス

scanf で a->age にだけ & をつける理由 scanf("%s", a->name ); scanf("%d", &a->age ); scanf("%s", a->address ); 文字列 a->name, a->address は, 文字の配列の先頭メモリアドレス という意味 (& は付けない ) 整数, 浮動小数 &a->age は, 整数データのメモリアドレス という意味 (& を忘れると, うまく動かない ) 課題 1. 住所録の条件検索 3 人分の住所録を読み込んで, の配列に格納した後に, 20 歳以上 のデータだけを選んで表示するプログラムを作りなさい ここでは, 20 歳以上のデータだけを表示する機能 を持った関数 (main 関数とは別の関数 ) を作ること 住所録データを扱うために, の配列を使うこと 住所録は, 例題 1 と同じく, 名前 ( サイズ 20 の文字の配列 ), 年齢, 住所 ( サイズ 40 の文字の配列 ) から構成する 確かに,20 歳以上のデータだけが表示されることを確認すること 課題 2. 日付 日付を扱うを設計し それを使ったプロ グラムを作成しなさい 日付データを扱うために, を使うこと 日付は, 年 ( 整数データ ), 月 ( 整数データ ), 日 ( 整数データ ) から構成する 日付を読み込んで,1 か月分のカレンダーを表示す るようなプログラムであること. 例 ) 日付が 2001 年 12 月 21 日 なら,2001 年 12 月の 1 か月分のカレンダーを表示する 例題 3. のリスト 住所録の読み込みと表示を行うプログラムを作る 住所録データを扱うために, のリストを使う 住所録は, 名前 ( サイズ20の文字の配列 ), 年齢, 住所 ( サイズ40の文字の配列 ) から構成する メニュー機能を作るために switch 文を使う

#include <stdio.h> #include <string.h> #include <malloc.h> struct Person int age; Person の型宣言 struct PersonNode struct Person person; PersonNode の型宣言 struct PersonNode* next; struct PersonList struct PersonNode* top; PersonList の型宣言 void insert_head( struct PersonList* a, char* name, int age, char* address ) struct PersonNode* x = new struct PersonNode(); strcpy(x->person.name, name); x->person.age = age; strcpy(x->person.address, address); x->next = a->top; a->top = x; void input_data( struct PersonList* a ) int age; printf("name="); scanf("%s", name ); printf("age="); scanf("%d", &age ); printf("address="); scanf("%s", address ); insert_head( a, name, age, address ); へのポインタ x の宣言と初期化 のメンバの読み出し printf( "name=%s, age=%d, address=%s n", a->name, a->age, a->address ); void print_data( struct PersonList* a ) PersonNode* current; if ( a->top == NULL ) current = a->top; do print_person( &(current->person) ); current = current->next; while( current!= NULL ); へのポインタ current の宣言 のメンバの読み出し のメンバの読み出し void menu() struct PersonList* a = new PersonList(); a->top = NULL; int command; while(1) printf("menu n"); printf("-------- n"); printf("1. input n"); printf("2. print n"); printf("9. exit n"); scanf("%d", &command ); if ( command == 9 ) switch( command ) case 1: input_data( a ); break; case 2: print_data( a ); break; default: printf("invalid command n"); へのポインタ a の宣言と初期化 switch 文については後述

menu(); return 0; menu -------- 1. input 実行結果の例 2. print 9. exit 1 name=ken age=20 address=newyork menu -------- 1. input 2. print 9. exit 1 name=bill age=32 address=hongkong menu -------- 1. input 2. print 9. exit 2 name=bill, age=32, address=hongkong name=ken, age=20, address=newyork リスト 何か を順に並べたもの 順序に意味がある ポインタを使ったリストの実現例 データデータデータデータ NULL データ部分 ポインタ部分 1 つの NULL で, リストの末端であることを表す struct Person int age; struct PersonNode struct Person person; struct PersonNode* next; struct PersonList struct PersonNode* top; リストの例 ポインタ Bill 32 HongKong ポインタ struct Person struct PersonNode struct PersonList Ken 20 NewYork NULL struct Person struct PersonNode

ポインタ リストの辿り 動的メモリ管理 Bill 32 HongKong ポインタ Ken 20 NewYork NULL プログラムの実行中に 必要に応じて メモ リを確保 メモリを解放 すること ループ 1 回目は,cuurent は, ここへのポインタ ループ 2 回目は,cuurent は, ここへのポインタ ( current->next が NULL なので, ループが終了する ) current = a->top; do print_person( &(current->person) ); current = current->next; while( current!= NULL ); new, delete を使用 リストと動的メモリ管理 ポインタ 挿入 ポインタ 新しいノード を作るには,new あるいは malloc を使う. 下記は new を使った例 void insert_head( struct PersonList* a, char* name, int age, char* address ) struct PersonNode* x = new struct PersonNode(); strcpy(x->person.name, name); x->person.age = age; strcpy(x->person.address, address); x->next = a->top; a->top = x; Bill 32 HongKongポインタ 5 の時点 Ken 20 NewYorkNULL Bill 32 HongKongポインタ 6 の時点 Ken 20 NewYorkNULL void insert_head( struct PersonList* a, char* name, int age, char* address ) 1 struct PersonNode* x = new struct PersonNode(); 2 strcpy(x->person.name, name); 3 x->person.age = age; 4 strcpy(x->person.address, address); 5 x->next = a->top; 6 a->top = x;

動的メモリ管理のメリット 必要な分だけのメモリを 好きなときに得られる 1. リスト は, 必要に応じて, 大きくなったり小さくなったりする 2. 配列は, あらかじめサイズが決まっていて, サイズを超えるデータは入らない 課題 3. 住所録 例題 3 のプログラムについて, 住所録の表示を関数の再帰呼び出しによって行うように書き換えなさい. 表示関数 1 番目の要素の表示 課題 3 のヒント 要素の表示 表示関数 2 番目の要素の表示 要素の表示 表示関数末尾の要素の表示 要素の表示