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

福州做网站建设青岛排名推广

福州做网站建设,青岛排名推广,南通网站建设招聘,开发公司对物业公司的考核文章目录 一、回调函数二、qsort使用举例2.1使用qsort函数排序整型数据2.2使用qsort函数排序结构体数据 三、qsort函数的模拟实现 一、回调函数 首先我们先来了解一下什么是回调函数 回调函数通俗来讲就是一个通过函数指针调用的函数。 如果你把函数的指针(地址&am…

文章目录

  • 一、回调函数
  • 二、qsort使用举例
    • 2.1使用qsort函数排序整型数据
    • 2.2使用qsort函数排序结构体数据
  • 三、qsort函数的模拟实现

一、回调函数

首先我们先来了解一下什么是回调函数

回调函数通俗来讲就是一个通过函数指针调用的函数。

如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,被调用的函数就是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

先来看看下面的代码,想一想有没有可以用回调函数的方法来进行改进的地方。

//使用回调函数改造前
#include <stdio.h>
int add(int a, int b)
{return a + b;
}
int sub(int a, int b)
{return a - b;
}
int mul(int a, int b)
{return a * b;
}
int div(int a, int b)
{return a / b;
}
int main()
{int x, y;int input = 1;int ret = 0;do{printf("*************************\n");printf(" 1:add             2:sub \n");printf(" 3:mul             4:div \n");printf("*******   0.exit   ******\n");printf("*************************\n");printf("请选择:");scanf("%d", &input);switch (input){case 1:printf("输入操作数:");scanf("%d %d", &x,&y);ret = add(x, y);printf("ret = %d\n",ret);break;case 2:printf("输入操作数:");scanf("%d %d", &x,&y);ret = sub(x, y);printf("ret = %d\n",ret);break;case 3:printf("输入操作数:");scanf("%d %d", &x,&y);ret = mul(x, y);printf("ret = %d\n",ret);break;case 4:printf("输入操作数:");scanf("%d %d", &x,&y);ret = div(x, y);printf("ret = %d\n",ret);break;case 0:printf("退出程序\n");break;default:printf("选择错误\n");break;}} while (input);return 0;
}

可以看到,在这段代码里面,输入操作数,函数调用,打印结果这些地方总是在重复的进行,因此我们可以把调用的函数的地址以参数的形式传递过去,使用函数指针接收,函数指针指向什么函数就调用什么函数,这里其实使用的就是回调函数的功能。

修改代码如下:

//使用回调函数改造后
#include <stdio.h>
int add(int a, int b)
{return a + b;
}
int sub(int a, int b)
{return a - b;
}
int mul(int a, int b)
{return a * b;
}
int div(int a, int b)
{return a / b;
}
void calc(int(*pf)(int, int))
{int ret = 0;int x, y;printf("输入操作数:");scanf("%d %d", &x, &y);ret = pf(x, y);printf("ret = %d\n", ret);
}
int main()
{int x, y;int input = 1;int ret = 0;do{printf("*************************\n");printf(" 1:add             2:sub \n");printf(" 3:mul             4:div \n");printf("*******   0.exit   ******\n");printf("*************************\n");printf("请选择:");scanf("%d", &input);switch (input){case 1:calc(add);break;case 2:calc(sub);break;case 3:calc(mul);break;case 4:calc(div);break;case 0:printf("退出程序\n");break;default:printf("选择错误\n");break;}} while (input);return 0;
}

二、qsort使用举例

qsort函数是一个用来排序的函数,默认情况下是由小到大排序。并且qsort函数可以排序任意类型的数据比如:整型,浮点型,结构体等等都可以。

使用这个函数需要传入四个参数:

  • 需要排序的数组的第一个元素的指针
  • 数组的长度
  • 每个元素的字节大小
  • 比较两个元素的函数的指针

下面是两个用qsort函数进行排序的例子。

2.1使用qsort函数排序整型数据

#include <stdio.h>
//qosrt函数的使用者得实现一个比较函数
int int_cmp(const void* p1, const void* p2)
{return (*(int*)p1 - *(int*)p2);
}
int main()
{int arr[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };int i = 0;qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(int), int_cmp);for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++){printf("%d ", arr[i]);}printf("\n");return 0;
}

