前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >【C语言】(指针系列四)回调函数+qsort函数

【C语言】(指针系列四)回调函数+qsort函数

作者头像
用户11367452
发布2024-11-21 08:06:59
发布2024-11-21 08:06:59
8200
代码可运行
举报
文章被收录于专栏:学习学习
运行总次数:0
代码可运行

一、回调函数

回调函数就是通过函数指针调用的函数

如果你把函数的指针作为参数传递给另外一个函数,当这个指针被用来调用其所指向的函数时,被调用的函数就是回调函数。回调函数并不是一个单一的函数实现的,而是在某种情况下,编写者根据需要所编写的,在特定的时间或条件发生由另外一方的调用的,用于对该事件的相应

这是我们普通实现计算器的思路和代码: 

代码语言:javascript
代码运行次数:0
复制
#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 menu()
{
	printf("*************************\n");
	printf("**1:add***********2:sub**\n");
	printf("**3:mul***********4:div**\n");
	printf("*********0:exit**********\n");
	printf("*************************\n");

}
int main()
{
	int x = 0;
	int y = 0;
	int input = 0;
	int ret = 0;
	do
	{
		menu();
		printf("请输入:");
		scanf("%d", &input);
		switch (input)
		{
		case 0:
			break;
		case 1:
			printf("请输入两个数:");
			scanf("%d %d", &x, &y);
			ret = Add(x, y);
			printf("%d+%d=%d\n", x, y, ret);
			break;
		case 2:
			printf("请输入两个数:");
			scanf("%d %d", &x, &y);
			ret = Sub(x, y);
			printf("%d-%d=%d\n", x, y, ret);
			break;
		case 3:
			printf("请输入两个数:");
			scanf("%d %d", &x, &y);
			ret = Mul(x, y);
			printf("%d*%d=%d\n", x, y, ret);
			break;
		case 4:
			printf("请输入两个数:");
			scanf("%d %d", &x, &y);
			ret = Div(x, y);
			printf("%d/%d=%d\n", x, y, ret);
			break;
		default:
			printf("输入错误,请重新输入\n");
			break;
		}
	} while (input);
	return 0;
}

然后我们发现这种代码和思路非常非常的冗余,对于初学者来说很友好,但是对于进阶来说,

这种重复性的代码不是很好的选择,那么有没有方法让他简化一下哪?

当然有,用回调函数,这里Cacl()函数就是回调函数。

代码语言:javascript
代码运行次数:0
复制
int Add(int* x, int* y)//1
{
	return *x + *y;
}
int Sub(int* x, int* y)//1
{
	return *x + *y;
}
int Mul(int* x, int* y)//1
{
	return *x + *y;
}
int Div(int* x, int* y)//1
{
	return *x + *y;
}void meau()
{
	printf("*************************\n");
	printf("**1:add***********2:sub**\n");
	printf("**3:mul***********4:div**\n");
	printf("*********0:exit**********\n");
	printf("*************************\n");

}
void Cacl(int(*pf)(int*, int*))
{

	int ret = 0;
	int x = 0, y = 0;
	printf("请输入两个数");
	scanf("%d %d", &x, &y);
	ret = pf(&x,&y);
	printf("%d\n", ret);

}



int main()
{
	int a = 0, b = 0;
	int input = 0;
	do
	{
		meau();
		printf("请输入");
		scanf("%d", &input);
		switch (input)
		{
		case 0:
			break;
		case 1:
			Cacl(Add);
			break;
		case 2:
			Cacl(Sub);
			break;
		case 3:
			Cacl(Mul);
			break;
		case 4:
			Cacl(Div);
			break;

		default:
			printf("输入错误,请重新输入");
			break;
		}

	} while (input);
	
	
	return 0;
}

 二、qsort函数

qsort函数

qsort函数时C语言提供的一个库函数,头文件时stdlib.h,对任意类型的元素都能进行排序。

void qsort(void*base,   size-t nums,   size_t size,   int(*compare)(const*void elem1,const*void elem2) );

  • void*base 是待排序数组的第一个首元素的地址。
  • size_t nums是待排序数组的元素个数。
  • size_t size是待排序数组中每个元素的大小。
  • int(*compare)(const*void elem1,const*void elem2)):函数指针-------传函数的地址。

注意:int(*compare)(const*void elem1,const*void elem2))-----比较函数,需要使用qsort函数的程序员自己实现,并且有以下要求。

  • 当p1<p2时,返回小于1的数 。
  •  当p1=p2时,返回等于0的数 。
  • 当p1>p2时,返回大于1的数。 

1.通过结构体中的整形成员排序

代码语言:javascript
代码运行次数:0
复制
#include<stdio.h>
#include<stdlib.h>
void Print(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
}
struct stu
{
	char name[20];
	int age;
};
//按照年龄比较,排序结构体数组
int cmp_stu_by_age(const void* e1, const void* e2)
{
	//return (*((struct stu*)e1)).age > (*((struct stu*)e2)).age;
	return ((struct stu*)e1)->age - ((struct stu*)e2)->age;
}
void test2()
{
	struct stu arr[] = { {"zhangsan",20},{"lisi",35},{"wangwu",18} };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp_stu_by_age);//通过age排序
}
int main()
{
	test2();
	return 0;
}

2.通过结构体中的字符串成员排序

代码语言:javascript
代码运行次数:0
复制
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void Print(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
}
struct stu
{
	char name[20];
	int age;
};
//按照名字比较,排序结构体数组
int cmp_stu_by_name(const void* e1, const void* e2)
{
	//注意:强转是暂时的需要带上()
	return strcmp(((struct stu*)e1)->name, ((struct stu*)e2)->name);
	//这里借助strcmp函数比较字符串,返回值恰好与函数的返回值要求相同
}
void test2()
{
	struct stu arr[] = { {"zhangsan",20},{"lisi",35},{"wangwu",18} };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp_stu_by_name);
}
int main()
{
	test2();
	return 0;
}

到这里,指针系列就结束了,感谢各位支持,但是我们都知道,学习永无止境!!!!

我们都会走向属于自己的顶峰!!!!!!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-11-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、回调函数
  •  二、qsort函数
    • qsort函数
    • 1.通过结构体中的整形成员排序
    • 2.通过结构体中的字符串成员排序
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档