第11回 http://www.fit.ac.jp/~matsuki/lecture.html プログラミングⅡ 第11回 http://www.fit.ac.jp/~matsuki/lecture.html.

Slides:



Advertisements
Similar presentations
第 10 回 宿題 出題日: 12 月 14 日 締切日: 12 月 21 日. 提出について 以下の場合は、出題日の出席を欠席とする 締切日を過ぎた場合 正解率が 7 割未満の場合 提出は、 PDF ファイルを印刷して、それに答 えを書いて提出すること。
Advertisements

プログラミング入門2 芝浦工業大学情報工学科青木 義満 第11回構造体. プログラミング入門2 2 構造体 5 人分のサッカー選手データ 全てのデータを関数に渡して,処理する場合 char name[5][256]; int assist[5]; int score[5]; void func( char.
C 言語講座第 5 回 構造体. 構造体とは ... 異なる型の値をまとめて新しい型とする 機能がある . つまり , 複数の変数を 1 つのまとまりにできる . 配列と違って同じ型でデータをまとめるのではな く違った型のデータをまとめられる .
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第3回 配列(1) 情報・知能工学系 山本一公
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第5回 関数(1) 情報・知能工学系 山本一公
ポインタ プログラミング入門2 第10回 芝浦工業大学情報工学科 青木 義満
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
数理情報工学演習第一C プログラミング演習 (第3回 ) 2014/04/21
プログラミング入門2 第10回 動的な領域確保 情報工学科 篠埜 功.
第12回新しい型と構造体.
第13回構造体.
課題解説: 関数の引数にポインタを使って2数を入れ替える
データ構造とアルゴリズム 第10回 mallocとfree
第12回構造体.
プログラミング入門2 ポインタについて補足 構造体 第11回 芝浦工業大学情報工学科 青木 義満、篠埜 功
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
プログラミング演習Ⅱ 第12回 文字列とポインタ(1)
16.3 関数と構造体 構造体ポインタ 地底探査ゲーム
プログラミング演習(2組) 第12回
第13回 プログラミングⅡ 第13回
第8回 プログラミングⅡ 第8回
構造体.
プログラミング演習II 2004年12月 21日(第8回) 理学部数学科・木村巌.
配列の扱い、探索 有効範囲と記憶域期間 第12回 [7月10日、H.15(‘03)] 今日のメニュー 1 前回の課題の復習
第16章 構造体 16.1 構造体の定義と構造体変数 16.2 構造体の配列.
第16章 構造体 16.1 構造体の定義と構造体変数 16.2 構造体の配列.
演習問題の答え #include #include #define NUM 5 typedef struct { // 構造体の定義 float shincho; // 身長 float taiju; // 体重 } shintai; void hyouji(shintai.
第3回 配列,構造体,ポインタ ~ データ構造について学ぶための基礎~
構造体 プログラミング入門2 芝浦工業大学情報工学科 青木 義満
精密工学科プログラミング基礎Ⅱ 第3回資料 今回の授業で習得してほしいこと: 2次元配列の使い方 (前回の1次元配列の復習もします.)
構造体 構造体, 構造体とポインタの組み合わせ,.
プログラミング 3 構造体(1).
第10回 プログラミングⅡ 第10回
第16章 構造体 16.1 構造体の定義と構造体変数 16.2 構造体の配列.
プログラミング2 関数
第11回 宿題 出題日:12月21日 締切日:1月7日(木).
精密工学科プログラミング基礎 第10回資料 (12/18実施)
プログラミング 4 記憶の割り付け.
2005年度 データ構造とアルゴリズム 第3回 「C言語の復習:再帰的データ構造」
第10章 これはかなり大変な事項!! ~ポインタ~
プログラミング 3 構造体(2).
プログラミング入門2 第11回 情報工学科 篠埜 功.
プログラミング入門2 第11回 情報工学科 篠埜 功.
第7回 プログラミングⅡ 第7回
復習 前回の関数のまとめ(1) 関数はmain()関数または他の関数から呼び出されて実行される.
地域情報学 C言語プログラミング 第5回 ポインタ、関数、ファイル入出力 2017年11月17日
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
精密工学科プログラミング基礎Ⅱ 第4回資料 今回の授業で習得してほしいこと: 文字列の扱い ファイル入出力の方法 コマンドライン引数の使い方
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
メモリとメモリアドレス, ポインタ変数,関数へのポインタ渡し
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
精密工学科プログラミング基礎Ⅱ 第5回資料 今回の授業で習得してほしいこと: 構造体 (教科書 91 ページ)
構造体と共用体.
プログラミング 3 2 次元配列.
第13章 文字の取り扱い方 13.1 文字と文字型変数 13.2 文字列 13.3 文字型配列への文字列の代入
情報基礎演習B 後半第2回 担当 岩村 TA 谷本君.
ネットワーク・プログラミング Cプログラミングの基礎.
第5回 プログラミングⅡ 第5回
プログラミング論 構造体
プログラミング 4 文字列.
プログラミング演習II 2003年11月19日(第6回) 木村巌.
プログラミング演習II 2003年12月10日(第7回) 木村巌.
プログラミング演習II 2004年11月 2日(第3回) 理学部数学科・木村巌.
プログラミング入門2 第5回 配列 変数宣言、初期化について
情報処理Ⅱ 小テスト 2005年2月1日(火).
C言語講座第5回 2017 構造体.
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
高度プログラミング演習 (10).
Presentation transcript:

第11回 http://www.fit.ac.jp/~matsuki/lecture.html プログラミングⅡ 第11回 http://www.fit.ac.jp/~matsuki/lecture.html

連絡 小テスト 授業開始直後と終了直前に小テストを2行います 授業開始直後テスト(復習テスト)⇒前回の復習 授業終了直前テスト(本テスト)⇒その日の内容の復習 本テストの成績(正答率)が50%以下の場合は、宿題を出します(レポートとは別)。 宿題を決められた期日までに提出しない場合は、欠席扱いにします

宿題の提出について 以下の場合は、出題日の出席を欠席とする 締切日を過ぎた場合 正解率が7割未満の場合 提出は、PDFファイルを印刷して、それに答えを書いて提出すること。

プログラミングに関する質問時間 月曜日と金曜日の12:00から13:00までは, CAE室で,プログラミングに関する質問を受け付けています. 遠慮なく相談に来てください.

今日の内容 構造体のサイズ 構造体とポインタ 構造体と配列 関数と構造体 引数に渡す 構造体へのポインタを引数として渡す

構造体のサイズ char型 ・・・ 1バイト int型 ・・・ 4バイト double型 ・・・ 8バイト Car型・・・ ?バイト typedef struct { int num; double gas; char name[20]; }Car; 4バイト×1個 8バイト×1個 1バイト×20個 32バイト (4+8+20) 書込め printf(“%dバイト\n”, sizeof(Car) ) 書込め

構造体のサイズ 名前、電話番号、年齢の構造体を以下のように定義した。 Info型・・・ ?バイト typedef struct { char name[20]; char tel[20]; int age; }Info; 1バイト×20個 1バイト×20個 4バイト×1個 44バイト (20+20+4) 書込め printf(“%dバイト\n”, sizeof(Info) ) 書込め

構造体とポインタ 変数と同じように、構造体へのポインタを考える typedef struct { char name[20]; friend typedef struct { char name[20]; char tel[16]; int age; }Info; Info friend = {“松木”, “090-1234-5678”, 20}; Info *p; 松木 090-1234-5678 20 p アドレス専門 ?????? 書込め ポインタ変数

構造体とポインタ typedef struct { char name[20]; char tel[16]; int age; }Info; friend typedef struct { char name[20]; char tel[16]; int age; }Info; Info friend = {“松木”, “090-1234-5678”, 20}; Info *p; p = &friend; 松木 090-1234-5678 20 p アドレス専門 0012FE30 ???????? friendのアドレスをpに代入 書込め

ポインタを使った構造体メンバの参照 構造体変数のメンバをポインタで参照するには、 「->」(マイナス「-」と不等号記号「>」)を使う 構造体変数のメンバをポインタで参照するには、 「->」(マイナス「-」と不等号記号「>」)を使う アロー演算子という 書込め printf(“名前は%s\n”, p->name); printf(“電話番号は%s\n”, p->tel); printf(“年齢は%d\n”, p->age); 書込め 書込め ポインタ名 メンバ名

pはポインタなので、アロー演算子でメンバを参照 #include <stdio.h> #include <string.h> /*構造体型のCarの宣言*/ typedef struct { char name[20]; char tel[16]; int age; }Info; main() { Info friend; Info *p; p = &friend; strcpy(p->name, “松木”); strcpy(p->tel, “090-1345-9696”); p->age = 30; printf(“名前: %s\n”, p->name); printf(“電話番号: %s\n”, p->tel); printf(“年齢: %d\n”, p->age); } 構造体へのポインタを定義 書込め friendのアドレスをpに代入 (pはfriendを指すことになる) 書込め 書込め pはポインタなので、アロー演算子でメンバを参照 書込め

構造体と配列 通常の変数と同じように、構造体の変数を考えることが可能 氏名、電話番号、年齢の構造体の場合、 松木 090-1257-9696 30 田中 090-8579-4545 24 ・・・・・・ person[0] person[1]

構造体配列の定義 typedef struct { char name[20]; char tel[16]; int age; }Info; Info person[5]; 構造体型の定義 書込め 構造体配列の定義

構造体配列の参照 typedef struct { char name[20]; char tel[16]; int age; }Info; Info person[5]; person[1].age = 20; 要素番号1番の配列のageに20を代入 書込め

書込め Infoという名前の構造体型を定義 strcpy(person[0].name, “松木”); #include <stdio.h> #include <string.h> /*構造体型のCarの宣言*/ typedef struct { char name[20]; char tel[16]; int age; }Info; main() { Info person[5]; int i; strcpy(person[0].name, “松木”); strcpy(person[0].tel, “090-1345-9696”); person[0].age = 30; strcpy(person[1].name, “田中”); strcpy(person[1].tel, “090-8579-4545”); person[1].age = 24; for (i = 0; i < 2; i++) { printf(“名前: %s\n”, person[ i ].name); printf(“電話番号: %s\n”, person[ i ].tel); printf(“年齢: %d\n”, person[ i ].age); } Infoという名前の構造体型を定義 構造体配列を定義 書込め for文を使ってまとめて表示 書込め

構造体配列の初期化 構造体型の定義 構造体配列の宣言と 書込め 初期化 typedef struct { char name[20]; char tel[16]; int age; }Info; Info person[5] = { {“松木”, “090-1234-9696”, 37}, {“田中”, “080-8579-5656”, 28}, : {“鈴木”, “050-5879-2626”, 18} }; 構造体型の定義 構造体配列の宣言と 初期化 書込め

アロー演算子(->)を使ってもOK 書込め Info person[3] = { {“松木”, “090-1234-5678”,20}, {“田中”, “080-3147-9696”,37}, {“鈴木”, “050-8765-5891”,18} }; Info *p; for (p=person; p != person+3; p++) { printf(“名前は%s\n”, p->name); printf(“電話番号は%s\n”, p->tel); printf(“年齢は%d\n”, p->age); } 書込め 書込め

構造体の関数への受け渡し

引数として構造体を使う 構造体型の変数も、関数の引数として利用することが可能。 名前、電話番号、年齢を表示する関数showを作ってみましょう。

show関数にfriendを渡して呼び出す #include <stdio.h> #include <string.h> /*構造体型のInfoの宣言*/ typedef struct { char name[20]; char tel[16]; int age; }Info; /*show関数のプロトタイプ宣言 */ void show( Info c ); main() { Info friend; strcpy(friend.name, “松木”); strcpy(friend.tel, “090-1345-9696”); friend.age = 30; show(friend); } 構造体型 Infoを定義 書込め 構造体変数 friendを定義 show関数にfriendを渡して呼び出す 書込め 次ページにつづく

printf(“名前は%s\n”, c.name); printf(“電話番号は%s\n”, c.tel); void show( Info c ) { printf(“名前は%s\n”, c.name); printf(“電話番号は%s\n”, c.tel); printf(“年齢は%d\n”, c.age); } 書込め 書込め 仮引数Cのメンバを参照 書込め main関数 show関数 friend c メンバはすべてコピーされる     ・name     ・tel     ・age 書込め

構造体へのポインタを引数に使う 構造体は、データサイズが大きい。 データすべてを関数にコピーすると処理が遅くなる。 ポインタ(アドレス)のみを渡せば、処理速度が向上する。 書込め 書込め

show関数にfriendのアドレスを渡す #include <stdio.h> #include <string.h> /*構造体型のInfoの宣言*/ typedef struct { char name[20]; char tel[16]; int age; }Info; /*show関数のプロトタイプ宣言 */ void show( Info *pc ); main() { Info friend; strcpy(friend.name, “松木”); strcpy(friend.tel, “090-1345-9696”); friend.age = 30; show(&friend); } 構造体へのポインタを受け取る 書込め 構造体変数 friendを定義 show関数にfriendのアドレスを渡す 書込め 次ページにつづく

構造体へのポインタpcという仮引数で受け取る void show( Info *pc ) { printf(“名前は%s\n”, pc->name); printf(“電話番号は%s\n”, pc->tel); printf(“年齢は%d\n”, pc->age); } 書込め 書込め pcはポインタなので、 アロー演算子でメンバを参照 main関数 show関数 friendのアドレス pcにアドレスが渡される メンバはコピーされない もし、pc->age += 3とすれば、friendのageも3増えることになる 書込め

構造体に値を入力する関数を作る 構造体へのポインタを引数に受け取って、その構造体に値を入力させる関数Inputを作る void Input( Info *p )

構造体へのポインタpという仮引数で受け取る 関数showは値を変更しないので、ポインタで受け取る必要がない void Input( Info *p ) { printf(“名前を入力してください:”); scanf(“%s”, p->name); printf(“電話番号を入力してください:”); scanf(“%s”, p->tel); printf(“年齢を入力してください”); scanf(“%d”, &p->age); } void show( Info c ) printf(“名前は%s\n”, c.name); printf(“電話番号は%s\n”, c.tel); printf(“年齢は%d\n”, c.age); 構造体へのポインタpという仮引数で受け取る 書込め 書込め 書込め 関数showは値を変更しないので、ポインタで受け取る必要がない 書込め

Input( &(person[1]) ); show(my_friend); show( person[1] ); 構造体変数を定義 #include <stdio.h> #include <string.h> /*構造体型のInfoの宣言*/ typedef struct { char name[20]; char tel[16]; int age; }Info; /*関数のプロトタイプ宣言 */ void show( Info c ); void Input( Info *pc ); main() { Info my_friend; Info person[3]; Input( &my_friend ); Input( &(person[1]) ); show(my_friend); show( person[1] ); } 構造体変数を定義 Input( person + 1 ) でも同じ 書込め 書込め 書込め