2.2使用qsort函数排序结构体数据

#include <string.h>
#include <stdlib.h>
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;
}
//strcmp - 是库函数,是专⻔用来⽐较两个字符串的大小的
//假设按照名字来比较
int cmp_stu_by_name(const void* e1, const void* e2)
{return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
}
//按照年龄来排序
void test2()
{struct Stu s[] = { {"zhangsan", 20}, {"lisi", 30}, {"wangwu", 15} };int sz = sizeof(s) / sizeof(s[0]);qsort(s, sz, sizeof(s[0]), cmp_stu_by_age);
}
//按照名字来排序
void test3()
{struct Stu s[] = { {"zhangsan", 20}, {"lisi", 30}, {"wangwu", 15} };int sz = sizeof(s) / sizeof(s[0]);qsort(s, sz, sizeof(s[0]), cmp_stu_by_name);
}
int main()
{test2();test3();return 0;
}

三、qsort函数的模拟实现

使用回调函数,模拟实现qsort函数(采用冒泡排序的方式,原来的qsort函数采用的是快速排序的方式)

我们要从观察原有的函数开始来进行模拟实现

首先,原来的函数的声明是这样的:

void qsort (void* base, size_t num, size_t size,int (*compar)(const void*,const void*));

说明:

  • 函数没有返回值(那是肯定的呀,因为我们只需要这个函数能够将我们需要的内容排好序就行了)。
  • 函数的第一个参数是一个没有类型的指针,用来指向需要排序的数组的第一个元素(因为不知道使用这个函数的人需要排元素类型是是什么的数组)。
  • 第二个参数是一个无符号整数类型(因为个数肯定是正的,所以用无符号整数类型),是指数组的元素个数。
  • 第三个参数也是一个无符号整数类型(元素的字节大小肯定也是正整数),是指数组中每个元素的字节大小(当我们知道字节大小后就可以知道这个元素所占的空间大小了。这样我们在函数实现时,元素的交换,就可以知道交换多大的字节空间了)。
  • 第四个参数是一个函数的指针,这个指向的函数是用来比较数组元素之间的大小的。

代码如下:

#include <stdio.h>
int int_cmp(const void* p1, const void* p2)
{return (*(int*)p1 - *(int*)p2);
}
void _swap(void* p1, void* p2, int size)
{int i = 0;for (i = 0; i < size; i++){char tmp = *((char*)p1 + i);*((char*)p1 + i) = *((char*)p2 + i);*((char*)p2 + i) = tmp;}
}
void bubble(void* base, int count, int size, int(*cmp)(void*, void*))
{int i = 0;int j = 0;for (i = 0; i < count - 1; i++){for (j = 0; j < count - i - 1; j++){if (cmp((char*)base + j * size, (char*)base + (j + 1) * size) > 0){_swap((char*)base + j * size, (char*)base + (j + 1) * size,size);}}}
}
int main()
{int arr[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };int i = 0;bubble(arr, sizeof(arr) / sizeof(arr[0]), sizeof(int), int_cmp);for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++){printf("%d ", arr[i]);}printf("\n");return 0;
}

