情報処理・演習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
© Copyright 2024 ExpyDoc