通过函数回调排序结构体数组

来源:互联网 发布:上海兄弟连java学费 编辑:程序博客网 时间:2024/06/08 12:22

通过函数回调排序结构体数组
main文件

#import <Foundation/Foundation.h>#import "teacher.h"/** 函数名枚举 */enum FunctionName{    CompareNameByAscending = 1,    CompareNameByDescending,    CompareNumberByAscending,    CompareNumberByDescending,    CompareScoreByAscending,    CompareScoreByDescending,    PrintFemaleTeacher,    PrintMaleTeacher};int main(int argc, const char * argv[]) {    // 创建结构体    Teacher sunGaoJie = {"sunGaoJie",'m',23,002,98};    Teacher zhangChunFei = {"zhangChunFei",'m',25,001,97};    Teacher chenPengJu = {"chenPengJu",'m',22,005,99};    Teacher guLi = {"guLi",'f',20,003,94};    Teacher wangChao = {"wangChao",'f',21,006,92};    // 结构体数组    Teacher tea[5] = {sunGaoJie,zhangChunFei,chenPengJu,guLi,wangChao};    // 用于存储用户输入的选项    short number = 0;    // 存数是否结束的用户输入    char goOn = 'Y';    // 存储是否选择输出男女老师    BOOL pintfSex = NO;    // 初始化函数指针    CompareFunctionPointer cfp = NULL;    // 主循环    while (goOn!='n' && goOn!='N') {        pintfSex = NO;        printf("==================================\n");        printf("输入1: 实现按照姓名进行升序排列\n");        printf("输入2: 实现按照姓名进行降序排列\n");        printf("输入3: 实现按照员工编号进行升序排列\n");        printf("输入4: 实现按照员工编号进行降序排列\n");        printf("输入5: 实现按照评分进行升序排列\n");        printf("输入6: 实现按照评分进行降序排列\n");        printf("输入7: 实现输出所有女员工\n");        printf("输入8: 实现输出所有男员工\n");        printf("==================================\n");        printf("请输入实现功能对应的数字:\n");        scanf("%hd",&number);        getchar();        switch (number) {                // 进行各选项函数回调            case CompareNameByAscending:                cfp=compareNameByAscending;break;            case CompareNameByDescending:                cfp=compareNameByDescending;break;            case CompareNumberByAscending:                cfp=compareNumberByAscending;break;            case CompareNumberByDescending:                cfp=compareNumberByDescending;break;            case CompareScoreByAscending:                cfp=compareScoreByAscending;break;            case CompareScoreByDescending:                cfp=compareScoreByDescending;break;                // 输出那女老师,如果选择讲printSex的布尔值变为YES            case PrintFemaleTeacher:                printFemaleTeacher(tea, 5);pintfSex=YES;break;            case PrintMaleTeacher:                printMaleTeacher(tea, 5);pintfSex=YES;break;            default:printf("输入错误,请重新输入!\n");pintfSex=YES;break;        }        sortTeachers(tea, 5, cfp);        if (pintfSex==NO) {            printTeachers(tea, 5);        }        printf("继续执行吗?(Y/N)");        scanf("%c",&goOn);    }    printf("再见!\n");    return 0;}

TEACHER.h文件

#import <Foundation/Foundation.h>/** 老师结构体声明 */typedef struct Teacher{    char name[20];    char sex;    short age;    short number;    float score;}Teacher;/** 比较函数指针 */typedef BOOL (*CompareFunctionPointer)(Teacher teacher1,Teacher teacher2);#pragma mark - 从此以下为函数声明/** 打印一个员工 */void printTeacher(Teacher* teacher);/** 员工数组排序 */void sortTeachers(Teacher teacher[],int count,CompareFunctionPointer cfp);/** 打印员工数组 */void printTeachers(Teacher teacher[],int count);/** 打印男员工 */void printMaleTeacher(Teacher *teachers,int count);/** 打印女员工 */void printFemaleTeacher(Teacher *teachers,int count);/** 比较员工姓名 */BOOL compareNameByAscending(Teacher teacher1,Teacher teacher2);BOOL compareNameByDescending(Teacher teacher1,Teacher teacher2);/** 比较员工编号 */BOOL compareNumberByAscending(Teacher teacher1,Teacher teacher2);BOOL compareNumberByDescending(Teacher teacher1,Teacher teacher2);/** 比较员工评分 */BOOL compareScoreByAscending(Teacher teacher1,Teacher teacher2);BOOL compareScoreByDescending(Teacher teacher1,Teacher teacher2);

teach.m文件

#import "teacher.h"#import "teacher.h"/** 打印一个老师 */void printTeacher(Teacher* teacher){    printf("这名老师的姓名:%s 性别:%c 年龄:%hd 员工编号:%hd 评分:%.2f\n",teacher->name,teacher->sex,teacher->age,teacher->number,teacher->score);}/** 员工数组排序 */void sortTeachers(Teacher teacher[],int count,CompareFunctionPointer cfp){    Teacher terTemp = {0};    if (cfp == NULL) {        return;    }    for (int i = 0; i < count-1; i++) {        for (int j = 0; j < count-i-1; j++) {            if (cfp(teacher[j],teacher[j+1])) {                terTemp = teacher[j];                teacher[j] = teacher[j+1];                teacher[j+1] = terTemp;            }        }    }}/** 打印员工数组 */void printTeachers(Teacher teacher[],int count){    for (int i = 0; i < count; i++) {        printTeacher(&teacher[i]);    }}/** 打印男员工 */void printMaleTeacher(Teacher *teachers,int count){    for (int i = 0 ; i < count; i++) {        if (teachers[i].sex == 'm') {            printTeacher(&teachers[i]);        }    }}/** 打印女员工 */void printFemaleTeacher(Teacher *teachers,int count){    for (int i = 0 ; i < count; i++) {        if (teachers[i].sex == 'f') {            printTeacher(&teachers[i]);        }    }}#pragma mark - 函数指针回调(比较值)/** 比较员工姓名 */BOOL compareNameByAscending(Teacher teacher1,Teacher teacher2){    return strcmp(teacher1.name, teacher2.name) > 0;}BOOL compareNameByDescending(Teacher teacher1,Teacher teacher2){    return strcmp(teacher1.name, teacher2.name) < 0;}/** 比较员工编号 */BOOL compareNumberByAscending(Teacher teacher1,Teacher teacher2){    return teacher1.number > teacher2.number;}BOOL compareNumberByDescending(Teacher teacher1,Teacher teacher2){    return teacher1.number < teacher2.number;}/** 比较员工评分 */BOOL compareScoreByAscending(Teacher teacher1,Teacher teacher2){    return teacher1.score > teacher2.score;}BOOL compareScoreByDescending(Teacher teacher1,Teacher teacher2){    return teacher1.score < teacher2.score;}
0 0
原创粉丝点击