用C语言构建简单计算器:函数指针的奇妙之旅

发布时间:2023年12月24日

????????在这篇博客中,我们将深入探讨使用C语言编写的简单计算器。这个计算器不仅支持基本的加法、减法、乘法、除法,还包括异或运算。我们将利用函数指针和菜单驱动的方法,展示如何创建一个灵活且具有组织性的计算器。

第一种代码展示:

int add(int x,int y ) {
	int z = x + y;
}
int sub(int x, int y) {
	int z = x - y;
}
int cdd(int x, int y) {
	int z = x * y;
}
int fcc(int x, int y) {
    if (y != 0) {
        int z = x / y;
        return z;
    } else {
        printf("错误:除数不能为零\n");

              }
}
int xor(int x, int y) {
	int z = x ^ y;
}
muen() {
	printf("******************************\n");
	printf("*1.和 2.差 3.积 4.商 5.异或  *\n");
	printf("*********** 0.退出 ***********\n");
	printf("******************************\n");
}
int main() {
	int input = 0;
	int x = 0;
	int y = 0;
do
{
	muen();
	printf("请输入你要计算的类型>");
	scanf("%d",&input);
	

	switch (input)
	{
	case 1:
		printf("请输入两个数>");
		scanf("%d%d", &x, &y);
		printf("%d\n", add(x, y));
		break;
	case 2:
		printf("请输入两个数>");
		scanf("%d%d", &x, &y);
		printf("%d\n", sub(x, y));
		break;
	case 3:
		printf("请输入两个数>");
		scanf("%d%d", &x, &y);
		printf("%d\n", cdd(x, y));
		break;
	case 4:
		printf("请输入两个数>");
		scanf("%d%d", &x, &y);
		printf("%d\n", fcc(x, y));
		break;
	case 0:
		printf("退出");
		break;
	default:
		printf("请重新输入!\n");
		break;
	}
} while (input);

代码分析(Code Analysis):

1. 函数定义:
int add(int x, int y) {
    int z = x + y;
}

int sub(int x, int y) {
    int z = x - y;
}

int cdd(int x, int y) {
    int z = x * y;
}

int fcc(int x, int y) {
    int z = x / y;
}

这四个函数(addsubcddfcc)用于执行基本的算术运算。

2. 菜单函数:
void muen() {
    printf("******************************\n");
    printf("*1.和 2.差 3.积 4.商 5.异或  *\n");
    printf("*********** 0.退出 ***********\n");
    printf("******************************\n");
}

这个函数 muen 打印了一个简单的计算器程序菜单,这个可以自己按照自己喜好

3. 主函数:
int main() {
    int input = 0;
    int x = 0;
    int y = 0;
    do {
        muen();
        printf("请输入你要计算的类型>");
        scanf("%d", &input);

        switch (input) {
            case 1:
                printf("请输入两个数>");
                scanf("%d%d", &x, &y);
                printf("%d\n", add(x, y));
                break;
            case 2:
                printf("请输入两个数>");
                scanf("%d%d", &x, &y);
                printf("%d\n", sub(x, y));
                break;
            case 3:
                printf("请输入两个数>");
                scanf("%d%d", &x, &y);
                printf("%d\n", cdd(x, y));
                break;
            case 4:
                printf("请输入两个数>");
                scanf("%d%d", &x, &y);
                printf("%d\n", fcc(x, y));
                break;
            case 0:
                printf("退出");
                break;
            default:
                printf("请重新输入!\n");
                break;
        }
    } while (input);
}

这个主函数包含一个简单的菜单循环,允许用户选择不同的操作。用户可以输入数字来选择操作类型。然后,程序根据用户的选择执行相应的操作,包括调用上述四个函数。循环在用户输入 0 时结束。

这个代码是一个简单的计算器实现,但还需要一些改进来提高其功能性和可靠性。

第二种代码展示:

int add(int x,int y ) {
	int z = x + y;
}
int sub(int x, int y) {
	int z = x - y;
}
int cdd(int x, int y) {
	int z = x * y;
}
int fcc(int x, int y) {
    if (y != 0) {
        int z = x / y;
        return z;
    } else {
        printf("错误:除数不能为零\n");

              }
}
int xor(int x, int y) {
	int z = x ^ y;
}
void xyz(int (*paa)(int,int)) {//函数回调:将函数地址传给函数指针,这样传的什么函数就执行该函数
	int x = 0;
	int y = 0;
	printf("请输入两个数>");
	scanf("%d%d", &x, &y);
	printf("%d\n", paa(x, y));
}
muen() {
	printf("******************************\n");
	printf("*1.和 2.差 3.积 4.商 5.异或  *\n");
	printf("*********** 0.退出 ***********\n");
	printf("******************************\n");
}
int main() {
	int input = 0;
	int x = 0;
	int y = 0;
	//优化
	do
{
	muen();
	printf("请输入你要计算的类型>");
	scanf("%d",&input);


	switch (input)
	{
	case 1:
		xyz(add);//函数回调
		break;
	case 2:
		xyz(sub);
		break;
	case 3:
		xyz(cdd);
		break;
	case 4:
		xyz(fcc);
		break;
	case 0:
		printf("退出");
		break;
	default:
		printf("请重新输入!\n");
		break;
	}

解释:

对函数回调的解释

  1. 函数指针的定义:
    void xyz(int (*paa)(int, int));

    这里的 paa 是一个函数指针,它指向一个接受两个整数参数并返回整数的函数。在 xyz 函数中,通过调用 paa 来执行具体的数学运算。

  2. 函数回调的调用:
    xyz(add);

    在主程序中,通过将 add 函数的地址传递给 xyz 函数,实现了函数回调。这里 add 是一个函数,可以是加法运算,而 xyz 函数会调用 add 函数进行计算。

  3. xyz 函数的实现:
    void xyz(int (*paa)(int, int)) {
        int x = 0;
        int y = 0;
        
        printf("请输入两个数>");
        scanf("%d%d", &x, &y);
        
        printf("%d\n", paa(x, y));
    }
    

    xyz 函数中,首先通过用户输入获取两个整数 xy。然后,通过调用函数指针 paa 执行具体的数学运算。由于 paa 是一个函数指针,它可以指向不同的数学运算函数,实现了根据用户选择的不同数学运算类型来动态调用相应的函数。

????????通过使用 xyz(add)xyz(sub) 等方式,实现了根据用户输入选择不同数学运算类型,并通过函数回调执行相应的计算。这种设计使得代码更具灵活性,可以轻松地扩展和修改支持的数学运算。

第三种代码展示:

int add(int x,int y ) {
	int z = x + y;
}
int sub(int x, int y) {
	int z = x - y;
}
int cdd(int x, int y) {
	int z = x * y;
}
int fcc(int x, int y) {
    if (y != 0) {
        int z = x / y;
        return z;
    } else {
        printf("错误:除数不能为零\n");

              }
}
int xor(int x, int y) {
	int z = x ^ y;
}

muen() {
	printf("******************************\n");
	printf("*1.和 2.差 3.积 4.商 5.异或  *\n");
	printf("*********** 0.退出 ***********\n");
	printf("******************************\n");
}
int main() {
	int input = 0;
	int x = 0;
	int y = 0;
    int(*pa[])(int,int) = {0,add,sub,cdd,fcc,xor};//利用函数指针数组--存储函数

    do
{
	muen();
	printf("请输入你要计算的类型>");
	scanf("%d", &input);
	if (input>=1 && input<=5) 
	{
		printf("请输入两个数>");
		scanf("%d%d", &x, &y);
		printf("%d\n", pa[input](x, y));
	}
	else if (input == 0)
	{
		printf("退出\n");//input == 0(为假)
	}
	else
	{
		printf("请重新输入\n");
	}
	
} while (input);

解释:

函数指针数组定义:
int (*pa[])(int, int) = {0, add, sub, cdd, fcc, xor};
  1. 这行代码定义了一个函数指针数组 pa,它包含了六个元素。每个元素都是一个指向函数的指针,这些函数接受两个整数参数并返回整数。数组的第一个元素为 0,主要是为了占位,使得数组的索引从1开始对应不同的数学运算。

  2. 用户输入和函数调用

    在主程序中,通过用户的输入 scanf("%d", &input) 获取用户选择的数学运算类型。然后,通过 pa[input] 来访问函数指针数组中对应索引的元素,即获取用户选择的数学运算函数的指针。

printf("请输入你要计算的类型>");
scanf("%d", &input);
根据用户选择调用相应函数:

如果用户输入的数字在数组范围内(1到5),程序会要求用户再输入两个数,并通过 pa[input](x, y) 调用相应的数学运算函数。这样,根据用户的选择,程序动态地调用了不同的数学运算函数。

if (input >= 1 && input <= 5) {
    printf("请输入两个数>");
    scanf("%d%d", &x, &y);
    printf("%d\n", pa[input](x, y));
}
程序的退出条件:

do-while 循环中,如果用户输入了 0(为假),即选择退出,循环会结束,程序退出。

} while (input);

通过使用函数指针数组,你实现了一个更加灵活的计算器,用户可以通过输入选择不同的数学运算类型,而程序会相应地调用相应的函数进行计算。

文章来源:https://blog.csdn.net/2302_78381559/article/details/135167546
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。