C 入门 第十一节

int maxValue(int x,int y)
{
    return x > y ? x : y;
}

void printHello()
{
    printf("hello\n");
}

int max(int x,int y)
{
    return x < y ? x : y;
}
int sum(int x,int y)
{
    return x + y;
}

int getValue(int x,int y,int (*p)(int ,int ))
{
    //  p是函数指针,具体指向一个函数,由调用函数时传入的函数名决定
    int r = p(x,y);
    return r;
}

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

#pragma mark --------------------函数指针--------------------
/*
    函数: 实现某种特定功能的代码
    程序编译时,系统会将函数代码分配在代码区,这段存储空间的起始地址就是函数的地址.又称
    函数的指针
    函数名和数字名一样是地址
 
//  通过函数名调用函数
    printf("%d ",maxValue(3,5));
    
    函数指针: 指向函数的指针.可以通过函数指针调用指向的函数
    定义函数指针指向maxValue函数
    指针类型必须与指向的数据的类型匹配,函数有类型,函数指针必须和函数的类型保持一致
    maxValue函数的类型 int(int,int)
    返回值类型 (*函数指针名)(参数类型) = 函数名

int (*p)(int x,int y) = maxValue;
    printf("%d ",p(30,50));
    
//    函数指针类型:返回值类型 (*)(参数类型) 例如:
    int (*)(int x ,int y);
 
//  练习: void printHello(); 定义一个可以指向上述函数的函数指针,并通过函数指针实现调用该函数
    
    void (*p)() = printHello;
    p();

//  练习 定义两个函数,?一个求最?大值,?一个求和,输?入max或sum分别求3,5的 最?大值或和(提?示,定义?一个函数指针,根据输?入内容指向不同函数,最后 ?一次调?用完成)
    
    char a[5] = {0};
    scanf("%s",a);
        if (strcmp(a, "sum") == 0)
    {
        int (*p)(int x,int y) = sum;
        printf("%d ",p(3,5));

}
    if (strcmp(a, "max") == 0)
    {
        int (*p)(int x,int y) = max;
        printf("%d ",p(3,5));
        
    }
    
    printf("\n");
*/
#pragma mark --------------回调函数------------------
/*
    //函数指针作为函数参数
    int (*p)(int ,int ) = max;
    int (*q)(int ,int ) = sum;
    int max1 = getValue(3, 5, p);
    int sum2 = getValue(3, 5, q);
    printf("%d %d\n",max1,sum2);
    
    回调过程: 在getValue执行的过程中,体内各国传入的函数指针,调用执行某个函数
    回调函数: 在函数执行过程中.通过函数指针被调用的函数
    函数回调: 调用回调函数的操作
*/
//  练习 写?一函数查找成绩90分以上的学员,使?回调函数在姓名后加”?富帅”。
/*
    Student stu1[3] =
    {
        {1,"zhangsan",84.0},
        {2,"lisi",59.0},
        {3,"wangwu",96.0}
    };
    Student *p = stu1;
    findstudentScorechengji(p);
*/
/*
    Student stu1 = {"wukong", ‘m‘, 500, 60.0};
    Student stu2 = {"zixia", ‘w‘, 18, 98.0};
    Student stu3 = {"sanzang", ‘w‘, 40, 100.0};
    Student stu4 = {"longma", ‘w‘, 27, 93.0};
    Student stu5 = {"bajie", ‘w‘, 300, 59.0};
    Student stus[5] = {stu1, stu2, stu3, stu4, stu5};
    //    定义一个函数指针,指向拼接字符串函数
    void (*p)(char*) = addStr;
    
    findStudentByScore(stus, 5, p);
    printAllStudent(stus, 5);
*/   
    
#pragma mark ----------动态排序--------------
    
    //  排序: 排序的规则不同,年龄,姓名,成绩,升序,降序
    //利用回调函数实现动态排序
    
    Student stu1 = {"wukong", ‘m‘, 500, 60.0};
    Student stu2 = {"zixia", ‘w‘, 18, 98.0};
    Student stu3 = {"sanzang", ‘w‘, 40, 100.0};
    Student stu4 = {"longma", ‘w‘, 27, 93.0};
    Student stu5 = {"bajie", ‘w‘, 300, 59.0};
    Student stus[5] = {stu1, stu2, stu3, stu4, stu5};
