Xcodeでの関数ポインタ呼び出しと構造体ソートの実装
① 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;
}