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

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4
 5 int compare_score(const void *n1 ,const void *n2) {
 6
 7     int *a = (int *)n1;
 8     int *b = (int *)n2;
 9     return *a - *b;
10 }
11
12 int compare_name(const void *n1 , const void *n2) {
13
14     char **a = (char **)n1;
15     char **b = (char **)n2;
16     return strcmp(*a, *b);
17 }
18
19 int main(int argc, const char * argv[]) {
20
21     int array[] = {123,34,55,66,77,342,4,22};
22
23     qsort(array, 8, sizeof(int), compare_score);
24
25     for (int i = 0; i < 8; i++) {
26         printf("%i \n",array[i]);
27     }
28
29     char *name[] = {"abc","efs","ss","gds","aaa","fee"};
30     qsort(name, 6, sizeof(char *), compare_name);
31     for (int i = 0; i < 6; i++) {
32         printf("%s \n",name[i]);
33     }
34
35     return 0;
36 }

输出结果为

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

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

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

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4
 5 /**
 6  创建一个包含需要类型的枚举来保存类型数据
 7  */
 8 enum response_type {
 9     DUMP,            ///  舍弃
10     SECOND_CHANCE,   ///  给次机会
11     MARRIAGE         ///  合作
12 };
13
14 /**
15  *  创建一个结构体,用来保存相应这的姓名和类型
16  */
17 typedef struct {
18     char *name;
19     enum response_type type;
20 }reponse;
21
22 /**
23  *  给响应者p 发送dump邮件,单看这个函数,是没有限制条件的
24  */
25 void dump(reponse p) {
26     printf("Dear: %s \n",p.name);
27     puts("Unfortunately your last date contacted us to");
28     puts("say that they will not be seeing you again");
29 }
30
31 /**
32  *  给次机会的方法
33  */
34 void second_chance(reponse p) {
35     printf("Dear: %s \n",p.name);
36     puts("Good news: your last date had asked us to");
37     puts("arrange another meeting. Please call AA");
38 }
39
40 /**
41  *  合作的方法
42  */
43 void marriage(reponse p) {
44     printf("Dear: %s \n",p.name);
45     puts("Congratulatons: your last date has contacted");
46     puts("us with a proposal of marriage");
47 }
48
49 int main(int argc, const char * argv[]) {
50
51     reponse p[] = {
52                         {"James",DUMP},
53                         {"Juces",SECOND_CHANCE},
54                         {"Bande",SECOND_CHANCE},
55                         {"Hanmeimei",SECOND_CHANCE}
56                     };
57
58     for (int i = 0; i < 4; i++) {
59
60         switch (p[i].type) {
61             case DUMP:
62                 dump(p[i]);
63                 break;
64             case SECOND_CHANCE:
65                 second_chance(p[i]);
66                 break;
67             default:
68                 marriage(p[i]);
69                 break;
70         }
71     }
72
73     return 0;
74 }

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

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

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

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

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

 1 int main(int argc, const char * argv[]) {
 2
 3     reponse p[] = {
 4                         {"James",DUMP},
 5                         {"Juces",SECOND_CHANCE},
 6                         {"Bande",SECOND_CHANCE},
 7                         {"Hanmeimei",SECOND_CHANCE}
 8                     };
 9
10     void (*reponse_array[])(reponse) = {dump,second_chance,marriage};
11
12     for (int i = 0; i < 4; i++) {
13
14         reponse_array[p[i].type](p[i]);
15     }
16
17     return 0;
18 }

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

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

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

 1 #include <stdio.h>
 2
 3 enum drink {
 4     MUDSLIDE,FUZZY_NAVEL,MONKEY_GLAND,ZOMBIE
 5 };
 6
 7 double price(enum drink d) {
 8     switch (d) {
 9         case MUDSLIDE:
10             return 122.0;
11             break;
12         case FUZZY_NAVEL:
13             return 222.0;
14             break;
15         case MONKEY_GLAND:
16             return 322.0;
17             break;
18         default:
19             return 422.0;
20             break;
21     }
22 }
23
24 int main(int argc, const char * argv[]) {
25
26
27     printf("%f",price(MONKEY_GLAND));
28
29     return 0;
30 }

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

double total(3,MUDSLIDE,FUZZY_NAVEL,MONKEY_GLAND);

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

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

1 void print_ints(int arg,...) {
2     va_list ap;
3     va_start(ap, arg);
4     for (int i = 0; i < arg; i++) {
5         printf("%i \n",va_arg(ap, int));
6     }
7     va_end(ap);
8 }

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

 1 #include <stdio.h>
 2 #include <stdarg.h>
 3
 4 enum drink {
 5     MUDSLIDE,FUZZY_NAVEL,MONKEY_GLAND,ZOMBIE
 6 };
 7
 8 double price(enum drink d) {
 9     switch (d) {
10         case MUDSLIDE:
11             return 122.0;
12             break;
13         case FUZZY_NAVEL:
14             return 222.0;
15             break;
16         case MONKEY_GLAND:
17             return 322.0;
18             break;
19         default:
20             return 422.0;
21             break;
22     }
23 }
24
25 double total(int args,...) {
26     double total = 0.0;
27     va_list ap;
28     va_start(ap, args);
29     for (int i = 0; i < args; i++) {
30         double p = price(va_arg(ap, enum drink));
31         total += p;
32     }
33     va_end(ap);
34     return total;
35 }
36
37
38
39
40 int main(int argc, const char * argv[]) {
41
42
43     printf("%f",total(3,MUDSLIDE,MONKEY_GLAND,FUZZY_NAVEL));
44
45     return 0;
46 }

