iOS开发之c语言基础Lesson-11 函数指针 上课笔记 与 试题练习

main.m 文件

  9 #import <Foundation/Foundation.h>
 10 #import "Pointer.h"
 11 ////////////////Lesson 11 函数指针 课堂笔记 与 习题练习////////////
 12 
 13 
 14 //函数指针:指向函数的指针叫做函数指针,用来存储函数的地址
 15 //函数名代表函数的入口地址
 16 
 17 
 18 //回调函数; 函数指针变量,存储对应的函数的地址
 19 //给函数指针类型,取一个新的名字  typedef,修饰的新名字,不是变量
 20 //typedef int (*PFun)(int, int);//起得新的名字是PFUN,此时PFUN的作用还是函数指针的类型,不是变量
 21 //int getValue(int a, int b, PFun p);
 22 //int getValue(int a, int b, PFun p){
 23 //    return p(a, b);
 24 //}
 25 
 26 
 27 ///////////////////下午课程,动态排序
 28 /*
 29 struct student{
 30     char name[20];
 31     int age;
 32     int number;
 33     float score;
 34     float weight;
 35     float height;
 36 };
 37 typedef struct student Stu;
 38 
 39 
 40 ///所有排序函数, if语句中的比较条件是不一样的,其余部分代码都是一样的;把相同的内容,取出来放在一个函数中,只写一次,把 不同的内容写成一个一个的函数。
 41 
 42 
 43 ////利用回调函数,调取排序方式
 44 //bool arrayWay(Stu *stu1, Stu *stu2, bool (*p)(Stu *, Stu *)){
 45 //    return p(stu1, stu2) ? YES : NO;
 46 //}
 47 
 48 //为函数指针变量,重命名
 49 typedef bool(*SORT) (Stu *, Stu*);
 50 //动态排序, 函数指针变量作为参数,存储排序的函数地址
 51 void sortArrayStudent(Stu *stu, int n, SORT p);
 52 void sortArrayStudent(Stu *stu, int n, SORT p){
 53     for (int i = 0; i < n - 1; i++) {
 54         for (int j = 0; j < n - 1 - i; j++) {
 55             //函数指针,调用对应的函数
 56             if (p(stu + j, stu + j + 1)) {
 57                 Stu temp = *(stu + j);
 58                 *(stu + j) = *(stu + j + 1);
 59                 *(stu + j + 1) = temp;
 60             }
 61         }
 62     }
 63 }
 64 
 65 //成绩升序 升级版
 66 bool scoreSortAscUpdate(Stu *stu1, Stu *stu2){
 67     return   stu1->score > stu2->score;
 68 }
 69 //姓名升序
 70 bool nameSortAscUpdate(Stu *stu1, Stu *stu2){
 71     return strcmp(stu1->name, stu2->name) > 0;
 72 }
 73 //输出学生信息
 74 void outputAllStudentInfo(Stu *stu, int n){
 75     for (int i = 0; i < n ; i++) {
 76         printf("name = %s,num = %d, age = %d, score = %.2f, weight = %.2f, height = %.2f 
", (stu + i)->name,(stu + i)->number, (stu + i)->age, (stu + i)->score, (stu + i)->weight, (stu + i)->height);
 77     }
 78 }
 79 
 80 //创建匹配结构体
 81 struct mapNameFunction{
 82     char name[10];//存储名字
 83     SORT functon;//存储对应的函数的地址
 84 };
 85 typedef struct mapNameFunction MAP;
 86 
 87 //根据输入的字符串,从匹配表中,匹配到对应的函数地址
 88 SORT matchFunctionByName(MAP *m, char *temp, int n){
 89     for (int i = 0; i < n; i++) {
 90         if (strcmp((m + i)->name, temp) == 0) {
 91          return  (m + i)->functon;
 92         }
 93     }
 94     return  NULL;
 95 }*/
 96 
 97 
 98 ////////////////////////////美丽分割线///////////////////////////////
 99 //练习最大公约,最小公倍,余数, 最大,最小, 和, 差,积
