include - みる会図書館


検索対象: 月刊 C MAGAZINE 1992年2月号
29件見つかりました。

1. 月刊 C MAGAZINE 1992年2月号

#ifdef PROTOTYPE #include "cboxprot. h" #endif clearblk (xl, yl, x2, y2) [ 戻り値 ] [ 引数 ] int xl, yl, x2, y2 ーーシステム時間を取得 ( 付録ティスク収録 , CM920202 ) getstime( ) 関数 2 , y2 ) のプロック部分をクリアする。 ウインドウ stdscr 内の座標 (xl, yl ) から (x [ 機能 ] ない場合は一 1 を返す。 idx, markndb. pr2 また , 環境変数 TERM に、、 nec98 クを設定 する必要がある。 xl ←クリアするプロックの左上端の x 座標 yl ←クリアするプロックの左上端の y 座標 x2 ←クリアするプロックの右下端の x 座標 y2 ←クリアするプロックの右下端の y 座標 正常終了の場合は 0 を , 座標の指定が適切て、 ーー dsc 「ウインドウ内の特定プロックをクリア clearblk( ) 関数 (List. 7 , CM920201 ) 道具箱に追加された関数 List 4 [ 書式 ] #include #include #include "config. h" く curses. h > <string. h> 92 : 93 : 94 : 95 : 96 : 98 : 99 : 100 : 101 : 102 : 103 : 104 : 105 : 106 : 107 : 108 : 109 : 110 : 111 : ) mid(pdnames, pdname, 1 , 2 の ; mid(pdnames2, pdname, 1 , 1 の ; lbaika = atol(baika) ; subtotal = lbaika * lkosu; tOta 1 total + subtotal mvprintw(), 3 , ” % 2d ” , cnt) ; mvprintw(), 7 , Gcuinpbuf) ; mvprintw(), 19 , ; mvprintw(), 47 , ” % 61d ” , lkosu) ; mvprintw(), 55 , ” % 101d ” , lbaika) ; mvprintw(), 67 , ” % 101d ” , subtotal) ; mvprintw(), 55 , ” % 101d 円” , total) ; move(23, 1 ) ;refresh() ; refresh() : 十十 ; return( の ; 2 : 5 : 11 : 12 : 17 : 22 : 26 : 28 : 30 : 35 : 36 : srpdnam 2 ( ) 関数 (srpdnam2. c) List 5 extern 4 : #define EXTN 3 : #define MYEXTERN extern ” config. h ” 1 : #include 6 : #include ” ctstdr. h ” 9 : #include く string. h 〉 10 : #include く ctype. h> 13 : #include 14 : #include 15 : #include ” ctdecl. h ” 16 : #include ctoptn. h ” ctaerr. h ” cterrc. h ” 18 : #ifdef CTSERVER 19 : #include ” ctcomm. h ” 20 : extern UCOUNT cts 21 : #endif 23 : #include ” markndb2. h ” 24 : #include ” marknva2. h ” 25 : #include ” renta101. h ” _apxslz ; / * message Size * / [ 書式 ] #include "config. h" 39 : 45 : 48 : 49 : 27 : #include く curses. h> 29 : TEXT *TFRMKEY() ; 31 : #ifdef PROTOTYPE 32 : #include ” cboxprot. h ” 33 : #include marprot. h ” 34 : #endif 37 : s rpdnam3 ()d i d, pdname, ba i ka) 38 : char *pdid; Char 40 : char *baika; 42 : VOID cpychr() ; 43 : COUNT keyno, myerr ; 44 : TEXT *tarval : keyno = PDIDKEY; #include <stdio. h > #include く time. h> #include < string. h > cpychr(Gpdkey—target. id, PDIDL) : 136 C MAGAZINE 1 2 2

2. 月刊 C MAGAZINE 1992年2月号

