Structures, Unions, Enumerations, and Type
Definitions
(構造体 (struct)、共用体
(union)、列挙型 (enum)、typedef)
Computing Practice I
6th lecture, May 19, 2016
http://www.sw.it.aoyama.ac.jp/2016/CP1/lecture6.html
Martin J. Dürst
© 2005-16 Martin
J. Dürst 青山学院大学
Today's Schedule
- Minitest
- About last week's exercises
- Structures (
struct
)
- Type declarations (
typedef
)
- Unions (
union
)
- Enumeration types (
enum
)
- About today's exercises
ミニテスト
- 授業開始までにログイン済み
- 授業開始まで教科書、資料、筆箱、財布などを鞄に入れ、鞄を椅子の下に
- テスト終了後その場で待つ
不正行為について
C 言語の応用: gcc
- GNU Compiler Collection, formerly the
GNU C Compiler
- 最初の公開は 1987 年
- C, C++, Objective-C, Fortran, Java, Ada, Go
等のプログラム言語に対応
- 出力は Intel x86 や ARM を含め 30以上の機械
- 本体約 175万行、テスト約 55万行
- バージョン 4.8 以降で C++ を採用
前回の演習結果
|
05A1 |
05B1 |
05B2 |
05B3 |
05C1 |
05C2 |
100点 |
79 |
47 |
54 |
36 |
9 |
2 |
60点 |
9 |
41 |
34 |
52 |
59 |
61 |
エラー |
- |
- |
- |
- |
12 |
14 |
未提出 |
1 |
1 |
1 |
1 |
9 |
12 |
前回の演習問題について
- 発展問題はともかく、そうでない問題は必ず提出
(これからも使う内容の演習)
- 予習が非常に大事
- Q&A フォーラムはもっと活用
前回の演習: 05C1
- 短い関数が多い
- 関数の名前は長くて分かりやすい
- 関数のおかげで「何を」と「どうやって」を分離
- 大学・学生関連の関数と再利用可能な関数は区別
- 学科の判断を
switch
(プログラム)
からテーブル (データ) に変更
前回の演習: 05C2
main
関数は超簡単
- 再帰関数は
- 一行入力 (入力が終了の時、そのまま
return
)
- 再帰的呼び出し
- 入力した一行を出力
- バッファは関数内のため、呼び出しごとに別途に用意
- 行の逆順の出力は再帰呼び出しのパターンによって実現
自覚: 分かることと分からないこと
本授業について、一番分かることと一番分からないことそれぞれ三つ列挙しなさい。
Importance of Data
- Lifetime:
- Hardware: 3-5 years
- Software: about 10 years
- Data: more than 30 years (examples: graduation certificate, social
security)
- In information technology, the design of data structures is more
important than the design of functions
Main Data Types in C
Basic Types
- Integers/characters (
char
, short
,
int
, long
)
- Floating point numbers (
float
, double
)
Derived Types
- Arrays, functions
- Structures (
struct
), unions (union
),
enumeration types (enum
)
- Pointers
Simple Example of a Structure (struct
)
typedef struct { // declaration of type Person
char name[40];
double height; /* m */
int weight; /* kg */
} Person;
Person student = { "Taro Aoyama", 1.70, 70 }; // definition and initialization
double bmi = student.weight / // use
(student.height * student.height);
構造体
(structure)
- 複数のデータの組み合わせ (並び) のデータ型
- 構造体の「部品」はメンバ (member)
- 一つの変数で使用可能:
- 変数の宣言と定義、初期化
- 代入
- 関数の引数と戻り値
- メンバ毎にしかできない操作: 演算、入出力
- 関数は機能を抽象化、構造体はデータ型を抽象化
[オブジェクト指向はこの二つを結びつく]
新型の宣言: typedef
(教科書 pp. 272-273 参照)
typedef
は struct
以外でも使用可能
- 型の命名
- プログラムが鮮明
- 型と変数の名前を区別するための決まりが可読性を向上
(例: 変数名: 小文字; 型名: 頭文字が大文字)
typedef
の作成方法と使用方法
例: 4×4 の行列
(三次元グラフィックス、ゲーム等で多用)
- 変数の定義: 宣言したい型の変数を定義
例: double a[4][4];
- 型名に置換: その変数名を型名に変更
例: double Matrix[4][4];
typedef
の完成: 定義全体に typedef
を前置
例: typedef double Matrix[4][4];
typedef
の使用: 既存の型名と同様
例: Matrix a;
参考: 構造体の宣言の種類
- 歴史的な原型 (構造体タグ使用)
struct Person
{...};
(本授業で ×)
- 構造体タグを使った定義の後に
typedef
struct Person
{...};
typedef struct Person
Person;
(本授業で ×)
(構造体タグと
typedef
による型名は同一でも別でもよい)
- 構造体タグと typedef
の組合せ
typedef struct Person
{...} Person;
(本授業で ×)
- 構造体タグの省略
(推奨)
typedef struct {...} Person;
(本授業で ◎)
参考: 使用可能な定義:
Person p1;
(前スライドの (2), (3), (4))
struct Person
p1;
(前スライドの (1), (2), (3))
- C の初期からの残り物
- 再帰的データ構造以外では不要
Structures and Functions
double bmi (Person p)
{
return p.weight
/ (p.height * p.height);
}
- Structures can be used both as arguments and as return values
- Pass by value is used in both cases (similar to
int
)
Example of Structures as Arguments and Return Values
Complex add(Complex a, Complex b)
{
Complex result;
/* calculate the real/immaginary parts of result
from the real/immaginary parts of a and b */
return result;
}
Unions (union
)
- Declaration syntax is the same as for
struct
, but
struct
s reserve separate memory for each member
union
s superimpose members
→ only one member can be used at one time
- Applications:
- Memory savings
- Low-level data conversion
- Simulation of object-orientation
Enumeration Types (enum
)
- Used to distinguish a small number of things
Examples: Moves in rock, paper, scissors; colleges/departments; types of
bank accounts,...
- Making program easier to understand by using names (instead of
numbers)
- In C,
enum
s are implemented as integers
(int
)
- Similar concepts available in many other language
(Ruby: Symbol
, Lisp: Atom,...)
Example of Enumeration Type
Make 03C2 and 03C3 (rock,
paper, scissors) easier to read:
typedef enum
{ Rock, Scissors, Paper } Janken;
Janken moveA, moveB;
...
if (moveA == Paper)
pointA += 5;
演習についての補助
演習問題の概要
- 06A1: 日付のための構造体
- 06A2: 二つの点の間の距離
- 06B1: 複素数の足し算
- 06C1: 成績表
- 06C2: 複素数の関数による計算 (重要:
来週・再来週に再利用)
- 06C3 (発展問題、月曜締切): 趣味の数のグラフ
入出力の詳細に注意
次回までの準備
- 残りの演習問題を宿題として完成、提出
- 分からないことについてしっかり復習
- 来週の総合復習テスト (紙、約 30 分) の準備
Glossary
- structure
- 構造体
- union
- 共用体
- enumeration type
- 列挙型
- lifetime
- 寿命
- graduation certificate
- 卒業証明証
- social security
- 社会保障
- basic type
- 基本型、基本的なデータ型
- derived type
- 派生型
- floating point numbers
- 浮動小数点数
- pointer
- ポインタ
- pass by value
- 値渡し
- complex number
- 複素数
- real part
- 実部
- immaginary part
- 虚部
- superimpose
- 重ねる
- data conversion
- データ変換
- object-orient(ed/ation)
- オブジェクト指向