回调函数;qsort库函数介绍及实现;

目录

回调函数;

代码:

qsort库函数介绍及实现;

冒泡排序;

代码:

qsort函数实现排序;

qsort介绍及使用;

比较两个数;

代码:

​编辑比较字符;

代码:

比较结构体里面的内容;

代码:

使用冒泡排序实现一个类似qsort函数的函数;

整数的比较;

代码:

结构体内容(这里是比较字符串内容)的比较;

代码:


回调函数;

简要介绍:回调函数就是通过函数指针调用的函数;函数指针可以实现回调函数,回调函数依赖函数指针;回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应;

代码:

#include<stdio.h>
int add(int x, int y)
{return x + y;
}
int jian(int x, int y)
{return x - y;
}
int cheng(int x, int y)
{return x * y;
}
int chu(int x, int y)
{return x / y;
}
void jisuan(int(*pa)(int, int))
{int x = 0;int y = 0;printf("请输入操作数:> ");scanf("%d %d", &x, &y);int ret = pa(x, y);printf("%d\n", ret);
}
void menu()
{printf("********1.add  ***********\n");printf("********2.jian ***********\n");printf("********3.cheng***********\n");printf("********4.chu  ***********\n");printf("********0.exit ***********\n");
}int main()
{int input = 0;int x = 0;int y = 0;do{menu();scanf("%d", &input);switch (input){case 1:jisuan(add);break;case 2:jisuan(jian);break;case 3:jisuan(cheng);break;case 4:jisuan(chu);break;case 0:printf("退出\n");break;default:printf("输入错误,请重新输入\n");break;}} while (input);return 0;
}

代码分析:进入循环,出现菜单,输入input,进入switch语句,根据input选择case;进入case,不同的case里面传递了不同的函数指针,进入jisuan函数,输入操作数,通过函数指针调用相应的函数,得出计算结果;

运行结果:

qsort库函数介绍及实现;

输入一个无序数组,要将它实现有序排列,这里我们介绍两种方法,一个是冒泡排序,;另一个是qsort库函数;

冒泡排序;

代码:
#include<stdio.h>
int main()
{int arr[] = { 2,5,7,8,10,1,3,9,4 };int sz = sizeof(arr) / sizeof(arr[0]);int i = 0;int j = 0;for (i = 0;i < sz - 1;i++)//总共sz-1次排序;{for (j = 0;j < sz - 1 - i;j++)//每次排序比较sz-1-i对数;{if (arr[j] > arr[j + 1]){int tem = arr[j + 1];arr[j + 1] = arr[j];arr[j] = tem;}}}for (i = 0;i < sz;i++){printf("%d ", arr[i]);}return 0;
}

代码分析:冒泡排序的思想主要是逐对比较,将最大(最小)的数排到最后,再将排名第二的数排到倒数第二位,如此循环;输入n个数,进行n-1次循环,拍好n-1个数,最后一个数自动归位;第一位数要比较n-1对数;第二位比较n-2对数;第m位比较n-m对数;如此循环;排序完之后打印各位数,观察排序效果;

运行结果:

qsort函数实现排序;

qsort介绍及使用;

void qsort (void* base, size_t num, size_t size,int (*compar)(const void*,const void*));qsort 第一个参数是所要排的数组的首元素地址;第二个是元素的个数;第三个是每个元素的大小;第四个是要求的函数指针,这个函数要比较数组里两个元素的大小,返回>0 =0 <0;所以在使用qsort函数之前要写一个比较函数,两个参数进行比较,返回>0 =0 <0;qsort默认是升序,如果想改变,可以在比较函数里更改形参的顺序;

比较两个数;
代码:
#include<stdio.h>
#include<stdlib.h>
int bidaxiao(const void* x, const void* y)//void*表示可以传任意指针类型,但使用的时候要强制转换成所要用的类型;
{return *((int*)x) - *((int*)y);
}
int main()
{int arr[] = { 2,5,7,8,10,1,3,9,4 };int sz = sizeof(arr) / sizeof(arr[0]);qsort(arr, sz, sizeof(arr[0]), bidaxiao);//qsort 第一个参数是所要排的数组的首元素地址;第二个是元素的个数;第三个是每个元素的大小;//第四个是要求的函数指针,这个函数要比较数组里两个元素的大小,返回>0 =0 <0;int i = 0;for (i = 0;i < sz;i++){printf("%d ", arr[i]);}return 0;
}

