栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【C语言】计算器实现

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【C语言】计算器实现

本节代码高能全程高能呦。适当摸摸鱼,调整自身状态。不要忘记锻炼呀,有钱也得有命花才行呀~给家人打个电话,唠唠家常。

文章目录
  • 前言
  • 1. 函数指针
    • 1.1 函数指针格式
    • 1.2 函数指针调用
    • 1.3 实例解读
  • 2.函数指针数组
  • 3. 计算器实现


前言

本节主要用到函数指针相关知识,感受函数指针的高效高能。首先是实现计算器,第二是实现比较任意类型数据的冒泡排序。


1. 函数指针

函数也有地址,指向函数的指针就是函数指针。

1.1 函数指针格式

函数的地址用函数名或者&函数名表示。函数指针的格式是 函数返回值类型 (*指针名) (参数名)

int test(int  int);
int (*pt)(int, int) = &test;  //pt是指向test函数指针
int(*pta)(int, int) = test   //函数名也能直接表示函数地址
1.2 函数指针调用

以上面实例为例,调用格式为

(*pt)(2,3); 
或者
(pta)(2,3)

对pt指针解引用,找到函数,调用函数传参。因为指针pta可以直接替换函数test,所以不加‘ * ’也可以。两种方式都合法。

1.3 实例解读
  1. 观察如下代码,这个代码是在做什么呢?花时间,分解一下呦,提示:从0突破
(* (void (*) () )0) ();

答案:此代码为通过函数指针调用首地址为0的函数。

解析:从0开始,0前面是一个括号(void (*) ()),是一个函数指针,在0前面,意为强制类型转换,将0强制转为函数指针类型。再往前,有一个‘ * ’,对0函数指针解引用,最后面的括号是在传参。
2. 观察如下代码,说出代码作用。提示:signal是函数名还是指针名呢?

void (* signal(int, void(*)(int))) (int);
答案:
这是一个函数声明,函数是返回值为void(*)(int)类型,
函数名是signal,参数列表是(int, void(*)(int))
解析:
看signal,并没有和‘ * ’括在一起,由于优先级,
signal先与后面的括号结合,故signal是一个函数。
后面紧跟的(int, void(*)(int))是函数signal的参数列表。
将signal(int, void(*)(int))抠出来,会发现还剩下void(*)(int)
这是一个函数指针,这里作为signal函数的返回值类型,大家要注意这种特殊的写法呀

代码优化
上面的写法很难分析,我们可以使用typedef对类型重命名
例如,将unsigned int 换成unit

typedef  unsigned int  unit;

应用:将上面的void(*)(int)换成pf_t

typedef void(*pf_t)(int) 
void (* signal(int, void(*)(int))) (int);
被替换为
pf_t  signal (int, pf_t);
2.函数指针数组

函数指针数组是一个数组,数组的每一个元素是函数地址。通过函数地址调用函数。通过下面实例说明。

3. 计算器实现
#define _CRT_SECURE_NO_WARNINGS
#include
void menu()
{
	printf("****************************n");
	printf("****************************n");
	printf("***** 1.Add     2.Sub ******n");
	printf("***** 3.Mul     4.Div ******n");
	printf("***** 5.Sur     0.Exit *****n");
	printf("****************************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 Sur(int x, int y)
{
	return x % y;
}
int main()
{	
	int input;
	int (*parr[6])(int, int) = { 0,Add,Sub,Mul,Div,Sur };
	do
	{
		menu();
		printf("请选择操作:>");
		scanf("%d", &input);
		if (input == 0)
			printf("退出");
		else if (input >= 1 && input <= 5)
		{
			int x = 0;
			int y = 0;
			printf("请输入两个操作数:>");
			scanf("%d %d", &x, &y);
			int ret = parr[input](x, y);
			printf("结果为%dn", ret);
		}
		else
			printf("输入错误");
	} while (input);
}

解析:

int (*parr[6])(int, int) = { 0,Add,Sub,Mul,Div,Sur };
parr为函数指针数组,,包含6个元素,每一个元素是函数地址。
书写就是在函数指针 int(*) (int,int)的基础上加上数组类型parr[6]
调用函数方法: parr[input](x, y);

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1019016.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号