#4
by かずま » 8年前
ソースプログラムを貼り付けるときは、codeタグを使ってほしかった。
フォーラムルールをよく読んでください。お願いします。
さて、計算部分ですが、ちょっと謎めいた書き方をしています。
これを解読して、普通の書き方に直して、返信に貼り付けてください。
コード:
#include <stdio.h> // printf, fopen, fclose, fgets
#include <stdlib.h> // strtod, exit
#include <ctype.h> // isspace, isdigit
#include <math.h> // pow
#define MAX_STRINGS 80
unsigned char c;
const char *p, o[] = "+-*/^^";
int get(void) { do c = *p++; while (isspace(c)); return c; }
double expr(const char *b)
{
double v;
if (*b)
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
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) :
(v = c = 1);
return v;
}
int calc(const char *s, double *v) { return p = s, *v = expr(o), c; }
int main(void)
{
char filename[] = "data.txt";
FILE *fp;
char data[MAX_STRINGS];
if ((fp = fopen(filename, "r")) == NULL) { /* ファイル・オープン */
printf("ファイル「%s」のオープンに失敗しました。プログラムを終了します。\n", filename);
exit(1);
}
while (fgets(data, MAX_STRINGS, fp) != NULL) { /* データ処理 */
double val;
printf("%s", data);
if (calc(data, &val))
printf(" error\n");
else
printf(" %.15g\n", val);
}
fclose(fp); /* ファイル・クローズ */
return 0;
}
data.txt
コード:
2+3
1 + 2*(3-4)/5
355/113
2^3^2
4**5
実行結果
コード:
2+3
5
1 + 2*(3-4)/5
0.6
355/113
3.14159292035398
2^3^2
512
4**5
error
ソースプログラムを貼り付けるときは、codeタグを使ってほしかった。
フォーラムルールをよく読んでください。お願いします。
さて、計算部分ですが、ちょっと謎めいた書き方をしています。
これを解読して、普通の書き方に直して、返信に貼り付けてください。
[code=c]
#include <stdio.h> // printf, fopen, fclose, fgets
#include <stdlib.h> // strtod, exit
#include <ctype.h> // isspace, isdigit
#include <math.h> // pow
#define MAX_STRINGS 80
unsigned char c;
const char *p, o[] = "+-*/^^";
int get(void) { do c = *p++; while (isspace(c)); return c; }
double expr(const char *b)
{
double v;
if (*b)
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
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) :
(v = c = 1);
return v;
}
int calc(const char *s, double *v) { return p = s, *v = expr(o), c; }
int main(void)
{
char filename[] = "data.txt";
FILE *fp;
char data[MAX_STRINGS];
if ((fp = fopen(filename, "r")) == NULL) { /* ファイル・オープン */
printf("ファイル「%s」のオープンに失敗しました。プログラムを終了します。\n", filename);
exit(1);
}
while (fgets(data, MAX_STRINGS, fp) != NULL) { /* データ処理 */
double val;
printf("%s", data);
if (calc(data, &val))
printf(" error\n");
else
printf(" %.15g\n", val);
}
fclose(fp); /* ファイル・クローズ */
return 0;
}
[/code]
data.txt
[code=text]
2+3
1 + 2*(3-4)/5
355/113
2^3^2
4**5
[/code]
実行結果
[code=text]
2+3
5
1 + 2*(3-4)/5
0.6
355/113
3.14159292035398
2^3^2
512
4**5
error
[/code]