//    printf("按姓名排序\n");
//    sortStudentByName(stus,5);
//    AllStudent(stus,5);
//    printf("按分数排序\n");
//    sortStudentByScore(stus,5);
//    AllStudent(stus,5);
//    printf("按年龄排序\n");
//    sortStudentByAge(stus,5);
//    AllStudent(stus,5);
//
    printf("新玩法\n");
//    printf("按姓名排序\n");
//    sortStudent(stus,5,compartStudentByName);
//    AllStudent(stus,5);
//    printf("按分数排序\n");
//    sortStudent(stus,5,compartStudentByScore);
//    AllStudent(stus,5);
//    printf("按年龄排序\n");
//    sortStudent(stus,5,compartStudentByNAge);
//    AllStudent(stus,5);
    
#pragma mark ------------函数的返回值是函数的指针--------------

m.h

typedef struct
{
    char name[30];
    char sex;
    int age;
    float score;
}Student;

void findstudentScorechengji(Student *p);
// 根据名字大小排序
void sortStudentByName(Student *stus,int count);
//根据分数排
void sortStudentByScore(Student *stus,int count);
//根据年龄排
void sortStudentByAge(Student *stus,int count);
//遍历输出
void AllStudent(Student *stus,int count);

// 新玩法
typedef BOOL (*SORT)(Student,Student);
//SORT代表的是一个类型函数指针,指向的函数的返回值是BOOL类型,参数是俩个Student变量
//实现排序函数
void sortStudent(Student *stus,int count,SORT p_sort);
BOOL compartStudentByName(Student stu1,Student stu2);
BOOL compartStudentByScore(Student stu1,Student stu2);
BOOL compartStudentByNAge(Student stu1,Student stu2);

m.m

/*
void findstudentScorechengji(Student *p)
{
    for (int i = 0; i < 3; i ++)
    {
        if ((p + i) -> score > 90)
        {
            strcat((p + i) -> name, "高富帅");
            printf("%d %s %.1f\n",(p + i) -> num,(p+i) -> name,(p + i) -> score);
        }
    }
}
*/
/*
void findStudentByScore(Student *stus,int count,void (*p)(char *)){
    for (int i = 0; i < count;i++) {
        if (stus[i].score > 90) {
            p(stus[i].name);//函数回调
        }
    }
}
void printAllStudent(Student *stus,int count){
    for (int i = 0; i < count; i++) {
        printf("name = %s, sex = %c, age = %d, score = %.2f\n",stus[i].name,stus[i].sex,stus[i].age,stus[i].score);
    }
    
}
*/

// 根据名字大小排序
void sortStudentByName(Student *stus,int count)
{
    for (int i = 0; i < count - 1; i ++)
    {
        for (int j = 0; j < count - 1 - i; j ++)
        {
            if (strcmp(stus[j].name,stus[j+1].name ))
            {
                Student temp = stus[j];
                stus[j] = stus[j + 1];
                stus[j + 1] = temp;
                
            }
        }
    }
}
//根据分数排
void sortStudentByScore(Student *stus,int count)
{
    for (int i = 0; i < count - 1; i ++)
    {
        for (int j = 0; j < count - 1 - i; j ++)
        {
            if (stus[j].score > stus[j+1].score)
            {
                Student temp = stus[j];
                stus[j] = stus[j + 1];
                stus[j + 1] = temp;
                
            }
        }
    }
}
//根据年龄排
void sortStudentByAge(Student *stus,int count)
{
    for (int i = 0; i < count - 1; i ++)
    {
        for (int j = 0; j < count - 1 - i; j ++)
        {
            if (stus[j].age > stus[j+1].age)
            {
                Student temp = stus[j];
                stus[j] = stus[j + 1];
                stus[j + 1] = temp;
            }
        }
    }

}

//遍历输出
void AllStudent(Student *stus,int count)
{
    for (int i = 0; i < count; i++) {
        printf("name:%s sex:%c age:%d score:%.1f\n",stus[i].name,stus[i].sex,stus[i].age,stus[i].score);
    }
    
}