100 typedef int (*CALC) (int, int);
101 int getValue(int a, int b, CALC p){
102     return p(a, b);
103 }
104 
105 //因为Pointer.h中已经存在maxValue,所有在这里就写maxValue1
106 int maxValue1(int a ,int b){
107     return a > b ? a : b;
108 }
109 int minValue1(int a, int b){
110     return a > b ? b : a;
111 }
112 int getGcd(int a, int b){
113 //    int r = a % b;
114 //    while(r){
115 //        a = b;
116 //        b = r;
117 //        r = a % b;
118 //    }
119     return b == 0 ? a : getGcd(b, a % b);
120 }
121 int getMod(int a, int b){
122     return a % b;
123 }
124 typedef struct MapOperator{
125     char oper;
126     CALC calFunction;
127 }MAPOPER;
128 
129 CALC matchOperator(MAPOPER *m, int n, char c){
130     for (int i = 0; i < n; i++) {
131         if ((m + i)->oper == c) {
132             return (m + i)->calFunction;
133         }
134     }
135     return  NULL;
136 }
137 
138 int main(int argc, const char * argv[]) {
139     
140 ////上午课程
141     /*
142      //
143      //    int max =  maxValue(15, 20);
144      //    printf("max = %d
", max);
145      
146      //定义一个函数指针指向maxValue函数
147      //类型:int (*ptr)(int x, int y);
148      
149      //    //1.定义的ptr,可以指向返回值类型为int,并且有两个整形参数的函数
150      //    int (*ptr)(int a, int b) = NULL;
151      //    //2.指针变量指向maxValue函数
152      //    ptr = maxValue;
153      //    //3.通过指针变量实现函数的调用
154      //    int max = ptr(4, 5);
155      //    printf("max = %d
", max);
156      
157      //    void (*plove)(int n) = NULL;
158      //    plove = sayLove;
159      //    plove(5);
160      //
161      
162      //
163      //    int (*pMoney)() = NULL; //指向一个无参数,有一个返回值的函数
164      //    pMoney = getMoney;
165      //    int money = pMoney();
166      //    printf("getmoney = %d
 ", money);
167      //
168      //    char* (*pstr)() = NULL;
169      //    pstr = getString;
170      //    char *str =  pstr();
171      //    printf("%s
", str);
172      //
173      //    void (*pHello)() = NULL;
174      //    pHello = sayHello;
175      //    pHello();
176      //
177      //    char *(*pstr1)(char *s) = NULL;
178      //    pstr1 = getStr;
179      //    char *str1 = pstr1("Welcome to Lanou!");
180      //    printf("%s
", str1);
181      //
182      //
183      //    void (*pSwap)(int *a, int *b) = NULL;
184      //    pSwap = swap;
185      //    int aa = 5, bb = 10;
186      //    pSwap(&aa, &bb);
187      //    printf("%d
", aa);
188      
189      
190      //定义两个函数,⼀一个求最⼤大值,⼀一个求和,输⼊入max或sum分别求3,5的 最⼤大值或和(提⽰示,定义⼀一个函数指针,根据输⼊入内容指向不同函数,最后 ⼀一次调⽤用完成)。
191      //    char temp[10] = {0};
192      //    printf("Input max or sum or min:");
193      //    scanf("%s", temp);
194      //    int (*ptemp)(int a, int b) = NULL;
195      //    strcmp("max", temp) == 0 ? (ptemp = maxValue) : strcmp("sum", temp) == 0 ? (ptemp = sumValue) : strcmp("min", temp) == 0?(ptemp = minValue):(ptemp = minValue);
196      //    printf("%s = %d ",temp, ptemp(3, 5));
197      
198      
199      //    char c = 0;
200      //    printf("Input a or b or c:");
201      //    scanf("%c", &c);
202      //    int (*ptemp)(int, int) = NULL;
203      //
204      //    switch (c) {
205      //        case 'a':  //case后面只能是常量(整型常量) 或者常量(整型常量)表达式
206      //            ptemp = sumValue;
207      //            break;
208      //        case 'b':
209      //            ptemp = maxValue;
210      //            break;
211      //        case 'c' :
212      //            ptemp = minValue;
213      //            break;
214      //        default:
215      //            break;
216      //    }
217      //    printf("%c = %d ",c, ptemp(3, 5));
218      
219      
220      
221      //函数调用,回调函数
222      //    int value = getValue(3, 5, maxValue);
223      //    printf("value = %d
", value);
224      
225      */
226     
227  ////////////////////////////美丽分割线///////////////////////////////
228     
229 ///////////下午课程
230     //DynamicSort 动态排序
231     /*
232 //    Stu students[5] = {
233 //        {"Ashen0", 24, 100, 89, 55, 180},
234 //        {"zAshen1", 45, 101, 90, 60, 173},
235 //        {"Ashen2", 32, 103, 60, 70, 165},
236 //        {"aAshen3", 16, 102, 100, 65, 178},
237 //        {"Ashen4", 99, 104, 54, 80, 173}
238 //    };
239 //    
240 //    //创建函数匹配表
241 //    MAP maps[2] ={
242 //        {"score",scoreSortAscUpdate},
243 //        {"name", nameSortAscUpdate}
244 //    };
245 //    //根据用户在控制台的输入,选择对应的排序方式
246 //    char temp[10] = {0};//存储输入的字符串
247 //    printf("输入排序方式(e.g. 成绩(score), 年龄(age), 姓名(name), 学号(num)):");
248 //    scanf("%s",temp);
249 //    //匹配获取对应的函数地址
250 //    SORT sortTemp =matchFunctionByName(maps, temp, 2);
251 //    
252 //    while (sortTemp == NULL) {  //如果sortTemp == NULL ,说明没有匹配到对应的函数地址,继续输入匹配
253 //         printf("请重新输入排序方式(e.g. 成绩(score), 年龄(age), 姓名(name), 学号(num)):");
254 //         scanf("%s",temp);
255 //         sortTemp =matchFunctionByName(maps, temp, 2);
256 //    }
257 //    
258 //    sortArrayStudent(students, 5, sortTemp);//调用动态排序函数, 传入排序方式
259 //    outputAllStudentInfo(students, 5);
260 //    
261     
262     */
263 ////////////////////////////美丽分割线///////////////////////////////
264 
265 
266     
267     MAPOPER mapopers[4] = {
268         {'b', maxValue1},
269         {'s', minValue1},
270         {'g', getGcd},
271         {'m', getMod}
272     };
273     
274     char c = 0;
275     printf("Input operator:e.g. 最大值(b), 最小值(s),最大公约数(g),余数(m):");
276     scanf("%c",&c);
277     
278     CALC temp = matchOperator(mapopers, 4, c);
279     while (temp == NULL) {
280         printf("Input operator:(e.g. 最大值(b), 最小值(s),最大公约数(g),余数(m):");
281         rewind(stdin);  //每次输入之前清空键盘缓冲区
282         scanf("%c", &c);
283         temp = matchOperator(mapopers, 4, c);
284     }
285     printf("value = %d", getValue(3, 4, temp));
286     
287     return 0;
288 }

