拙ブログの記事「ちょっと前のクイズ(2)」で使用した関数電卓のソース calc.c がリンク切れになっているようなので、EZFUNC のソースを使って Evaluate 関数等を書き直してみました。「ちょっと前のクイズ」といっても、だいぶ前になってしまいましたが、この記事の続きということで、こんなタイトルになってしまいました。(^_^;
EZFUNC.c の main と calculate と *lineinput と openlog 関数のプロトタイプと関数本体を「#if 0 〜 #endif」で無効化して _EZFUNC.c に改名したソースを使います。
bcc32 でコンパイルすると、警告が出ますがそのままでも大丈夫です。気になる場合は _EZFUNC.c の readpara 関数の「p = NULL;」を「*p = NULL;」に修正すれば警告は出なくなります。もともと LSI-C86 用のソースなので Borland C++ との仕様の違いから、本当は他にも修正する必要がありますが、ユーザー定義関数や変数を使わなければ上記の修正だけで使えます。(^_^;
ちなみに、0.0/0.0で NaN を作っても「NaN!=NaN」にはならないようだし、なんか危ない感じがするので、-DBL_MAX で NaN の代用をしました。(^_^;
実行結果は同じなので省略しました。
● Quiz_07_1.c
/* * Quiz_07_1.c */ #include <stdio.h> // EZFUNC.c の main と calculate と *lineinput と openlog 関数のプロトタイプと // 関数本体を #if 0 〜 #endif で無効化して _EZFUNC.c に改名したソース #include "_EZFUNC.c" // _EZFUNC.c を使いやすくするための関数 #include <float.h> double Evaluate(char *src) { char *p; double r; removespace(src); p = src; r = calc1(&p); if(p==NULL) r = -DBL_MAX; // エラーのときは-DBL_MAXを返す return(r); } int main(void) { double res; char buf[64],opr[8]="+-*/"; // 少し多めに余裕をもって int i,j,k; for(i=0; i<4; i++){ for(j=0; j<4; j++){ for(k=0; k<4; k++){ sprintf(buf,"9%c4%c6%c2",opr[i],opr[j],opr[k]); printf("%s=% .16g",buf,res=Evaluate(buf)); if(res==4.0) printf(" <---------- Hit!\n"); else printf("\n"); } } } return(0); }
※参考URL
●EZFUNC