c 中内置了很多高级的函数,我们先使用排序函数看一下

 #include <stdio.h>
#include <stdlib.h>
#include <string.h> int compare_score(const void *n1 ,const void *n2) { int *a = (int *)n1;
int *b = (int *)n2;
return *a - *b;
} int compare_name(const void *n1 , const void *n2) { char **a = (char **)n1;
char **b = (char **)n2;
return strcmp(*a, *b);
} int main(int argc, const char * argv[]) { int array[] = {,,,,,,,}; qsort(array, , sizeof(int), compare_score); for (int i = ; i < ; i++) {
printf("%i \n",array[i]);
} char *name[] = {"abc","efs","ss","gds","aaa","fee"};
qsort(name, , sizeof(char *), compare_name);
for (int i = ; i < ; i++) {
printf("%s \n",name[i]);
} return ;
}

输出结果为

为了能使这个qsort排序函数适应很多种排序情况,需要传入一个排序规则函数当做参数。

下边介绍一种函数指针数组的使用情况

假如我们要写一个群发邮件的程序,向不同的人发送不同类型的内容,很自然的想到,我们用struct 来实现

 #include <stdio.h>
#include <stdlib.h>
#include <string.h> /**
创建一个包含需要类型的枚举来保存类型数据
*/
enum response_type {
DUMP, /// 舍弃
SECOND_CHANCE, /// 给次机会
MARRIAGE /// 合作
}; /**
* 创建一个结构体,用来保存相应这的姓名和类型
*/
typedef struct {
char *name;
enum response_type type;
}reponse; /**
* 给响应者p 发送dump邮件,单看这个函数,是没有限制条件的
*/
void dump(reponse p) {
printf("Dear: %s \n",p.name);
puts("Unfortunately your last date contacted us to");
puts("say that they will not be seeing you again");
} /**
* 给次机会的方法
*/
void second_chance(reponse p) {
printf("Dear: %s \n",p.name);
puts("Good news: your last date had asked us to");
puts("arrange another meeting. Please call AA");
} /**
* 合作的方法
*/
void marriage(reponse p) {
printf("Dear: %s \n",p.name);
puts("Congratulatons: your last date has contacted");
puts("us with a proposal of marriage");
} int main(int argc, const char * argv[]) { reponse p[] = {
{"James",DUMP},
{"Juces",SECOND_CHANCE},
{"Bande",SECOND_CHANCE},
{"Hanmeimei",SECOND_CHANCE}
}; for (int i = ; i < ; i++) { switch (p[i].type) {
case DUMP:
dump(p[i]);
break;
case SECOND_CHANCE:
second_chance(p[i]);
break;
default:
marriage(p[i]);
break;
}
} return ;
}

我们使用结构来存放需要的数据打印的结果如下

但是代码中充斥着大量的函数调用,每次都需要根据type来判断调用哪个函数,日后如果需要添加新的类型,就要改动很多地方的代码,这并不是我们想看到的

其实接下来的思想跟上边的枚举差不多,我们可以把一类的东西放到一个数组中,根据需要在其中取值就可以了

void (*reponse_array[])(reponse) = {dump,second_chance,marriage};

经过函数指针数组的改造呢,我们就得出了下边的代码

 int main(int argc, const char * argv[]) {

     reponse p[] = {
{"James",DUMP},
{"Juces",SECOND_CHANCE},
{"Bande",SECOND_CHANCE},
{"Hanmeimei",SECOND_CHANCE}
}; void (*reponse_array[])(reponse) = {dump,second_chance,marriage}; for (int i = ; i < ; i++) { reponse_array[p[i].type](p[i]);
} return ;
}

上边的单词写错了 reponse 应该改成 response ,这里就不做修改了

接下来 引入一个可以传多个参数的函数的使用方法,类似printf函数

加入某酒吧中有很多种不同的酒,现在需要写一个程序,当我们输入酒的名称的后可以获取该酒的价格,很简单,程序是这样的

 #include <stdio.h>

 enum drink {
MUDSLIDE,FUZZY_NAVEL,MONKEY_GLAND,ZOMBIE
}; double price(enum drink d) {
switch (d) {
case MUDSLIDE:
return 122.0;
break;
case FUZZY_NAVEL:
return 222.0;
break;
case MONKEY_GLAND:
return 322.0;
break;
default:
return 422.0;
break;
}
} int main(int argc, const char * argv[]) { printf("%f",price(MONKEY_GLAND)); return ;
}

现在我们已经能够获取酒的价格了,但是现在如果我提出这样一个要求,需要知道几种单酒的总价的呢。因此我们就需要写一个函数类似于这样的

double total(,MUDSLIDE,FUZZY_NAVEL,MONKEY_GLAND);

由于输入的酒品的个数是不固定的,因此顺理成章的引申出了可变参数这个概念

我们先看一下打印多个int 的函数

 void print_ints(int arg,...) {
va_list ap;
va_start(ap, arg);
for (int i = ; i < arg; i++) {
printf("%i \n",va_arg(ap, int));
}
va_end(ap);
}

经过我们修改后的代码是这样的

 #include <stdio.h>
