简单计算器

写了一个简单计算器,主要实现了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;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值