# =============================================== # 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 <stdio.h> #include <stdlib.h> #include <time.h> #include <string.h> #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 <stdio.h> #include <string.h> #include <stdlib.h> #include <cfunc.h> 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 <cfunc.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #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 -<param1> -t<param2>\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 <cfunc.h> #include <math.h> #include <stdio.h> #include <string.h> #include <stdlib.h> #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 <stdlib.h> #include <stdio.h> #include <string.h> #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 <stdio.h> #include <stdlib.h> #include <stddef.h> #include <dos.h> 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が入る */