计算器核心代码在这里
- int split_expr(char *expr, int *num, char *ops);
- int calc(int *num, char *ops,int count);
- int power(int a);
- void move_left_int(int *arr, int s,int e);
- void move_left_chr(char *arr, int s,int e);
- void main()
- {
- char expr[] = "11+22-33*55/11-2";//这里是任意加减乘除表达式
- int count;
- int num[20];
- char ops[20];
- count = split_expr(expr, num, ops);
- calc(num,ops,count);
- }
- int split_expr(char *expr, int *num, char *ops)//将字符串expr分解成数字num[]和运算符ops[]两个数组
- {
- int i, j,count_num = 0, numbit[20];
- while (*expr != '\0')//直到遍历到字符串结尾
- {
- if (*expr > 47 && *expr < 58)//ASCII中48~57是0~9整数
- {
- count_num++;
- i = 0;
- while (*expr > 47 && *expr < 58)
- {
- numbit[i++] = (*expr++)-48;//用于将ASCII值转换成整数,将每一位数字暂存(i的值会比有效下标大1
- }
- *num = 0;
- for (j = 0; j < i;j++)
- *num += numbit[j] * power(i-1-j);//数字写入num数组,并且移到下一位
- num++;
- }
- else
- *ops++ = *expr++;//如果不是数字,直接将所含字符存进op里,并且将地址+1;
- }
- return count_num;//返回数字的个数,用于计算时遍历
- }
- int calc(int *num, char *ops,int count)
- /*卧槽这里我好想加图片注释...
- 具体思路是遍历两遍,第一遍一旦遍历到 乘 除 就对对应的两个数字进行运算,
- 结果存储在较前那个数字的位置,然后将这两个数字后的所有数字向左移动一格,
- 运算符也作相应的处理.第二遍处理加减*/
- {
- int i, amount = count - 1;
- for (i = 0; i <= amount; i++)//第一遍遍历
- {
- if (ops[i] == '*')
- {
- num[i] = num[i] * num[i + 1];
- move_left_int(num, i + 2, amount + 1);
- move_left_chr(ops, i + 1, amount);
- amount--;
- i--;//回退1:否则可能漏掉运算符
- }
- else if (ops[i] == '/')
- {
- num[i] = num[i] / num[i + 1];
- move_left_int(num, i + 2, amount + 1);
- move_left_chr(ops, i + 1, amount);
- amount--;
- i--;
- }
- }
- for (i = 0; i <= amount; i++)//第二遍遍历
- {
- if (ops[i] == '+')
- {
- num[i] = num[i] + num[i + 1];
- move_left_int(num, i + 2, amount + 1);
- move_left_chr(ops, i + 1, amount);
- amount--;
- i--;
- }
- if (ops[i] == '-')
- {
- num[i] = num[i] - num[i + 1];
- move_left_int(num, i + 2, amount + 1);
- move_left_chr(ops, i + 1, amount);
- amount--;
- i--;
- }
- }
-
- return num[0];
- }
- void move_left_int(int * arr, int s, int e)//这个函数将整型数组arr中从s到e的元素向左移动一格.
- {
- int i;
- for (i = s; i <= e; i++)
- arr[i - 1] = arr[i];
- }
- void move_left_chr(char * arr, int s,int e)//这个函数将字符数组arr中从s到e的元素向左移动一格.
- {
- int i;
- for (i = s; i <= e; i++)
- arr[i - 1] = arr[i];
- }
- int power(int a)//以10为底的幂函数
- {
- int i, res = 1;
- for (i = 0; i < a; i++)
- res *= 10;
- return res;
- }
复制代码
|
|
2015-12-23 07:08:10
评论
举报
|
|
|