ぼんさい塾

ぼんさいノートと補遺に関する素材や注釈です.ミスが多いので初稿から1週間を経た重要な修正のみ最終更新日を残しています.

Cの文法 (14)

2010-09-28 14:23:16 | 暮らし
「まず覚える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"
    };
  のようにします.



最新の画像もっと見る

1 コメント

コメント日が  古い順  |   新しい順
構造体 (Yuka)
2010-10-02 16:10:35
構造体、難しくて(汗。

BASIC→アセンブラ→必要に迫られてC

と流れて来ましたので(全部独学)、構造体は壁で、くじけてしまいました。C++なんて、ほんと、構造体そのもので、ごめんなさい、しました。

この章でお勉強します!
返信する

コメントを投稿