応用 C 言語 C の道具箱 理を行うための関数てある。この中の clear blk ( ) 関数は , ひとつの処理が終了した場合 に , 数字などが残らないように画面の一部 をクリアするための関数てある。 srpdnam2 ( ) 関数は (List 5 ) , 商品コード から商品名および売価を検索するための関 数てある。 EQLREC ( ) 関数は c-tree PIus ラ イプラリの関数て、 , 特定のキーの値が一致 した場合 , そのレコード番号をカレントの レコード番号にする関数て、ある。 kaidsp2 ( ) 関数は (List 6 ) , 窓口会計処理 用の画面を作成するための関数て、ある。 ute xtke4 ( ) 関数は罫線を引くための関数て、あ プログラムの実行 プロンプトから以下のように入力する。 A>markndb9 すると Fig. 3 のようなメインメニュー画面が 現れる。 商品テータの追加 、、商品データの追加クを選択すると , Fi Fig. 3 メインメニュー 0 List 2 28 : 29 : #include ” markndb2. h ” 30 : #include ” marknva2. h ” 31 : #include ” renta101. h ” 32 : 33 : #include く curses. h> 34 : #include く string. h> 35 : 36 : 37 : VOID marpdad3() 39 : COUNT ans ; 40 : COUNT i : 41 : UCOUNT varlen; VOID getfld3() ; 43 : 44 : clear(); mvprintw(2,5," 商品データを追加します \ n \ n " ) ; 46 : refresh(); 48 : do( 49 : 50 : 51 : 52 : 53 : 54 : 55 : 56 : 58 : 59 : 60 : 62 : 63 : 64 : 65 : 66 : 68 : 69 : 42 : for (i = 0 ; i く PD-NO-FLD; i + + ) ( getfld3(), PDNEW) ; refresh() ; varlen = pdputimg(); if (LKISAM(ENABLE) Ⅱ ADDREC(HINDAT, Ghin) ) ( mvprintw(19, 5 , " 工ラーが生じました Xd(Xd)*n ” if(isam—err==2){ mvprintw ( 20 , 5 , " この番号はすでに使用されています " ) : _fil); lsam_err, 1Sam else( mvprintw(20, 5 , " データが追加されました " ) : refresh() ; LKISAM(FREE) ; mvprintw(22, 5 , " 入力処理を終了しますか (y)"); refresh() : ans ニ getch() ; clear() ; )while( ans ! = 'y' & & ans ! = marpdsc 2 ( ) 関数 (marpdsc2. c) ” config. h ” 1 : #include 2 : 3 : #define MYEXTERN extern 4 : #define EXTN extern 5 : 6 : #include ” ctstdr. h ” 7 : 8 : #include く string. h> 9 : #include く ctype. h> 10 : 11 : #include ” ct0Ptn. h" 12 : #include ” ctaerr. h" 13 : #include ” ctdecl. h" 14 : #include ” cterrc. h ” 15 : 16 : #ifdef CTSERVER 17 : #include ” ctcomm. h ” 18 : extern U COUNT cts _apxslz; 19 : #endif 20 : 21 : #include ” markndb2. h ” 22 : #include ” marknva2. h ” 23 : #include ” renta101. h ” 24 : 25 : #include く curses. h 〉 26 : 27 : #ifdef PROTOTYPE ” cboxprot. h ” 28 : #include 29 : #endif List 3 3 追 ぶ の タ 商 4 くく 簡易 POS mes sage S1ze 品データを加します : IE 1 データか追買されました : 入力処理を終了しますかゆ■ 1 ・ 0 」っ》 4 に 6 - ー 応用 C 言語 133

3. 月刊 C MAGAZINE 1992年2月号

五ロ C の道具箱 M OS±T の UN Ⅸプロクの UNIX プログの SLDOS への植 豊国永健。 前回までで , cu 「 ses の主要な関数かおおよそをろった , しロはこれらの 関数を使用して , よりアプリーショ 9 こ近い ムの作成に挑戦する。 第 20 回 main( ) 関数 (markndb9. c) 1 : #include ” config. h ” 2 : 3 : #define EXTN 4 : #define MYEXTERN 5 : 6 : #include Vctstdr. h ” 7 : 8 : #include く stdio. h 〉 9 : #include く string. h> 10 : #include く ctype. h 〉 11 : 12 : 13 : #include ” ctoptn. h ” 14 : #include ” ctaerr. h" 15 : #include ” ctdecl. h ” 16 : #include ” cterrc. h ” 18 : #ifdef CTSERVER 19 : #include ” ctcomm. h ” 20 : extern UCOUNT cts _aPXSlZ; 21 : #endif 22 : 23 : 24 : #include ” markndb2. h ” 25 : #include ” marknva2. h" 26 : #include ” renta101. h ” 28 : #include く curses. h> 29 : 30 : #include く locale. h> 32 : #ifdef PROTOTYPE ” cboxprot. h ” 33 : #include 34 : #endif 35 : 36 : 37 : TEXT *TFRMKEY() ; 38 : 39 : struct Gmnstr mnC]={ 商品データの追加 40 : 商品データの修正 41 : 窓口会計処理 42 : 終 了 43 : 44 : 45 : 46 : VOID main ( ) 47 : { 48 : char ch List 1 はじめに 以前にも述べたが , MS-DOS 版 curses を 作成する目的のひとつは , UN Ⅸ用のプログ ラムを MS ー DOS 上て、デバッグすることにあ る。このデバッグを行う前提として Fig. 1 の ように , ま $UNIX プログラムを MS-DOS に移植てきなくてはならない。 こに MS- DOS 版 curses が必要になる第一の理由があ そこて、今回は , 本誌 ' 91 年 10 月号「 SPARC LT プログラミング」第 4 回て紹介した SPÄR CLT 用のプログラムを , MS ー DOS に移植し てみることにした。この移植がてきれば , MS ー DOS 上のデバッガを駆使して , より完 成度の高いプログラムに仕上げることがて きると思われる。さらに MS-DOS 上て一層 複雑なプログラムを開発し , 最後に UN Ⅸに Fig. 1 UNIX ←→ MS-DOS UN Ⅸプログラムの MS ー DOS への移植 MS ー DOS 上でデバッグ テパッグしたプログラムを UN Ⅸへ移植 / * message Size * / . ー「・り LD 8 、 1 1 11 戸 0 戸 0 0 0 つなりムつつな ↓ ↓ 応用 C 言語 131

4. 月刊 C MAGAZINE 1992年2月号

