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. 【原】谈谈对Objective-C中代理模式的误解

    [原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...

  2. Linux虚拟机的安装(使用Centos6.3)

    1.什么是虚拟机? 虚拟机指通过软件模拟的具有完整硬件系统功能的.运行在一个完全隔离环境中的完整计算机系统 2.安装Linux虚拟机前要做的准备 2.1:一台windows环境的pc 2.2:下载VM ...

  3. HTML5 介绍

    本篇主要介绍HTML5规范的内容和页面上的架构变动. 目录 1. HTML5介绍 1.1 介绍 1.2 内容 1.3 浏览器支持情况 2. 创建HTML5页面 2.1 <!DOCTYPE> ...

  4. Git分布式版本控制教程

    Git分布式版本控制Git 安装配置Linux&Unix平台 Debian/Ubuntu $ apt-get install git Fedora $ ) $ dnf and later) G ...

  5. springmvc+mybatis+spring 整合 bootstrap html5

    A 调用摄像头拍照,自定义裁剪编辑头像 [新录针对本系统的视频教程,手把手教开发一个模块,快速掌握本系统]B 集成代码生成器 [正反双向](单表.主表.明细表.树形表,开发利器)+快速构建表单;  技 ...

  6. iOS开源项目周报1229

    由OpenDigg 出品的iOS开源项目周报第三期来啦.我们的iOS开源周报集合了OpenDigg一周来新收录的优质的iOS开发方面的开源项目,方便iOS开发人员便捷的找到自己需要的项目工具等. Ma ...

  7. CYQ.Data V5 从入门到放弃ORM系列:教程 - AppConfig、AppDebug类的使用

    1:AppConfig类的介绍: Public Static (Shared) Properties IsEnumToInt 是否使用表字段枚举转Int方式(默认为false). 设置为true时,可 ...

  8. Linux CentOS7通过yum命令安装Mono(尝先安装模式)

    前言 经过尝试网上各种安装mono的技术贴,这个安装过程经历了大约2周,尝试了各个版本,几目前博客所描述的所有安装方式.以下内容的安装方式可以为你尝试不同版本的mono.并非正式环境安装标准方式安装. ...

  9. JDK 中的证书生成和管理工具 keytool

    参考资料 该文中的内容来源于 Oracle 的官方文档 Java SE Tools Reference .Oracle 在 Java 方面的文档是非常完善的.对 Java 8 感兴趣的朋友,可以直接找 ...

  10. C#开发奇技淫巧三:把dll放在不同的目录让你的程序更整洁

    系列文章 C#开发奇技淫巧一:调试windows系统服务 C#开发奇技淫巧二:根据dll文件加载C++或者Delphi插件 C#开发奇技淫巧三:把dll放在不同的目录让你的程序更整洁 程序目录的整理 ...