c 高级函数的简单用法
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 高级函数的简单用法相关推荐
- python3的格式化用法_浅析python3字符串格式化format()函数的简单用法
format()函数 """ 测试 format()函数 """ def testformat(): # format()函数中有几个元素, ...
- matlab中ode45函数的用法_带你理解Excel中COUNTIF函数的简单用法
每天5分钟,每天学一点. COUNTIF函数是Excel中最常用的统计函数之一,它的作用主要是用于根据特定条件对数据进行统计.假如,你想统计一下本周总共做了几次健身/瑜伽,或者统计上了几次培训课,那么 ...
- MATLAB中画折线图:plot函数的简单用法
20年4月24日更新 关于MATLAB里柱状图的画法,以及如何在图例legend和轴标签xlabel里加入latex公式,请参考 https://blog.csdn.net/u014261408/ar ...
- map函数的简单用法。
在这里感谢新浪博客的daylive的博文: Map是c++的一个标准容器,她提供了很好一对一的关系,在一些程序中建立一个map可以起到事半功倍的效果,总结了一些map基本简单实用的操作! 1. map ...
- C语言带空格的字符串输入——gets()函数、scanf()函数缺陷以及改进后的gets_s()函数、scanf_s()函数的简单用法(上)
**在C语言中,带空格的字符串输入问题相对而言还是比较"坑"的,所以呢,小编就决定要专门谈一谈这个问题,希望对于初学者能够有所帮助. 该篇主要简述了C语言中gets()函数以及sc ...
- linux中signal函数的简单用法
信号是软件中断,它提供了一种处理异步事件的方法,每个信号有个以SIG打头的名字,讲signal函数之前我们先了解下当前系统所支持的信号名称,在linux中敲下kill -l就能查看. [lingyun ...
- Oracle中sign函数的简单用法
sign函数语法: sign(n) sign函数说明: 取数字n的符号,大于0返回1,小于0返回-1,等于0返回0 示例: select sign( 100 ),sign(- 100 ),sign( ...
- signal函数的简单用法
1.函数原型理解 void (*signal(int sig,void(*func)(int)))(int); 指定使用sig指定的信号编号处理信号的方法. signal函数的返回值是函数指针. 比如 ...
- oracle lag group,Oracle中的lag()和lead()函数的简单用法(统计增长率)
这两个函数,是偏移量函数,其用途是:可以查出同一字段下一个值或上一个值,并作为新列存在表中. 准备数据 select t.row_id, t.product_code, t.product_price ...
最新文章
- java 类中构造函数的讲解
- 背水一战 Windows 10 (19) - 绑定: TemplateBinding 绑定, 与 RelativeSource 绑定, 与 StaticResource 绑定...
- bootstrap框架下 单选按钮组的选中以及取值问题
- spring security源码分析之core包
- 看微信了解MySQL及相关IT技术
- ABP框架详解(三)Domain
- 编译选项—微软官方+各地总结
- C#获取txt记事本内容,防止乱码情况
- 《C++ Primer》读书笔记 第三章
- 利用numpy生成各种波
- Android 的一点总结
- 原创专栏:谈谈我对评分模型的理解
- 当客户需要被当作“傻瓜”时,请不要客气
- Uva220 Othello
- 架构设计师(Architect)的专业与角色
- 圆内接等边三角形的画法_如何画出圆的内接正三角形
- 京东云VPC对等连接(VPC Peering)
- 图像特征——纹理特征
- ubuntu20 关闭防火墙_ubuntu中如何关闭防火墙
- 计算机网络说明文,《Wi-Fi》初中说明文阅读题及答案
热门文章
- 高级 Linux 命令精通指南
- Oracle 升级10.2.0.5.4 OPatch 报错Patch 12419392 Optional component(s) missing 解决方法
- 仿FLASH动感十足鼠标滑过放大的菜单代码
- AC日记——积木大赛 洛谷 P1969
- ConcurrentHashMap 的实现原理
- js中event,event.srcElement,event.target在IE和firefox下的兼容性
- SmartFoxServer 2X 笔记一:login request (转)
- BSTR 、LPCTSTR、CString附C语言串基本操作
- Python 机器学习库 Top 10,你值得拥有!
- myeclipse中git的使用