移植することもてきる。 ソースプログラム こて、紹介するプログラムは , ' 91 年 10 月 号て、発表した SPARC LT 用の窓口会計処理 用のプログラムを MS ー DOS に移植てきるよ うに若干バージョンアップしたものてある。 このプログラム全体は 70 本程度のモジュー ルから構成されているが , 主要な構造は Fi g. 2 のようになっている。 プログラムの主要部分をここに紹介する。 なお , 本プログラムは FairCom 社の c-tree P lus のライプラリを使用している。 List 1 を見ていただきたい。 main ( ) 関数 てある。最初の config. h の内容によって , M S-DOS 用か UNIX 用かを判断するようにな っている。また同じ include 文の中の locale. h は , 環境を設定するためのものてあるが , MS-C て、は Ver. 6.0 からサポートされるよう になったものなのて、 , 注意していただきた marpdad3 ( ) 関数は (List 2 ) , 商品データ を追加するための関数てある。 LKISAM ( ) 関数は , c-tree PIus ライプラリの関数てあ り , レコードをロックするためのものてあ る。これは UNIX などマルチューザのシステ ムて必要になるものて、ある。 marpdsc2 ( ) 関数は (List 3 ) , 商品データ を修正するための関数て、ある。この中の GT EREC() 関数は , c-treePlus ライプラリの 関数て、 , 特定のキーの値が一致する場合 , あるいは , より大きな値を持っ場合 , その レコード番号をカレントのレコード番号に する関数て、ある。 markaik4 ( ) 関数は (List 4 ) , 窓口会計処 Fig. 2 窓口会計処理プログラムの主要構造 74 : / * * ” I S A M ファイルを閉じることができません Xd (Xd) *n" 94 : } List 1 49 : 53 : 55 : 56 : 58 : 59 : 62 : 63 : 64 : 65 : 66 : 68 : 69 : 71 : 72 : 73 : 77 : 79 : 80 : 82 : 83 : 84 : 85 : 86 : 88 : 89 : 90 : 91 : 92 : 93 : int opt 50 : #ifdef CTSERVER C ts_apxs i Z 52 : #endif char *envprtdev ; 54 : char prtdev[80] : initscr(); ニ CTS_MAXSMSG; keypad(stdscr, TRUE) ; scrollok(stdscr, TRUE) ; noecho() ; raw(); setlocale(LC—ALL, ”” ) ; if (OPNISAM( ” markndb. pr2 ” )) { sprintf(Gconbuf, ”パラメータファイル関連のエラーが生じました % d ( % d ) \ n ” , isam_err, isam_fil) : mvprintw(21, 5 , Gconbuf) : refresh() ; STPUSR ( ) ; exit( の : marknin4() : clear(); utextke4(stdscr, 1 , 1 , 78 , 23 , A—DIM) : while( (opt = marmn0(mn, 4 , ” < < sprintf(Gconbuf, if (CLISAM()){ case 3 : case 2:markaik4();break; case 1 :marpdsc2() ;break; case 0 : r ad3 ( ) ;break; switch(opt){ : break : refresh() ; mvprintw(21, 5 , Gconbuf) ; exit( の : endwin(); fclose(stdprn) ; 簡易 P 0 S lsam_err, lsam_fil) : marpdad3 ( ) 関数 (mdrpdad3. c) List 2 ” config. h" 1 : #include 3 : #define MYEXTERN extern 4 : #define EXTN extern 6 : #include ” ctstdr. h ” 7 : #include ” co 叩 iler. h ” 10 : #include く string. h> 11 : #include く ctype. h> 13 : #ifdef TURBOC #include く a110C. h 〉 15 : #else #include く malloc. h> 17 : #endif 19 : #include ” ctoptn. h ” 20 : #include ” ctaerr. h ” 21 : #include ” ctdecl. h ” 22 : #include ” cterrc. h ” 24 : # i fdef CTSERVER 25 : #include ” ctcomm. h ” 26 : extern UCOUNT cts—apxsiz; 27 : #endif 23 : 16 : 14 : 12 : 9 : 8 : 5 : 2 : / * mes sage S i ze * / 132 main 商品テータの追加 商品テータの修正 窓口会計処理 終了 C M AGAZIN E 1 2 2

5. 月刊 C MAGAZINE 1992年2月号

