C语言指针——计算器

@TOC

思路

首先我们建立一个菜单,用户输入1为加法(Add),输入2为减法(Sub),输入3为乘法(Mul),输入4为除法(Div),输入0退出计算器,输入其它数字要求重新输入。

菜单

我们完成菜单mune()函数,用户根据菜单进行输入input;
多次输入,用do……while实现,当input=0时为假时退出循环(当input不为0直接进入循环因此省略);

  • 至此,代码如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<stdio.h>
//打印菜单
void mune()
{
printf("*****1. add 2.sub*****\n");
printf("*****3. mul 4.div*****\n");
printf("******0. exit ***********\n");
printf("***********************\n");
printf("请输入运算符号:>");

}
int main()
{
int input = 0;
do{
mune();
scanf("%d", &input);

} while (input);
return 0;
}

加减乘除函数

接下来完成运算函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//运算函数
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 Div(int x, int y)
{
return x / y;
}

选择语句

根据input用switch语句确认符号函数,输入x、y两整数,调用函数将结果放入ret中。

  • 代码如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//运算函数
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 Div(int x, int y)
{
return x/y;
}

void mune()
{
printf("*****1. add 2.sub*****\n");
printf("*****3. mul 4.div*****\n");
printf("******0. exit ***********\n");
printf("***********************\n");
printf("请输入运算符号:>");
}


int main()
{
int input = 0;
int x = 0;
int y = 0;
int ret = 0;
do{
mune();
scanf("%d", &input);
switch (input)
{
case 1 :
printf("请输入:");
scanf("%d %d", &x, &y);
ret = Add(x, y);
printf("%d\n", ret);
break;
case 2:
printf("请输入:");
scanf("%d %d", &x, &y);
ret = Sub(x, y);
printf("%d\n", ret);
break;
case 3:
printf("请输入:");
scanf("%d %d", &x, &y);
ret = Mul(x, y);
printf("%d\n", ret);
break;
case 4:
printf("请输入:");
scanf("%d %d", &x, &y);
ret = Div(x, y);
printf("%d\n", ret);
break;
case 0 :
printf("已退出。\n");
break;
default:
printf("输入错误,请重新输入;\n");
break;
}

} while (input);
return 0;
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ExzfrKo9-1693294097658)(file:///D:/%E6%88%91%E7%9A%84%E5%9D%9A%E6%9E%9C%E4%BA%91/%E6%A0%91%E5%AE%AB/02%20%E8%83%BD%E5%8A%9B%E6%8A%80%E6%9C%AF%E7%AF%87/01%20%E7%BC%96%E7%A8%8B/01%20%E8%AF%AD%E8%A8%80/01%20C%E8%AF%AD%E8%A8%80/%E9%99%84%E4%BB%B6/Pasted%20image%2020230829144435.png#pic_center)]

  • 至此,1.0版本实现

迭代

2.0版本(函数回调)

我们发现1.0版本在switch语句中每次一个运算符都要进行一次输入说明,导致代码冗杂,浪费空间,所以针对这一点进行如下优化。
观察冗余空间,我们可以将运算符函数放入Calc( )(calculate)计算函数中,将运算符函数传入该函数中去,函数回调,在主函数中直接使用;
int Calc(int (*pf)(int, int){} 函数的形参为int(*)(int,int);,为函数指针类型;

  • 2.0版本代码如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include<stdio.h>
//运算函数
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 Div(int x, int y)
{
return x / y;
}

int Calc(int (*pf)(int, int))
{
int x = 0;
int y = 0;
int ret = 0;
printf("请输入:");
scanf("%d %d", &x, &y);
ret = pf(x, y);
printf("%d\n", ret);
}


void mune()
{
printf("*****1. add 2.sub*****\n");
printf("*****3. mul 4.div*****\n");
printf("******0. exit ***********\n");
printf("***********************\n");
printf("请输入运算符号:>");
}
int main()
{
int input = 0;
int x = 0;
int y = 0;
int ret = 0;
do {
mune();
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 0:
printf("已退出。\n");
break;
default:
printf("输入错误,请重新输入;\n");
break;
}
} while (input);
return 0;
}
  • 至此,2.0版本实现

3.0版本(转移表)

在2.0中,我们通过函数指针完成了对运算符函数的回调。在此版本中我们利用函数指针数组的特点完成计算器的使用;
将运算符函数封装进函数指针数组内,

1
2
函数指针数组类型为int (*pf[5])(int ,int)
int (*pf[5])(int ,int )={Add,Sub,Mul,Div};

在主函数中我们之间通过数组下标(input)来确认符号函数(为方便用户,我们在下标为0处位置放入空指针NULL)。
通过指针”pf“函数指针直接调用函数。

  • 至此,3.0代码如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
//转移表
void mune()
{
printf("*****1. add 2.sub*****\n");
printf("*****3. mul 4.div*****\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 Div(int x, int y)
{
return x / y;
}

int main()
{
int input = 0;
int x = 0;
int y = 0;
int ret = 0;
do
{
mune();
printf("请选择符号:>");
scanf("%d", &input);
//指针函数数组
int (*pf[5])(int, int) = { NULL,Add,Sub,Mul,Div };
if (input > 0 && input < 5)
{
printf("请输入:");
scanf("%d %d", &x, &y);
ret = pf[input](x, y);
printf("ret=%d\n", ret);
}
else if (input == 0)
{
printf("退出成功!\n");
break;
}
else
{
printf("输入错误,请重新输入;\n");
}
} while (input != 0);
return 0;
}

1a5886c6017abc3de33bb2dced9a7bcd_MD5

  • 至此,3.0版本计算器完成

写在最后

非常感谢你的阅读!创作不易,如果觉得其中一点有帮助,还请关注我,一起进步。
当然来一个点赞也是可以的哦!🚀Live long and Prosper!🖖🏼
爱你呦~~❤️❤️❤️❤️❤️