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. 你知道C#中的Lambda表达式的演化过程吗?

    那得从很久很久以前说起了,记得那个时候... 懵懂的记得从前有个叫委托的东西是那么的高深难懂. 委托的使用 例一: 什么是委托? 个人理解:用来传递方法的类型.(用来传递数字的类型有int.float ...

  2. 冒泡,setinterval,背景图的div绑定事件,匿名函数问题

    1.会冒泡到兄弟元素么? $(function(){ $("#a").click(function(){alert("a")}) $("#b" ...

  3. System.FormatException: GUID 应包含带 4 个短划线的 32 位数(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)。

    在NHibernate数据库查询中出现了这个错误,由于是数据库是mysql的,当定义的字段为char(36)的时候就会出现这个错误. [解决方法] 将char(36) 改成varchar(40)就行了 ...

  4. 如何进行python性能分析?

    在分析python代码性能瓶颈,但又不想修改源代码的时候,ipython shell以及第三方库提供了很多扩展工具,可以不用在代码里面加上统计性能的装饰器,也能很方便直观的分析代码性能.下面以我自己实 ...

  5. spark处理大规模语料库统计词汇

    最近迷上了spark,写一个专门处理语料库生成词库的项目拿来练练手, github地址:https://github.com/LiuRoy/spark_splitter.代码实现参考wordmaker ...

  6. 将 instance 部署到 OVS Local Network - 每天5分钟玩转 OpenStack(130)

    上一节创建了 OVS 本地网络 first_local_net,今天我们会部署一个 instance 到该网络并分析网络结构.launch 一个 instance,选择 first_local_net ...

  7. CRL快速开发框架系列教程九(导入/导出数据)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  8. [干货来袭]MSSQL Server on Linux预览版安装教程(先帮大家踩坑)

    前言 昨天晚上微软爸爸开了全国开发者大会,会上的内容,我就不多说了,园子里面很多.. 我们唐总裁在今年曾今透漏过SQL Server love Linux,果不其然,这次开发者大会上就推出了MSSQL ...

  9. 分享两种实现Winform程序的多语言支持的解决方案

    因公司业务需要,需要将原有的ERP系统加上支持繁体语言,但不能改变原有的编码方式,即:普通程序员感受不到编码有什么不同.经过我与几个同事的多番沟通,确定了以下两种方案: 方案一:在窗体基类中每次加载并 ...

  10. Git学习笔记一:新建本地仓库及初始化

    1.百度搜索Git下载安装,直接按默认选项安装即可. 例如:Git-2.7.2-32-bit_setup.1457942412.exe 2.配置Git信息,建立版本仓库 (Alt+PrintScerr ...