Xcodeでの関数ポインタ呼び出しと構造体ソートの実装

7045 ワード

①   Teacher , sortTeachers(Teacher  teacher[ ] ,int count,CompareFunctionPointer  cfp) , ( switch…case, ) 、 、 , 、 。 : 、 。

②   。

③   。

 
  

//  Teacher.h
//  Exame
//
//  Created by lanou3g on 15-3-25.
//  Copyright (c) 2015  lanou3g. All rights reserved.
//

#import 
//      
//   
// typedef enum sex
// {
//    Man,
//    Woman
// } Sex;

// typedef struct teacher
// {
//    char name[20];
//     Sex sex;
//    int age;
//    int num;
//    float score;
//    
// } Teacher;

typedef struct teacher
{
    char name[20];
    char sex;
    int age;
    int num;
    float score;
    
} Teacher;


enum FunctionName
{
    CompareNameByAscending = 1,
    CompareNameByDescending,
    CompareNumberByAscending,
    CompareNumberByDescending,
    CompareScoreByAscending,
    CompareScoreByDescending,
    PrintFemaleTeacher,
    PrintMaleTeacher
    
    
};
void printTeacher(Teacher *teacher);

typedef BOOL (*CompareFunctionPointer)(Teacher teacher1,Teacher teacher2);

void sortTeachers(Teacher teacher[],int count,CompareFunctionPointer cfp);//       

void printTeachers(Teacher *teachers,int count);

BOOL compareNumberAscending(Teacher teacher1,Teacher teacher2);
BOOL compareNumberDescending(Teacher teacher1,Teacher teacher2);

BOOL compareNameAscending(Teacher teacher1,Teacher teacher2);
BOOL compareNameDescending(Teacher teacher1,Teacher teacher2);

BOOL compareScoreDescending(Teacher teacher1,Teacher teacher2);
BOOL compareScoreAscending(Teacher teacher1,Teacher teacher2);


void printMaleTeacher(Teacher *teacher,int count);
void printFemaleTeacher(Teacher *teacher,int count);







//
//  Teacher.m
//  Exame
//
//  Created by lanou3g on 15-3-25.
//  Copyright (c) 2015  lanou3g. All rights reserved.
//

#import "Teacher.h"

void printTeacher(Teacher *teacher)
{
    printf("  :%s,  :%c,  :%d,  :%d,  :%f
",teacher->name,teacher->sex,teacher->age,teacher->num,teacher->score); } typedef BOOL (*CompareFunctionPointer)(Teacher teacher1,Teacher teacher2);// void sortTeachers(Teacher teacher[],int count,CompareFunctionPointer cfp)// { for (int i = 0; i < count - 1; i ++) { for (int j = 0; j < count - i - 1; j ++) { if (cfp(teacher[j],teacher[j+1])) { Teacher tea = teacher[j]; teacher[j] = teacher[j+1]; teacher[j+1] = tea; } } } } void printTeachers(Teacher *teachers,int count) { for (int i = 0; i < count; i ++) { printTeacher(&teachers[i]); } } BOOL compareNumberAscending(Teacher teacher1,Teacher teacher2) { return teacher1.num > teacher2.num; } BOOL compareNumberDescending(Teacher teacher1,Teacher teacher2) { return teacher1.num < teacher2.num; } BOOL compareNameAscending(Teacher teacher1,Teacher teacher2) { //return strcmp(teacher1.name,teacher2.name); if (strcmp(teacher1.name,teacher2.name) > 0) { return YES; } else return NO; } BOOL compareNameDescending(Teacher teacher1,Teacher teacher2) { //return strcmp(teacher2.name, teacher1.name); if (strcmp(teacher1.name,teacher2.name) < 0) { return YES; } else return NO; } BOOL compareScoreDescending(Teacher teacher1,Teacher teacher2) { return teacher1.score < teacher2.score; } BOOL compareScoreAscending(Teacher teacher1,Teacher teacher2) { return teacher1.score > teacher2.score; } void printMaleTeacher(Teacher *teacher,int count) { for (int i = 0; i < count; i ++) { if (teacher[i].sex == 'm') { printTeacher(&teacher[i]); } } } void printFemaleTeacher(Teacher *teacher,int count) { for (int i = 0; i < count; i ++) { if (teacher[i].sex == 'f') { printTeacher(&teacher[i]); } } }
//
//  main.m
//  Exame
//
//  Created by lanou3g on 15-3-25.
//  Copyright (c) 2015  lanou3g. All rights reserved.
//

#import 
#import "Teacher.h"

int main(int argc, const char * argv[])
{
    printf("  1:            
2:
3:
4:
5:
6:
7:
8:
"); printf("=====================
"); printf(" :
"); Teacher teacher[4] = {{"zhangsan",'m',23,34,5.5},{"lishi",'f',45,56,3.5},{"wangwu",'m',22,12,1.3},{"songliu",'f',45,12,3.2}}; int n = 0; while (scanf("%d",&n)!=EOF) { if (n >= 1 && n <= 8) { switch (n) { case CompareNameByAscending: sortTeachers(teacher,4,compareNameAscending); printTeachers(teacher,4); break; case CompareNameByDescending: sortTeachers(teacher,4,compareNameDescending); printTeachers(teacher,4); break; case CompareNumberByAscending: sortTeachers(teacher,4,compareNumberAscending); printTeachers(teacher,4); break; case CompareNumberByDescending: sortTeachers(teacher,4, compareNumberDescending); printTeachers(teacher,4); break; case CompareScoreByAscending: sortTeachers(teacher,4, compareScoreAscending); printTeachers(teacher,4); break; case CompareScoreByDescending: sortTeachers(teacher,4, compareScoreDescending); printTeachers(teacher,4); break; case PrintFemaleTeacher: printFemaleTeacher(teacher,4); break; case PrintMaleTeacher : printMaleTeacher(teacher,4); break; default: break; } } else printf(" :
"); } return 0; }