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. 【AR实验室】OpenGL ES绘制相机(OpenGL ES 1.0版本)

    0x00 - 前言 之前做一些移动端的AR应用以及目前看到的一些AR应用,基本上都是这样一个套路:手机背景显示现实场景,然后在该背景上进行图形学绘制.至于图形学绘制时,相机外参的解算使用的是V-SLA ...

  2. C# 破解 Reflector8.5

    一.分析 破解.net .dll,可以使用reflector,但官方提供的reflector是需要购买的,因此,破解reflector势在必行. 二.破解Reflector具体步骤 下面为详细的破解步 ...

  3. C# 利用性能计数器监控网络状态

    本例是利用C#中的性能计数器(PerformanceCounter)监控网络的状态.并能够直观的展现出来 涉及到的知识点: PerformanceCounter,表示 Windows NT 性能计数器 ...

  4. Xcode模拟器启动不了,修复ios模拟器

    1.如果可以重置模拟器 首先试试重置模拟器 2.如果不能重置,可以选择使用如下命令杀死模拟器服务: killall -9 com.apple.CoreSimulator.CoreSimulatorSe ...

  5. Spark RDD 核心总结

    摘要: 1.RDD的五大属性 1.1 partitions(分区) 1.2 partitioner(分区方法) 1.3 dependencies(依赖关系) 1.4 compute(获取分区迭代列表) ...

  6. 08.LoT.UI 前后台通用框架分解系列之——多样的Tag选择器

    LOT.UI分解系列汇总:http://www.cnblogs.com/dunitian/p/4822808.html#lotui LoT.UI开源地址如下:https://github.com/du ...

  7. 重撸JS_1

    1.声明 用 var 或 let 声明的未赋初值的变量,值会被设定为undefined(译注:即未定义值,本身也是一个值) 试图访问一个未初始化的变量会导致一个 ReferenceError 异常被抛 ...

  8. 神经网络、logistic回归等分类算法简单实现

    最近在github上看到一个很有趣的项目,通过文本训练可以让计算机写出特定风格的文章,有人就专门写了一个小项目生成汪峰风格的歌词.看完后有一些自己的小想法,也想做一个玩儿一玩儿.用到的原理是深度学习里 ...

  9. 带你实现开发者头条APP(四)---首页优化(加入design包)

    title: 带你实现开发者头条APP(四)---首页优化(加入design包) tags: design,Toolbar,TabLayout,RecyclerView grammar_cjkRuby ...

  10. Android Notification 详解——基本操作

    Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...