ちょっと前のクイズ(3)

 拙ブログの記事「ちょっと前のクイズ(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