代码分析:首先建立一个数组,算出元素大小和元素个数;之后再写一个比较函数,函数的参数类型和返回类型参考上面;由于这里是比较两个数的大小,返回差值就满足函数的要求;现在形参是void* 型,所以做差时要先强制转换成int*型再解引用;写完函数后把函数的地址(函数名或者&函数名)传给qsort函数;使用qsort要添加头文件<stdlib.h>;之后打印出来观察效果;

运行结果:



比较字符;
代码:
#include<stdio.h>
#include<stdlib.h>
int bidaxiao(const void* x, const void* y)//void*表示可以传任意指针类型,但使用的时候要强制转换成所要用的类型;
{return *((char*)x) - *((char*)y);
}
int main()
{int arr[] = { 'a','d','c','s','b','k','x','z','y'};int sz = sizeof(arr) / sizeof(arr[0]);qsort(arr, sz, sizeof(arr[0]), bidaxiao);//qsort 第一个参数是所要排的数组的首元素地址;第二个是元素的个数;第三个是每个元素的大小;//第四个是要求的函数指针,这个函数要比较数组里两个元素的大小,返回>0 =0 <0;int i = 0;for (i = 0;i < sz;i++){printf("%c ", arr[i]);}return 0;
}

代码分析:跟比较整数差不多,把比较函数改一下,由于字符再内存里是以整数形式存在的,所以指针类型强制转换为int* 或char* 类型效果一样;

运行结果:

比较结构体里面的内容;

结构体里面整数的内容比较跟整数比较差不多,只需要再比较函数那里强制转换为结构体指针再进行结构体内容访问就可以;现在主要讲一下结构体中字符串内容比较;

代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>*///比较名字的前后,名字首字母a-z ;
struct student//结构体定义得放在最前面;
{int age;char name[100];
};
int bidaxiao(const void* x, const void* y)//void*表示可以传任意指针类型,但使用的时候要强制转换成所要用的类型;
{return strcmp(((struct student*)x)->name, ((struct student*)y)->name);
}
int main()
{struct student arr[] = { {10,"zhang"},{21,"bing"},{23,"sna"} };int sz = sizeof(arr) / sizeof(arr[0]);/*qsort(arr, sz, sizeof(arr[0]), bidaxiao);*///qsort 第一个参数是所要排的数组的首元素地址;第二个是元素的个数;第三个是每个元素的大小;//第四个是要求的函数指针,这个函数要比较数组里两个元素的大小,返回>0 =0 <0;qsort(arr, sz, sizeof(arr[0]), bidaxiao);int i = 0;for (i = 0;i < sz;i++){printf("%d %s\n", arr[i].age, arr[i].name);}return 0;
}

代码分析:建立一个结构体数组,并对其进行初始化;建立一个比较函数,这里函数的内容是比较结构体里面的字符串的内容;用到strcmp函数,添加<string.h>头文件,strcmp是将两个字符串的首字母进行比较,返回>0 =0 <0;将qsort函数的参数补充完整,运行,打印,观察效果;

运行结果:

使用冒泡排序实现一个类似qsort函数的函数;

qsort函数要使用两个函数,一个是比较函数,一个是交换函数;

整数的比较;
代码:
#include<stdio.h>
int shuzi(const void* p1, const void * p2)
{return (*((int*)p1) - *((int*)p2));
}
void SWAP(char* p1, char* p2,int size)
{int i = 0;for (i = 0;i < size;i++){char x = *p1;*p1 = *p2;*p2 = x;p1++;p2++;}
}
void bubllp(void* arr, int sz, int size,int(*shu)(const void*,const void*) )
{int i = 0;int j = 0;for (i = 0;i < sz-1;i++){for (j = 0;j < sz - 1 - i;j++){if (shu((char*)arr + j * size, (char*)arr + (j + 1) * size)>0){SWAP((char*)arr + j * size, (char*)arr + (j + 1) * size,size);}}}
}void test1()
{int arr[] = { 2,5,7,8,10,1,3,9,4 };int sz = sizeof(arr) / sizeof(arr[0]);bubllp(arr, sz, sizeof(arr[0]), shuzi);int m = 0;for (m = 0;m < sz;m++){printf("%d ", arr[m]);}
}
int main()
{test1();return 0;
}

