zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    网上找的面试题-之一
    python里的Join函数
    【转载51CTO】Linux中引号那些事儿
    【面试编程题】巧妙排序:排序只有1,2,3三个元素的数组,不能统计1,2,3的个数。
    [转载]mininet的安装和使用
    Open vSwitch源码阅读【转】及自己的理解【稍后更新】
    7、8月份安排 进度条
    请不要忽视基础小细节
    【编程之美】2.20 程序理解问题
    GDOI2017爆炸记
  • 原文地址:https://www.cnblogs.com/zhaoashen/p/4387307.html
Copyright © 2011-2022 走看看