C语言--函数指针
#import <Foundation/Foundation.h> #include "Function.h" int main(int argc, const char * argv[]) { // printf("%d\n",sum(10, 8)); // // int (*p)(int x,int y) = sum; // //函数指针类型 int (*)(int x,int y) // //描述: 指向 返回值为 int 两个int参数 的 指针类型 // //函数指针变量: p // //初始值: sum // // printf("%d", p(8,9)); // // // void (*q)() = printHello; // q(); // char str[10] = {0}; // printf("请输入 maxValue 或者 sum:"); // scanf("%s",str); // // typedef int (*FP)(int x,int y); // //FP是新类型int (*)(int x,int y)是旧类型 // //此时此刻 FP 就是int (*)(int x,int y) // //int (*p)(int x,int y) = NULL; // FP p = NULL; // if (strcmp(str, "maxValue") == 0) { // p = maxValue; // }else if(strcmp(str, "sum")==0){ // p = sum; // } // printf("%d",p(3,5)); // printf("%d\n",getValue(10, 8, minValue)); // printf("%d\n",getValue(10, 8, maxValue)); Student stus[3] = { {"haojianming",89.95,45,1}, {"yaozhaodi",91,13,0.5}, {"dengyongjun",99.99,37,0.3} }; //printArray(stus, 3); sortArray(stus, 3,compareByName ); printArray(stus, 3); // printStudents(stus, 3,"(高富帅)",test); return 0; }
#import "Function.h" //函数声明:声明我是一个什么函数 //求两个数的和 //函数的类型:int (int x,int y) //即:我是一个 返回值为整型,有两个整型参数的函数. //函数名为 sum int sum(int x,int y); int minValue(int x,int y); int maxValue(int x,int y); int getValue(int x,int y, int(*p)(int a,int b)); int max2Value(int x,float y); //int minValue(int x,int y,int z); void printHello(); struct Student{ char name[30]; float score; int age; float attendance; }; typedef struct Student Student; //比较两个学生的年龄大小 BOOL compareByAge(Student s1,Student s2); //比较两个学生的分数大小 BOOL compareByScore(Student s1,Student s2); //比较两个学生的出勤率大小 BOOL compareByAttendance(Student s1,Student s2); //比较两个学生的姓名大小 BOOL compareByName(Student s1,Student s2); typedef BOOL (*CFP)(Student s1,Student s2); void sortArray(Student stus[],int count,CFP p); void printArray(Student stus[],int count); void mark(char originStr[],char markStr[]); void replace(char originStr[],char markStr[]); void test(char originStr[],char markStr[]); typedef void (*PPP)(char originStr[],char markStr[]); void printStudents(Student stus[],int count,char str[],PPP p);
#import "Function.m" int sum(int x,int y) { return x + y; } int maxValue(int x,int y) { return x > y ? x : y; } int minValue(int x,int y) { return x < y ? x : y; } int getValue(int x,int y, int(*p)(int a,int b)) { return p(x,y); } void printHello() { printf("Hello\n"); } void mark(char originStr[],char markStr[]) { strcat(originStr,markStr); } void test(char originStr[],char markStr[]) { } void replace(char originStr[],char markStr[]) { strcpy(originStr, markStr); } void printStudents(Student stus[],int count,char str[],PPP p) { for (int i = 0; i < count; i++) { if (stus[i].score >= 90) { p(stus[i].name,str); printf("%s %.2f\n",stus[i].name,stus[i].score); } } } BOOL compareByAttendance(Student s1,Student s2) { return s1.attendance > s2.attendance ? YES : NO; } BOOL compareByName(Student s1,Student s2) { return strcmp(s1.name, s2.name) > 0 ? YES : NO; } BOOL compareByScore(Student s1,Student s2) { return (s1.score > s2.score) ? YES : NO; } BOOL compareByAge(Student s1,Student s2) { return (s1.age > s2.age) ? YES : NO; } void sortArray(Student stus[],int count,CFP p) { for (int i = 0; i < count - 1; i++) { for(int j = 0; j < count - 1 - i;j++){ //按年龄排 stus[j].age > stus[j+1].age //按分数排 stus[j].score > stus[j+1].score //按出勤率 stus[j].attendance > stus[j+1].attendance if (p(stus[j],stus[j+1])) { Student temp = stus[j]; stus[j] = stus[j+1]; stus[j+1] = temp; } } } } void printArray(Student stus[],int count) { for (int i = 0; i < count; i++){ printf("%s %f %d % f\n",stus[i].name,stus[i].score,stus[i].age,stus[i].attendance); } }
#import <Foundation/Foundation.h> #import "GetValue.h" int main(int argc, const char * argv[]) { /** * 建立一张映射表,存储 字符串-函数名 对儿 函数调用时,检查给定的字符串是否在映射表中,如果在,取出对应的函数名 使用取出的函数名,调用函数,完成结果. */ printf("%d\n",getValue(8, 12, "mul")); return 0; }
#import "GetValue.h" typedef int (*PFUN)(int x,int y); //新类型 PFUN 旧类型int (*)(int x,int y) //映射表是一个 结构体数组,为了建立映射表,我们先建立一个结构体.此结构体包含 一个字符串 和一个函数指针 struct NameFunctionPair { char name[30]; //字符串 PFUN function; //函数指针 }; typedef struct NameFunctionPair NameFunctionPair; //求2个数的最大值 int maxValue(int x,int y); //求2个数的最小值 int minValue(int x,int y); int sum(int x,int y); int minus(int x,int y); int multiple(int x,int y); int divide(int x,int y); int gcd(int x,int y);//最大公约数 int gbs(int x,int y);//最小公倍数 //根据字符串 获取 函数名 PFUN functionOfName(char *name); //三个参数 ,前2个是参与运算的数字,第三个参数用于查询映射表 //返回值是 运算结束后的结果,如何运算,取决于第三个参数. int getValue(int x,int y, char *name);
#import "GetValue.m" NameFunctionPair nfps[] = { {"max",maxValue}, {"min",minValue}, {"sum",sum}, {"minus",minus}, {"mul",multiple}, {"div",divide}, {"gcd",gcd}, {"gbs",gbs} }; PFUN functionOfName(char *name) { for (int i = 0; i < sizeof(nfps)/sizeof(nfps[0]); i++) { if (strcmp(name, nfps[i].name) == 0){ //如果映射表里 有对应的 function, 返回这个 function return nfps[i].function; } } //如果没找到,默认求最大值 return maxValue; } int getValue(int x,int y, char *name) { PFUN fun = functionOfName(name);//根据 name 获取对应的函数 return fun(x,y);//使用选定的函数计算结果 } int gbs(int x,int y) { return x * y / gcd(x, y); } int gcd(int x,int y) { while (x % y != 0) { int temp = x % y; x = y; y = temp; } return y; } int divide(int x,int y) { return x/y; } int multiple(int x,int y) { return x * y; } int minus(int x,int y) { return x - y; } int sum(int x,int y) { return x + y; } int minValue(int x,int y) { return x < y ? x : y; } int maxValue(int x,int y) { return x > y ? x : y; }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。