「まず覚えるCの文法」 (校正中) P53: 複素数の計算 //------------------------------------- #include <stdio.h> typedef struct{double r, i;} complex; complex x={2, 3}, y={4, 5}; int main(void){ complex z, *p; z.r=x.r+y.r; z.i=x.i+y.i; printf("z==(%f, %f)\n", z.r, z.i); p=&z; p->r=x.r*y.r-x.i*y.i; p->i=x.r*y.i+x.i*y.r; printf("*p==(%f, %f)\n", p->r, p->i); return 0; } //------------------------------------- P53A: 構造体の配列 //------------------------------------- #include <stdio.h> typedef struct{ int id; char name[10]; char mail[30]; } member; member igo[10]={ {1, "Aoki", "aoki@xxx.ne.jp"}, {2, "Itoh", "taro@yyy.jp"} }; int main(void){ member *p=igo; while(p->id!=0){ printf("%d, %s, %s\n", p->id, p->name, p->mail); p++; } return 0; } //------------------------------------- |
Cではデータの組を構造体としてまとめることができます. P53 のプログラムでは実数部,虚数部の組を複素数の構造体 としてまとめています. ・構造体の定義は「struct complex{double r, i;};」でいい のですが,「typedef」で定義しておかないと構造体を使う ときに「struct complex」と書かねばなりません[#52]. ・構造体 x の実数部を「x.r」,虚数部を「x.i」で参照しま す.また構造体へのポインタ p が参照する実数部,虚数部 は「p->r」「p->i」です. ・「.」「->」の演算子としての優先度は最高で「p->r=x.r* y.r-x.i*y.i;」は (p->r)=(x.r)*(y.r)-(x.i)*(y.i); を意味します(@37). ・「complex *p;」と宣言しただけでは p は使えません.P53 のプログラムの「p=&z;」を削除すると,コンパイル時には エラーになりませんが p が指すアドレスにデータを書き込 もうとします. 構造体は配列を考えることによって,使用価値が著しく向上し ます.P53A の「igo」は囲碁部員の名前とメールアドレスの対 応を記憶する配列で,例示した main() では使っていませんが, 常識的な構成に近づけるため「id」もメンバに加えています. (データベースの主キーに対応) ・「char name[10];」の代わりに「char *name;」を用いると igo.name[i] に記憶されるのは文字列へのアドレスです. igo の初期値をテキストファイルから読み込むのであれば 配列の方がいいでしょう. ・igo は大域変数ですから,初期化されなかった配列要素には 0 が設定されます.また, member igo[10]={ {1, "Aoki"}, {2, "Itoh", "taro@yyy.jp"} }; のように初期化すると igo[0].mail は空白になります.内 側の { } が煩わしければ,空白の代わりに "?" 等を用いて member igo[10]={ 1, "Aoki", "?", 2, "Itoh", "taro@yyy.jp" }; のようにします. |
最新の画像[もっと見る]
- g++による演習 (5) 10年前
- g++による演習(4) 10年前
- g++による演習 (3) 11年前
- g++による演習 (2) 11年前
- g++による演習 (1) 11年前
- 構造化チャート 11年前
- gccによる演習 (7) 11年前
- 離散コサイン変換 (5) 11年前
- L8プログラミング (0) 11年前
- 離散コサイン変換 (4) 11年前
BASIC→アセンブラ→必要に迫られてC
と流れて来ましたので(全部独学)、構造体は壁で、くじけてしまいました。C++なんて、ほんと、構造体そのもので、ごめんなさい、しました。
この章でお勉強します!