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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值