C语言--函数指针

来源:互联网 发布:弹幕源码下载 编辑:程序博客网 时间:2024/05/22 12:14


#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)//即:我是一个 返回值为整型,有两个整型参数的函数.//函数名为 sumint 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;}


0 0
原创粉丝点击