Pointer.h

 1 //
 2 //  Pointer.h
 3 //  LessonC11FunctionPointer
 4 //
 5 //  Created by lanouhn on 15/3/31.
 6 //  Copyright (c) 2015年 Ashen. All rights reserved.
 7 //
 8 
 9 #import <Foundation/Foundation.h>
10 
11 //定义两个函数,⼀一个求最⼤大值,⼀一个求和,输⼊入max或sum分别求3,5的 最⼤大值或和(提⽰示,定义⼀一个函数指针,根据输⼊入内容指向不同函数,最后 ⼀一次调⽤用完成)。
12 int maxValue(int a, int b);
13 int sumValue(int a, int b);
14 int minValue(int a, int b);
15 
16 
17 
18 
19 void sayLove(int number);
20 
21 //Practice练习
22 int getMoney();
23 
24 char *getString();
25 
26 void sayHello();
27 
28 char *getStr(char *s);
29 
30 void swap(int *a, int *b);

Pointer.m文件

//
//  Pointer.m
//  LessonC11FunctionPointer
//
//  Created by lanouhn on 15/3/31.
//  Copyright (c) 2015年 Ashen. All rights reserved.
//

#import "Pointer.h"

int maxValue(int a, int b){
    return a > b ? a : b;
}
int sumValue(int a, int b){
    return  a + b;
}
int minValue(int a, int b){
    return a > b ? b: a;
}


