设为首页 加入收藏

TOP

C语言第十一课
2014-11-23 19:09:04 来源: 作者: 【 】 浏览:17
Tags:语言 十一

主要内容:函数指针

一、函数指针的定义

int maxValue(int a,int b)

{

return a > b a : b;

}

函数名和数组名一样是地址,存在在代码区


int maxValue(int a,int b)

int (*p)(int,int)= NULL

函数指针定义,p是变量,其他是类型(通常没有形参a,b)

p = maxValue(函数指针的使用:赋值函数名)

int m = p(3,5)(指针可当函数用)


练习:定义两个函数,一个求最大值,一个求和,用户从控制台输入两个整数,在从控制台输入max或sum分别求3和5的最大值或和,(提示:定义一个函数指针,根据输入内容指向不同的函数,最后一次调用完成)

int maxValue ( int a, int b ) / / 求最大值的函数

{

return a > b a : b;

}

int sumValue ( int a, int b ) / / 求和的函数

{

return a + b;

}


int main( int argc, const char *argv[])

{

void (*p) (int , int) = NULL; / / 定义一个指针变量

int a , b; / / 定义两个需要用的整型变量

printf(" 请输入两个整数: "); / / 让用户输入两个整数

scanf(" %d%d ",&a,&b); / / 标准的输入函数

printf(" 请输入sum或者max: "); / / 让用户输入sum或者max

char *name = malloc(sizeof(char) * 10); / / 申请char类型的乘以10的内存空间

scanf(" %s ", name);

/ / 判断用户输入的是sum还是max

if (strcmp(name, " sum ") == 0){

p = sumValue;

}else if (strcmp(name, " max ") == 0){

p = maxValue;

}else {

printf(" 输入错误,失败 ");

}

free (name); / / 释放内存,一定不能忘


int result = p(a, b); / / 定义result接收结果

printf(" %d ", result); / / 输出结果

}


二、回调函数

函数指针做参数

int getValue(int a, int b, int (*p)(int , int));

getValue: 函数名

int (*p)(int ,int): 函数指针做getValue函数的参数

int value = getValue(3, 5, maxValue);(函数调用:getValue函数执行过程中再调用(回调)maxValue)

如图所示:

\


练习:写一函数查找成绩在90分以上的学生,是用回调函数在姓名后面加“高富帅”< http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+dHlwZWRlZiAgc3RydWN0IHsgICAgICAgICAgIC8gLyAgtqjS5dK7uPa94bm5zOU8L3A+CjxwPmNoYXIgbmFtZVsyMF07PC9wPgo8cD5pbnQgIGFnZTs8L3A+CjxwPmZsb2F0ICBzY29yZTs8L3A+CjxwPn0gU3R1ZGVudDs8L3A+CjxwPjwvcD4KPHA+dm9pZCAgcHJpbnRmU3R1ZGVudChTdHVkZW50ICAqc3R1LCBpbnQgIGNvdW50KaO7PC9wPgo8cD52b2lkICBwcmludGZTdHVkZW50KFN0dWRlbnQgICpzdHUsIGludCAgY291bnQpICAgLyAvICDJ+cP3sqKx4NC00ru49rTy06G94bm5zOXK/dfptcS6r8r9PC9wPgo8cD57PC9wPgo8cD5mb3IoaW50ICBpID0gMDsgaSA8IGNvdW50IDsgaSYjNDM7JiM0MzspezwvcD4KPHA+cHJpbnRmKA=="%s %d %.2f", (stu + i) ->name, (stu + i) ->age, (stu + i) ->score);

}

}


/ / 声明并编写查找90分以上的学生并在姓名后面加“高富帅”

void changeStudent(Student *stu, int count, void (*p)(Student *));

void changeStudent(Student *stu, int count, void(*p)(Student *))

{

for (int i = 0; i < count ; i++){

if ((stu + i) ->score >= 90){

p(stu + i);

}

}

}


void changeName(Student *stu);

void changeName(Student *stu)

{

strcat (stu ->name, " 高富帅 ");

}


int main(int argc, const char*argv[]){

Student student = { / / 定义结构体变量

{" 方世玉 ", 26, 92},

{" 令狐冲 ", 30, 89},

{" 韦小宝 ", 27, 99},

{" 花仙子 ", 20, 80},

{" 大教主 ", 24, 80}

};

int count = sizeof(student) / sizeof(Student); / / 求结构体数组的长度


printfStudent(stuent, count); / / 打印没查找前的结构体数组


changeStudent(student, count, changeName); / / 判断是否符合条件90分以上的进行改变


printfStudent(student, count) / / 打印查找后的结构体数组

}

三、动态排序

排序需求不定,无法预测的需求变更

void sortArray(int *array, int count)

{

for (int i = 0; i < count - 1; i++){

for (int j = 0; j < count - 1 - i; j++){

if (条件(需求)) {

交换

}

}

}

}

决定排序方式的重要语句封装成函数在此回调


int 数组动态排序

typedef BOOL(* PFUNC)(int , int); / / 为函数指针类型起名为PFUNC

void sortArray(int *array, int count , PFUNC p); / / 动态函数排序声明

示例:

/ / 1:创建一个结构体

typedef struct {

char name[20];

int age;

float score;

} Student;


/ / 3:打印学生结构体数组的函数

void printfStudent(Student *stu, int count);

void printfStudent(Student *stu, int count)

{

for (int i = 0; i < count; i++){

printf("%s %d %.2f",(stu + i) ->name, (stu + i) ->age, (stu + i) ->score);

}

printf("\n");

}


/ / 5:写一个函数根据分数从小到大排序

void paiXuStudent(Student *stu, int count, BOOL (*PFUNC)(Student *stu1, Student *stu2));

void paiXuStudent(Student *stu, int count, BOOL (*PFUNC)(Student *stu1, Student *stu2))

{

for (int i = 0; i < count - 1; i++){

for (int j = 0; j < count - 1 - i; j++){

if (PFUNC((stu + j), (stu + j + 1))){

Student temp;

temp = *(stu + j);

*(stu + j) = *(stu + j + 1);

*(stu + j + 1) = temp;

}

}

}

}


/ / 6:定义一个按分数比较大小的函数

BOOL biJiaoScore(Student *stu1, Student *stu2);

BOOL biJiaoScore(Student *stu1, Student *stu2)

{

return stu1 ->score > stuff ->score;

}


/ / 定义一个按年龄排序的函数

BOOL compareAge(Student *stu1, Student *stu2);

BOOL compareAge(Student *stu1, Student *stu2)

{

return stu1 ->age > stuff ->age

}


int main(int argc, char * argv[]){

/ / 2:创建学生结构体数组

Student *student = {

{"索隆", 22, 93},

{"香吉士", 21, 97},

{"犬夜叉", 20, 80},

{"路飞", 19, 70}

};

/ / 4:排序前调用打印函数打印结构体数组

int count = sizeof(student) / sizeof(Student);

printfStudent(student, count);

/ / 7:调用函数

paiXuStudent(student, count , biJiaoScore);

/ / paiXuStudent(student, count , compareAge);按年龄排序(只需传入函数就可)

/ / 8:打印排序后的结构体数组

printfStudent(student, count);

}


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C语言标准库之setjmp 下一篇Objective-c下具有下载功能的NSUR..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: