《嗨翻C语言》随书练习七 7章 高级函数
编辑时间:2017-03-26 作者:金满斗 浏览量:2405 来源:原创

直接上例子,这个调用函数指针还是比较好理解的。

/* 《嗨翻C语言》随书练习 7章 高级函数  2016-12-06  
xiousheng@126.com  
寻找真命天子例子 
*/ 
#include <stdio.h>
#include <stdlib.h>
 
int NUM_ADS = 7;
char *ADS[] = {
    "王小华:喜欢体育,电视 美食",
    "周星星:喜欢艺术、电影、戏曲",
    "邓小斗:喜欢骑马,射击,读书,画画",
    "张大山:喜欢书籍,戏曲,睡懒觉,体育",
    "习大华:喜欢游泳,画画,园艺",
    "中三郎:喜欢美食,美女,小黄书,体育" ,
    "江坑爹:喜欢美女,音乐,体育" 
};
 
//两个搜索条件函数 
int sport_no_huangshu(char *s){
    return strstr(s,"体育")&& !strstr(s,"小黄书") ;
}
int meisi_no_lanjiao(char *s){
    return strstr(s,"美食")&& !strstr(s,"睡懒觉") ;
}
 
//其实这里有点高级语言的回调函数的意思 
 
void find(int (*match)(char*)){    //调用函数指针 
    int i;
    puts("寻找我的真命天子:");
    puts("------------------------------------");
    for(i=0;i<NUM_ADS;i++){
        if(match(ADS[i])){
            printf("符合条件的是%s\r\n",ADS[i]); 
        } 
    } 
} 
 
int main(){
    find(sport_no_huangshu);
    find(meisi_no_lanjiao); 
    return 0;
}

调用排序函数的小例子

/* 《嗨翻C语言》随书练习 7章 高级函数  2016-12-08
xiousheng@126.com
排序算法
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
 
 
 
//按升序排列整形得分
int compare_scores(const void* score_a, const void* score_b){
	int a = *(int*)score_a;
	int b = *(int*)score_b;
	return a - b;
};
 
//按降序排列整形得分
int compare_scores_desc(const void* score_a, const void* score_b){
	int a = *(int*)score_a;
	int b = *(int*)score_b;
	return b - a;
};
 
//按面积从小到大排列矩形
//先定义矩形结构体
typedef struct{
	int width;
	int height;
} rectangle;
 
int compare_areas(const void* a, const void* b){
	rectangle * za = (rectangle*)a;   //因为void* 指针可以表示任意类型,这里先转换为矩形结构体型
	rectangle * zb = (rectangle*)b;
	int areas_a = (za->height)*(za->width);     //计算各自面积
	int areas_b = (zb->height)*(zb->width);
	return areas_a - areas_b;
};
 
//按字目序排列名字,区分大小写
int compare_names(const char* a, const char* b){
	char** sa = (char**)a;   //字符串是字符指针,所以我们这里得到的是指针的指针
	char** sb = (char**)b;
	return strcmp(*sa, *sb);
}
 
 
//库里面自带排序函数,参数(数组指针,数组长度,数组中每个元素长度,真正用于排序计算的函数指针(参数a,b))
//qsort(void *array, size_t length, size_t item_size, int(*compar)(const void *, const void *));   //void* 指针可以指向任意数据类型
 
int main(){
	//按数字排序
	int scores[] = { 543, 321, 223, 345, 678, 993, 876 };
	qsort(scores, 7, sizeof(int), compare_scores_desc);
	puts("看看排序结果");
	for (int i = 0; i < 7; i++){
		printf("%i ", scores[i]);
	};
	printf("\r\n");
	//按字符排序
	char *names[] = { "习近平", "李克强", "江泽民", "温家宝" }; //字符串指针数组
	qsort(names, 4, sizeof(char*), compare_names);
	puts("看看排序结果");
	for (int i = 0; i < 4; i++){
		printf("%s ", names[i]);
	};
	system("PAUSE ");
	return 0;
 
}


来说两句吧