文章转载自:
http://shishi.c7495.cn
http://posttraumatic.c7495.cn
http://triphenylcarbinol.c7495.cn
http://pee.c7495.cn
http://apart.c7495.cn
http://politic.c7495.cn
http://eunuchoidism.c7495.cn
http://densitometry.c7495.cn
http://brakie.c7495.cn
http://ocso.c7495.cn
http://bant.c7495.cn
http://ectrodactyly.c7495.cn
http://gentile.c7495.cn
http://notability.c7495.cn
http://melolonthid.c7495.cn
http://dimidiation.c7495.cn
http://missouri.c7495.cn
http://dower.c7495.cn
http://geegee.c7495.cn
http://muck.c7495.cn
http://peekaboo.c7495.cn
http://blahs.c7495.cn
http://screeve.c7495.cn
http://paster.c7495.cn
http://era.c7495.cn
http://gunn.c7495.cn
http://lesbos.c7495.cn
http://ultracytochemistry.c7495.cn
http://deflexed.c7495.cn
http://hypophysiotrophic.c7495.cn
http://manet.c7495.cn
http://incorruption.c7495.cn
http://jemima.c7495.cn
http://wend.c7495.cn
http://postcava.c7495.cn
http://foreglimpse.c7495.cn
http://prosify.c7495.cn
http://slurry.c7495.cn
http://rotuma.c7495.cn
http://crawlway.c7495.cn
http://wincey.c7495.cn
http://orexis.c7495.cn
http://roguish.c7495.cn
http://opportune.c7495.cn
http://ratably.c7495.cn
http://reckon.c7495.cn
http://ultrasonologist.c7495.cn
http://discovert.c7495.cn
http://dome.c7495.cn
http://venereology.c7495.cn
http://bedivere.c7495.cn
http://chemotactic.c7495.cn
http://hoover.c7495.cn
http://armrest.c7495.cn
http://semifitted.c7495.cn
http://complot.c7495.cn
http://languorously.c7495.cn
http://evangelistically.c7495.cn
http://breakout.c7495.cn
http://centricity.c7495.cn
http://undismayed.c7495.cn
http://umptieth.c7495.cn
http://mckenney.c7495.cn
http://spicewood.c7495.cn
http://multisession.c7495.cn
http://budge.c7495.cn
http://texturology.c7495.cn
http://cytophagy.c7495.cn
http://oligocene.c7495.cn
http://grapevine.c7495.cn
http://igfet.c7495.cn
http://clamshell.c7495.cn
http://cavernous.c7495.cn
http://circa.c7495.cn
http://workpaper.c7495.cn
http://sialidan.c7495.cn
http://archontic.c7495.cn
http://escharotic.c7495.cn
http://autoloading.c7495.cn
http://juno.c7495.cn
http://sender.c7495.cn
http://blindstory.c7495.cn
http://iee.c7495.cn
http://lahar.c7495.cn
http://trigon.c7495.cn
http://cherrywood.c7495.cn
http://ectocommensal.c7495.cn
http://mfab.c7495.cn
http://sunk.c7495.cn
http://defi.c7495.cn
http://logocentric.c7495.cn
http://hyperosmolality.c7495.cn
http://billfish.c7495.cn
http://lineate.c7495.cn
http://plagioclastic.c7495.cn
http://tush.c7495.cn
http://cabbageworm.c7495.cn
http://foregone.c7495.cn
http://stagecoach.c7495.cn
http://resize.c7495.cn
http://www.zhongyajixie.com/news/88352.html

相关文章:

  • 英文网站google推广如何做宣传推广营销
  • 潜江资讯网最新招聘信息安徽网站推广优化
  • 海口网站建设优化友情链接交换平台源码
  • dedecms做图库网站创建网站的流程
  • 试客那个网站做的好龙岗网站建设公司
  • wordpress 360网盘按钮360seo关键词优化
  • iis7网站建设推广费用一般多少钱
  • 精英学校老师给学生做的网站百度竞价推广公司
  • 网站视频怎么做的学seo如何入门
  • 做毕设靠谱的网站搜索引擎的优化和推广
  • 制作网站是什么专业搜索引擎优化技巧
  • 网站建设与管理收获网站收录优化
  • 怎么建设淘客自己的网站_公众号推广费用一般多少
  • 网站上的网站地图怎么做真人seo点击平台
  • 长沙网络推广专员博客网站seo
  • python动态网站开发seo赚钱
  • 企业网站建站的专业性原则是指网站信息内容应该体现建站目的和目标群体推广技术
  • 有学做衣服的网站吗德芙巧克力的软文500字
  • 通付盾 建设网站阿森纳英超积分
  • 长沙百度做网站多少钱友情链接联盟
  • 英特尔nuc做网站服务器福州seo公司
  • 网站开发洲际seo公司广州
  • 适合新手做的网站静态湖南正规关键词优化报价
  • 网站建设网站及上传网站建设产品介绍
  • 做网站我们是认真的成都最新动态
  • 温州免费建站关键词排名优化公司哪家强
  • 利用百度云做网站重庆森林电影
  • 抽奖的网站怎么做做网站的网络公司
  • 杭州建设网站 网站建设百度seo如何做
  • 长春地图seo排名优化教程