c语言 指针进阶5 6 自定义冒泡函数 qsort

news2025/1/11 8:18:38

指向函数指针数组的指针

在这里插入图片描述
在这里插入图片描述

回调函数

如何使用

一个函数可以实现加减乘除 calc()
在这里插入图片描述
不同点通过函数参数传进去

代码解释如下

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 Cale(int(*pf)(int,int))//函数回调
{
	 int x = 0;
	 int y = 0;
	printf("请输入两个操作数\n");
	scanf("%d %d", &x, &y);
	return pf(x, y);//pf存的是add地址传过来
	
	
}

int main()
{
	int input = 0;
	//计算器  计算整型变量的加减乘除
	do
	{
		menu();

		int x = 0;
		int y = 0;
		int ret = 0;
		printf("请选择");
		scanf("%d", &input);

		switch (input)
		{
		case 1:
			ret = Cale(Add);
			
			printf("ret=%d\n", ret);
			break;
		case 2:
			ret = Cale(Sub);
			printf("ret=%d\n", ret);
			break;
		case 3:
			ret = Cale(Mul);
			printf("ret=%d\n", ret);
			break;
		case 4:
			ret = Cale(Div);
			printf("ret=%d\n", ret);
			break;
		case 0:
			printf("退出程序");

			break;
		default:
			printf("选择错误,重新选择\n");

			break;
		}

	} while (input);




	return 0;
}

6

qsort q是quick sort是排序

在这里插入图片描述
自定义函数实现冒泡排序算法

确定下标arr【j】和arr【j-1】 .j是一个循环
在这里插入图片描述

//自定义函数实现冒泡排序算法
void buble_sort(int arr[], int sz)
{
	int i = 0;
	//排序趟数
	for (i = 0; i < sz-1; i++)
	{
		//一趟排序  i表示趟数  j表示每一趟的对数
		int j = 0;
		for (j = 0; j<sz-1-i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}

		}

	}


}
void print(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d",arr[i]);
	}
	printf("\n");

}


int main()
{
	int arr[10] = { 9,8,7,6,5,4,3,2,1,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);//10个数排序需要9躺 所以需要提前计算元素个数
	print(arr, sz);

	buble_sort(arr,sz);
	print(arr, sz);

	return 0;
}

qsort 这个自带库函数可以实现同样的功能。并且什么类型都能排,不挑类型 我们自己写的比较挑类型

void qsort( void *base,    //base中存放的是待排序数据中第一个对象地址。用void代表像排序所有的类型都可以  void想象成垃圾桶谁都能有 
size_t num, //排序数据元素的个数  相当于我们上面自己写的函数的传参sz
size_t size, //一个元素几个字节 相当于判断出元素类型
int ( *compare )(const void *elem1, const void *elem2 ) );//比较待排序数据中的两个元素的一个函数   e1 传的是你要比较的第一个元素地址 e2是第二个。  设计一个比较函数

第四图解
在这里插入图片描述


利用qsort

#include <stdlib.h>
int cmp_int(const void* e1, const void* e2)
{


	return *(int*)e1 - *(int*)e2;
}
 void print_arr(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d",arr[i]);
	}
	printf("\n");

}
int main()
{
	int arr[10] = { 9,8,7,6,5,4,3,2,1,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);//10个数排序需要9躺 所以需要提前计算元素个数
	

	qsort(arr, sz, sizeof(arr[0]), cmp_int);
	print_arr(arr, sz);


	return 0;
}

在这里插入图片描述

接下用qsort定义结构体函数

#include <stdlib.h>
#include <string.h>

int cmp_int(const void* e1, const void* e2)
{


	return *(int*)e1 - *(int*)e2;
}
 void print_arr(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d",arr[i]);
	}
	printf("\n");

}
void test1()
{
	int arr[10] = { 9,8,7,6,5,4,3,2,1,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);//10个数排序需要9躺 所以需要提前计算元素个数
	

	qsort(arr, sz, sizeof(arr[0]), cmp_int);
	print_arr(arr, sz);


	return 0;
}

struct Stu
{
	char name[20];
	int age;

};
int sort_by_age(const void* e1,const void *e2)
{
	return   ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}



void test2()
{
	struct Stu s[] = {{"zhangsan",30},{"lisi",34},{"wangwu",20}};
	//年龄排序
	int sz = sizeof(s) / sizeof(s[0]);
	qsort(s, sz, sizeof(s[0]), sort_by_age);
	


} 
int main()
{

	test1();
	test2();//定义结构体

	return 0;
}

在这里插入图片描述
下面结构体名字比较

在这里插入图片描述

#include <stdlib.h>
#include <string.h>

