函数指针 : 函数回调 动态函数调用
1.指针类型和函数类型必须一致
#import <Foundation/Foundation.h>
//int maxValue(int a,int
b){
// return a > b ? a : b;
//}
//int
minValue(int a,int b){
// return a < b ? a :
b;
//}
//
//typedef int(*pFun)(int,int);//pFun是变量类型
//
//int
getValue(int a,int b,pFun p){//函数定义
// return
p(a,b);
//}
///////////////1.有一学生数组,将90分以上的学?生姓
名后加上”(月薪过万)”////////////////
//struct student {
// float
score;
// char name[50];
//};
//typedef struct
student Student;
//
//void fun(char *
str){//定义一个拼接字符串的函数
// strcat(str,
"月薪过万");
//}
//typedef void(* pFun2)(char *);//指针类型void
和函数类型一定要一样
//
//void changeName(Student * arr,int count,pFun2
p){
// for (int i = 0; i < count; i++)
{
// if (arr[i].score > 90)
{
//
p(arr[i].name);//函数回调相当于
fun(arr[i].name);
//
}
// }
//}
//void printStudent(Student * arr,int
count){
// for (int i = 0; i < count; i++)
{
// printf("%.2f
%s\n",arr[i].score,arr[i].name);
//
}
//}
//////////////////////////////////////////////////////////////////////////
///////////////2.学?生结构体数组,按成绩排序、按年
龄排序,按名字排序...如何实现///////////////
struct student {
float
score;
int age;
char
name[50];
};
typedef struct student Stu;
typedef BOOL(*pFun)(Stu
*,Stu *);//和位置没关系 类型,参数一样就行
typedef struct funPointer
{
char name[50];//函数名
pFun pointer;
//函数指针
}fPointer;//定义函数指针数组
BOOL scorePanduan(Stu * stu1,Stu *
stu2){//成绩从高到低
return stu1->score <
stu2->score;
}
BOOL agePanduan(Stu * stu1,Stu *
stu2){//年龄从小到大
return stu1->age >
stu2->age;
}
BOOL namePanduan(Stu * stu1,Stu *
stu2){//名字从a到z
return strcmp(stu1->name, stu2->name)
> 0;
}
fPointer pointer[2] =
{{"成绩排序",scorePanduan},{"姓名排序",namePanduan}};//给函数指针数组赋值
pFun
getFunction(fPointer * arr,int count,char *
str){//(函数指针数组名,函数个数,函数名)
for (int i = 0; i < count;
i++) {
if (strcmp(arr[i].name,
str) == 0) {//比较传进去的名和函数指针数组中得名
如果一样
return arr[i].pointer;
//返回函数指针
}
}
return NULL;//要有返回值
}
void sort(Stu * stu,int
count,char * str){
pFun p = getFunction(pointer, 2,
str);
for (int i = 0; i < count - 1; i++)
{
for (int j = 0; j < count - i
- 1; j++)
{
if(p(&stu[j],&stu[j +
1])){//if判断中函数回调
Stu temp =
stu[j];
stu[j] = stu[j +
1];
stu[j + 1] =
temp;
}
}
}
}
void printStudent(Stu * stu,int count){
for
(int i = 0; i < count; i++) {
printf("%.2f %d
%s\n",stu[i].score,stu[i].age,stu[i].name);
}
}
int main(int argc, const char *
argv[])
{
// pFun p = maxValue;
//
//int (*p)(int,int) = maxValue;//p保存函数maxValue的地址 p是变量名
//
int max = p(3,5);//用指针名直接调用函数
// printf("max =
%d\n",max);
//
// p =
minValue;
// max = p(10,3);
//
printf("%d\n",max);
// int value =
getValue(3, 5, maxValue);
// printf("value =
%d\n",value);
//////
1.
/////
// Student stu[5] =
{{59.9,"shenqingjun"},{99.9,"zhaoyunlong"},{91,"liuchundong"},{95,"lixiaolong"},{89.9,"liujian"}};
//
changeName(stu, 5,fun);
// printStudent(stu,
5);
//////
2.
/////
Stu stu[5] =
{{59.9,21,"aa"},{58.9,20,"ddd"},{80,22,"ccc"},{89.9,23,"bbt"},{90,18,"drr"}};
sort(stu, 5, "姓名排序");
printStudent(stu,5);
return 0;
}
作业:
1、输?一句英?句子,将其中所有单词首字符转换成大写,用回调函数实现。(修改单词功能写成回调函数)。
2、动态函数调用实现下列操作,输入2个数以及操作符计算结果。
@ 求最?公约数 $求最小公倍数?