パソコン活用研究シリコンバレー(C、C++、の活用研究)

構造体

「構造体」とは、またいかめしい名前がでてきましたが、これはいったい何者なのでしょうか。
「構造」というと、なにやら哲学を連想してしまいますが(「構造主義」とか「現代社会の存立構造」とか
あったような)、C言語の構造体も、なかなか複雑なもののようです。

一昔前のプログラムの本(手続き型の旧BASIC全盛期のころの本)では、構造体はポインタと並んで
もっともCらしい機能のひとつで・・・・といった解説がよくなされていましたが、旧BASICにはない機能の
ひとつです。
もっとも、最近のプログラム言語には、みな構造体がありますが。

1 構造体

構造体は、複数のデータ型をひとつにまとめて、あたかもひとつの変数のように扱えるようにしたものです。
構造体の説明で必ず引き合いにだされる例が、「住所録」ですが、おじさんはちょっと趣向を変えて、「星」
を題材に構造体を考えてみます。(住所録じゃつまんないもん)

「星」には属性データとして、位置(ここはコンピューター上だから、X座標、Y座標)、そして色をもたせる
ことにします。それでは「星」(Star)をC言語の構造体として定義してみましょう。

構造体の定義は以下の書式で行います。
struct 構造体タグ {
  メンバーの宣言;
  メンバーの宣言;
 } 変数名;

/*starの構造体定義*/   
struct star {     構造体タグ(名前)
int x;          メンバー1 X座標
int y;          メンバー2 Y座標  
int c;          メンバー3 星の色
} st;       構造体変数名

それぞれのメンバーへは、 「構造体変数名.メンバー 」 という書式で参照ができます。
starのメンバーは、それぞれ
st.x  「星」のX座標
st.y  「星」のY座標
st.c 「星」の色
をあらわすことになります。
構造体のメンバーは、通常の変数のように扱うことができますので、例えば、「星」のX座標を20にしたければ
st.x = 20;
とすればO.K.です。
構造体変数名に配列を使うこともできます。

構造体の基本的なところは、こんなところでしょうか


2 プログラム例

それでは、画面上に色とりどりの「星」が降ってくるプログラムを作成してみましょう
実行画面イメージ

                                                               
                                 
         
                          
                                                    

                                          


                                                       

        


                                               


プログラムとしては
(1) Y座標(st[ ].y)の数値で星の画面への表示、非表示を分ける。
    Y座標=0の時は、非表示
(2) 非表示の星は、乱数を使い、9%の確率で表示に変更。画面の一番上(Y座標=1 の位置)に表示
(3) 星は少しづつ画面下まで移動し、Y座標が20になると非表示に戻す(Y座標=0にする)
というシンプルな流れのものです。

ソースコードはPC/AT互換機 コンパイラLSIC用のものです。(TurboCでもそのままコンパイル可のはず)

/*STAR  構造体のサンプル用プログラム */

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <dos.h>
#include <conio.h>
#define num 30
#define delay 12000
#define dosvcol 30  /*DOS/Vでの文字色設定のエスケープシーケンス 30黒*/
void locate(int,int);
void color(int);
int wait(int,int);

main(){
struct star {          /*starの構造体定義*/
int x;
int y;
int c;
} st[num];

int i,dx,dc;
long nowt,t;

printf("\x01b[2J");   /*画面クリア*/
printf("\x01b[>5h");
t= time(&nowt);
srand(nowt%3600);     /*乱数初期化*/

/*変数の初期化*/
for (i=1;i<num; i++){
st[i].x=0; st[i].y=0; st[i].c=0;}

while(!kbhit()){
for( i=1 ;i<num;i++){
if (st[i].y==0 && rand()>30000){
dx= 32767/78;  dc=32767/7; 
st[i].x=rand()/dx+1; st[i].y=1; st[i].c=rand()/dc+dosvcol;
}
if (st[i].y == 0) continue;
locate(st[i].x,st[i].y);
putch(' ');
st[i].y=st[i].y+1;
if (st[i].y>19){st[i].y=0; continue;}
color(st[i].c); locate(st[i].x,st[i].y);
putch('*');
wait(0,delay);
}}
printf("\x01b[>5l");
}



void locate (int tx,int ty)
{  printf("\x1b[%d;%dH" ,ty,tx);
  }

void color(int col)
{printf("\x01b[%dm",col);} 

int wait(int time1, int time2)
{
union REGS regs;
regs.h.ah=0x86;
regs.x.cx=time1;
regs.x.dx=time2;
int86(0x15,&regs,&regs);
return (regs.x.cflag);}
















Star構造体の定義   



構造体変数は配列にした   








X、Y座標、色を初期化
Y座標(st[ ].y)が0の時は、画面に表示
しないことにする。

何かキーが押されたら終了
Y座標=0(非表示時) 確率9%で、
表示状態に 変更する(Y座標=1)
Y座標=0ならcontinue(何もせず、
for ループの 先頭に戻る)


星の移動
Y座標が20以上になったら非表示に変更











カーソル位置移動



色設定



ウェイトをかける





BIOSのディレイルーチンのコール


【 補足】
locate,color 関数については、
Short Program(もぐらたたき)を参照して下さい。

wait はBIOSをコールしています。これはPC/AT互換機のBIOSの場合です。PC-98はこのままでは
正常に動作しません。

TopPage