第16章 構造体 16.1 構造体の定義と構造体変数 16.2 構造体の配列.

Slides:



Advertisements
Similar presentations
構造体 構造体とは? 複数のデータをパックしたもの。 新しい “ 型 “ として使用できる. 構造体 キーワード struct strcut は構造体を宣言する命令。 struct { double x,y; }a,b,c; ↑ ここまでが宣 言 ← この形式で、構造体 a,b,c, を定 義.
Advertisements

プログラミング入門2 芝浦工業大学情報工学科青木 義満 第11回構造体. プログラミング入門2 2 構造体 5 人分のサッカー選手データ 全てのデータを関数に渡して,処理する場合 char name[5][256]; int assist[5]; int score[5]; void func( char.
C 言語講座第 5 回 構造体. 構造体とは ... 異なる型の値をまとめて新しい型とする 機能がある . つまり , 複数の変数を 1 つのまとまりにできる . 配列と違って同じ型でデータをまとめるのではな く違った型のデータをまとめられる .
理化学研究所 第 10 回 構造体 半田利弘 鹿児島大学 大学院理工学研究科 物理・宇宙専攻 鹿児島大学 プログラミング基礎演習.
構造体変数 1234 x xyz A 普通の変数 ( ここでは座標値 ) 構造体変数 ( ここでは点を表す ) xyz B 14 y 5 z 点 A の x 座標 プログラム中では A.x 点 B の y 座標 プログラム中では B.y 例えば 「 3 次元空間で2点 A と B の 間に線分を引き・・・」
配列の宣言 配列要素の初期値 配列の上限 メモリ領域 多次元配列 配列の応用
次ページに関数の解答例 課題12-1 (問題と解答) 複素数xとして, 実部を入力してください.10 虚部を入力してください.20
A B x y z 復習 構造体変数 普通の変数 x y z 構造体変数 x y z 箱のイメージ 引き出しのイメージ
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
関数(1) 第11回 [6月29日、H.16(‘04)] 今日のメニュー 1 前回の課題 2 前回の宿題 3 いろいろな関数の演習 4 課題
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
数理情報工学演習第一C プログラミング演習 (第3回 ) 2014/04/21
プログラミング入門2 第10回 動的な領域確保 情報工学科 篠埜 功.
第2章 数値の入力と変数 scanfと変数をやります.
第12回新しい型と構造体.
第13回構造体.
課題解説: 関数の引数にポインタを使って2数を入れ替える
解答 1 複素数を構造体として定義し、二つの複素数の積(結果は複素数)を返す 関数 を定義せよ。
第12回構造体.
プログラミング入門2 ポインタについて補足 構造体 第11回 芝浦工業大学情報工学科 青木 義満、篠埜 功
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
16.3 関数と構造体 構造体ポインタ 地底探査ゲーム
情報科学1(G1) 2016年度.
第6章 2重ループ&配列 2重ループと配列をやります.
構造体.
プログラミング演習II 2004年12月 21日(第8回) 理学部数学科・木村巌.
16.3 関数と構造体 ■ 乱数の発生 ■ 制御コード ■ 列挙型 ■ system関数
第16章 構造体 16.1 構造体の定義と構造体変数 16.2 構造体の配列.
第16章 構造体 16.1 構造体の定義と構造体変数 16.2 構造体の配列.
第3回 配列,構造体,ポインタ ~ データ構造について学ぶための基礎~
構造体 プログラミング入門2 芝浦工業大学情報工学科 青木 義満
プログラミング 3 構造体(1).
第10回 プログラミングⅡ 第10回
関数とポインタ 値呼び出しと参照呼び出し swapのいろいろ 関数引数 数値積分
16.3 関数と構造体 ■ 乱数の発生 ■ 制御コード ■ 列挙型 ■ system関数
関数と配列とポインタ 1次元配列 2次元配列 配列を使って結果を返す 演習問題
第11回 宿題 出題日:12月21日 締切日:1月7日(木).
プログラミング 4 記憶の割り付け.
2005年度 データ構造とアルゴリズム 第3回 「C言語の復習:再帰的データ構造」
プログラミング入門2 第8回 ポインタ 情報工学科 篠埜 功.
プログラミング入門2 第11回 情報工学科 篠埜 功.
前回の練習問題.
同じ構造をした「引き出し」変数を構造体変数と呼ぶ
プログラミング入門2 第11回 情報工学科 篠埜 功.
第7回 プログラミングⅡ 第7回
16.3 関数と構造体 ■ 乱数の発生 ■ 制御コード ■ 列挙型 ■ system関数
第11回 プログラミングⅡ 第11回
関数の再帰呼び出しとは ハノイの塔 リダイレクト レポート課題
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
第14章 ファイル操作 14.1 ファイルへの書き込み 14.2 ファイルからの読み込み 14.3 ファイルへの追加書き込み
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
配列変数とポインタ 静的確保と動的確保 ポインタ配列 2次元配列 時間計測 第1回レポートの課題
第14章 ファイル操作 14.1 ファイルへの書き込み 14.2 ファイルからの読み込み 14.3 ファイルへの追加書き込み
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
プログラミング入門2 第9回 ポインタ 情報工学科 篠埜 功.
プログラミング序論演習.
11.1 標準ライブラリ関数 11.2 関数呼び出しのオーバーヘッド 11.3 大域変数 11.4 プロトタイプ宣言 11.5 関数引数
プログラミング論 構造体
2005年度 データ構造とアルゴリズム 第2回 「C言語の復習:配列」
モバイルプログラミング第2回 C言語の基礎 (1).
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
プログラミング演習II 2003年12月10日(第7回) 木村巌.
プログラミング入門2 第5回 配列 変数宣言、初期化について
第14章 ファイル操作 14.1 ファイルへの書き込み 14.2 ファイルからの読み込み 14.3 ファイルへの追加書き込み
第2章 数値の入力と変数 scanfと変数をやります.
C言語講座第5回 2017 構造体.
第1章 文字の表示と計算 printfと演算子をやります 第1章 文字の表示と計算.
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
Presentation transcript:

第16章 構造体 16.1 構造体の定義と構造体変数 16.2 構造体の配列

今日のポイント 構造体の定義と宣言のしかた タグとは何か、メンバーとは何か 構造体変数の宣言と理解 メンバーの理解と使い方 構造体配列とその使い方

16.1 構造体の定義 point Structures タグ名 メンバーの宣言 struct point { double x; 16.1 構造体の定義 Structures タグ名 メンバーの宣言 struct point { double x; double y; }; 左の表記で構造体の構成を決めている. この例では、2つのdouble型をパックした詰め合わせセットを定義した. 「2つのdouble型から成る構造体に point という名前のブランドタグをつけよう」    …という感じ セミコロンを 忘れないこと! x 座標 y 座標 point 構造体=ユーザーが定義した(複合的な)オリジナルの型 =詰め合わせセットを独自ブランドとして登録したもの

point というタグがついた構造体を2つ用意 16.1 構造体の定義と構造体変数 プログラム例 16.1.1 2点の中点の座標を求めるプログラム #include <stdio.h> struct point { double x; double y; }; int main(void) { struct point p1, p2; double xm, ym; p1.x = 3.8; p1.y = 5.6; p2.x = 8.4; p2.y = 18.2; xm = (p1.x + p2.x) / 2.; ym = (p1.y + p2.y) / 2.; printf("(%.2f, %.2f)と(%.2f,%.2f)の中点の座標は(%.2f, %.2f)\n", p1.x, p1.y, p2.x, p2.y, xm, ym); return 0; } 「point というタグがついた構造体は 2つの実数メンバーから構成される」という意味 point というタグがついた構造体を2つ用意 各構造体の中のメンバーに それぞれ異なる値を代入 メンバーの指定 にはメンバー 演算子(ピリオド) を使用 各メンバーを用いて加工

正誤表 p.152, 下から7行目 誤: typedef point float_float 正: typedef struct point float_float

16.1 構造体を新しい型として定義 プログラム例 16.1.1 改 2点の中点の座標を求めるプログラム 16.1 構造体を新しい型として定義 プログラム例 16.1.1 改 2点の中点の座標を求めるプログラム #include <stdio.h> struct point { double x; double y; }; typedef struct point double_double; int main(void) { double_double p1, p2; double xm, ym; p1.x = 3.8; p1.y = 5.6; p2.x = 8.4; p2.y = 18.2; xm = (p1.x + p2.x) / 2.; ym = (p1.y + p2.y) / 2.; printf("(%.2f, %.2f)と(%.2f,%.2f)の中点の座標は(%.2f, %.2f)\n", p1.x, p1.y, p2.x, p2.y, xm, ym); return 0; } ex16_1_1a.c タグを使わずに定義する方法 typedef struct { double x; double y; } double_double; struct point を新しい型 double_double として定義 p.152 の下から10行目~4行目

16.1 構造体の代入 構造体のメンバーの値を一括コピーするには代入演算子"="が使える p.154 の下から10行目~3行目 16.1 構造体の代入 p.154 の下から10行目~3行目 構造体のメンバーの値を一括コピーするには代入演算子"="が使える #include <stdio.h> struct point { double x; double y; }; int main(void) { struct point p1, p2; p1.x = 12.; p1.y = 18.; p2 = p1; printf("p1 = (%.2f, %.2f)\n", p1.x, p1.y); printf("p2 = (%.2f, %.2f)\n", p2.x, p2.y); return 0; } ex16_1_1b.c

16.1 構造体の定義 grade タグ名 メンバーの宣言 struct grade { char name[15]; 16.1 構造体の定義 タグ名 メンバーの宣言 struct grade { char name[15]; int subject1; int subject2; int subject3; double average; }; 左の表記で構造体の構成を決めている. この例では、文字列と3つの整数と1つの実数からなる詰め合わせセットを作った. 氏 名 科目1の点数 科目2の点数 科目3の点数 平均点 grade 「こういう構成から成る構造体にgrade という名前の ブランド タグをつけよう」 という感じ セミコロンを 忘れないこと! ユーザーが定義したオリジナルの型 =独自ブランドとして登録

16.1 構造体の定義と構造体変数 プログラム例 16.1.3 3科目の平均点を出力するプログラム 16.1 構造体の定義と構造体変数 プログラム例 16.1.3 3科目の平均点を出力するプログラム #include <stdio.h> struct grade { char name[15]; int subject1; int subject2; int subject3; double average; }; int main(void) { struct grade Smith = {"John Smith", 90, 80, 35, 0}; Smith.average = (Smith.subject1 + Smith.subject2 + Smith.subject3) / 3.; printf("name: %s¥n", Smith.name); printf("科目1: %d 科目2: %d 科目3: %d¥n", Smith.subject1, Smith.subject2, Smith.subject3); printf("平均: %f¥n", Smith.average); return 0; } 「grade というタグがついた構造体は、この 5つのメンバーから構成される」という意味 構造体宣言部 「Smith は grade というタグのついた構造体で、初期値は{ … }」という意味 構造体変数 Smith の宣言と初期値代入 平均点計算

16.1 構造体の定義と構造体変数 プログラム例 16.1.3 の一部 構造体変数名.メンバー 例: Smith.name 16.1 構造体の定義と構造体変数 プログラム例 16.1.3 の一部 int main(void) { struct grade Smith = {"John Smith", 90, 80, 35, 0}; Smith.average = (Smith.subject1 + Smith.subject2 + Smith.subject3) / 3.; printf("name: %s¥n", Smith.name); printf("科目1: %d 科目2: %d 科目3: %d¥n", Smith.subject1, Smith.subject2, Smith.subject3); printf("平均: %f¥n", Smith.average); return 0; } 平均点の計算 構造体の中のメンバーを指す時(アクセスする時)は 構造体変数名.メンバー 例: Smith.name ピリオド(メンバー演算子)

16.2 構造体の配列 世の中で扱われるデータの例: 成績データ 16.2 構造体の配列 世の中で扱われるデータの例: 成績データ 氏名と科目1、科目2、科目3の点数と平均点を1セットのデータとして扱いたい. → 「構造体」というデータ構造で表現 → データ全体は「構造体の配列」

16.2 構造体の配列 プログラム例 16.2.1 のサブセット 3人各々について3科目の 平均点を出力するプログラム 16.2 構造体の配列 3人各々について3科目の 平均点を出力するプログラム プログラム例 16.2.1 のサブセット #include <stdio.h> struct grade { char name[15]; int subject1; int subject2; int subject3; double average; }; int main(void) { struct grade student[] = {{"John Smith", 90, 70, 50, 0}, {"Ken Ohta", 65, 85, 75, 0}, {"Chen Bien", 77, 89, 97, 0}}; int i, ndata = 3; for (i = 0; i < ndata; i++) { student[i].average = (student[i].subject1 + student[i].subject2 + student[i].subject3) / 3.; printf("name: %s¥n", student[i].name); printf("科目1: %d 科目2: %d 科目3: %d¥n", student[i].subject1, student[i].subject2, student[i].subject3); printf("平均: %.2f¥n\n", student[i].average); } return 0; 各人の平均点計算と表示を for ループで3人分回す

スキルアップタイム1 以下の4名の成績データについて、* のセルを埋めるプログラムを作れ(プログラム例 16.2.1 のサブセット を参考にする).

スキルアップタイム1のヒント #include <stdio.h> struct grade { char name[15]; int subject1; int subject2; int subject3; ??? ????????; double average; }; int main(void) { struct grade student[] = {{"John Smith", 90, 70, 50, 74, 0}, ... {?????????????? ??? ??? ??? ??? ?}}; int i, ndata = ?; for (i = 0; i < ndata; i++) { student[i].average = (student[i].subject1 + student[i].subject2 + student[i].subject3 + ???????????????????) / ??; printf("name: %s¥n", student[i].name); printf("科目1: %d 科目2: %d 科目3: %d ?????? ??¥n", student[i].subject1, student[i].subject2, student[i].subject3, ???????????????????); printf("平均: %.2f¥n\n", student[i].average); } return 0;

スキルアップタイム2 以下の4名の成績データについて、* のセルを埋めるプログラムを作れ(プログラム例 16.2.1 (教科書)の後半を参考にする).

スキルアップタイム2のヒント #include <stdio.h> struct grade { ... }; int main(void) { struct grade student[] = {{"John Smith", 90, 70, 50, 74, 71.0}, {?????????????? ??? ??? ??? ??? ????}}; int i, ndata = ?; int total1, total2, total3, total4; double average1, average2, average3, average4; total1 = total2 = total3 = total4 = 0; for (i = 0; i < ndata; i++) { total1 += student[i].subject1; } average1 = (double)total1 / ndata; printf("各科目の平均点\n"); printf("科目1: %.2f 科目2: %.2f 科目3: %.2f ?????? ????¥n", average1, average2, average3, ????????); return 0;

スキルアップタイム3 スキルアップタイム2 までできた人は 演習問題16.1 を やってみよう. "Author", "Title", "Pub", 1999, "0-11-111111-1", 1000, 20010101 "著者", "書名", "出版社", 2007, "4-9999-9999-9", 20000, 20070707 "Kernighan", "C", "Prentice", 1988, "0-13-110362-8", 3000, 20040506 "カーニハン", "言語C", "共立", 1989, "4-320-02692-6", 2800, 20030303 "熊谷", "C言語", "近代科学", 2001, "4-7649-0289-3", 2200, 20070401

スキルアップタイム3のヒント #include <stdio.h> struct database { char author[80]; char title[80]; char publisher[80]; int year; char isbn[20]; int price; int date; }; int main(void) { struct database textbook[5] = {{"Author","Title","Pub", 1999,"0-11-111111-1", 1000, 20000101}, ... {"熊谷","C言語","近代科学", 2001,"4-7649-0289-3", 2200, 20070401}}; int i, ndata = ?, total = 0; for (i = 0; i < ndata; i++) { printf("著者: %s¥n", textbook[i].author); printf("署名: %s\n", textbook[i].title); printf("購入年月日: %d¥n\n", textbook[i].date); total += textbook[i].price; } printf("total = %d\n", total); return 0;

本日のパズル 次のプログラムは何を出力するか #include <stdio.h> #define PR(format,value) printf(#value"=%"#format" ",(value)) #define NL putchar('\n') int a[]={0,1,2,3,4}; int main(void) { int i, *p; for ( p= &a[0],i=1; i<=5; i++ ) PR(d,p[i]); NL; for ( p=a,i=0; p+i<=a+4; p++,i++ ) PR(d,*(p+i)); return 0; } 1 2