您的位置:首页 > 移动开发 > IOS开发

我的iOS学习历程 - 第十一天

2015-10-22 17:46 344 查看
今天主要说的是函数指针

#import<Foundation/Foundation.h>

//  两个数的和的函数两个数比较大小返回大的

int Sum(int a,int b);

int MaxValue (int a,int b);

//void printHello();

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

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

//***********************************************************************

typedefstruct Student{

char name[50];

int age;

float score;

int number;

}Student;

//  比较两个学生的分数

BOOL compareStudentByScore(Student *stu1,Student *stu2);

BOOL compareStudentByAge(Student *stu1,Student *stu2);

BOOL compareStudentByNumber(Student *stu1,Student *stu2);

//  给函数指针的类型起别名

//  新的名称起在 *的后面

typedefBOOL (*SORT)(Student *stu1,Student *stu2);

void Studentprintf(Student stu);

void AgeStudent(Student *stus,int count,SORT p);

void Allprintf(Student *stus,int count);

void ScoreStudent(Student *stus,int count);

void NumberStudent(Student *stus,int count);

//  新的排序方法参数是函数指针

void sortStudents(Student *stus,int count,SORT p);

//***********************************************************************

//  练习使用

void addStr(char *name);

void findStudentByScore(Student *stus,int count,void(*p)(char *name));

//**********************************************************************

//  声明一个结构体

typedefstruct SelectWork{

char work[20];

SORT x;

}SelectWork;

SORT getFunction(char *Name);


#import"Function.h"

int Sum(int a,int b){

return a + b;

}

int MaxValue (int a,int b){

return a > b ? a : b;

}

//void printHello(){

//    printf("xixi\n");

//}

//  指针函数作为了参数的函数

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

int result = p(a,b);

return  result;

}

//***********************************************************************

void Studentprintf(Student stu){

printf("%s, %d, %.2f, %d\n", stu.name, stu.age, stu.score, stu.number);

}

void Allprintf(Student *stus,int count){

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

Studentprintf(stus
);

}

}

void AgeStudent(Student *stus,int count,SORT p){

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

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

if ((stus + j)->age > (stus + j +1)->age) {

Student temp = *(stus + j);

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

*(stus + j +1) = temp;

}

}

}

Allprintf(stus, count);

}

void ScoreStudent(Student *stus,int count){

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

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

if ((stus + j)->score > (stus + j +1)->score) {

Student temp = *(stus + j);

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

*(stus + j +1) = temp;

}

}

}Allprintf(stus, count);

}

void NumberStudent(Student *stus,int count){

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

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

if ((stus + j)->number > (stus + j +1)->number) {

Student temp = *(stus + j);

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

*(stus + j +1) = temp;

}

}

}Allprintf(stus, count);

}

//***************************************************************

BOOL compareStudentByScore(Student *stu1,Student *stu2){

return stu1->score > stu2->score;

}

BOOL compareStudentByAge(Student *stu1,Student *stu2){

return stu1->age > stu2->age;

}

BOOL compareStudentByNumber(Student *stu1,Student *stu2){

return stu1->number > stu2->number;

}

void sortStudents(Student *stus,int count,SORT p){

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

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

// 条件选择器

if (p(stus + j,stus + j +1)) {

Student temp = *(stus + j);

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

*(stus + j +1) = temp;

}

}

}Allprintf(stus, count);

}

//***********************************************************************

//  练习实现

void addStr(char *name){

strcat(name,"高富帅");

}

void findStudentByScore(Student *stus,int count,void(*p)(char *name)){

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

if ((stus + n)->score >90) {

p((stus + n)->name);

Studentprintf(stus
);

}

}

}

//***********************************************************************

SORT getFunction(char *Name){

SORT x1 =compareStudentByAge;

SORT x2 =compareStudentByScore;

SORT x3 =compareStudentByNumber;

SelectWork sew1 = {"age", x1};

SelectWork sew2 = {"score", x2};

SelectWork sew3 = {"number", x3};

SelectWork sews[] = {sew1, sew2, sew3};

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

if (strcmp(Name, sews
.work) ==0) {

return sews
.x;

}

}