代码分析:建立一个整形数组,写出一个比较函数和一个交换函数,比较函数还行跟qsort函数的比较函数一样,交换函数这里是以字符指针的形参接受,并且接受数组里每个内容的大小,交换的时候以一个字节的形式逐一交换,这样写的好处是可以不需要根据数组里内容的类型频繁改变形参类型;按照qsort函数的参数的输入形式输入到冒泡函数里,进入冒泡函数,按照冒泡函数的思想,建立两层循环,逐对比较;比较完后,打印出来观察效果;

运行结果:

结构体内容(这里是比较字符串内容)的比较;
代码:
int shuzi(const void* p1, const void* p2)
{return  strcmp((*(struct student*)p1).name, (*(struct student*)p2).name);//要注意运算符先算谁;
}

代码分析:这里主要把整形比较的数组内容改成结构体;比较函数中运用strcmp实现字符串的比较;

运行结果:

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

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

相关文章

排序算法:如冒泡排序、插入排序、选择排序、快速排序、归并排序

冒泡排序&#xff08;Bubble Sort&#xff09;&#xff1a;冒泡排序是一种简单的排序算法。它通过反复交换相邻的元素&#xff0c;将最大的元素逐步“浮”到数组的末尾。基本思想是每次比较相邻的两个元素&#xff0c;如果顺序不对就进行交换&#xff0c;直到整个数组有序。时间…

浙大版《C语言程序设计(第4版)》题目集-习题3-5 三角形判断

给定平面上任意三个点的坐标(x1,y1)、(x2,y2)、(x3,y3)&#xff0c;检验它们能否构成三角形。 输入格式: 输入在一行中顺序给出六个[−100,100]范围内的数字&#xff0c;即三个点的坐标x1、y1、x2、y2、x3、y3。 输出格式: 若这3个点不能构成三角形&#xff0c;则在一行中输…

数据在内存里面的存储

学习流程 ————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————…

中间件设置静态资源目录

文章目录 为什么要设置静态资源目录设置静态资源代码示例 为什么要设置静态资源目录 服务器中的代码&#xff0c;对于外部来说都是不可见的&#xff0c; 所以我们写的html页面&#xff0c;浏览器无法直接访问 如果希望浏览器可以访问&#xff0c;则需要将页面所在的目录设置静…

axios的post请求,数据为什么要用qs处理?什么时候不用?

axios 是一个基于 Promise 的 HTTP 客户端&#xff0c;用于浏览器和 node.js。当我们使用 axios 发送 POST 请求时&#xff0c;经常需要处理请求体中的数据。qs 是一个库&#xff0c;用于将 JavaScript 对象或值转换为 URL 编码的字符串&#xff0c;这在发送表单数据时特别有用…

数据结构面试常见问题之串的模式匹配(KMP算法)系列-大师改进

&#x1f600;前言 KMP算法是一种改进的字符串匹配算法&#xff0c;由D.E.Knuth&#xff0c;J.H.Morris和V.R.Pratt提出&#xff0c;因此人们称它为克努特—莫里斯—普拉特操作&#xff08;简称KMP算法&#xff09; KMP算法的优势: 提高了匹配效率&#xff0c;时间复杂度为O(m…

软考 系统架构设计师系列知识点之云原生架构设计理论与实践(4)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之云原生架构设计理论与实践&#xff08;3&#xff09; 所属章节&#xff1a; 第14章. 云原生架构设计理论与实践 第2节 云原生架构内涵 14.2 云原生架构内涵 关于云原生的定义有众多版本&#xff0c;对于云原生架构的…

IDEA, Pycharm, Goland控制台乱码

IDEA, Pycharm, Goland控制台乱码 问题描述: 控制台出现&#xfffd;&#xfffd;&#xfffd;&#xfffd;等乱码 复现频率: 总是 解决方案: 以IDEA为例 添加 -Dfile.encodingUTF-8位置 idea64.exe.vmoptions 在安装idea的bin目录idea.vmoptions idea客户端 示意图

Java IO流与网络编程入门教程:通俗易懂,实例丰富

一、IO流概念与应用 什么是IO流? 想象一下水管流水,水从一端流入流出的过程就像是数据在程序中的传输。在Java世界里,IO流就是这样一个抽象概念,它是数据在不同存储介质或网络之间传输的一种方式。简单来说,如果你把数据看作水流,那么IO流就是承载这个水流的管道,它可以…

