写了一个简单计算器,主要实现了1.表达式求值。主要用栈。
2.乘方开方。
3.数值转换。
4.求绝对值。
/**********************************************/
/* 作者:Dick */
/* 日期:2017.1.5 */
/* 功能:简单计算器 */
/**********************************************/
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#define MAXSIZE 100
#define OK 1
#define ERROR 0
//主函数声明
double arithmetic();
double power_root();
int transform();
int absolute_value ();
/***************菜单***************/
short menu()
{
system("color 4e");
char s_b1[] = { " " };//space_black
char s_b2[] = { " " };//space_black
int a = 0;
printf("%s", s_b1);
printf("/***************************/\n");
printf("%s", s_b2);
printf("以下就是您需要的功能:\n");
printf("%s", s_b2);
printf("1.加减乘除。\n");
printf("%s", s_b2);
printf("2.乘方开方。\n");
printf("%s", s_b2);
printf("3.进制转换。\n");
printf("%s", s_b2);
printf("4.求绝对值。\n");
printf("%s", s_b2);
printf("5.退出。\n");
printf("%s", s_b1);
printf("/****************************/\n");
scanf("%d", &a);
switch (a)
{
case 1:printf("请输入你的表达式并以'#'结尾\n");
printf("最终结果为:%lf\n", arithmetic()); break;
case 2:printf("最终结果为:%lf\n",power_root());break;
case 3:transform();break;
case 4:absolute_value();break;
case 5:return 0;
default: break;
}
system("pause");
system("cls");
return 1;
}
/******************1.加减乘除****************/
//子函数声明
int ln(char ch);
char precede(char a, char b);
double two_count(double a, char mm, double b);
/***************顺序栈*************/
typedef struct
{
double *base;
double *top;
int stacksize;
}Nustack; //数字栈 number
typedef struct
{
char *base;
char *top;
int stacksize;
}Opstack; //运算符栈 operator
//加减乘除主函数
double arithmetic()
{
char c = 0, theta = 0;
double a = 0, b = 0;
//创建一个空栈(数字栈)
Nustack S;
S.base = (double*)malloc(MAXSIZE * sizeof(int) * 2);
S.top = S.base;
S.stacksize = MAXSIZE;
//创建一个空栈(运算符栈)
Opstack OP;
OP.base = (char*)malloc(MAXSIZE * sizeof(char));
OP.top = OP.base;
OP.stacksize = MAXSIZE;
//push(O,'#')插入元素为栈顶元素
OP.top++;
*OP.top = '#';
c = getchar();
while (c != '#' || *OP.top != '#')
{
if (ln(c) == ERROR) //不是运算符进栈
{
*S.top++;//push
*S.top = c - '0';
c = getchar();
}
else //是运算符则去判断
{
switch (precede(*OP.top, c))
{
case '<':OP.top++; //push
*OP.top = c;
c = getchar(); break;
case '=':OP.top--; //pop
c = getchar(); break;
case '>':theta = *OP.top--;//pop
a = *S.top--;//pop
b = *S.top;//pop
*S.top = two_count(a, theta, b); break;
}
}
}
return (*S.top);
}
//加减乘除下子程序
//a.判断输入字符是否为为运算符
int ln(char ch)
{
if (ch == '+') return OK;
if (ch == '-') return OK;
if (ch == '*') return OK;
if (ch == '/') return OK;
if (ch == '(') return OK;
if (ch == ')') return OK;
if (ch == '#') return OK;
return ERROR;
}
//b.比较符号a和符号b的优先级
//如果a优先于b,则返回>,否则返回<或=
char precede(char a, char b) {
int i, j;
char pre[][7] = {
/*运算符之间的优先级制作成一张表格*/
//+,-,*,/,(,),#
{ '>','>','<','<','<','>','>' },
{ '>','>','<','<','<','>','>' },
{ '>','>','>','>','<','>','>' },
{ '>','>','>','>','<','>','>' },
{ '<','<','<','<','<','=','0' },
{ '>','>','>','>','0','>','>' },
{ '<','<','<','<','<','0','=' } };
switch (a) {
case '+': i = 0; break;
case '-': i = 1; break;
case '*': i = 2; break;
case '/': i = 3; break;
case '(': i = 4; break;
case ')': i = 5; break;
case '#': i = 6; break;
}
switch (b) {
case '+': j = 0; break;
case '-': j = 1; break;
case '*': j = 2; break;
case '/': j = 3; break;
case '(': j = 4; break;
case ')': j = 5; break;
case '#': j = 6; break;
}
return pre[i][j];
}
//c.把啊a,b进行二元运算
double two_count(double a, char mm, double b)
{
if (mm == '+') return (a + b);
if (mm == '-') return (a - b);
if (mm == '*') return (a*b);
if (mm == '/') return (a / b);
}
/*****************2.乘方开方*****************/
double power_root()
{
double x=0,y=0,n=0;
printf("请输入底数:\n");
scanf("%lf",&x);
printf("请输入指数:\n");
scanf("%lf",&y);
n=pow(x,y);
return (n);
}
/*****************3.进制转换*****************/
int transform()
{
int j=0;
int x=0,y=0,N=0,d=0;
int str[MAXSIZE];
printf("提示:目前支持十进制转换为二,八,十六进制\n");
printf("输入要转换的进制:(例如:转换为二进制输入 2)\n");
scanf("%d",&d);
printf("请输入需要转换的数字:\n");
scanf("%d",&N);
x=N;
if(d==2||d==8||16)
{
while(x>0)
{
y=x-x/d*d;
x=x/d;
str[j]=y;
j++;
}
for(j=j-1;j>=0;j--)
{
if(str[j]>9)
{
switch(str[j])
{
case 10:printf("A");break;
case 11:printf("B");break;
case 12:printf("C");break;
case 13:printf("D");break;
case 14:printf("E");break;
case 15:printf("F");break;
default: break;
}
}
else
printf("%d",str[j]);
}
}
else
return ERROR;
return 0;
}
/*******************4.求绝对值*******************/
int absolute_value ()
{
double x=0;
printf("请输入要求绝对值的数:\n");
scanf("%lf",&x);
if(x>=0)
printf("%lf的绝对值是:%lf\n",x,x);
else
printf("%lf的绝对值是:%lf\n",x,-x);
return 0;
}
/*******************主函数************************/
int main()
{
while(menu());
return 0;
}