returnNULL;

}


#import<Foundation/Foundation.h>

#import"Function.h"

int main(int argc,constchar *
argv[]) {

函数指针:就是指向函数的指针

函数的名字是一个地址是一个常量地址

定义函数指针步骤 :

1.把要指向的函数复制过来把函数名删了

int Sum(int a,int b); ->int
(int a,int b);

2.把原来函数名的位置替换成 (*) (此时该式子就是函数指针的类型)

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

3.给函数指针起一个名字

int (*函数指针名字)(int num1,int
num2)

注意:函数指针只能指向同类型的函数

定义函数指针指向求最大值的函数

int (*p) (int a,int b) =NULL;

p = MaxValue;

// 可以用函数指针的名字代替函数名来调用函数

printf("%d\n", p(3,5));

void (*p1)() =NULL;

p1 = printHello;

// 无参数调用时也要加括号

p1();

定义函数指针

定义两个函数,⼀个求最⼤值,⼀个求和,输⼊max或sum分别求3,5的最⼤值或和(提⽰,定义⼀个函数指针,根据输⼊内容指向不同函数,最后⼀次调⽤完成)。

定义函数指针的时候参数的名字可以省略

int (*p) (int a,int b) =NULL;

printf("请输入一个请求\n");

char str1[20] = {0};

char str2[] ="maxValue";

char str3[] ="sum";

scanf("%s",str1);

if (strcmp(str1, str2) ==0) {

// 执行maxValue

p = MaxValue;

printf("%d\n",p(3,5));

}elseif (strcmp(str1, str3) ==0){

// 执行Sum

p = Sum;

printf("%d\n",p(3,5));

}else{

printf("error\n");

}

调用函数指针如果在外面调用指针的话需要进行安全判断当p
!=NULL时才能进行调用

int (*p) (int a,int b) =NULL;

printf("请输入一个请求\n");

char str1[20] = {0};

char str2[] ="maxValue";

char str3[] ="sum";

scanf("%s",str1);

if (strcmp(str1, str2) ==0) {

// 执行maxValue

p = MaxValue;

}elseif (strcmp(str1, str3) ==0){

// 执行Sum

p = Sum ;

}else{

printf("error\n");

}

if (p !=NULL) {

printf("%d\n",getValue(3,5,
p));

}

Student stu1 = {"Meiko",16,82.8,2};

Student stu2 = {"Pawn",12,84.8,3};

Student stu3 = {"Deft",19,91.8,1};

Student stu4 = {"Koro",26,88.8,5};

Student stu5 = {"ClearLove",18,98.8,4};

Student stus[]= {stu1, stu2, stu3, stu4, stu5};

AgeStudent(stus,
5);

NumberStudent(stus,5);

ScoreStudent(stus,5);

SORT p =NULL;

调用排序

p = compareStudentByAge;

sortStudents(stus,5, p);

char arr[20] = {0};

printf("请输入信息\n");

scanf("%s",arr);

if (strcmp(arr,"age") ==0)
{

p = compareStudentByAge;

}elseif (strcmp(arr,"score")
== 0){

p = compareStudentByScore;

}elseif (strcmp(arr,"number")
== 0){

p = compareStudentByNumber;

}

if (p !=NULL) {

sortStudents(stus,5, p);

}

练习:写⼀函数查找成绩90分以上的学员,使⽤回调函数在姓名后加”⾼富帅”。

void (*p)(char *name) =NULL;

p = addStr;

findStudentByScore(stus,5, p);

SORT P =NULL;

while (1) {

char arr[20] = {0};

printf("age/score/number\n");

scanf("%s",arr);

P = getFunction(arr);

break;

}

if (P !=NULL) {

sortStudents(stus,5, P);

}else{

printf("false\n");

}

return0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: