情報処理・演習II --

情報処理・演習II
--- 第2回: 構造体 --情報科学科
井口幸洋
[email protected]
2015/9/30
情報処理・演習II
1
構造体の使用目的(意義)
• いくつかのデータのまとまり
• まとまっていることで一つの意味をなす
• これらをかたまりのまま取り扱えれば便利
– 例1. 複素数: 実数部と虚数部
– 例2. 座標: X座標とY座標
– 例3. 個人データ: 番号, 名前, 年齢, 性別, 年
収, etc.
2015/9/30
情報処理・演習II
2
構造体の宣言と使い方
• struct {
int a, b;
double c;
} x,y;
左の書き方は実は
あまり使わない.
メンバー
x
x.a
x.b
x.c
y
y.a
y.b
y.c
2015/9/30
情報処理・演習II
3
複素数の表現例
ー構造体を使わないときー
• 複素数 x: xの実数部 xr
xの虚数部 xi
• 複素数 y: yの実数部 yr
yの虚数部 yi
• double xr, xi, yr, yi;
複素数の代入という
• x にy を代入
論理的な意味合いが
xr = yr;
明示的に表現されて
xi = yi;
いない!
2015/9/30
情報処理・演習II
4
複素数の表現
ー構造体を用いた場合ー
struct complex {
double re, im;
};
struct complex x, y;
y.re = 1.5; y.im = 3.0;
x = y;
2015/9/30
左のような書き方が多い.
3ページの書き方と比較
すること.
代入をまとめて
簡単に記述可能
情報処理・演習II
5
型の組合せ
• 型の異なるデータを一つにまとめられる
– 配列は同じ型のデータを複数まとめられる.
構造体とはここが違う!
• 異なる型を組合わせた例
– クラスの人数と各学生の点数
struct class_score{
int count;
int points[100];
};
2015/9/30
情報処理・演習II
6
型の組合せ(つづき)
• クラス1、クラス2の人数と生徒の点数を扱いたい
struct class_score class1,class2;
scanf(“%d”,&x);
class1.points[class1.count]= x;
class1.count = class1.count + 1;
2015/9/30
情報処理・演習II
7
構造体を要素とする配列
• 複素数データ100個を格納する配列
struct complex a[100];
a[i].re = a[i+1].re;
a[i].im = -a[i+1].im;
2015/9/30
情報処理・演習II
8
複素数のデータ読み込み
struct complex read_complex(void)
{
struct complex z;
printf(“Input a complex number: “);
scanf(“%lf”,&z.re);
scanf(“%lf”,&z.im);
return(z);
返り値がstruct complex型である
}
ことに注意!
2015/9/30
情報処理・演習II
9
複素数のデータ印刷
void print_complex(struct complex x)
{
printf(“(%0.lf, %0.lf“, x.re, x.im);
}
引数がstruct complex型である
ことに注意!
2015/9/30
情報処理・演習II
10
複素数の乗算
struct complex multiply(struct complex x,
struct complex y)
{
struct complex z;
z.re = x.re * y.re – x.im * y.im;
z.im = x.re * y.im + x.im * y.re;
return(z);
}
2015/9/30
情報処理・演習II
11
課題1ヒント:複素数の加算
struct complex add(struct complex x,
struct complex y)
{
struct complex z;
z.re =
;
z.im =
;
return(z);
}
2015/9/30
情報処理・演習II
12
何に注目するか?
• 関数の返り値はなにか?その型は?
• 関数の引数はなににするか?その型は?
• 関数の中身はどう計算するか?
2015/9/30
情報処理・演習II
13
課題2ヒント:身長と体重の比(1)
struct person{
double height, weight;
};
struct person a[MAX]; a[0] a[0].height a[0].weight
a[1] a[1].height a[1].weight
int n;
a[2] a[2].height a[2].weight
a[99]
2015/9/30
情報処理・演習II
a[99].height
a[99].weight
14
課題2ヒント:身長と体重の比(2)
n=0;
while(1){
printf(“Height:”); scanf(“%lf”,&h);
printf(“Weight:”); scanf(“%lf”,&w);
if(h==0.0 && w=0.0)
break;
a[n].height = h;
a[n].weight = w;
n++;
}
2015/9/30
情報処理・演習II
15
課題2ヒント:身長と体重の比(3)
max_person = 0;
max_ratio = a[0].weight /
a[0].height;
for(i=0; i<n; i++){
ratio = a[i].weight/a[i].height;
if(ratio > max_ratio){
max_person = i;
max_ratio = ratio;
}
2015/9/30
情報処理・演習II
16
課題3ヒント:整数の集合(1)
struct set{
int count; /* 集合の要素の個数 */
int elements[100]; /*要素を格納する配列 */
};
struct set a;
a.count = 3;
a.elements[0]
a.elements[1]
a.elements[2]
2015/9/30
と宣言し{2,3,5}を格納するのは
= 2;
= 3;
=5; とすればよい.
情報処理・演習II
17
課題3ヒント:整数の集合(2)
集合の読み込み
struct set read_set(void){
struct set z;
int el;
z.count = 0;
while(1){
printf(“Input an element:”);
scanf(“%d”,&el);
if(el == 0)
break;
z.elements[z.count]=el;
z.count++;
}
情報処理・演習II
} 2015/9/30
18
課題3ヒント:整数の集合(3)
積集合
struct set intersection(struct set x,
struct set y){
struct set z;
int i,j;
z.count = 0;
for(i=0; i<x.count; i++)
for(j=0; j<y.count; j++)
if(x.elements[i]==y.elements[j])
z.elements[z.count++]=x.elements[i]
return(z);
}
2015/9/30
情報処理・演習II
19
課題3追加問題:整数の集合(3)
直積を求めて印刷
void print_direct_product(struct set x,
struct set y){
int i,j;
for(i=0; i<x.count; i++)
for(j=0; j<y.count; j++)
printf(“(%d,%d)\n)”,x.elements[i],
y.elements[j]);
}
本当は集合の集合を求めたいところ。工夫すれば、
要素がまたstruct_set型であるような新しい型を定義
できる. ファイトのある人はチャレンジしてもよい.
2015/9/30
情報処理・演習II
20