下面介绍两种办法求解: 代码1:

#include<stdio.h>
void menu()
{
printf("***** 1.Add   2.Sub  *****\n");
printf("***** 3.Mul   4.Div  *****\n");
printf("***** 5.Xor   0.exit *****\n");
}
int Add(int x,int y)
{
	int z = 0;
	z = x + y;
	return z;
}
int Sub(int x,int y)
{
	int z = 0;
	z = x - y;
	return z;
}int Mul(int x,int y)
{
	int z = 0;
	z = x * y;
	return z;
}int Div(int x,int y)
{
	int z = 0;
	z = x/y;
	return z;
}
int Xor(int x,int y)
{
	int z = 0;
	z = x ^ y;
return z;
}
int main()
{
	int x = 0;
	int y = 0;
	int input = 0;
	int sum = 0;
	int (*pa[6])(int,int) = {0,Add,Sub,Mul,Div,Xor};
	do
	{
	menu();
	printf("请选择:>");
	scanf("%d",&input);
	if(input>=1 && input<=5)
	{
		printf("请输入两个操作数:");
	scanf("%d%d",&x,&y);
	sum = pa[input](x,y);
	printf("%d\n",sum);
	}
	else if(input == 0)
	{
	printf("退出\n");
	}
	else 
	{
	printf("选择错误,请重新输入\n");
	}
	}while(input);
return 0;
}

代码1主要是利用函数指针数组求解,比较繁琐,还有就是在求最终结果时,调用的是函数数组里面的函数。


代码2:

#include<stdio.h>
void menu()
{
printf("***** 1.Add   2.Sub  *****\n");
printf("***** 3.Mul   4.Div  *****\n");
printf("***** 5.Xor   0.exit *****\n");
}
int Add(int x,int y)
{
	int z = 0;
	z = x + y;
	return z;
}
int Sub(int x,int y)
{
	int z = 0;
	z = x - y;
	return z;
}int Mul(int x,int y)
{
	int z = 0;
	z = x * y;
	return z;
}int Div(int x,int y)
{
	int z = 0;
	z = x/y;
	return z;
}
int Xor(int x,int y)
{
	int z = 0;
	z = x ^ y;
return z;
}
void Calc(int (*pa)(int ,int ))
{
	int x = 0;
	int y = 0;
	printf("请输入两个操作数:>");
	scanf("%d%d",&x,&y);
	printf("%d\n",pa(x,y));
}
int main()
{
	int input = 0;
	do
	{
	menu();
	printf("请选择:>");
	scanf("%d",&input);
	switch(input)
	{
	case 1:
		Calc(Add);
	break;
		case 2:
		Calc(Sub);
	break;
		case 3:
		Calc(Mul);
	break;
		case 4:
		Calc(Div);
	break;
		case 5:
		Calc(Xor);
	break;
		case 0:
		printf("退出\n");
	break;
		default:
		printf("选择错误,请重新选择\n");
	}
	}while(input);
	return 0;
}

代码2主要利用回调函数,就很好的避免了冗余,最后编译出错是因为没写完整do{}while;语句,真头大。