void sayLove(int number){
    while (number) {
        printf("Love + %d
", number);
        number--;
    }
}

//Practice练习
int getMoney(){
    return 100;
}

char *getString(){
    return "I love you";
}

void sayHello(){
    printf("Hello, Ashen
");
}

char *getStr(char *s){
    return  s;
}

void swap(int *a, int *b){
    *a ^= *b^= *a^= *b;
}
  •  课后习题
  1 //
  2 //  main.m
  3 //  HomeworkFunctionPointer
  4 //
  5 //  Created by lanouhn on 15/3/22.
  6 //  Copyright (c) 2015年 Ashen. All rights reserved.
  7 //
  8 
  9 #import <Foundation/Foundation.h>
 10 int maxValue(int a, int b);
 11 int sumValue(int a, int b);
 12 void printHello();
 13 
 14 typedef struct student{
 15     int score;
 16     char name[20];
 17     int age;
 18     int attend;
 19 } Stu;
 20 
 21 //函数声明
 22 void getName(Stu *students, int n);
 23 void getValue(int n, void (*p)(Stu *,int));
 24 
 25 
 26 Stu students[10] = {};
 27 
 28 
 29 int main(int argc, const char * argv[]) {
 30     //    @autoreleasepool {
 31     //        // insert code here...
 32     //        NSLog(@"Hello, World!");
 33     //    }
 34     //////////////////Lesson11 函数指针  练习//////////////////
 35     
 36     //带参数的函数指针
 37     //        int (*p)(int a,int b)=NULL;
 38     //        p = maxValue;
 39     //        printf("%d ", p(3,4));
 40     
 41     //不带参数的函数指针
 42     //    void (*b)() = NULL;
 43     //    b = printHello;
 44     //    b();
 45     // 2.定义两个函数,⼀一个求最⼤大值,⼀一个求和,输⼊入max或sum分别求3,5的 最⼤大值或和(提⽰示,定义⼀一个函数指针,根据输⼊入内容指向不同函数,最后 ⼀一次调⽤用完成)。
 46     //        int (*p)(int a, int b) = NULL;
 47     //
 48     //        printf("max 或 sum :");
 49     //        char choose[4] = {0};
 50     //        scanf("%s",choose);
 51     //        if (strcmp(choose, "max") == 0) {
 52     //            p = maxValue;
 53     //        }else if(strcmp(choose, "sum") == 0){
 54     //            p = sumValue;
 55     //        }else {
 56     //            printf("输入有误!
");
 57     //        }
 58     //        printf("%s = %d 
", choose, p(3,5));
 59     
 60     
 61     //  3  写⼀一函数查找成绩90分以上的学员,使⽤用回调函数在姓名后加”⾼富 帅”。
 62     
 63             char cname[10][20] = {"张三", "李四", "王二", "EZ", "卡特", "小Z", "DanDan", "BenBen", "Ying", "Ashen"};
 64             for (int i = 0; i < 10; i++) {
 65                 strcpy(students[i].name, cname[i]);
 66                 students[i].score = arc4random() % (100 - 40 + 1) + 40;
 67                 printf("%d ", students[i].score);
 68             }
 69   
 70             printf("
");
 71             getValue(10,getName);
 72     
 73     
 74     //  4.有30个学⽣需要排序 1.按姓名排 2.按成绩排 3.按年龄排
 75     //    .... ⼀一周后新需求,按出勤率排?
 76     //        int sortName(Stu *stu, int j);
 77     //        int sortAge(Stu *stu, int j);
 78     //        void sortArray(Stu *stu, int count, int(*sort)(Stu *, int));
 79     //        char cname[10][10] = {"zhang", "lisi", "wanger", "ez", "kate", "ashen", "danDan", "benBen", "ying", "zhong"};
 80     //        for (int i = 0; i < 10; i++) {
 81     //            strcpy(students[i].name, cname[i]);
 82     //            students[i].score = arc4random() % (100 - 40 + 1) + 40;
 83     //            students[i].age = arc4random() % (25 - 15 + 1) + 15;
 84     //            students[i].attend = arc4random() % 100;
 85     //            printf("%s ", students[i].name);
 86     //        }
 87     //        printf("
");
 88     //        sortArray(students, 10, sortName);
 89     //        for (int i = 0; i < 10; i++) {
 90     //            printf("%s ", students[i].name);
 91     //        }
 92     //
 93     
 94     // 5 对list增加元素,sum求和,mul求乘积.
 95     
 96     
 97     
 98     
 99     
100     
101     ////////////////////Lesson11 函数指针,  作业///////////
102 //    1.(***)随机生成一个 10 个元素的数组,找到 3 的倍数,并将其值修改成 0.(注意:修改数值使用回掉函数处理)
103 //    int editNum(int num);
104 //    int getEditNum(int num, int (*p)(int));
105 //    int ranArr[10] = {0};
106 //    for (int i = 0; i < 10; i++) {
107 //        ranArr[i] = arc4random() % 100 + 1;
108 //        printf("%d ", ranArr[i]);
109 //    }
110 //    printf("
");
111 //    for (int i = 0; i < 10; i++) {
112 //        ranArr[i] = getEditNum(ranArr[i], editNum);
113 //        printf("%d ", ranArr[i]);
114 //    }
115 //  2. (***)有两个10个元素的数组,分别为A和B,编程实现相同位置的元素, 如果 B 的元素小于 A 的元素进行数值交换:(使用回调函数实现)
116     void swap(int *a, int *b);
117     void getSwap(int *a, int *b, void (*p)(int *,int *));
118     int A[10] = {9, 19, 11, 96, 26, 18, 2, 70, 64, 17, };
119     int B[10] = {19, 10, 10, 32, 90, 1, 23, 40, 23, 20};
120     for (int i = 0; i < 10; i++) {
121         getSwap(&A[i], &B[i], swap);
122     }
123     for (int i = 0; i < 10; i++) {
124         printf("%d ",A[i]);
125     }
126     printf("
");
127     for (int i = 0; i < 10; i++) {
128         printf("%d ",B[i]);
129     }
130     return 0;
131 }
132 ///////////////// 练习1 和练习2
133 int maxValue(int a, int b){
134     return a > b ? a : b;
135 }
136 int sumValue(int a, int b){
137     return a + b;
138 }
139 void printHello()
140 {
141     printf("Hello
");
142 }
143 
144 
145 ///////////////////////练习3
146 void getName(Stu *students, int n){
147     for (int i = 0 ; i < n; i++) {
148         if (students[i].score > 90) {
149             strcat(students[i].name, "[高富帅]");
150             printf("%s: %d 
", students[i].name, students[i].score);
151         }else{
152             printf("%s: %d 
", students[i].name, students[i].score);
153         }
154     }
155 }
156 //回调函数
157 void getValue(int n, void (*p)(Stu *,int)){
158     p(students,n);
159 }
160 ////////////////练习4
161 void sortArray(Stu *stu, int count, int(*sort)(Stu *, int)){
162     for (int i = 0; i < count; i++) {
163         for (int j = 0; j < 10 - 1 -i; j++) {
164             if (sort(stu, j)) {
165                 Stu temp = stu[j];
166                 stu[j] = stu[j + 1];
167                 stu[j + 1] = temp;
168             }
169         }
170     }
171 }
172 
173 //
174 //int sortName(Stu *stu, int j){
175 //    return strcmp(stu[j].name, stu[j + 1].name) > 0 ? 1 : 0;
176 //}
177 //int sortAge(Stu *stu, int j){
178 //    return stu[j].age> stu[j + 1].age ? 1 : 0;
179 //}
180 ////////////////////////作业1
181 int editNum(int num){
182     if (num % 3 == 0) {
183         num = 0;
184     }
185     return num;
186 }
187 int getEditNum(int num, int (*p)(int)){
188    return p(num);
189 }
190 /////////////////////////作业2
191 //如果 B 的元素小于 A 的元素进行数值交换:
192 void swap(int *a, int *b){
193     if (*b < *a) {
194         int temp = *b;
195         *b = *a;
196         *a = temp;
197     }
198 }
199 void getSwap(int *a, int *b, void (*p)(int *,int *)){
200     p(a,b);
201 }
原文地址:https://www.cnblogs.com/zhaoashen/p/4387307.html