// // main.m // LessionFunctionPointer // // Created by laouhn on 15/7/29. // Copyright (c) 2015年 池海涛. All rights reserved. // #import <Foundation/Foundation.h> #import "Function.h" int main(int argc, const char * argv[]) { // // int a = 10; // int *p = &a; // printf("%d ", *p); //定义结构体指针,指向结构体变量 //结构体中包含,姓名,性别,分数,学号,新建文件实现结构体申明 // // Student stu1 = {"KongKong",'w',19,99,"1234322"}; // Student *sp = &stu1; // printf("name = %s,gender = %c,age = %d,score = %f,num = %s",sp->name,sp->Sex,sp->age,sp->score,sp->studentNum); // int b = maxCommon(6, 9); // printf("%d",b); // printf("%d",minCommon(6, 9)); /** * 函数指针 //函数指针 //函数在代码区 */ //int (*p)(int a, int b) = maxCommon; //赋初值 maxCommon 注意,不加(); //使用函数指针调用函数 //int value = p(6,8); // printf("value = %d", value); // typedef int (*PFUN)(int a, int b); //PFUN q = maxCommon; //printf("value = %d", q(3,5)); //重定义一个无参函数 // typedef void (*PPRINT)(); // // PPRINT q = printHollo; // // q(); typedef int (*PFUN)(int a, int b); printf("请输入数字 : 1---maxValue,2-----minValue,3---sumValue,4----subValue"); int a = 0; scanf("%d",&a); PFUN p = NULL; switch (a) { case 1: p = bigNum; break; case 2: p = littleNum; break; case 3: p = sumNum; break; case 4: p = cutNum; break; default: break; } int result = p(3,5); printf("result == %d ",result); //定义结构体数组,包含 5 个元素 Student stu[] = { {"kongKong",'w',27,99,"1234321"}, {"liming",'m',14,88,"432142314"}, {"zhangxin",'w',19,85,"223442113"}, {"goushen",'m',21,93,"343214"}, {"doubi",'w',45,44,"64214321"} }; printStudentArray(stu,5); //sortByNum(stu,5); // sortByAge1(stu,5); printf("------------------- "); // findStudentByScore(stu,5,addStr); // printStudentArray(stu,5); //函数回调 //函数指针作为函数参数 //int value = getValue(3, 5, maxCommon); // printf("%d",value); //findStudentByScore(stu,5,addStr); sortStudentArray(stu,5,compareByName); printStudentArray(stu,5); // printf("------------------- "); // sortStudentArray(stu,5,compareByNum); // printStudentArray(stu,5); return 0; }
//Function.h
// // Function.h // LessionFunctionPointer // // Created by laouhn on 15/7/29. // Copyright (c) 2015年 池海涛. All rights reserved. // #import <Foundation/Foundation.h> struct student{ char name[20]; char Sex; int age; float score; char *studentNum; }; typedef struct student Student; //函数描述:返回值为整形,有两个整形参数的函数 ,名字是max //函数类型:int(int a,int b)---可简写为int(int,int) //函数指针类型:int (*)(int a, int b) //求两个数最大值 int bigNum(int a, int b); //求两个数的最小值 int littleNum(int, int); //求两个数的和 int sumNum(int, int); //求两个数的差 int cutNum(int, int); //求两个数的乘积 int productNum(int, int); //求两个数的商 int divide(int, int); //求两个数的最大公约数 int maxCommon(int, int); //求两个数的最小公倍数 int minCommon(int, int); void printHollo(); void printStudentArray(Student *,int); //姓名升序 void sortByName(Student *,int); //年龄降序 void sortByAge(Student *,int); //分数升序 void sortByScore(Student *,int); //学号降序 void sortByNum(Student *,int); void sortByAge1(Student[], int); typedef int (*PFUN)(int a, int b); int getValue(int a,int b, PFUN p); void addStr(char *); typedef void (*FADD)(char *); void findStudentByScore(Student stu[],int count,void (*p)(char *)); typedef BOOL (*SORT)(Student,Student); //姓名比较,升序 BOOL compareByName(Student stu1,Student stu2); //年龄比较,降序 BOOL compareByAge(Student stu1,Student stu2); //分数比较,升序 BOOL compareByScore(Student stu1,Student stu2); //学号比较,降序 BOOL compareByNum(Student stu1,Student stu2); //结构体数组排序 void sortStudentArray(Student stu[],int count,SORT sort);
//Function.m
// // Function.m // LessionFunctionPointer // // Created by laouhn on 15/7/29. // Copyright (c) 2015年 池海涛. All rights reserved. // #import "Function.h" //求两个数最大值 int bigNum(int a, int b) { return a > b ? a : b; } //求两个数的最小值 int littleNum(int a, int b) { return a > b ? b : a; } //求两个数的和 int sumNum(int a, int b) { return a + b; } //求两个数的差 int cutNum(int a, int b) { return a - b; } //求两个数的乘积 int productNum(int a, int b) { return a * b; } //求两个数的商 int divide(int a, int b) { return a / b; } //求两个数的最大公约数 int maxCommon(int a, int b) { // 9 6 int temp = a % b ; while (temp != 0) { a = b; b = temp; temp = a % b; } return b; } //求两个数的最小公倍数 int minCommon(int a, int b) { int temp = maxCommon(a,b); return (a * b) / temp; } void printHollo() { printf("这是弄啥呢"); } void printStudentArray(Student *sp,int count) { for (int i = 0; i < count; i++) { printf("name = %s,gender = %c,age = %d,score = %f,num = %s ",(sp + i)->name,(sp + i)->Sex,(sp + i)->age,(sp + i)->score,(sp + i)->studentNum); } } void sortByName(Student *a,int b) { for (int i = 0; i < b - 1; i++) { for (int j = 0; j < b - 1 - i; j++) { if (strcmp((a + j)->name, (a + j + 1)->name) > 0) { Student temp = *(a + j); *(a + j) = *(a + j + 1); *(a + j + 1) = temp; } } } } //年龄降序 void sortByAge(Student *a,int b) { for (int i = 0; i < b - 1; i++) { for (int j = 0; j < b - 1 - i; j++) { if ((a + j)->age < (a + j+ 1)->age) { Student temp = *(a + j); *(a + j) = *(a + j + 1); *(a + j + 1) = temp; } } } } void sortByAge1(Student str[], int a){ for (int i = 0; i < a - 1; i++) { for (int j = 0; j < a - 1 - i; j++) { if (str[j].age < str[j + 1].age) { Student temp = str[j]; str[j] = str[j + 1]; str[j + 1] = temp; } } } } //分数升序 void sortByScore(Student *a,int b) { for (int i = 0; i < b - 1; i++) { for (int j = 0; j < b - 1 - i; j++) { if ((a + j)->name > (a + j + 1)->name) { Student temp = *(a + j); *(a + j) = *(a + j + 1); *(a + j + 1) = temp; } } } } //学号降序 void sortByNum(Student *a,int b) { for (int i = 0; i < b - 1; i++) { for (int j = 0; j < b - 1 - i; j++) { if (strcmp((a + j)->studentNum, (a + j + 1)->studentNum) < 0) { Student temp = *(a + j); *(a + j) = *(a + j + 1); *(a + j + 1) = temp; } } } } int getValue(int a,int b, PFUN p) { return p(a,b); } void addStr(char *name) { //*b = *b + "高富帅"; //strcat(b,"高富帅"); strcat(name, "高富帅"); } void findStudentByScore(Student stu[],int count,void (*p)(char *)) { for (int i = 0; i < count; i++) { if (stu[i].score >= 90) { p(stu[i].name); } } } //姓名比较,升序 BOOL compareByName(Student stu1,Student stu2) { return strcmp(stu1.name, stu2.name) > 0 ? YES : NO; } //年龄比较,降序 BOOL compareByAge(Student stu1,Student stu2) { return stu1.age < stu2.age ? YES : NO; } //分数比较,升序 BOOL compareByScore(Student stu1,Student stu2) { return stu1.score > stu2.score ? YES : NO; } //学号比较,降序 BOOL compareByNum(Student stu1,Student stu2) { return strcmp(stu1.studentNum, stu2.studentNum) < 0 ? YES : NO; } //结构体数组排序 void sortStudentArray(Student stu[],int count,SORT sort) { for (int i = 0; i < count - 1; i++) { for (int j = 0; j < count - 1 - i; j++) { if (sort(stu[j], stu[j + 1])) { Student temp = stu[j]; stu[j] = stu[j + 1]; stu[j + 1] = temp; } } } }