知恵袋だと何度も返信できないのでこちらでも質問させていただきます。
リンク先は説明不足なのでこちらで書きます。
こちらの電卓のコード↓を自分のソフトに移植しました。
#include <stdio.h> // printf, puts, fgets
#include <stdlib.h> // strtod
#include <ctype.h> // isspace, isdigit
#include <math.h> // pow
unsigned char c; const char *p, o[] = "+-*/^ "; double m[26];
int get(void) { while (isspace(c = *p++)) ; return c; }
double expr(const char *b)
{
double v;
if (*b) // binary operators; power is right associative
for (v = expr(b + 2); c == b[0] || c == b[1]; )
c == '+' ? v += expr(b + 2) :
c == '-' ? v -= expr(b + 2) :
c == '*' ? v *= expr(b + 2) :
c == '/' ? v /= expr(b + 2) : (v = pow(v, expr(b)));
else // number, parentheses, unary operators, and variable
get() == '.' || isdigit(c) ? v = strtod(p-1, (char **)&p), get() :
c == '(' ? v = expr(o), c == ')' ? get() : (c = 1) :
c == '+' ? v = expr(b) :
c == '-' ? v = -expr(b) :
islower(c) ? v = m[c - 'a'], get() : (v = c = 1);
return v;
}
int main(void)
{
char s[800]; double v; int i;
while (fgets(s, sizeof s, stdin))
p = s, get() == '?' ?
v = expr(o), c ? puts(" --err--") : printf(" %.15g\n", v) :
islower(c) && (i = c - 'a', get() == '=') && (v = expr(o), !c) ?
m[i] = v : puts(" --err--");
return 0;
}
しかし普通に実行してみると4.4ときちんと結果が出ます。
移植後の修正は出力の仕方と、mainのwhile文を無くしたことくらいで、あとは手を付けていません。
知恵袋で書いていますが、double型を2つ足すだけのコードでも同様な結果です。
ただ2.2+5とか、小数点が一回しか出ないのはちゃんと出ます。
足した時に何が原因で数値が変わるのでしょうか?
VC++2010
Windows7