//  main.m

//  1-28随堂笔记

//讲师: 小辉

//笔者: 王学文

//  Created by lanouhn on 15/1/28.

//  Copyright (c) 2015年 lanouhn. All rights reserved.

// 函数指针, 回调函数

 

#import <Foundation/Foundation.h>

struct student {

    char name[20];

    float score;

    int age;

};

typedef struct student Student;

 

void printHello();

void printHello() {

    printf("HelloWorld!\n");

}

 

int maxNumber(int a, int b);

int maxNumber(int a, int b) {

    return a > b ? a : b;

}

 

int sumNumber(int m, int n);

int sumNumber(int m, int n) {

    return m + n;

}

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

int function(int a, int b, int (*p)(int, int)) {

    return p(a, b);

}

 

BOOL isScore(Student *p1, Student *p2); //判断分数高低,

BOOL isScore(Student *p1, Student *p2) {

    //1.

//    if (p1 ->score < p2 ->score) {

//        return YES;

//    } else {

//        return NO;

//    }

    //2.

//    return p1 ->score < p2 ->score  ? YES : NO;

    //3.

    return p1 -> score  < p2 ->score;

}

 

BOOL isName(Student *p1, Student *p2); //判断姓名的前后

BOOL isName(Student *p1, Student *p2) {

    return strcmp(p1 ->name, p2 ->name) > 0;

}

 

BOOL isAge(Student *p1, Student *p2); //判断年龄的大小

BOOL isAge(Student *p1, Student *p2) {

    return p1 ->age > p2 ->age;

}

 

typedef BOOL (*SortType)(Student *, Student *); //类型转换

 

SortType isType(char *string); //判断main函数中调用函数时按什么排序

SortType isType(char *string) {

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

        return isName;

    } else if (strcmp(string, "age") == 0) {

        return isAge;

    } else if (strcmp(string, "score") == 0) {

        return isScore;

    } else {

        return isName;

    }

}

 

void sort(Student *p, int n, char *string); //冒泡交换结构体

void sort(Student *p, int n, char *string) {

    

    SortType funp = isType(string); //(重定义)指针指向按什么类型排序

    

    BOOL flag = YES;

    for (int i = 0; i < n - 1 && flag; i++) {

        flag = NO;

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

            if (funp(p + j, p + j + 1)) { //funp用的是前面BOOL函数里的返回值

                Student temp = {0};

                temp = *(p + j);

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

                *(p + j + 1) = temp;

                flag = YES;

            }

        }

    }

}

 

//void sort(Student *p, int n, SortType funp);

//void sort(Student *p, int n, SortType funp) {

//    BOOL flag = YES;

//    for (int i = 0; i < n - 1 && flag; i++) {

//        flag = NO;

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

//            if (funp(p + j, p + j + 1)) {

//                Student temp = *(p + j);

//                *(p + j) = *(p + j + 1);

//                *(p + j + 1) = temp;

//                flag = YES;

//            }

//        }

//    }

//}

void printStu(Student *p, int n);

void printStu(Student *p, int n) {

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

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

    }

}

 

 

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

    //栈区地址

    int a = 0;

    printf("%p\n", &a);

    

    //堆区地址

    int *p = malloc(sizeof(int) * 10);

    printf("%p\n", p);

    

    //静态全局区

    static int b = 1;

    printf("%p\n", &b);

    

    //常量区地址

    char *p1 = "ABC";

    printf("%p\n", p1);

    

    //代码区地址

    printHello();

    

    //数组的名字,是数组的首地址

    int array[5] = {1, 2, 3, 4, 5};

    printf("%p\n", array);

    

    //函数的名字,也是函数的首地址

    //函数的首地址在代码区

    printf("%p\n", printHello);

    

    //获取两个数的最大值()函数

    maxNumber(5, 10);

    printf("%p\n", maxNumber);

    

    //存储数组的首地址

    //int *p2 = array;

    

    //如何存一个函数的首地址

    

    //函数指针定义

    //返回值类型(*p)(参数类型1, 参数类型2, ...) = 初值;

    //注:

    //1. p是指针名字

    //2. 除指针名字p以外的, 是函数指针的类型

    

    int (*p3)(int, int ) = NULL;

    p3 = maxNumber;

    

    //指向数组首地址的指针有什么作用

    //可以当做数组使用

    //p2[1]; *(p2 + 1);

    

    //指向函数首地址的指针; 可以用来调用函数

    maxNumber(1, 2);

    p3(1, 2);

    

    //定义一个指针指向printHello

    

    void (*p4)() = NULL;

    p4 = printHello;

    p4();

 

    //求两个整型数之和的函数

    int (*p5)(int, int) = NULL;

    p5 = sumNumber;

    int sum = p5(10, 20);

    printf("%d\n", sum);

    

    //函数指针作为函数的参数使用

    

    int sum1 = function(1, 2, sumNumber);

    int max1 = function(1, 2, maxNumber);

    printf("两数之和%d, 两数中最大值%d\n", sum1, max1);

    

    //回调函数: 使用函数指针来调用函数

    

    //重命名函数指针类型

    //函数指针的重命名比较特殊,新名字需要写在*后面

    typedef int (*ABC)(int, int);

    //ABC p6 = NULL;

    

    //写一函数查找成绩90分以上的成员,使用回调函数

    

    //定义一个结构体数组

    Student arr[5] = {

        {"zhangsan", 80.0, 25},

        {"lisi", 90.5, 22},

        {"wangwu", 70.0, 20},

        {"zhaoliu", 59.9, 18},

        {"zhouqi", 88.0, 24}

    };

    

    //根据考试成绩由高到低排序

    printStu(arr, 5);

    

//    //姓名

//    sort(stu, 5, isName);

//    //成绩

//    sort(stu, 5, isScore);

//    //年龄

//    sort(stu, 5, isAge);

    

    printf("\n");

    sort(arr, 5, "name");

    printStu(arr, 5);

    printf("\n");

    sort(arr, 5, "score");

    printStu(arr, 5);

    printf("\n");

    sort(arr, 5, "age");

    printStu(arr, 5);

    

    

    

    return 0;

}

 

posted on 2015-01-28 16:56  小雪童鞋  阅读(295)  评论(0编辑  收藏  举报