您的位置:首页 > 其它

CODE[VS]1015 计算器的改良

2017-09-05 16:53 295 查看
题目:http://codevs.cn/problem/1015/

思路:将方程式简化为一个系数,一个常数,然后计算未知数值

题解:

/* 1015 计算器的改良 */
#include <stdio.h>

#define DEBUG

#define toInt(X) (X-'0')

#define MAXL 200

char equation[MAXL];    /* 方程式 */
double coefficient;     /* 系数 */
double constant;        /* 常数 */
double unknown_n;       /* 未知数值 */
char  unknown_ch;       /* 未知数字符 */

/* 获取系数,常数,未知数字符 */
void deal_equation(){
double t;   /* 临时值 */
char ch;    /* 当前方程式字符 */
int i;      /* 索引 */
double sign;    /* 符号位 */
int is_left;    /* 当前值位于等号的左边还是右边 */
/* 初始化索引指,符号位,等号位置,系数和常数 */
i = 0;
t = 0.0;
is_left = 1;
sign = 1.0;
coefficient = constant = 0.0;
while('\0' != (ch = equation[i++])){
/* 下一个字符为数字 */
if(ch >= '0' && ch <= '9'){
if(0.0 == t){
t = toInt(ch) * sign * is_left;
}
else{
t = t * 10.0 + toInt(ch) * sign * is_left;
}
}
/* 下一个字符为未知数字符, 上一次获取值为系数 */
else if(ch >= 'a' && ch <= 'z'){
if(0.0 == t){
t = 1.0 * sign * is_left;
}
unknown_ch = ch;
coefficient = coefficient + t;
t = 0.0;
sign = 1;
}
/* 下一个字符为 '-' 操作符, 上一个值为常数,下一个符号为负 */
else if(ch == '-'){
constant = constant + t;
t = 0.0;
sign = -1;
}
/* 下一个字符为 '+' 操作符, 上一个值为常数,下一个符号为正 */
else if(ch == '+'){
constant = constant + t;
t = 0.0;
sign = 1;
}
/* 下一个字符为 '=' 操作符, 上一个值为常数,反转等号后的符号 */
else if(ch == '='){
constant = constant + t;
t = 0.0;
sign = 1;
is_left = -1;
}
}
/* 最后一个常量加入到常数中 */
constant = constant + t;
}

/* 主函数入口 */
int main(int argc, char *argv[]) {

#ifdef DEBUG
FILE *fp;
if(NULL == (fp = fopen("data.txt", "r"))){
return 1;
}
#endif

/* 获取方程式 */
#ifdef DEBUG
fscanf(fp, "%s", equation);
#else
scanf("%s", equation);
#endif

/* 分析方程式,获取系数,常数和未知字符 */
deal_equation();

unknown_n = constant / coefficient * -1.0;

printf("%c=%0.3f", unknown_ch, unknown_n);
#ifdef DEBUG
fclose(fp);
#endif

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: