当前位置: 首页 > news >正文

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

一、回调函数

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

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

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

#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()函数就是回调函数。

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.通过结构体中的整形成员排序

#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.通过结构体中的字符串成员排序

#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;
}

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

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

http://www.lryc.cn/news/438432.html

相关文章:

  • 全面理解tensor编程中矩阵的行和列
  • 【Kubernetes】常见面试题汇总(十)
  • CSS —— 界面布局
  • SpringBoot万级并发-jemeter-Address already in use: connect
  • P1228 地毯填补问题
  • 【计算机网络】UDP TCP介绍
  • JDBC初相识
  • Go语言现代web开发07 map字典
  • AI工具一键制作爆火的“汉语新解“卡片!
  • windows检查端口占用并关闭应用
  • 机器学习-聚类算法
  • keil 中 printf重定向
  • yum下载软件失败:‘Could not resolve host: mirrorlist .centos .org; Unknowm error
  • 云轴科技ZStack 获鲲鹏应用创新大赛2024上海赛区决赛一等奖
  • 沉浸式体验Stability AI最新超强AI图片生成模型Ultra
  • 网络安全宣传周的时间,举办活动的方式和意义
  • Jacoco的XML报告详解
  • 【数据结构与算法 | 灵神题单 | 合并链表篇】力扣2, 21, 445, 2816
  • 【秒达开源】多功能中文工具箱源码:自部署 全开源 轻量级跨平台 GPT级支持+高效UI+Docker
  • 【云原生安全篇】一文掌握Harbor集成Trivy应用实践
  • 计算机网络30——Linux-gdb调试命令makefile
  • 【物联网】一篇文章带你认识RFID(射频识别技术)
  • STM32G474RE之RTC
  • TwinCAT3 实时核中ADS实现C++ server、clinet数据传输
  • apt:Debian 高级包管理器
  • 基于React+JsonServer+Antddesign的读书笔记关联系统
  • 【win工具】win安装flameshot并设置截图快捷键
  • react 安装使用 antd+国际化+定制化主题+样式兼容
  • 【Kubernetes】常见面试题汇总(十六)
  • 【mysql】mysql之优化