• C语言第11课


    主要内容:函数指针

    一、函数指针定义

            int  maxValue(int  a,int  b)

            {

                      return   a > b ?

    a : b;

            }

            函数名和数组名一样是地址,存在在代码区


            int  maxValue(int  a。int  b)

            int  (*p)(int。int)=  NULL

            函数指针定义。p是变量,其它是类型(通常没有形參a。b)

            p = maxValue(函数指针的使用:赋值函数名)

            int  m = p(3,5)(指针可当函数用)


           练习:定义两个函数,一个求最大值,一个求和。用户从控制台输入两个整数,在从控制台输入max或sum分别求

                       3和5的最大值或和,(提示:定义一个函数指针,依据输入内容指向不同的函数。最后一次调用完毕)

            int  maxValue ( int a, int  b )    / / 求最大值的函数

            { 

                     return  a > b ? a : b;

            }

            int  sumValue ( int a, int b )     / / 求和的函数

            {

                    return  a + b;

            }


            int  main( int argc, const char *argv[])

            {

                    void (*p) (int , int) = NULL;                           / / 定义一个指针变量

                    int   a  , b;                                                     / / 定义两个须要用的整型变量

                    printf(" 请输入两个整数: ");                        / / 让用户输入两个整数

                    scanf(" %d%d ",&a,&b);                               / / 标准的输入函数

                    printf(" 请输入sum或者max: ");                 / /  让用户输入sum或者max

                    char  *name = malloc(sizeof(char) * 10);     / /  申请char类型的乘以10的内存空间

                    scanf(" %s ", name);

                    / / 推断用户输入的是sum还是max

                    if (strcmp(name, " sum ") == 0){

                    p = sumValue;

                    }else if (strcmp(name, " max ") == 0){

                    p = maxValue;

                    }else {

                    printf(" 输入错误,失败 ");

                    }

                    free (name);        / /  释放内存,一定不能忘


                    int  result = p(a, b);/ /  定义result接收结果

                    printf(" %d ", result);/ /  输出结果

             }


    二、回调函数

           函数指针做參数

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

           getValue: 函数名

           int (*p)(int ,int): 函数指针做getValue函数的參数

           int  value = getValue(3, 5, maxValue);(函数调用:getValue函数运行过程中再调用(回调)maxValue)

           如图所看到的:



            练习:写一函数查找成绩在90分以上的学生,是用回调函数在姓名后面加“高富帅”

                    typedef  struct {           / /  定义一个结构体

                    char name[20];

                    int  age;

                    float  score;

                    } Student;

                    void  printfStudent(Student  *stu, int  count)。

                    void  printfStudent(Student  *stu, int  count)   / /  声明并编写一个打印结构体数组的函数

                    {

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

                            printf("%s %d %.2f", (stu + i) ->name, (stu + i) ->age, (stu + i) ->score);

                            }

                    }


    / / 声明并编写查找90分以上的学生并在姓名后面加“高富帅”

                   void  changeStudent(Student  *stu, int count,  void (*p)(Student  *));

                   void  changeStudent(Student  *stu, int count,  void(*p)(Student  *))  

                   {

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

                                       if ((stu + i) ->score >= 90){

                                               p(stu + i); 

                                      }

                               }

                   }


                   void  changeName(Student *stu);

                   void  changeName(Student *stu)

                   {

                             strcat (stu ->name, " 高富帅 ");

                   }


                   int  main(int argc, const char*argv[]){

                   Student  student = {/ / 定义结构体变量

                            {" 方世玉 ", 26,  92},

                            {" 令狐冲 ", 30,  89},

                            {" 韦小宝 ", 27,  99},

                            {" 花仙子 ", 20,  80},

                            {" 大教主 ", 24,  80}

                    };

                    int  count  = sizeof(student) / sizeof(Student);  / / 求结构体数组的长度


                    printfStudent(stuent, count); / / 打印没查找前的结构体数组


                    changeStudent(student, count, changeName); / / 推断是否符合条件90分以上的进行改变


                     printfStudent(student,  count)  / / 打印查找后的结构体数组

              }

    三、动态排序

            排序需求不定,无法预測的需求变更

            void  sortArray(int  *array,  int  count)

            {

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

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

                                              if (条件(需求)) {

                                                       交换

                                              }

                                  } 

                      }

              }

              决定排序方式的重要语句封装成函数在此回调


              int 数组动态排序

              typedef  BOOL(* PFUNC)(int , int);   / / 为函数指针类型起名为PFUNC

              void  sortArray(int  *array, int count , PFUNC  p);  / / 动态函数排序声明

              演示样例:

    / / 1:创建一个结构体

                     typedef  struct {

                     char  name[20];

                     int  age;

                     float  score;

                     } Student;


                     / / 3:打印学生结构体数组的函数

                     void  printfStudent(Student  *stu,  int  count);

                     void  printfStudent(Student  *stu,  int  count)

                     {

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

                                          printf("%s %d %.2f",(stu + i) ->name, (stu + i) ->age,  (stu + i) ->score);

                               }

                               printf(" ");

                      }


                      / / 5:写一个函数依据分数从小到大排序

                      void   paiXuStudent(Student  *stu,  int  count,  BOOL (*PFUNC)(Student  *stu1,  Student  *stu2));

                      void   paiXuStudent(Student  *stu,  int  count,  BOOL (*PFUNC)(Student  *stu1,  Student  *stu2))

                      {

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

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

                                                          if (PFUNC((stu + j), (stu + j + 1))){

                                                                      Student  temp;

                                                                      temp = *(stu + j);

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

                                                                      *(stu + j + 1) = temp;

                                                          }

                                             }

                                  }

                       }


                / / 6:定义一个按分数比較大小的函数

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

                BOOL  biJiaoScore(Student  *stu1,  Student  *stu2)

                {

                              return  stu1 ->score  >  stuff ->score;

                 }


                / / 定义一个按年龄排序的函数

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

               BOOL  compareAge(Student  *stu1, Student  *stu2)

               {

                            return  stu1 ->age  >  stuff ->age

               }


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

                                / / 2:创建学生结构体数组

                                Student  *student = {

                                         {"索隆",  22,  93},

                                         {"香吉士",  21,  97},

                                         {"犬夜叉",  20,  80},

                                         {"路飞",  19,  70}

                                };

                               / / 4:排序前调用打印函数打印结构体数组

                               int  count = sizeof(student) / sizeof(Student);

                               printfStudent(student, count);

                               / / 7:调用函数

                               paiXuStudent(student,  count , biJiaoScore);

                               / / paiXuStudent(student,  count , compareAge);按年龄排序(仅仅需传入函数就可)

                               / / 8:打印排序后的结构体数组

                               printfStudent(student,  count);

                     }


    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    python字符串与字典转换
    B站弹幕爬取 / jieba分词
    【计算机网络】第四章 网络层(1)
    【计算机网络】第三章 传输层(4)
    【计算机网络】第三章 传输层(3)
    【计算机网络】第三章 传输层(2)
    【计算机网络】第三章 传输层(1)
    【计算机网络】第二章 网络应用(5)
    【计算机网络】第二章 网络应用(4)
    【计算机网络】第二章 网络应用(3)
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4844743.html
Copyright © 2020-2023  润新知