C语言实现简单计算器

本文介绍了如何使用回调函数法和函数指针数组法实现一个简易的计算器程序。通过菜单选择运算类型,用户可以进行加、减、乘、除、取模和异或操作。回调函数法中,利用函数指针在Calc函数中调用对应的运算函数;函数指针数组法更进一步,直接通过数组存储运算函数地址,简化了switch语句,提高了代码的可读性和可扩展性。
摘要由CSDN通过智能技术生成

目录

1.实现目标

2.实现方法

1.回调函数法

 2.函数指针数组法


1.实现目标

我们要实现一个简易计算器,提供可选择功能包括加,减,乘,除,取模和异或。

2.实现方法

1.回调函数法

首先我们需要打印一个计算器菜单供使用者选择计算类型,我们可以自定义简单的菜单函数menu,再利用do while循环加switch语句完成用户选则功能,具体实现方法可以看我的另一篇博客:猜数字游戏。如果是在每一个case里进行打印提示和,输入数字和函数调用会显得非常繁冗,并且不利于新运算类型的添加,我们可以将其改进:将以上数条语句包装,利用一个函数Calc来实现我们将不同的运算函数的地址传入Calc函数,利用函数指针接收,在内部进行调用。程序形式便得到简化。

void menu()
{
	printf("***************************\n");
	printf("***** 1.加法   2.减法  *****\n");
	printf("***** 3.乘法   4.除法  *****\n");
	printf("***** 5.取模   6.异或  *****\n");
	printf("*****      0.exit     *****\n");
	printf("***************************\n");

}
int Add(int x, int y)
{
	return x + y;
}
int Sub(int x, int y)
{
	return x - y;
}
int Mul(int x, int y)
{
	return x*y;
}
int Dvi(int x, int y)
{
	return x / y;
}
int Mol(int x, int y)
{
	return x%y;
}
int Xor(int x, int y)
{
	return x^y;
}
void Calc(int(*p)(int, int))
{
	int a, b;
	printf("请输入运算数");
	scanf("%d%d", &a, &b);
	printf("%d\n", (*p)(a, b));
}
int main()
{
	int input;
	do
	{
		menu();
		printf("请选择运算\n");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			Calc(Add);
			break;
		case 2:
			Calc(Sub);
			break;
		case 3:
			Calc(Mul);
			break;
		case 4:
			Calc(Dvi);
			break;
		case 5:
			Calc(Mol);
			break;
		case 6:
			Calc(Xor);
			break;
		case 0:
			printf("退出成功\n");
			break;
		default:
			printf("输入错误,请重新输入\n");
			break;
		}
	} while (input);
	return 0;
}

 2.函数指针数组法

我们还有一种方法可以更加方便地解决上述问题:将几个基本运算函数用数组的形式存储和调用,这便用到了函数指针数组,这样做还有一个好处:switch语句也不需要了。

void menu()
{
	printf("****************************\n");
	printf("***** 1.加法   2.减法 ******\n");
	printf("***** 3.乘法   4.除法 ******\n");
	printf("***** 5.取模   6.异或 ******\n");
	printf("*****      0.exit     ******\n");
	printf("****************************\n");

}
int Add(int x, int y)
{
	return x+y;
}
int Sub(int x, int y)
{
	return x-y;
}
int Mul(int x, int y)
{
	return x*y;
}
int Dvi(int x, int y)
{
	return x/y;
}
int Mol(int x, int y)
{
	return x%y;
}
int Xor(int x, int y)
{
	return x^y;
}
int main()
{
	int input,a,b;
	do
	{
		menu();
		printf("请选择计算类型>:");
		scanf("%d", &input);
		if (0<input&&input<7)
		{
			printf("请输入>:");
			scanf("%d%d", &a, &b);
			int(*Fun[])(int, int) = { 0, Add, Sub, Mul, Dvi, Mol, Xor };
			printf("%d\n", Fun[input](a, b));
		}
		else if (input==0)
		{
			printf("计算器关闭\n");
		}
		else
		{
			printf("输入错误\n");
			break;
		}
	} while (input);
	return 0;
}

C语言编写一个简单的命令行计算器,包括基本的四则运算以及阶乘功能,我们可以设计一个结构化的菜单驱动程序。下面是一个基础的示例: ```c #include <stdio.h> #include <math.h> // 定义计算函数 double add(double a, double b) { return a + b; } double subtract(double a, double b) { return a - b; } double multiply(double a, double b) { return a * b; } double divide(double a, double b) { if (b != 0) return a / b; else printf("Error: Division by zero is not allowed.\n"); return 0; } double factorial(int n) { if (n == 0 || n == 1) return 1; else return n * factorial(n - 1); } // 主菜单函数 void menu() { int choice; printf("\nCalculator Menu:\n"); printf("1. Addition\n"); printf("2. Subtraction\n"); printf("3. Multiplication\n"); printf("4. Division\n"); printf("5. Factorial\n"); printf("6. Exit\n"); scanf("%d", &choice); switch (choice) { case 1: // 加法 double num1, num2; printf("Enter two numbers for addition: "); scanf("%lf %lf", &num1, &num2); printf("Result: %.2f\n", add(num1, num2)); break; case 2: // 减法 scanf("%lf %lf", &num1, &num2); printf("Result: %.2f\n", subtract(num1, num2)); break; case 3: // 乘法 scanf("%lf %lf", &num1, &num2); printf("Result: %.2f\n", multiply(num1, num2)); break; case 4: // 除法 scanf("%lf %lf", &num1, &num2); divide(num1, num2); break; case 5: // 阶乘 int fact_num; printf("Enter an integer for factorial: "); scanf("%d", &fact_num); printf("Factorial: %d\n", factorial(fact_num)); break; case 6: // 退出 printf("Exiting calculator...\n"); break; default: printf("Invalid choice. Please try again.\n"); break; } } int main() { while (true) { menu(); } return 0; } ```
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值