難易度や面白さにストレートにて、てくるパ ラメータて、すが , 固定数字にしてしまいま 19 行目と 23 行目には , めったにて、てこな い、、 * 〃が三つもついた変数宣言て、す。 Fi g. 1 をご覧ください。 16X32 のスプライトて、 4 アニメーションパターンを考えます。 16 x 16 がひとつの単位て、 , 四つの PCG へのポイ ンタが初期化のために必要てす。ポインタ の配列は PCG * * て、す。これが 2 パターン 分必要になりますから , この配列 , すなわ ち PCG * * * がひとつのキャラクタを定義 するために必要な変数ってことになります ( もちろん , 個別にすればもっと簡単に見え ますが , 結局やっていることは同じて、す。 C て、は配列処理よりはポインタて処理したほ うが普通は速い場合が多いて、す。とくに多 数のアドレスレジスタを持っている 68000 て、 はそうて、す ) 。 ポインタは C 言語のもっともわかりにくい 部分のひとって、すが , アセンプラの知識が 少しあれば非常に理解は容易なのてす。 68 000 のアセンプラは単純明快なのて、 , C の勉 強のつもりて、アセンプラを少しかじってお けばポインタの理解も進むと思います。ま た , GCC の強力な asm 文を応用することも てきるようになります。 個別設計 私はどちらかといえば , 大まかに必要と 思われる大域変数を設定した後にちらはト ップダウンて、すね ) , 細かなルーチンをたく さん書いてポトムアップて、組み上げていき ます。今まてのサンプルソースて、関数 main のマクロてす。このように , マクロにも漢 が 1 種類の 2 パターンアニメ処理 , 自機はま ( ) が先頭にないのはそのためてす ( main ( ) 字を使うこともてきます。今回はインべー ったくアニメーションはしません ( そういう の位置はその人のコーディングスタイルを ダタイプなのて、 , 自機は左右移動しかしま 仕様にした・・・・・ ) 。画面上に存在てきる敵キ 反映しているかもしれません。とくに先頭 せんから , 、、 enum 移動方向クは、、左 , 静止 , ャラクタの最大数 , 自機が放った弾の最大 にある必要はありませんから ) 。 右〃の 3 種類しかありません。 数は , List 1 のようにそれぞれ 30 , 6 という List 2 は自機の移動方向と弾の発射を読 敵キャラクタは 1 種類て , ャラレバターン 数にしてみました。 こらへんはゲームの み取るルーチンてす。 9 行 ~ 10 行は GCC の拡 List 変数宣言部分 l:#include く stdio. h> 2:#incIude く stdlib. h> 3:#incIude く iocslib. h> 4 : 5 : #define MAIN 6:#incIude "sprite. h ” 7 : 9 : #define 表示 1 10:#define 非表示 0 11 : 12 : enum 移動方向 { 右 , 静止 , 左 } ; 14 : / * ユーザー操作の自機 * / 15:static sprite 自機 17 : / * 敵キャラクター * / 18:static sprite 敵 [ 30 ] ; 19 : static PCG *** 敵 PCG; 20 : 21 : / * 画面に存在する弾 * / 22:static Sprite 弾 [ 6 ] ; 23 : static PCG *** 弾 PCG; 24 : 25 : / * 現在の敵キャラ数 * / 26:static int 敵数 ; 28 : / * 経過時間カウンタ * / 29:static int 経過時間 ; 30 : 31 : / * 自機が弾を発射する為のフラグ * / 32:static int 弾発射 ; Fig. 1 アニメーションバターン 16X32 スプライト アニメーション 4 バターン PCG 型 PCG—DATAO 128 バイト PCG—DATAI 128 バイト PCG—DATA2 128 バイト PCG—DATA3 128 バイト アニメーション 4 パター ン PCG 型 PCG—DATAO 128 バイト PCG—DATAI 128 バイト PCG—DATA2 128 バイト PCG—DATA3 128 バイト ■■ 140 C MAGAZINE 1992 2

6. 月刊 C MAGAZINE 1992年2月号

