騰訊實習筆試題--簡單計算器程式的c語言實現

pengfoo發表於2012-01-05
 
/*本程式是一個簡單的計算器模擬程式。對任意給定的正確的四則表示式,程式計算其結果值並輸出。表示式中運算分量為無
正負號整數,運算子為+ - * / ,圓括號按常規配對,表示式以“=”結束。函式getach()為獲取表示式的一個合法字元,
並將字元存入變數curch;函式指標陣列func[]是為了統一加減乘除計算而設定的。*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int add_fun(int x,int y){return x+y;}
int sub_fun(int x,int y){return x-y;}
int mul_fun(int x,int y){return x*y;}
int div_fun(int x,int y){return x/y;}
int (*func[])(int ,int)={add_fun,sub_fun,mul_fun,div_fun};

int num,curch;
char chtbl[]="+-*/()=";
char corch[]="+-*/()=0123456789";

int getach()
{
	int i;
	while(1)
	{
		curch=getchar();
		if(curch==EOF)
			exit(0);
		for(i=0;corch[i]&&curch!=corch[i];i++);
		if(i<strlen(corch))
			break;
	}
	return curch;
}

int getid()
{
	int i;
	if(curch>='0'&&curch<='9')
	{
		for(num=0;curch>='0'&&curch<='9';getach())
			num=num=10*num+(curch-'0');	
			return -1;
	}
	else
	{
		for(i=0;chtbl[i];i++)
			if(chtbl[i]==curch)
				break;
		if(i<=5)
			getach();
		return i;
	}
}


int cal()
{
	int x1,x2,x3,op1,op2,i;
	i=getid();
	if(i==4)
		x1=cal();
	else
		x1=num;
	op1=getid();
	if(op1>=5)
		return x1;
	i=getid();
	if(i==4)
		x2=cal();
	else
		x2=num;
	op2=getid();
	while(op2!=6 && op2!= 5)
	{
		i=getid();
		if(i==4)
			x3=cal();
		else
			x3=num;
		if((op1/2==0)&&(op2/2==1))
			x2=(*func[op2])(x2,x3);
		else
		{
			x1=(*func[op1])(x1,x2);
			x2=x3;
			op1=op2;
		}	
		op2=getid();
	}
	return (*func[op1])(x1,x2);
}

int main(int argc,char* argv[])
{
	int value;
	printf("please input an expression:\n");
	getach();
	while(curch!='=')
	{
		value=cal();
		printf("the result is:%d\n",value);
		printf("please input an expression:\n");
		getach();
	}
	return 0;
}

相關文章