「まず覚える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"
};
のようにします.
|