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

Slides:



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

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

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

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

16.1 構造体の定義 point タグ名 メンバーの宣言 struct point { double x; double y; }; 16.1 構造体の定義 タグ名 メンバーの宣言 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つ用意 各構造体の中のメンバーに それぞれ異なる値を代入 中身を取り出して加工

正誤表(改訂前の教科書用) 教科書 pp.152〜153 の説明に間違った表現があるので注意 訂正のサイト http://www.info.kindai.ac.jp/C-Book/Correction.html p.152, 下から3行目 誤: 構造体中の各変数 p1, p2 は,メンバー(member)と呼ばれ… 正: 構造体中の各変数 x, y は,メンバー(member)と呼ばれ… 誤: メンバー変数 正: メンバー p.153, 1行目から2行目まで 誤: …のようにタグとメンバー変数名とで指定する.タグとメンバー変数名の間にはメンバー演算子(member operator)(.) を付ける.他の演算子 と違って,タグ,メンバー演算子,変数の間には… 正: …のように構造体変数名 (structure variable name) とメンバーとで指定する.構造体変数名とメンバーの間にはメンバー演算子 (member operator)(.)を付ける.他の演算子と違って,構造体変数名,メンバー演算子,メンバーの間には…

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 という名前のブランドタグをつけよう」           という感じ セミコロンを 忘れないこと! ユーザーが定義したオリジナルの型 =独自ブランドとして登録

構造体変数 student の宣言と初期値代入 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 というタグのついた構造体で、初期値は{ … }」という意味 構造体変数 student の宣言と初期値代入 平均点計算

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;