# ===============================================
# makefile
# LATTICE C ver.4.0
# cfunc.lib : in C-FUNCTION98 by HARADA S.D.
# ===============================================
gojoho.obj: gojoho.c gojoho.h
lc -B -n -e -ms -ccdmsw gojoho.c
gojoho1.obj: gojoho1.c gojoho.h
lc -B -n -e -ms -ccdmsw gojoho1.c
keysense.obj: keysense.c
lc -n -e -ms -ccdmsw keysense.c
gojoho.exe: gojoho.obj gojoho1.obj keysense.obj
lmb \LIB\c+gojoho+gojoho1+keysense,\
gojoho,nul,cfunc+lc;
■■■■■■■■■■■■■■■■■■■■■■■■■
/* =============================================
gojoho.c
ユークッドの互除法 demo
=============================================
*/
#include
#include
#include
#include
#include "gojoho.h"
int irflag; /* 整数比指定モード/ランダムモード */
main( argc,argv )
int argc;
char *argv[];
{
int ret;
getargs( argc,argv );
init();
while( 1 ) {
if( irflag==INP )
input_();
else
random_();
calc_();
if( ( ret=disp() ) != NXTRND ) {
if( cont()==RET_ESC )
break;
}
}
end();
}
getargs( argc,argv ) /* 引数の取得 */
int argc;
char *argv[];
{
if( argc != 2 )
usage();
strupr( argv[1] );
if( strcmp( argv[1],"-I" )==0 ) {
irflag=INP;
return;
}
if( strcmp( argv[1],"-R" )==0 ) {
irflag=RND;
return;
}
usage();
}
init()
{
long seed;
time( &seed );
srand( (unsigned) seed );
g_init();
printf( "\033[2J\033[>1h\033[>5h" );
}
end()
{
gcls();
printf( "\033[2J\033[>1l\033[>5l" );
exit( 1 );
}
gcls()
{
int i;
for( i=0; i < 2; ++i ){
g_screen( 3,0,i,1 );
g_cls();
}
}
cont()
{
int c;
printf( "\033[24;78H\033[>5l" );
c=getch();
printf( "\033[>5h" );
if( c==ESC ) /* ESC */
return( RET_ESC );
if( c==SPC ) /* SPACE */
irflag=irflag * ( -1 );
return( RET_NESC );
}
mati( c )
int c;
{
int i,j;
for( i=0; i < 100 * c ; ++i )
for( j=0; j < 100 * c ; ++j )
;
}
usage()
{
int index=0;
char *msg[]={
"\033[2J使用法: \n",
"\nGOJOHO -i",
"\n\t整数比指定モードでプログラムを開始する",
"\nGOJOHO -r",
"\n\tランダムモードでプログラムを開始する\n",
"\n最初のリボン表示に対し,リターンキーでプロセス開始",
"\n\tなおランダムモードでは,スペースキーで対象を変更できる\n",
"\nプロセス終了時(カーソル点滅時)において,",
"\n\tスペースキーで,モードを変更して再開始",
"\n\tリターンキーで,同一モードで再開始\n",
"\nプロセス実行中は,リターンキーで,中断\n",
"\nエスケープキーで,随時中止\n\n",
""
};
while( *msg[index] )
fprintf( stderr,"%s",msg[index++] );
exit( 1 );
}
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
/* ==============================================
gojoho1.c
==============================================
*/
#include
#include
#include
#include
extern int irflag;
int ap[2]={ 0,1 },dp[2]={ 1,17 };
int r[6]; /* 余り */
int m[6]; /* 何回割れるか */
int n; /* 割切れるまでの回数 */
int u;
int x[6][0x0f];
int y[2];
int udflg; /* up/down flag */
int a,b; /* 整数比指定の変数 */
input_()
{
char str[10];
printf("\033[2J\033[>5l");
printf("m : n ? (0 < m,n < 16)");
printf("\n\n\tm=");
gets(str);
a=atoi(str);
printf("\tn=");
gets(str);
b=atoi(str);
if(a >= b) {
udflg=0; /* 上が長い( [0]: 上 ) */
y[0]=UP;
y[1]=DOWN;
r[0]=a;
r[1]=b;
}
else {
udflg=1;
y[0]=DOWN;
y[1]=UP;
r[0]=b;
r[1]=a;
}
printf("\033[2J\033[>5h");
}
random_()
{
int k;
while(1) {
a=rand()%15+1; /* 1から15までの乱数を発生 */
b=rand()%15+1;
if(a >= b) {
udflg=0; /* 上が長い( [0]: 上 ) */
y[0]=UP;
y[1]=DOWN;
r[0]=a;
r[1]=b;
}
else {
udflg=1;
y[0]=DOWN;
y[1]=UP;
r[0]=b;
r[1]=a;
}
k=2;
while(1) {
if((r[k]=r[k-2]%r[k-1])==0) {
n=k-1;
break;
}
++k;
}
if(n > 1)
break;
}
}
calc_()
{
int k,i,j;
for(k=0; k < n; ++k)
m[k]=r[k]/r[k+1];
if(a > b)
u=600/a;
else
u=600/b;
for(i=0; i <= n; ++i){
if(i < 2)
x[i][0]=LEFT;
else
x[i][0]=x[i-2][m[i-2]];
for(j=1; j <= m[i]; ++j) {
x[i][j]=x[i][0]+u * r[i+1] * j;
}
}
}
disp()
{
int yf,yt,yfm,ytm,yy;
int i,j,k ,l,q,p,mx,my,ii,jj,ret;
char c;
printf("\033[2J");
for(i=0; i < 2; ++i){
g_screen(3,0,i,1);
g_cls();
draw_ribbon(x[0][0],y[0],u*r[0],
RWD,GVN_BCOL,GVN_ICOL);
draw_ribbon(x[1][0],y[1],u*r[1],
RWD,GVN_BCOL,GVN_ICOL);
}
if((c=(char) getch())==ESC) /* ESC */
end();
if(c==SPC && irflag==RND) /* SPACE KEY */
return(NXTRND);
for(k=1; k <= n; ++k){ /* [k]-> [k-1] */
if(k%2==0){ /* [偶数]から[奇数]へ */
if(udflg==0) { /* [偶数] が上 */
yf=UP;
yt=DOWN;
yfm=UP+OFS;
ytm=DOWN-OFS;
}
else { /* [偶数] が下 */
yf=DOWN;
yt=UP;
yfm=DOWN-OFS;
ytm=UP+OFS;
}
}
else{ /* [奇数]から[偶数]へ */
if(udflg==0) { /* [偶数] が上 */
yf=DOWN;
yt=UP;
yfm=DOWN-OFS;
ytm=UP+OFS;
}
else { /* [偶数] が下 */
yf=UP;
yt=DOWN;
yfm=UP+OFS;
ytm=DOWN-OFS;
}
}
for(i=0; i < m[k-1]; ++i) { /* 剰余の組入 */
for(j=0; j <= STEP; ++j){ /* 移動 */
l=j%2;
q=(l+1)%2;
g_screen(3,0,ap[l],dp[q]);
g_cls();
/* 移動中のリボン */
mx=x[k][0]+(x[k-1][0]+u*r[k]*i-x[k][0])*j
/STEP;
my=yfm+(ytm-yfm) * j/STEP;
draw_ribbon(mx,my,u*r[k],
RWD,MOV_BCOL,MOV_ICOL);
/* 前ステップの貼りつけリボン */
for(ii=1; ii < k; ++ii){
if(udflg==0){ /* [偶数]が上:このとき */
if(ii%2==0) /* [奇数]の剰余を上に描く */
yy=DOWN-OFS;
else
yy=UP+OFS;
}
else { /* [偶数]が下:このとき */
if(ii%2==0) /* [奇数]の剰余を下に描く */
yy=UP+OFS;
else
yy=DOWN-OFS;
}
for(jj=0; jj < m[ii-1]; ++jj)
draw_ribbon(x[ii-1][0]+u*r[ii]*jj,yy,
u*r[ii],RWD,CNT_BCOL,CNT_ICOL);
}
/* 現ステップの貼りつけリボン */
for(p=0; p < i; ++p)
draw_ribbon(x[k-1][0]+u*r[k]*p,ytm,
u*r[k],RWD,MOV_BCOL,MOV_ICOL);
/* 本体のリボン */
draw_ribbon(x[1][0],y[1],u*r[1],
RWD,GVN_BCOL,GVN_ICOL);
draw_ribbon(x[0][0],y[0],u*r[0],
RWD,GVN_BCOL,GVN_ICOL);
/* 除算を実行している二つの剰余部分 */
draw_ribbon(x[k][0],yf,u*r[k],
RWD,RES_BCOL,RES_ICOL);
draw_ribbon(x[k-1][0],yt,u*r[k-1],
RWD,RES_BCOL,RES_ICOL);
g_screen(3,0,ap[q],dp[l]);
if((ret=keysense()) !=-1) {
if(ret==ESC) /* ESC */
return(RET_ESC);
getch();
}
}
}
mati(5);
}
return(END);
}
draw_ribbon(x,y,w,h,bcol,icol)
int x,y,w,h,bcol,icol; /* 左上頂点が(x,y) */
{ /* 右へw,下へh,境界色,内部色 */
g_line(x,y,x+w,y+h,bcol,2,1,icol);
}
/* ============================================
GOJOHO.H
============================================
*/
#define ESC 0x1b
#define RET_ESC -1 /* ESC キー押下のリターン値 */
#define RET_NESC 0 /* ESC 以外のキー押下のリターン値 */
#define END 0 /* プロセス終了のリターン値 */
#define NXTRND -2 /* ランダムモードでの課題変更のリターン値 */
#define INP -1 /* 整数比指定モードのフラグ値 */
#define RND 1
#define LEFT 20
#define UP 100 /* リボン(上)の位置 */
#define DOWN 300 /* リボン(下)の位置 */
#define OFS 15 /* 剰余リボンの突出 */
#define RWD 20 /* リボンの幅 */
#define STEP 30 /* 移動のステップ数 */
/* リボンの色 (B:境界,I:内部) */
#define GVN_BCOL 1 /* 課題のリボンの色 */
#define GVN_ICOL 5
#define RES_BCOL 1 /* 除算が実行される剰余部分の色 */
#define RES_ICOL 4
#define MOV_BCOL 2 /* 移動リボンの色 */
#define MOV_ICOL 7
#define CNT_BCOL 2 /* 前ステップで貼りつけた剰余リボンの色 */
#define CNT_ICOL 6
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
# ===============================================
# makefile
# LATTICE C ver.4.0
# cfunc.lib : in C-FUNCTION98 by HARADA S.D.
# ===============================================
numsys.obj: numsys.c numsys.h
lc -B -n -e -ms -ccdmsw numsys.c
numsys1.obj: numsys1.c numsys.h
lc -B -n -e -ms -ccdmsw numsys1.c
numsys2.obj: numsys2.c numsys.h
lc -B -n -e -ms -ccdmsw numsys2.c
keysense.obj: keysense.c
lc -n -e -ms -ccdmsw keysense.c
numsys.exe: numsys.obj numsys1.obj \
numsys2.obj keysense.obj
lmb \LIB\c+numsys+numsys1+numsys2+keysense,\
numsys,nul,\lib\cfunc+\lib\lcm+\lib\lc;
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
/* =============================================
numsys.c
N 進命数法 demo
=============================================
*/
#include
#include
#include
#include
#include "numsys.h"
int nfflag; /* =0: 数字 =1: 図 */
int mode; /* 数字 : MADO/DIAL */
/* 図 : CIRCLE/RIBBON */
int matitime; /* 表示切り替えの速さを決める
パラメータ */
main( argc,argv )
int argc;
char *argv[];
{
getargs( argc,argv );
init();
while( 1 ){
input_();
memalloc();
calc_();
disp_();
if( cont()==END )
break;
gcls();
freemem();
}
end();
}
getargs( argc,argv ) /* 引数の取得 */
int argc;
char *argv[];
{
if( argc < 2 || argc > 3 )
usage();
strupr( argv[1] );
if( strcmp( argv[1],"-C" )==0 ) {
nfflag=FIGURE;
mode=CIRCLE;
}
else if( strcmp( argv[1],"-R" )==0 ) {
nfflag=FIGURE;
mode=RIBBON;
}
else if( strcmp( argv[1],"-N" )==0 ) {
nfflag=NUMBER;
mode=MADO;
}
else if( strcmp( argv[1],"-K" )==0 ) {
nfflag=NUMBER;
mode=DIAL;
}
else
usage();
if( argc==3 ) {
strupr( argv[2] );
if( *(argv[2])=='-' && *(argv[2]+1)=='T') {
matitime=atoi( argv[2]+2 );
return;
}
else
usage();
}
}
cont()
{
int c;
printf( "\033[24;78H\033[>5l" );
c=(char) getch();
printf( "\033[>5h" );
if( c==ESC ) /* ESC */
return( END );
return( CONT );
}
end()
{
int i;
printf( "\033[2J\033[>5l\033[>1l" );
for( i=0; i < 2; i++){
g_screen( 3,0,i,1 );
g_cls();
}
exit(0);
}
init()
{
g_init();
printf( "\033[2J\033[>1h\033[>5h" );
}
mati( c )
int c;
{
int i,j;
for( i=0; i < 10 * c ; ++i )
for( j=0; j < 10 * c ; ++j )
;
}
usage()
{
int index=0;
char *msg[]={
"\033[2J[使用法]\n",
"\nNUMSYS - -t\n",
"\nparam1 =n : 《数字》〈窓〉モードでプログラムを開始する\n",
" =k : 《数字》〈ダイヤル〉モードでプログラムを開始する\n",
" =r : 《図形》〈リボン〉モードでプログラムを開始する\n",
" =c : 《図形》〈円〉モードでプログラムを開始する\n",
"\nparam2 =数: 大きいほど,表示の切り替えがゆっくりとなる\n",
""
};
char *msg1[]={
"\033[2J",
"\nプロセス実行中では,",
"\n\tリターンキーで,一時停止",
"\n\tタブキーで,《数字》モードと《図形》モードの切替え",
"\n\tカーソル移動キーで,",
"\n\t 《数字》モードでは,〈窓〉,〈ダイヤル〉の切替え",
"\n\t 《図形》モードでは,〈リボン〉,〈円〉の切替え",
"\n\t〈円〉/〈リボン〉モードでは,スペースキーで",
"\n\t 二つの表示様式〈線分〉,〈領域〉の切替え\n",
"\nプロセスが終了しているとき(カーソル点滅時),",
"\n\tリターンキーでインプットモードに入る\n",
"\nインプットは,",
"\n\t青色カーソル点滅時に,何進法(2以上16以下)",
"\n\t赤色カーソル点滅時に,何桁 (2以上20以下)",
"\n\tスペースキーで,やり直し",
"\n(注意:入力文字は画面にエコーしません)\n",
"\nエスケープキーで,プロセスを随時中止\n\n",
""
};
while( *msg[index] )
fprintf( stderr,"%s",msg[index++] );
getch();
index=0;
while( *msg1[index] )
fprintf( stderr,"%s",msg1[index++] );
exit( 1 );
}
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
/* ==============================================
numsys1.c
==============================================
*/
#include
#include
#include
#include
#include
#include "numsys.h"
extern int nfflag;
extern int mode;
extern int matitime;
int form=0; /* リボン/円 =0: 線分 1: 領域 */
int ju; /* ju 進法 */
int cn; /* cn 個の装置 */
int *cnt; /* 各装置における単位いくつ */
int endflag; /* 終了を判定するフラグ */
struct device {
int **x; /* circle 動点の x 座標 */
int *y; /* リボン,円 動点の y 座標 */
int ht; /* 数 枠の高さ/2 */
/* リボン リボンの高さ/2 */
int wd; /* 数 枠の幅/2 */
/* リボン リボンの幅/2 */
/* circle 半径 */
} num,rib,cirl,cird;
int *cx; /* 中心の座標 */
int cy=200;
int *move; /* カウンタがまだ動いていないとき 0,
既に動いているとき 1 */
char numchar[16]
={ '0','1','2','3','4','5','6','7','8','9',
'A','B','C','D','E','F' };
int line; /* 数字の表示位置 */
calc_()
{
int i,j;
num.wd=240/cn; /* 幅 =(((640-40)/cn)/10)*4 */
if( num.wd > 25 )
num.wd=25;
rib.wd=240/cn; /* 幅 =(((640-40)/cn)/10)*4 */
if( rib.wd > 25 )
rib.wd=25;
cirl.wd=cird.wd=240/cn; /* 半径=
num.ht=num.wd * 2; /* (((640-40)/cn)/10)*4 */
rib.ht=10 * ju+5;
for( j=0; j < ju; ++j ){
cirl.y[j]=cy-cirl.wd*cos(2*3.14159*j/ju);
rib.y[j]=cy+rib.ht-rib.ht*2*j/(ju-1);
}
for( j=0; j < ju; ++j ){
cird.y[j]=cy-cird.wd*cos(2*3.14159*j/(ju-1));
}
for( i=0; i < cn; ++i ){
cx[i]=20+( i*2+1 )*300/cn;
for( j=0; j < ju; ++j )
cirl.x[i][j]=cx[i]+cirl.wd
*sin(2*3.14159*j/ju);
for( j=0; j < ju-1; ++j )
cird.x[i][j]=cx[i]+cird.wd
*sin(2*3.14159*j/(ju-1));
cnt[i]=0;
}
}
gcls()
{
int i;
for( i=0; i < 2; i++ ){
g_screen( 3,0,i,1 );
g_cls();
}
}
disp_()
{
int i,ret,matiflag=1;
int ap[2]={0,1}, dp[2]={1,17};
/* アクティブ・ディスプレイページ */
int a=0,d; /* ページ */
gcls();
for( i=0; i < cn; ++i )
move[i]=0;
for( i=0; i < 2 ; ++i ) {
if( nfflag==NUMBER ) {
draw0( 0,0 );
}
else { /* FIGURE */
if( form==0 )
draw0( 0,0 ); /* 線分 */
else
draw1( 0,0 ); /* 領域 */
}
a=( ++a )%2;
d=( a+1 )%2;
g_screen( 3,0,ap[a],dp[d] );
}
if( cont()==END )
return;
while( 1 ){ /* +1の結果を描いて1周期 */
if( matiflag==1 ) /* キー入力に対する */
mati( matitime ); /* 反応は遅らせない */
else
matiflag=1;
if( nfflag==NUMBER ) {
if( mode==MADO )
line=cy+num.ht+30;
else /* DIAL */
line=cy+cirl.wd+35;
}
else { /* FIGURE */
if( mode==RIBBON )
line=cy+rib.ht+25;
else /* CIRCLE */
line=cy+cirl.wd+35;
}
endflag=1;
if( nfflag==NUMBER ) {
draw0( 0,1 );
}
else { /* FIGURE */
if( form==0 )
draw0( 0,1 ); /* 線分 */
else
draw1( 0,1 ); /* 領域を足す */
}
a=( ++a )%2;
d=( a+1 )%2;
g_screen( 3,0,ap[a],dp[d] );
g_cls();
if( endflag==1 )
return;
if( ( ret=keysense() ) != -1 ) {
matiflag=0;
if( ret==ESC )
return;
if( ret==TAB )
nfflag=++nfflag%2;
else if( ret==RA || ret==RD ) {
mode=( ++mode )%MODEN;
CLS;
gcls();
}
else if( ret==RL || ret==RU ) {
mode=( mode+MODEN-1 )%MODEN;
CLS;
gcls();
}
else if( ret==SPC && nfflag==FIGURE ) {
form=( ++form )%FORMN;
}
else { /* その他のキーのときは入力待ち */
ret=getch();
if( ret==TAB )
nfflag=++nfflag%2;
else if( ret==RA || ret==RD ) {
mode=( ++mode )%MODEN;
CLS;
gcls();
}
else if( ret==RL || ret==RU ) {
mode=( mode+MODEN-1 )%MODEN;
CLS;
gcls();
}
else if( ret==SPC && nfflag==FIGURE ) {
form=( ++form )%FORMN;
}
}
}
}
}
draw0( m,inc )
int m,inc; /* m番目の装置, inc:位上がりフラグ */
{
int i,k;
if( inc==1 ) {
++cnt[m];
move[m]=1;
}
if( cnt[m] != ju-1 )
endflag=0;
if( nfflag==NUMBER ) {
if( mode==MADO ) {
g_line( cx[m]-num.wd,cy+num.ht,
cx[m]+num.wd,cy-num.ht,MIZ,RECT,0 );
}
else { /* DIAL */
g_circle( cx[m],cy,cirl.wd,cirl.wd,BLU,0 );
g_line( cx[m]-NUMWD*3/4,cirl.y[0]-NUMHT*3/4,
cx[m]+NUMWD/2,cirl.y[0]+NUMHT/2,
MIZ,RECT_P,1,BLA );
}
if( cnt[m] < ju ) { /* 位上がりしない */
if( mode==MADO ) /* 数字を描く */
numchar_( cx[m],cy,numchar[cnt[m]],
NUMWD,NUMHT,WHI );
else { /* DIAL */
for( i=1; i < ju; ++i ) {
k=( cnt[m]+i )%ju;
numchar_( cirl.x[m][ju-i],cirl.y[ju-i],
numchar[k],NUMWD,NUMHT,RED );
}
numchar_( cirl.x[m][0],cirl.y[0],
numchar[cnt[m]],NUMWD,NUMHT,WHI );
}
if( move[m]==1 )
numchar_( cx[m],line,numchar[cnt[m]],
NUMWD*(ju+12)/14,NUMHT*(ju+12)/14,WHI );
if( m < cn-1) /* 最後の装置でなかったら */
draw0(m+1,0); /* つぎの装置を */
} /* 前の通りに描く */
else { /* 位上がりする */
if( mode==MADO )
numchar_( cx[m],cy,numchar[0],
NUMWD,NUMHT,WHI );
else { /* DIAL */
for( i=1; i < ju; ++i )
numchar_( cirl.x[m][ju-i],cirl.y[ju-i],
numchar[i],NUMWD,NUMHT,RED );
numchar_( cirl.x[m][0],cirl.y[0],
numchar[0],NUMWD,NUMHT,WHI );
}
cnt[m]=0;
if( move[m]==1 )
numchar_( cx[m],line,numchar[0],
NUMWD*(ju+12)/14,NUMHT*(ju+12)/14,WHI );
if( m < cn-1 ) /* 位上がりしたのが,*/
draw0(m+1,1); /* 最後の装置でなかったら */
* つぎの装置を一つ進めて描く */
}
}
else { /* FIGURE */
if( mode==RIBBON ) {
for( i=0; i < ju; ++i )
g_line ( cx[m]-rib.wd,rib.y[0],
cx[m]+rib.wd,rib.y[i],BLU,RECT,0 );
/* 目盛,長方形を描く */
}
else { /* CIRCLE */
for( i=0; i < ju; ++i )
g_line( cx[m],cy,cirl.x[m][i],cirl.y[i],
BLU,LINE,0 ); /* 目盛 */
g_circle( cx[m],cy,cirl.wd,cirl.wd,MIZ,0 );
} /* 周 */
if( cnt[m] < ju ) { /* 位上がりしない */
if( mode==RIBBON ) {
g_line ( cx[m]-rib.wd,rib.y[cnt[m]],
cx[m]+rib.wd,rib.y[cnt[m]],WHI,LINE,0);
}
else /* CIRCLE */
g_line( cx[m],cy,cirl.
x[m][cnt[m]],cirl.y[cnt[m]],WHI,LINE,0);
if( move[m]==1 )
numchar_( cx[m],line,numchar[cnt[m]],
NUMWD,NUMHT,WHI );
if( m < cn-1) /* 最後の装置でなかったら */
draw0(m+1,0); /* つぎの装置を */
} /* 前の通りに描く */
else { /* 位上がりする */
if( mode==RIBBON )
g_line ( cx[m]-rib.wd,rib.y[0],
cx[m]+rib.wd,rib.y[0],WHI,LINE,0 );
else /* CIRCLE */
g_line( cx[m],cy,cirl.x[m][0],cirl.y[0],
WHI,LINE,0 );
cnt[m]=0;
if( move[m]==1 )
numchar_( cx[m],line,numchar[0],
NUMWD,NUMHT,WHI );
if( m < cn-1 ) /* 位上がりしたのが,*/
draw0(m+1,1); /* 最後の装置でなかったら */
} /* つぎの装置を一つ進めて描く */
}
}
numchar_( px,py,c,wx,wy,col )
int px,py,wx,wy,col;
char c;
{
if( c=='0' && py != line )
g_line( px-wx/4,py-wy/4,
px+wx/4,py+wy/4,col,RECT_P,1,col );
else {
if( c >= '0' && c <= '9' )
ssf_num( px-wx/2,py-wy/2,c,wx,wy,col );
else
ssf_l( px-wx/2,py-wy/2,c,wx,wy,col );
}
}
/* ribbon,circle */
draw1( m,inc ) /* 色を積み重ねる */
int m,inc;
{
int i;
if( inc==1 ) {
++cnt[m];
move[m]=1;
}
if( cnt[m] != ju-1 )
endflag=0;
if( mode==RIBBON ) {
g_line( cx[m]-rib.wd,rib.y[0],
cx[m]+rib.wd,rib.y[ju-1],MIZ,RECT_P,1,BLU );
for( i=1; i < ju-1; ++i )
g_line ( cx[m]-rib.wd,rib.y[i],
cx[m]+rib.wd,rib.y[i],BLA,LINE,0 );
/* 目盛を描く */
if( cnt[m] < ju ){
if( cnt[m] != 0 ) {
g_line(cx[m]-rib.wd,rib.y[0],cx[m]+rib.wd,
rib.y[cnt[m]],MIZ,RECT_P,1,MAG );
for( i=1; i < cnt[m]; ++i )
g_line ( cx[m]-rib.wd,rib.y[i],
cx[m]+rib.wd,rib.y[i],BLA,LINE,0 );
/* 目盛を描く */
}
if( move[m]==1 )
numchar_( cx[m],line,numchar[cnt[m]],
NUMWD,NUMHT,WHI );
if( m < cn-1 )
draw1( m+1,0 );
}
else { /* cnt[m]==ju */
cnt[m]=0;
if( move[m]==1 )
numchar_( cx[m],line,numchar[0],
NUMWD,NUMHT,WHI );
if( m < cn-1 )
draw1( m+1,1 );
}
}
else { /* CIRCLE */
if( cnt[m]==ju-1 )
g_circle( cx[m],cy,cird.wd,cird.wd,
YEL,SPC,0,0,0,0,MIZ );
else
g_circle( cx[m],cy,cird.wd,cird.wd,
YEL,SPC,0,0,0,0,BLU );
if( ju != 2 )
for( i=0; i < ju-1; ++i )
g_line( cx[m],cy,cird.x[m][i],cird.y[i],
BLA,LINE,0 ); /* 目盛 */
if( cnt[m] < ju ) {
if( cnt[m] != 0 && cnt[m] != ju-1 ) {
g_circle( cx[m],cy,cird.wd,cird.wd,
YEL,0x3f,cird.x[m][cnt[m]],cird.y[cnt[m]],
cird.x[m][0], cird.y[0],MIZ);
if( ju != 2 )
for( i=0; i <= cnt[m]; ++i )
g_line(cx[m],cy,cird.x[m][i],cird.y[i],
BLA,LINE,0 ); /* 目盛 */
}
if( move[m]==1 )
numchar_( cx[m],line,numchar[cnt[m]],
NUMWD,NUMHT,WHI );
if( m < cn-1 )
draw1( m+1,0 );
}
else { /* cnt[m]==ju */
cnt[m]=0;
if( move[m]==1 )
numchar_( cx[m],line,numchar[0],
NUMWD,NUMHT,WHI );
if( m < cn-1 )
draw1( m+1,1 );
}
}
}
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
/* ==============================================
numsys2.c
==============================================
*/
#include
#include
#include
#include "numsys.h"
extern int ju,cn;
extern int *cnt;
extern int *cx;
extern int *move;
extern struct device {
int **x;
int *y;
int numl;
int ht;
int wd;
} num,rib,cirl,cird;
input_()
{
char buffer[10];
int i,n,ret;
printf( "\033[2J" );
for( i=0; i < 2; ++i ) {
if( i==0 )
printf( "\033[24;78H\033[5;34m \033[m" );
else
printf( "\033[24;78H\033[5;31m \033[m" );
printf( "\033[24;78H\033[>5l" );
while( 1 ) { /* 入力および */
n=0; /* 入力値の妥当性チェックのループ */
while( 1 ) { /* 入力ループ */
if( ( ret=keysense() ) != -1 ) {
if( ret==ESC )
end();
else if( ret==RET )
break;
else if( ret==SPC )
n=0;
else if( ret > 0x2f && ret < 0x3a )
buffer[n++]=( char ) ret;
else {
printf( "\a" ); /* bell */
n=0;
}
}
}
buffer[n]='\0';
n=atoi( buffer );
if( n > 1 ) {
if( i==0 && n < 17 ) {
ju=n;
break;
}
if( i==1 && n < 21 ) {
cn=n;
break;
}
else
printf( "\a" ); /* bell */
}
else
printf( "\a" ); /* bell */
}
}
printf( "\033[24;78H " );
}
memalloc()
{
int i;
char str[20];
if((cnt=(int *)malloc(cn*sizeof(int)))==NULL)
malloc_err("cnt");
if((cx=(int *)malloc(cn*sizeof(int)))==NULL)
malloc_err("cx");
if((move=(int *)malloc(cn*sizeof(int)))==NULL)
malloc_err("move");
if((cirl.x=(int **)malloc(cn*sizeof(int)))==NULL)
malloc_err("cirl.x");
if((cird.x=(int **)malloc(cn*sizeof(int)))==NULL)
malloc_err("cird.x");
for(i=0; i < cn; ++i)
if((cirl.x[i]
=(int *)malloc(ju*sizeof(int)))==NULL){
sprintf( str,"cirl.x[%d]",i );
malloc_err( str);
}
for( i=0; i < cn; ++i )
if((cird.x[i]
=(int *)malloc(ju*sizeof(int)))==NULL){
sprintf( str,"cird.x[%d]",i );
malloc_err( str);
}
if((rib.y=(int *)malloc(ju*sizeof(int)))==NULL)
malloc_err("rib.y" );
if((cirl.y=(int *)malloc(ju*sizeof(int)))==NULL)
malloc_err("cirl.y" );
if((cird.y=(int *)malloc(ju*sizeof(int)))==NULL)
malloc_err( "cird.y" );
}
freemem()
{
int i;
free( ( int * ) cnt );
free( ( int * ) cx );
free( ( int * ) move );
for( i=0; i < cn; ++i )
free( ( int * ) cirl.x[i] );
free( ( int ** ) cirl.x );
for( i=0; i < cn; ++i )
free( ( int * ) cird.x[i] );
free( ( int ** ) cird.x );
free( ( int * ) cirl.y );
free( ( int * ) cird.y );
free( ( int * ) rib.y );
}
malloc_err( s )
char *s;
{
printf("MEMORY ALLOCATION ERROR ( %s )\n\n",s);
printf( "Hit any key " );
getch();
end();
}
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
/* ==============================================
numsys.h
==============================================
*/
#define END -1 /* プログラム終了のリターン値 */
#define CONT 0
#define NUMBER 0
#define FIGURE 1
#define CIRCLE 0
#define RIBBON 1
#define MADO 0
#define DIAL 1
#define ESC 0x1b
#define RET 0x0d
#define TAB TAB
#define SPC SPC
#define RA 0X0a /* →,↓,←,↑ */
#define RD 0x0c
#define RL 0x08
#define RU 0x0b
#define MODEN 2 /* 数字モード,図モードの
それぞれに2種類 */
#define FORMN 2 /* 〈リボン〉,〈円〉は,
ラインと塗りつぶしの2種類 */
#define NUMWD 12 /* グラフィック数字の幅と高さ */
#define NUMHT 15
#define CLS printf( "\033[2J" )
#define BLA 0 /* 色 */
#define BLU 1
#define RED 2
#define MAG 3
#define MIZ 5
#define YEL 6
#define WHI 7
/* g_line の描画スイッチ */
#define LINE 0 /* 直線を描く */
#define RECT 1 /* 矩形を描く */
#define RECT_P 2 /* 矩形を描き内部塗りつぶし */
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
/* =============================================
keysense.c
=============================================
*/
#include
#include
#include
#include
union REGS inregs,outregs;
struct SREGS segregs;
keysense()
{
char *c;
if( direct_key( c )==0 )
return( (int) *c );
else
return( -1 );
}
direct_key( c )
char *c;
/* 現在押されているキーを知る
リターン値は,キーボードが押されている
ときは0,押されていないときは1 */
{
union REGS inregs,outregs;
int intno;
intno=0x21;
inregs.h.ah=0x06;
inregs.h.dl=0xff;
int86(intno,&inregs,&outregs);
*c=outregs.h.al;
return( ( *c != 0 ) ? 0 : 1 );
/* キーボードが押されていない
ときには,ALレジスタには0が入る */
|