g. 4 のような画面が現れる。まず商品コード を半角て、入力する。たとえば当 12233 〃と 入力する。同様に , 売価などを入力する ( 商 品名は全角てもよい ) 。ただしこのプログラ ムて直接関係している項目は , 商品コード , 売価 , 商品名のみて、ある。 商品名まて入力すると , 入力処理を終了 するか否かの問い合わせが行われる。 て、半角て団と入力するとメインメニュー画面 に戻る。空打ちすると入力処理が継続され 商品テータの修正 回を入力する。なお , これらの分岐のための 入力する。メインメニュー画面に戻るには ひとつ後のレコードを表示するためには国を のひとつ前のレコードを表示するにはを , D を入力する。また表示されているレコード には , フィールド番号を入力する代わりに 表示されているレコードを削除する場合 後 , 新しい値を入力する。 修正は , Fig. 6 のように現在値が表示された て修正したいフィールド番号を入力する。 そのレコードのデータが表示される。そこ レコードの商品コードを入力する。すると g. 5 のよ・うな画面が現れる。まず修正したい 商ロロアータの修正クを選択すると , Fi 新正するフィつレド番号 ) 次闇前の釟 0 ) 終了■ : 12 : 1 を品コード入力商品コード : 8 商品データの修正 Fig. 5 商品テータの修正① 新しい値 現在の値商品名 Fig. 6 商品テータの修正② 缶チュー八イ List 3 30 : 31 : 33 : 34 : 37 : 38 : 39 : 40 : 41 : 42 : 44 : 45 : 46 : 48 : 49 : 50 : 51 : 52 : 53 : 54 : 55 : 56 : 57 : 58 : 59 : 61 : 62 : 63 : 64 : 65 : 66 : 68 : 69 : 70 : 71 : 72 : 73 : 74 : 75 : 76 : 77 : 78 : 79 : 80 : 82 : 83 : 84 : 85 : 86 : COUNT fldno,action,keyno; VOID cpychr() ; COUNT rntupdat() ; 35 : VOID marpdsc2() 32 : TEXT *TFRMKEY() ; TEXT * tarva 1 : TEXT choice[2] ; clear(); printw("}n 商品デ refresh(); keyno = PDIDKEY; fldno = 0 ; ータの修正 \ n ” ) ; printw(" Xs: ",GpdfldnamCfldno]); refresh() ; echo ( ) ; getstr(Gpdinpbuf) ; noecho() ; cpychr(Gpdkey-target. id, Gpdinpbuf, PDIDL) ; tarva 1 = TFRMKEY (keyno, &Gpdkey_target) : action = 0 : if (LKISAM(ENABLE) Ⅱ GTEREC(keyno, tarval, Gold_hin) Ⅱ RRDREC(HINDAT, Gold_hin)) { printw("}n}n 該当するデータが存在しません % d Xd", isam_err, isam-fil); refresh() : LKISAM(FREE) ; return : while (action 〉ー 1 & & !isam_err) { action = marpdupd() : LKISAM(RESET) ; if (action = NEXT) NXTREC(keyno, Gold_hin) ; else if (action = = PREV) PRVREC(keyno, Gold_hin) : if (!isam_err & & (action > = NEXT Ⅱ action く = SAME ) ) RRDREC(HINDAT, Gold_hin) : if (isam—err){ printw("}n}n 検索できません (code %d file (d). ", isam_err, isam—fil); refresh() : LKISAM(FREE); List 4 markaik4( ) 関数 (markaik4. c) extern 4 : #define EXTN 3 : #define MYEXTERN extern 1 : #include ” config. h" 5 : 7 : 9 : 10 : 11 : 12 : 6 : #include ” ctstdr. h ” 8 : #include く ctype. h 〉 #include 13 : #include ” ctdecl. h ” 14 : #include #include く string. h> #include ” ctoptn. h ” ctaerr. h ” cterrc. h ” 134 C MAGAZINE . タカラ缶チューノ、イ 500cc 1992 2

7. 月刊 C MAGAZINE 1992年2月号

37 : COUNT fldno, action, keyno; 38 : LONG total, subtotal, lbaika, lkosu; refresh() ; mvprintw(), 19 , strcpy(Gcuinpbuf, y = ((cnt-l) % 15 ) + 7 ; while( 1 ) { total = 01 ; echo() ; refresh() ; kaidsp2() ; clear(); 49 : TEXT kosu[30]; 48 : TEXT baikaCCUTELL+1] ; 47 : TEXT sx[CUADDIL + 1] : 46 : TEXT pdnames2CCUADDIL + 1] ; 45 : TEXT pdnamesCCUADDIL+1] : 44 : TEXT pdnameCCUADDIL + 1] : 43 : T EXT cuname CCUNAMEL + 1 ] ; 42 : TEXT choiceC2] ; 41 : TEXT *tarval ; 40 : COUNT y, x, i, cnt=l ; 39 : LONG tax,alltotal; List 4 34 : { 89 : 88 : 86 : 85 : 84 : 83 : 82 : 81 : 80 : 79 : 78 : 77 : 76 : 74 : 72 : 71 : 70 : 69 : 68 : 66 : 65 : 64 : 63 : 62 : 61 : 60 : 59 : 58 : 56 : 55 : 54 : 53 : 52 : 50 : 32 : 28 : 26 : 25 : 21 : 18 : 16 : 15 : _apxslz ; 0 message 17 : # ifdef CTSERVER # include "ctcomm. h ” 19 : extern UCOUNT cts 20 : #endif 22 : #include ” markndb2. h ” 23 : #include ” marknva2. h" 24 : #include ” renta101. h ” S 1 ze #include く curses. h> 27 : TEXT *TFRMKEY() : 29 : #ifdef PROTOTYPE ” cboxprot. 30 : #include 31 : #endif 33 : markaik4() 35 : COUNT rntupdat() ; 36 : VOID cpychr(); h ” echo() ; mvgetstr(), 19 , Gcuinpbuf) ; if(GcuinpbufC0) break; if(strIen(Gcuinpbuf)==0 ) { move(22, 1 ) ;refresh(); tax = 0.03 * total alltotal total + tax = 01 ;subtotal tOta 1 cnt mvprintw(), 55 , " % 101d 円” , total) ; clearblk ( 3 , 7 , 4 , 21 ) ; clearblk ( 7 , 7 , 16 , 21 ) ; clearblk ( 19 , 7 , 38 , 21 ) ; clearblk ( 41 , 7 , 44 , 21 ) ; clearblk(47, 7 , 52 , 21 ) ;cIearblk(55, 7 , 64 , 21 ) ; if(srpdnam3(Gcuinpbuf, pdname, baika) ) { lkosu = 11 : else{ ニ atol(kosu); lkosu echo() ; mvgetstr(), 47 , kosu) ;noecho() ; if(Gcuinpbuf[0] = noecho() ; con i nue refresh(); clearblk ( 67 , 7 , 76 , 21 ) ; mvprintw(3,19," 該当コードなし " ) : continue; refresh(); mvprintw(), 19 , getch(); refresh(); 応用 C 言語 C の道具箱 入力はすべて半角て行う。 窓口会計処理 窓口会計処理クを選択すると , Fig. 7 の ような画面が現れ , 商品コードの入力待ち になる。入力が行われると , そのコードに 対応する商品名 , 単価およびそれまて、の合 計額が表示される。各商品の個数について は 1 個がデフォルトに設定されており , すぐ に次の商品名の入力となる。個数を入力し たい場合には , 商品名の入力時に / を入力 する。すると個数入力のルーチンに入るの て、 , そこて個数を入力する。ひとつの商品 の入力が終了すると , 商品名と価格が印字 される。商品名コードの入力時にキーて 終了となる。また商品名コード入力時に * を入力すると会計処理自体が終了し , メイ 注意事項 すると , プログラムは終了する。 メインメニューにおいて、、終了クを選択 終了 ンメニューに復帰する。 t, marhin. idx, marden. dat, marden. marcust. dat, marcust. idx, marhin. da トリに置いておく必要がある。 関連の以下のファイルをカレントディレク 本プログラムの実行には , データベース ソースは公開て、きないのて、ご容赦願いたい している。したがって , c-treePlus 関連の Corporation の c-tree Plus Ver. 6.0 を使用 本プログラムの作成には , 米国 FairCom Fig. 7 窓口会計処理 く意ロ会計理 18 ト 76 一月 ) 応用 C 言語 135

8. 月刊 C MAGAZINE 1992年2月号

応用 C 言語 C の導具箱 kaidsp 2 ( ) 関数 (kaidsp2. c) ” config. h ” 1 : #include 3 : #define MYEXTERN extern 5 : #include 6 : 7 : kaidsp2() int i 9 : 10 : int y,x; 11 : char dateeC20] ; 12 : char timeeC20]; 13 : char yobiC5] ; 14 : utextke4(stdscr, 17 , 2 , 17 , 22 , A—DIM) ; 15 : utextke4(stdscr, 45 , 2 , 45 , 22 , A—DIM) ; utextke4(stdscr, 53 , 2 , 53 , 22 , A—DIM) ; utextke4(stdscr, 5 , 4 , 4 , 22 , A—DIM) ; 18 : utextke4(stdscr, 39 , 4 , 39 , 22 , A—DIM) ; 19 : utextke4(stdscr, 65 , 4 , 65 , 22 , A—DIM) ; 20 : utextke4(stdscr, 1 , 4 , 77 , 4 , A—DIM) ; utextke4(stdscr, 1 , 6 , 77 , 6 , A—DIM) ; 22 : utextke4(stdscr, 1 , 2 , 77 , 22 , A—DIM) ; 23 : attron(A_REVERSE IA-BOLD) ; 24 : mvprintw(), 28 , " く窓口会計処理 > " ) : 25 : attrset(A_NORMAL) ; 26 : attrset(A_REVERSE IA—STANDOUT) ; 入力” ) : mvprintw(), 3 , 28 : mvpr intw (), 3 , 29 : ”商品コード” ) ; mvprintw(), 7 , 30 : mvprintw(), 19 , 商品名 つ ; ”区分” ) mvprintw(), 41 , 32 : " 数量も : mvprintw(), 47 , 33 : 単価 mvpr intw (), 55 , 34 : 金額 mvprintw(), 67 , 35 : ”合計” ) ; mvprintw(), 47 , 36 : getstime(datee, timee, YObi) : attrset(A_NORMAL) ; 38 : mvprintw(), 61 , ” Xs(Xs) ” , datee, Y0bi) : 39 : return( の : 40 : 41 : } clea 「 blk( ) 関数 (clearblk. c) Copyright 1990 E. TOY0kuni ” config. h" 2 : #include 3 : 4 : #define MYEXTERN extern 5 : #define EXTN extern 6 : 7 : #include く curses. h 〉 8 : #include く string. h 〉 9 : 10 : # i fde f PROTOTYPE "cboxprot. h ” 11 : #include 12 : #endif 13 : 14 : clearblk(xl,yl, x2,y2) 15 : int xl,yl, x2,Y2 ; 16 : { 17 : char moji [ 100 ] ; 18 : char cc [ 100 ] ; 19 : 20 : int i, xlen,ylen; if ()l く 0 Ⅱ xl > = 80 Ⅱ yl く 0 Ⅱ yl 〉 = 25 ) 22 : return(-l) ; 23 : if ()2 く 0 Ⅱ x2 > = 80 Ⅱ y2 く 0 Ⅱ y2 〉 = 25 ) 24 : return(-l) ; 25 : 26 : if()l = x2 & & yl return( の 28 : if()l 〉 x2) 29 : iswap (&xl, &x2) ・ 30 : if()l 〉 y2) 31 : iswav (&yl, &y2) : 32 : 33 : Strc ()o ・ i 34 : 35 : xlen = x2 ー xl + 1 36 : ylen = y2 ー yl + 1 38 : mid(cc,moji,l, xlen); 39 : 40 : for( i=0;i く ylen; i + + ) { 41 : mvprintw()l + i, xl, ” XS 42 : 43 : return( の ; 44 : List 7 List 6 Number h> く curses. = y2) リンクは行わずコンパイルのみ行う ) (MS-C 用 config. h) #define MSC #ifndef MSDOS #define MSDOS #endif #ifndef PROTOTYPE #define PROTOTYPE attron, wattroff などの関数がないのて , ソ CURSES ライプラリとリンクする場合に は , コンパイル ( あるいはリンク ) の際にリ ース自体を若干修正する必要がある。 ンクオプションを指定する必要がある。 参考文献 (/usr/5bin/) cc sample. c -g -lcbox -lcurses -ltermcap ー 0 sample $-lcbox" とは , ライプラリ libcbox. a の ① AxeI T. Schreiner, "USING C with C 指定てある。 URSES, LEX and YACC " , Prentice このライプラリには , utextke4() 関数 , Hall, 1990 iswap ( ) 関数など UNIX 版 curses に含まれて ② Berny Goodheart, " UNIX Curses Exp lained", Prentice Hall, 1991 いない関数をコンパイル後収録しておく必 要がある。なおカッコ内は , SUN ワークス ③ジョン・ストラング著 / 矢吹道郎監修 / 菊 テーションの場合てある。 池彰訳 TCURSES 』啓学出版 (UNIX 用 config. h) ④ K. ハヴィランド , B. サラマ共著 / 玉井浩 #define UNIX 訳「 UNIX システムプログラミング』サイエ #define SYSV ンス出版 ⑤村山集治著『改訂 dBASE Ⅲ売上管理』ア 【注意】 SONY NEWS の curses ( こ一よ , ムコインターナショナル #endif 【 UNIX 】 道具箱に追加された関数を UNIX 上てコン パイルし , 特定のライプラリ ( たとえば libc b 。 x. a ) に追加するには , 以下のような操作 を行えばよい (/usr/5bin/)cc •func. c -c -g ar Ⅳ libcbox. a func. 0 138 C MAGAZINE 1 2 2

9. 月刊 C MAGAZINE 1992年2月号

応用 C 言語 C の道具箱 / ーパー機能のしイ ER Ⅵ誕 1 ノヾソコンが UN Ⅸ WS の端末に UN Ⅸ用端末工ミュレータ グラフィ、ス 漢字 語機能 文字コードは、 JIS か MS 漢字コードの 2 種 類から選択。 JIS のモードて、は、全ての文字 コード拡張手順をサポート。 JIS 初期値と JIS 現在値を任意に変更て、きるため、 EUC コードや DEC コードにも完全に対応 フィックス機能 テクトロニクス 4014 端末に準拠したグラフ ィックモード。カラーて、の出力も可。 最制財幾能 JIS と重複する画面消去コードを除き、 PC9801 と上位互換を持つように拡張され ている。ビジプルベル、カーソルの形状変 更、プリンタの有無などの制御コードを含 む。これらはローカルに変更可。 List 5 tarval = TFRMKEY(keyno, &Gpdkey_target) ; if (LKISAM(ENABLE) Ⅱ EQLREC(keyno, tarval,G01d—hin) ) { myerr 1 sam_err LKISAM(FREE) ; return(myerr) ; 0 1 りな 00 4 一 .0 6 7 8 9 0 1 りな 3 4 戸 0 一 .0 【 0 一 -0 0 -. 0 【 -0 一 .0 LD 0 6 6 6 6 6 NEC ー PC9800 シリーズ EPSON ー PC286 シリーズ (MS-DOS パージョン 3.1 以降 ) getimg(Gold—hin, Gpdfldtyp, Gpdfldlen, Gpd01dptr, PD—NO—FLD) ; LKISAM(FREE) ; mid(pdname, Gpd01d—image. name, 1 , PDNAMEL) ; mid(baika , Gpd01d—image. baikm 1 , PDBAIKAL) ; return( の ; 【 Turbo C 】 Turbo C て、コンパイルする場合には , コ ンパイルスイッチを以下のように設定する とともに , Turb0C コンパイラのディレク トリ下の INCLUDEi•ィレクトリの中に , c onfig. h として以下のファイルを入れておく 必要がある。また統合環境の中て、コンパイ ルするのてはなく , TCC を使用する。 tcc -v -K -J -w -ml -c ( デバッガを使用 /char を unsigned char にす る / 漢字を使用する / 警告あり / ラージメモリ モデル / リンクは行わずコンパイルのみ行う ) (TurbO C 用 config. h) #define TU RBOC #ifndef MSDOS #define MSDOS #endif #ifndef PROTOTYPE #define PROTOTYPE #ifdef PROTOTYPE #include "cboxprot. h" #endif getstime (datee, timee, Y0bi ) char * datee ; char * timee ; char * yobi [ 引数 ] datee ←日付データ timee ←時間データ yobi ←曜日デ ータ [ 戻り値 ] 正常終了の場合は 0 を返す。 [ 機能 ] システム時間を取得し , 日付を datee に , 時 間を timee に , 曜日を yobi に格納する。 道具箱に追加された関数は , TurboCV 【 MS-C 】 er. 2.0 および MS-CVer. 6.0 上てコンパイ MS-C< コンパイルする場合には , 従来と ル可能なものてある。いずれの場合にも各 同様にコンパイルスイッチを設定するとと プログラムは分割コンパイル用のものなの もに , MS ー C コンパイラのディレクトリ下の て , コンパイル後オプジェクトファイルを INCLUDEi•ィレクトリの中に , config. h と 読者のライプラリに追加していだきたい して以下の内容のファイルを入れておく必 なお , 上記のとおり , ここて紹介した ma 要がある。 in ( ) 関数は , c-treePIus を使用しているの CL /AL /Od /W4 /Zi /J /c 関数 . c て , 実行ファイルを作成することはてきな ( ラージメモリモード /CodeView を使用 / 警 告レベルは 4/char を unsigned char にする / 機能 RS ー 232C 拡張インターフェースポード 3 チャンネルのうち 1 チャンネルを選択使用。 75baud から 19200baud ( クロック l()MHz 以 上 ) まて使用可、しかも、その高速処理は 群を抜く。フロー制御は XON/XOFF によ る制御法と信号法から選択。 爿イル転送機能 UNIX ホストと DOS ファイルの間て、のテ キストファイル送受信が自在。コマンドは、 UNIX の cu と同様の操作。 その他多彩な機能満載、しかも低価格実現 価格 48 , 000 円 ( 消費税は別途 ) 開発及び販売 第情報数理研究所 lnforrnation 印 Ma せ一 t 紀 sc ・レ侊 Y. ー 〒ロー東京都豊島区池袋 2 ー 437 池袋青柳ビル TEL. 03ー 3590 ー 52 Ⅱ ( 代表 ) FAX. 03-3590 ー 5353 く資料請求番号 13 / 〉 応用 C 言語 137 #endif

10. 月刊 C MAGAZINE 1992年2月号

ログラミング 円羽信夫の イラスト・山形彰吾 puts(" ロ / ヾ puts ( " ロ / ヾ puts(" ロ /ヾ その 2 出不精 ここに登場するロバート佐々木氏は , C 言 語はおろか , ノヾソコンはワープロソフトし か使ったことがないという人物てある。 の , 頑固てはあるが , 気のよい老年 ( 70 近辺 か ? ) 紳士てあるロバート氏との C プログラ ミング勉強会が本格的に始まったのは先月 のことてある。以来 , 何の音沙汰もなかっ たのだが , 今日 , わが家の郵便ポストに久 しぶりに氏から手紙が届いていた。 前略 , またプログラムを作ったので見 てほしい。今回のはけっこういいぞ。な にせ , 1 か月の学習の集大成だからな。 / * 名前 . c * / #include く stdiO. h > けていく。 こだけの話だが , 愚息には main() puts ( ” puts(" ロ / ヾ ロ / ヾ ート佐々木 " ) ; ート佐々木 " ) : ート佐々木 " ) : ート佐々木” ) ート佐々木” ) ; もったいないくらいの女だ。孫の吉夫に しても , 小生の頭のよさに驚嘆したのだ ろう。最近は , ロごたえも少なくなり格 段に素直になった。 なにかに打ち込むということは他人か ら見れば美しいことなのだろう。実に , けっこうなことだ。あ , 長々と書くのは 性に合わんのでこのへんでやめる。 いつもながら唐突な手紙て、ある。あいか わらず puts ( ) にしがみついていて , そこか ら一歩も進んて、いないようだ。それても , 1 か月の集大成などといってのける。立派な ものだ。早速 , 返事を郵送した。 前略 , お手紙 , 拝読しました。なかな か進歩しましたね。ところで , 次のよう にすると繰り返しをしてくれます。 #include く stdio. h > / * 名前 2. c * / main ( ) for (i=0; i く 5 : i 十十 ) puts( ”ロバート佐々木 " ) : ロバートさんの人生観 , 楽しく読ませ int i ・ ところで , C のプログラムを始めてから 毎日が充実している。これは , たいへん ありがたい。つい先日まで , ほんやりし て一日を過ごすことも多かったのだが最 近は常に頭を使っている感じがしてすこ ぶる快調な毎日だ。 今回 , 痛感した。人間は , 頭を使うか ら人間なのであって , 頭を使わなければ 人間ではない。実際のところ , プログラ ムというのは頭を非常に使う仕事だから 小生のような生まれつきのインテリには びったりな内容でとてもよい。嫁の久美 子さんも , プログラムに打ち込む小生の 姿を微笑ましく思っているようだ。小生 に「がんばってますね」と背後から声をか 152 C MAGAZIN E 1992 2 ていただきました。 丹羽信夫 投函してから数日後 , 返事の手紙が届い た。先月もそうだったのだが , こちらの手 紙の内容に , 何か引っかかることがあると 猛烈な早さて返事をよこすのて、ある。 前略 , 繰り返しの方法を教えていただ き , 感謝に耐えない。しかし , たった 5 回 の繰り返しを不精するとは , 丹羽さんも 情けない。いくら歳をとったとはいえ , たった 5 回の繰り返しを不精するなど小生 の性格には合わぬ。いいかげん , 小生の 性格を理解してくれてもいい頃ではない か ? それに , 今回も単に繰り返し方法を例 示してもらっただけでなんら説明らしい 説明を受けていない。これでは , プログ ラミングを教えてもらっているとは到底 思えない。ーを聞いて百を知るというの が小生の得意技だからやっていけるのだ。 不精についての余談だが , 最近の大学 生は不精という言葉も知らんらしい。東 京の女子大 ( どうだ , すごいだろう ) に通 って , ユニックスとかいうものを学んで いる孫の久美子だが , 家にいるときは出 不精でこまる。部屋でごろごろして , 食 ってばかりいては太る一方ではないか。 まあ , 不純な遊戯場で遊びほうけてい る学生にくらべれば上できだが , これは これなりに心配ではある。 そこで , 先日 , 久美子に「出不精ではな いか , 反省せよ」と注意を喚起したとこ ろ , へソを曲げてしまった。わからん奴 だ。実の孫とはいえ , まことに , 嘆かわ しい。 そこで今回の出不精 . c なは出不精〃 の読み方を教えてくれるプログラムだ。 #include く stdio. h > / * 出不精 . c * / main( ) puts(" でぶしよう " ) : あまり , 進歩しとらんような気もするが 丹羽さんは太っ腹だから安心だ。 R. 佐々木