int cmp_int(const void* e1, const void* e2)
{


	return *(int*)e1 - *(int*)e2;
}
 void print_arr(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d",arr[i]);
	}
	printf("\n");

}
void test1()
{
	int arr[10] = { 9,8,7,6,5,4,3,2,1,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);//10个数排序需要9躺 所以需要提前计算元素个数
	

	qsort(arr, sz, sizeof(arr[0]), cmp_int);
	print_arr(arr, sz);


	return 0;
}

struct Stu
{
	char name[20];
	int age;

};
int sort_by_age(const void* e1,const void *e2)
{
	return   ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}
int sort_by_name(const void* e1, const void* e2)
{
	return   strcmp(((struct Stu*)e1)->name,((struct Stu*)e2)->name);

}//名字是字符串所以用strcmp  他的返回值是一样的.strcmp是比较字符串大小的函数 两个参数之间用,隔开 返回值只有正副和0
void test2()
{
	struct Stu s[] = {{"zhangsan",30},{"lisi",34},{"wangwu",20}};
	//年龄排序
	int sz = sizeof(s) / sizeof(s[0]);
	//qsort(s, sz, sizeof(s[0]), sort_by_age);
	qsort(s, sz, sizeof(s[0]), sort_by_name);


} 
int main()
{

	test1();
	test2();//定义结构体

	return 0;
}

strcmp比较两个字符串是挨个比较对应字符的ascll值
abcq
adc 比较a相同接下来下一个 d的ascll值大于b 所以adc更大

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/112536.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JDBC -- API

目录 DriverManager 驱动管理类 作用 注册驱动 获取数据库连接 Connection 数据库连接对象 作用 获取执行SQL的对象 管理事务 Statement 作用 执行SQL语句 ResultSet 结果集对象 作用 封装了DQL查询语句的结果 获取查询结果 PreparedStatement 作用 预编译SQ…

C#大型医院HIS系统源码 医院信息管理系统源码 C/S架构 VS2013+sql2012

了解更多源码内容&#xff0c;可私信我。 开发环境&#xff1a;VS2013sql2012 C/S架构 一、门诊系统&#xff1a; 1、挂号与预约系统:实现了医院门诊部挂号处所需的各种功能&#xff0c;包括门诊安排的管理&#xff0c;号表的生成及维护&#xff0c;门诊预约管理和挂号处理&…

6. SSM整合

1. SSM整合配置 SM整合流程 创建工程SSM整合 Spring SpringConfig MyBatis MybatisConfigJdbcConfigjdbc.properties SpringMVC ServletContainerInitConfigSpringMvcConfig 1.1 创建工程&#xff0c;添加依赖和插件 <dependencies><dependency><groupId&g…

【LeetCode】解数独 [H](深度优先遍历)

37. 解数独 - 力扣&#xff08;LeetCode&#xff09; 一、题目 编写一个程序&#xff0c;通过填充空格来解决数独问题。 数独的解法需 遵循如下规则&#xff1a; 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只…

设计模式-责任链模式

一、知其然 责任链字面含义第一联想到的就是他是一个链式的行为&#xff0c;就像一个链条一样把所产生的动力传输到到齿轮上一样&#xff1b;还有类似生活中的一个游戏“击鼓传花”&#xff0c;这样说好像也是泛泛而谈&#xff0c;来看看度娘的官方概念&#xff08;摘自百度百科…

[每周一更]-(第26期):反爬虫机制

随着网站的越来越普及&#xff0c;我们开发出来的知识类网站更不希望被竞争对手爬虫&#xff0c;虽然现在网络中充斥着各种各样的蜘蛛&#xff0c;有合法的浏览器爬虫&#xff0c;以及不合法 的人为爬虫&#xff0c;所以攻防战一直都存在&#xff0c;我们只能更好的设定规则&am…

中文文本分类

手把手带你做一个文本分类实战项目(模型代码解读) https://www.bilibili.com/video/BV15Z4y1S7aR/?spm_id_from333.788.recommend_more_video.-1&vd_sourcec47fbb8166930edc486d8fdc405bf569 中文汉字对应的数字索引 之后对应的数字索引 之后找到tokn embedding的东西 1…

34. 池化层 / 汇聚层

1. 池化层 如果我们拍摄黑白之间轮廓清晰的图像X&#xff0c;并将整个图像向右移动一个像素&#xff0c;即Z[i, j] X[i, j 1]&#xff0c;则新图像Z的输出可能大不相同。而在现实中&#xff0c;随着拍摄角度的移动&#xff0c;任何物体几乎不可能发生在同一像素上。即使用三脚…

15【SpringMVC的注解开发】