打印结果是

666.000000Program ended with exit code: 0

c 高级函数的简单用法相关推荐

  1. python3的格式化用法_浅析python3字符串格式化format()函数的简单用法

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

  2. matlab中ode45函数的用法_带你理解Excel中COUNTIF函数的简单用法

    每天5分钟,每天学一点. COUNTIF函数是Excel中最常用的统计函数之一,它的作用主要是用于根据特定条件对数据进行统计.假如,你想统计一下本周总共做了几次健身/瑜伽,或者统计上了几次培训课,那么 ...

  3. MATLAB中画折线图:plot函数的简单用法

    20年4月24日更新 关于MATLAB里柱状图的画法,以及如何在图例legend和轴标签xlabel里加入latex公式,请参考 https://blog.csdn.net/u014261408/ar ...

  4. map函数的简单用法。

    在这里感谢新浪博客的daylive的博文: Map是c++的一个标准容器,她提供了很好一对一的关系,在一些程序中建立一个map可以起到事半功倍的效果,总结了一些map基本简单实用的操作! 1. map ...

  5. C语言带空格的字符串输入——gets()函数、scanf()函数缺陷以及改进后的gets_s()函数、scanf_s()函数的简单用法(上)

    **在C语言中,带空格的字符串输入问题相对而言还是比较"坑"的,所以呢,小编就决定要专门谈一谈这个问题,希望对于初学者能够有所帮助. 该篇主要简述了C语言中gets()函数以及sc ...

  6. linux中signal函数的简单用法

    信号是软件中断,它提供了一种处理异步事件的方法,每个信号有个以SIG打头的名字,讲signal函数之前我们先了解下当前系统所支持的信号名称,在linux中敲下kill -l就能查看. [lingyun ...

  7. Oracle中sign函数的简单用法

    sign函数语法: sign(n) sign函数说明: 取数字n的符号,大于0返回1,小于0返回-1,等于0返回0 示例: select sign( 100 ),sign(- 100 ),sign( ...

  8. signal函数的简单用法

    1.函数原型理解 void (*signal(int sig,void(*func)(int)))(int); 指定使用sig指定的信号编号处理信号的方法. signal函数的返回值是函数指针. 比如 ...

  9. oracle lag group,Oracle中的lag()和lead()函数的简单用法(统计增长率)

    这两个函数,是偏移量函数,其用途是:可以查出同一字段下一个值或上一个值,并作为新列存在表中. 准备数据 select t.row_id, t.product_code, t.product_price ...

最新文章

  1. java 类中构造函数的讲解
  2. 背水一战 Windows 10 (19) - 绑定: TemplateBinding 绑定, 与 RelativeSource 绑定, 与 StaticResource 绑定...
  3. bootstrap框架下 单选按钮组的选中以及取值问题
  4. spring security源码分析之core包
  5. 看微信了解MySQL及相关IT技术
  6. ABP框架详解(三)Domain
  7. 编译选项—微软官方+各地总结
  8. C#获取txt记事本内容,防止乱码情况
  9. 《C++ Primer》读书笔记 第三章
  10. 利用numpy生成各种波
  11. Android 的一点总结
  12. 原创专栏:谈谈我对评分模型的理解
  13. 当客户需要被当作“傻瓜”时,请不要客气
  14. Uva220 Othello
  15. 架构设计师(Architect)的专业与角色
  16. 圆内接等边三角形的画法_如何画出圆的内接正三角形
  17. 京东云VPC对等连接(VPC Peering)
  18. 图像特征——纹理特征
  19. ubuntu20 关闭防火墙_ubuntu中如何关闭防火墙
  20. 计算机网络说明文,《Wi-Fi》初中说明文阅读题及答案

热门文章

  1. 高级 Linux 命令精通指南
  2. Oracle 升级10.2.0.5.4 OPatch 报错Patch 12419392 Optional component(s) missing 解决方法
  3. 仿FLASH动感十足鼠标滑过放大的菜单代码
  4. AC日记——积木大赛 洛谷 P1969
  5. ConcurrentHashMap 的实现原理
  6. js中event,event.srcElement,event.target在IE和firefox下的兼容性
  7. SmartFoxServer 2X 笔记一:login request (转)
  8. BSTR 、LPCTSTR、CString附C语言串基本操作
  9. Python 机器学习库 Top 10,你值得拥有!
  10. myeclipse中git的使用