解决长尾问题,BEV-CLIP:自动驾驶中复杂场景的多模态BEV检索方法

解决长尾问题&#xff0c;BEV-CLIP&#xff1a;自动驾驶中复杂场景的多模态BEV检索方法 理想汽车的工作&#xff0c;原文&#xff0c;BEV-CLIP: Multi-modal BEV Retrieval Methodology for Complex Scene in Autonomous Driving 链接&#xff1a;https://arxiv.org/pdf/2401.…

YoloV8改进策略:Block改进|PKINet

摘要 PKINet是面向遥感旋转框的主干,网络包含了CAA、PKI等模块,给我们改进卷积结构的模型带来了很多启发。本文使用PKINet的Block替换YoloV8的Block,实现涨点。改进方法是我独创首发,给写论文没有思路的同学提供改进思路,欢迎大家订阅! 论文:《Poly Kernel Inception …

Pycharm配置conda

1.下载conda Free Download | Anaconda . 2.配置环境 1.conda自带base环境 2.创建环境 3. Pycharm创建项目&#xff0c;选择环境 3.Pycharm中新建conda环境

Java序列化之Jackson详解

文章目录 1 Jackson1.1 Jackson简介1.2 为什么选择Jackson1.3 Jackson的基本功能1.3.1 将Java对象转换为JSON字符串&#xff08;序列化&#xff09;1.3.2 将JSON字符串转换为Java对象&#xff08;反序列化&#xff09; 1.4 Jackson库主要方法1.5 使用Jackson基本步骤1.5.1 添加…

【工具-GUI Guider】

工具-GUI Guider GUI Guider GUI Guider LVGL-使用GUI Guider 拖拽式设计LVGL

P1719 最大加权矩形(洛谷)

文章目录 最大加权矩形题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示二维前缀和易错 最大加权矩形 题目描述 为了更好的备战 NOIP2013&#xff0c;电脑组的几个女孩子 LYQ,ZSC,ZHQ 认为&#xff0c;我们不光需要机房&#xff0c;我们还需要运动&#xff0c;于…

CSRF一-WEB攻防-CSRF请求伪造Referer同源置空配合XSSToken值校验复用删除

演示案例&#xff1a; CSRF-无检测防护-检测&生成&利用CSRF-Referer同源-规则&上传&XSSCSRF-Token校验-值删除&复用&留空 #CSRF-无检测防护-检测&生成&利用 检测&#xff1a;黑盒手工利用测试&#xff0c;白盒看代码检验&#xff08;有无token…

【ESP32S3 Sense接入百度在线语音识别】

视频地址&#xff1a; ESP32S3 Sense接入百度在线语音识别 1. 前言 使用Seeed XIAO ESP32S3 Sense开发板接入百度智能云实现在线语音识别。自带麦克风模块用做语音输入&#xff0c;通过串口发送字符“1”来控制数据的采集和上传。 步骤概括    (1) 在百度云控制端选择“语音…

2023年全国职业院校技能大赛(网络系统管理赛项)样题三

2023****年全国职业院校技能大赛 GZ073****网络系统管理赛项 赛题第3套 模块A:网络构建 ​ 目 录 任务清单… 1 (一)基础配置… 1 (二)有线网络配置… 1 (三)无线网络配置… 3 (四)出口网络配置… 6 (五)网络运维配置… 6 (六)SDN网络配置… 7 附录1…

YiYi-Web项目介绍

YiYi-Web项目介绍 1. 简介2. 使用2.1 后端开发环境2.2 前端开发环境 3. 测试环境&#xff1a;4. 更新日志5. 打包情况6.项目截图 本项目前端是html、css、js、jQuery基础技术。 后端都是最新的SpringBoot技术&#xff0c;不分离版本&#xff0c; 是最基础的项目开发教程&#x…

挺后悔,我敷衍地回答了“程序员如何提升抽象思维“

分享是最有效的学习方式。 博客&#xff1a;https://blog.ktdaddy.com/ 大家好&#xff0c;我是老猫。 大概在月初的时候&#xff0c;我发了一篇文章【当程序员之后&#xff1f;(真心话)】,在这篇文章中&#xff0c;提及了抽象思维对一名程序员的重要性。可能说得也比较笼统&a…