文章目录二、SpringMVC注解支持2.1 回顾Servlet容器启动源码流程2.2 分析SpringMVC启动源码分析2.2.1 SpringServletContainerInitializer源码分析2.2.2 WebApplicationInitializer源码分析1&#xff09;AbstractContextLoaderInitializer2&#xff09;AbstractDispatcherServl…

短视频播放量超10w后,流量变少的问题解决方案

短视频播放量超10w后&#xff0c;流量变少的问题解决方案 上一篇我们聊了视频播放超10w后&#xff0c;会遇到流量变少的问题并分析了可能的原因&#xff0c;既然知道了原因&#xff0c;那么我们就可以针对性的去解决了。 今天给大家聊一聊在我赢助手跟超200名短视频创作者沟通…

Allegro如何设置差分动态等长规则操作指导

Allegro如何设置差分动态等长规则操作指导 Allegro上可以对差分设置动态等长规则,让差分对在任意一段距离上都是满足等长误差的,尤其是在差分对走线较长的情况下 以下面这两对线为例 具体操作如下 打开constraint Manage选择Physical规则

Linux 管理联网 设置主机名( nmtui图形化 和 hostnamectl命令 )

设置主机名 # 常用的有两种方式&#xff0c;一种是 nmtui 图形化界面的方式来设置&#xff0c; 一种是 hostnamectl 命令的方式来设置。 nmtui 直接在命令行 输入 nmtui 便进入 图形化界面 >>> 最后一选项&#xff08; 红底&#xff09; 便是 设置主机名~&#x…

微导纳米科创板上市:市值125亿 无锡首富王燕清再敲钟

雷递网 雷建平 12月23日江苏微导纳米科技股份有限公司&#xff08;简称&#xff1a;“微导纳米”&#xff0c;股票代码为&#xff1a;“688147”&#xff09;今日在科创板上市。微导纳米此次发行4544.55万股&#xff0c;发行价为24.21元&#xff0c;募资总额为11亿元。微导纳米…

react笔记_11 redux

目录redux定义使用时机redux基本概念StoreStateActionreducerredux工作原理语法[1] 创建StorecreateStorecombineReducers[2]创建并分发actiondispatchapplyMiddleware语法举例说明- 做一个加法运算执行原理redux-thunk中间件使用[3]创建reducer语法渲染过程[4]getState[5]subs…

基于meanshift算法的目标聚类和目标跟踪matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 meanshift算法其实通过名字就可以看到该算法的核心&#xff0c;mean&#xff08;均值&#xff09;&#xff0c;shift&#xff08;偏移&#xff09;&#xff0c;简单的说&#xff0c;也就是有一个…

Web前端105天-day63-HTML5_CORE

HTML5CORE03 目录 前言 一、复习 二、SVG 三、Echarts 四、Webworker 五、回调地狱 六、Promise 七、promiseajax 八、promise_axios 九、async_await 总结 前言 HTML5CORE03学习开始 一、复习 跨域 浏览器的同源策略限定: 网页中利用 AJAX 请求数据, 必须访问同源…

【CSS】flex布局用法解析,快速上手flex布局,flex:1是什么意思?肯定看的懂好吧?

一、flex布局 flex 是 flexible box 的缩写&#xff0c;意为"弹性布局"&#xff0c;用来为盒状模型提供最大的灵活性。 任何一个容器都可以指定为 flex 布局。 采用 flex 布局的元素&#xff0c;称为 flex 容器&#xff08;flex container&#xff09;&#xff0c;…

如何解决跨越

解决跨域我想在坐的各位都会听说过几个解决跨域的方法&#xff1a; 1.有什么 cors后端配置&#xff08;加几个请求头 2.jsonp&#xff08;利用script的src属性&#xff09; 3.还有vue-cli前端配置。 跨域其实就是违背了浏览器的一种策略&#xff0c;这种策略就是同源策略&…

公司刚来的阿里p8,看完我构建的springboot框架,甩给我一份文档

前言&#xff1a; 我们刚开始学习 JavaWeb 的时候&#xff0c;使用 Servlet/JSP 做开发&#xff0c;一个接口搞一个 Servlet &#xff0c;很头大&#xff0c;后来我们通过隐藏域或者反射等方式&#xff0c;可以减少 Servlet 的创建&#xff0c;但是依然不方便&#xff0c;再后…

【Transformer】医学分割领域的应用与扩展(论文阅读)(二) || DETR

声明:仅学习使用~ 目录 1. Transformer学习2. DETR1. Transformer学习 前篇指路:【Transformer】医学分隔领域的应用与扩展(论文阅读)(一) 继续… 关于Self-Attention的公式: 原来是 m x m 是2D的,现在变成1 x m了,是1D的了。 下图中。左图是传统的Transformer,右…