//实现排序函数
void sortStudent(Student *stus,int count,SORT p_sort)
{
    for (int i = 0; i < count - 1; i ++)
    {
        for (int j = 0; j < count -i - 1; j ++)
        {
            if (p_sort(stus[j],stus[j+1]))
            {                                                                                                                                                                                                                   
                Student temp = stus[j];
                stus[j] = stus[j+1];
                stus[j+1] = temp;
            }
        }
    }
}
BOOL compartStudentByName(Student stu1,Student stu2)
{
     return strcmp(stu1.name, stu2.name) > 0;
}
BOOL compartStudentByScore(Student stu1,Student stu2)

    return stu1.score > stu2.score;   
}

BOOL compartStudentByNAge(Student stu1,Student stu2)
{
     return stu1.age > stu2.age;
}

时间: 2024-10-08 05:49:49

C 入门 第十一节的相关文章

火云开发课堂 - 《Shader从入门到精通》系列 第二十一节:在Shader中对3D模型进行区域遮罩

<Shader从入门到精通>系列在线课程 优惠链接:http://edu.csdn.net/combo/detail/90 第二十一节:在Shader中对3D模型进行区域遮罩 视频地址: http://edu.csdn.net/course/detail/1441/22685?auto_start=1 交流论坛:http://www.firestonegames.com/bbs/forum.php 工程下载地址:请成为正式学员获取工程 课程截图: 版权声明:本文为博主原创文章,未经博主允许不得

centos mysql 优化 第二十一节课

centos mysql  优化  第二十一节课 f

第三百七十一节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现我的搜索以及热门搜索

第三百七十一节,Python分布式爬虫打造搜索引擎Scrapy精讲-elasticsearch(搜索引擎)用Django实现我的搜索以及热门 我的搜素简单实现原理我们可以用js来实现,首先用js获取到输入的搜索词设置一个数组里存放搜素词,判断搜索词在数组里是否存在如果存在删除原来的词,重新将新词放在数组最前面如果不存在直接将新词放在数组最前面即可,然后循环数组显示结果即可 热门搜索实现原理,当用户搜索一个词时,可以保存到数据库,然后记录搜索次数,利用redis缓存搜索次数最到的词,过一段时间更新

centos mysql 优化 第十一节课

centos mysql  优化  第十一节课 f

Inno Setup入门(十一)——完成安装后执行某些程序

Inno Setup入门(十一)——完成安装后执行某些程序 2011-02-16 16:24:23|  分类: Inno Setup |  标签:inno  setup   |举报 |字号 订阅 下载LOFTER客户端 有些时候我们的程序虽然能够很好的完成安装,但是程序的配置工作可能需要其他的一些程序来辅助完成,如果不执行这些程序,主程序就不能很好的完成工作,甚至不能完成工作,一个很明显的例子是,目前许多程序是通过NET技术开发的,这就要求计算机上必须安装有.net Framework,否则主程

火云开发课堂 - 《使用Cocos2d-x 开发3D游戏》系列 第二十一节:地表漫游与寻路

<使用Cocos2d-x 开发3D游戏>系列在线课程 第二十一节:地表漫游与寻路 视频地址:http://edu.csdn.net/course/detail/1330/20822?auto_start=1 交流论坛:http://www.firestonegames.com/bbs/forum.php 工程下载地址:请成为正式学员获取工程 课程截图: ?? 版权声明:本文为博主原创文章,未经博主允许不得转载.

centos LAMP第三部分php,mysql配置 第二十一节课

centos   LAMP第三部分php,mysql配置   第二十一节课 上半节课 下半节课 f

第三百二十一节,Django框架,发送邮件

第三百二十一节,Django框架,发送邮件 全局配置settings.py EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' #发送邮件引擎 EMAIL_USE_TLS = False #是否以https方式 EMAIL_HOST = 'smtp.163.com' #邮件smtp服务器 EMAIL_PORT = 25 #端口 EMAIL_HOST_USER = '[email protected]' #发件人 EMAIL_

第二百四十一节,Bootstrap进度条媒体对象和 Well 组件

第二百四十一节,Bootstrap进度条媒体对象和 Well 组件 学习要点: 1.Well 组件 2.进度条组件 3.媒体对象组件 本节课我们主要学习一下 Bootstrap 的三个组件功能:Well 组件.进度条组件.媒体对 象组件. 一.Well 组件 这个组件可以实现简单的嵌入效果. 嵌入效果 well样式class类,写在<div>里,设置一个div区块嵌入效果(Bootstrap)well-lg样式class类,写在<div>里,设置一个div区块嵌入效果大尺寸(Boo