#include <stdarg.h> enum drink {
MUDSLIDE,FUZZY_NAVEL,MONKEY_GLAND,ZOMBIE
}; double price(enum drink d) {
switch (d) {
case MUDSLIDE:
return 122.0;
break;
case FUZZY_NAVEL:
return 222.0;
break;
case MONKEY_GLAND:
return 322.0;
break;
default:
return 422.0;
break;
}
} double total(int args,...) {
double total = 0.0;
va_list ap;
va_start(ap, args);
for (int i = ; i < args; i++) {
double p = price(va_arg(ap, enum drink));
total += p;
}
va_end(ap);
return total;
} int main(int argc, const char * argv[]) { printf("%f",total(,MUDSLIDE,MONKEY_GLAND,FUZZY_NAVEL)); return ;
}

打印结果是

.000000Program ended with exit code: 

c 高级函数的简单用法的更多相关文章

  1. SQL Server中row_number函数的简单用法

    一.SQL Server Row_number函数简介   ROW_NUMBER()是一个Window函数,它为结果集的分区中的每一行分配一个连续的整数. 行号以每个分区中第一行的行号开头. 以下是R ...

  2. python3字符串格式化format()函数的简单用法

    format()函数 """ 测试 format()函数 """ def testFormat(): # format()函数中有几个元素, ...

  3. 【我要学python】open函数的简单用法

    open函数 1,使用方法:open('文件路径', '模式',编码方式). 2,最好使用with open as: 省去每一次都需要close()的环节 3,模式介绍: ①w 可写(如果存在,会覆盖 ...

  4. JS中回调函数的简单用法

    a能拿b,b能拿到c,c能拿到d,实现a拿到d的东西. function a() { b(function (data) { console.log(data); }); } function b(c ...

  5. matlab中disp函数的简单用法

    输出数组类型的数据,也可以把string类型的数据看做数组输出 输出数字 >> num = ; >> disp(num) 输出字符串 >> disp('this i ...

  6. Oracle的substr函数简单用法与substring区别

    substr(字符串,截取开始位置,截取长度) //返回截取的字 substr('Hello World',0,1) //返回结果为 'H'  *从字符串第一个字符开始截取长度为1的字符串 subst ...

  7. python简单的函数定义和用法实例

    python简单的函数定义和用法实例 这篇文章主要介绍了python简单的函数定义和用法,实例分析了Python自定义函数及其使用方法,具有一定参考借鉴价值,需要的朋友可以参考下 具体分析如下: 这里 ...

  8. Oracle的substr函数简单用法

    substr(字符串,截取开始位置,截取长度) //返回截取的字 substr('Hello World',0,1) //返回结果为 'H'  *从字符串第一个字符开始截取长度为1的字符串 subst ...

  9. Oracle的substr函数简单用法(转)

    转:http://www.cnblogs.com/nicholas_f/articles/1526063.html substr(字符串,截取开始位置,截取长度) //返回截取的字 substr('H ...

随机推荐

  1. 移动硬盘不能识别的常见7种解决方案 ~ By 逆天经验

    服务器汇总:http://www.cnblogs.com/dunitian/p/4822808.html#iis 服务器异常: http://www.cnblogs.com/dunitian/p/45 ...

  2. WebApi - 路由

    这段时间的博客打算和大家一起分享下webapi的使用和心得,主要原因是群里面有朋友说希望能有这方面的文章分享,随便自己也再回顾下:后面将会和大家分不同篇章来分享交流心得,希望各位多多扫码支持和点赞,谢 ...

  3. SDWebImage源码解读 之 NSData+ImageContentType

    第一篇 前言 从今天开始,我将开启一段源码解读的旅途了.在这里先暂时不透露具体解读的源码到底是哪些?因为也可能随着解读的进行会更改计划.但能够肯定的是,这一系列之中肯定会有Swift版本的代码. 说说 ...

  4. angular 源码分析 1 - angularInit()

    angularjs 是个神奇的框架,由于我的好奇,想了解她的内部工作原理,只能一步一步的走进她,靠近她,和她深入的交流. angularjs 的入口是什么样子的呢?一起掀起她的盖头吧. 在这里我只讲方 ...

  5. FreeMarker:怎么使用

    第一个FreeMarker程序 1. 建立一个普通的java项目:testFreeMarker 2. 引入freemarker.jar包 3. 在项目目录下建立模板目录:templates 4. 在t ...

  6. javaScript之BOM操作1

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. Openstack Periodic Task

    Openstack Periodic Task 周期性任务在各个模块的manager.py(computer,scheduler,cell,network)中添加. 添加方法:在模块manager类实 ...

  8. 一键部署mono 免费空间支持ASP.NET MVC 再也不担心伙食费换空间了

    一直以来 部署mono 都是很头疼的事情 因为是我在是不熟悉非win环境,今天偶然发现这个项目,挺好的,分享下 https://github.com/wshearn/openshift-communi ...

  9. 《高性能javascript》一书要点和延伸(上)

    前些天收到了HTML5中国送来的<高性能javascript>一书,便打算将其做为假期消遣,顺便也写篇文章记录下书中一些要点. 个人觉得本书很值得中低级别的前端朋友阅读,会有很多意想不到的 ...

  10. 《深入理解Java虚拟机》类文件结构

    上节学习回顾 在上一节当中,主要以自己的工作环境简单地介绍了一下自身的一些调优或者说是故障处理经验.所谓百变不离其宗,这个宗就是我们解决问题的思路了. 本节学习重点 在前面几章,我们宏观地了解了虚拟机 ...