回调函数实现计算器和qsort

简介: 回调函数实现计算器和qsort

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个
函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数
的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进
行响应。
在这里插入图片描述

@TOC


前言

今天用一个简易的计算器和qsort的实现,带大家深入了解回调函数

一、计算器🔎

写一个计算器
加法、减法、乘法、除法

1.switch语句实现

#include<stdio.h>
#include<string.h>

void menu()
{
    printf("****************************\n");
    printf("***** 1.add   2.sub   ******\n");
    printf("***** 3.mul   4.div   ******\n");
    printf("***** 0.exit          ******\n");
    printf("****************************\n");
}
int add(int x, int y)
{
    return x + y;
}
int sub(int x, int y)
{
    return x - y;
}
int mul(int x, int y)
{
    return x * y;
}
int div(int x, int y)
{
    return x / y;
}
int main()
{ 
    int input = 0;
    int x = 0;
    int y = 0;
    int ret = 0;
    do
    {
        menu();
        printf("请选择:>");
        scanf("%d", &input);
        printf("请输入两个操作数:>");
        scanf("%d %d", &x, &y);
        switch (input)
        {
        case 1:
            ret = add(x, y);
            printf("%d\n", ret);
            break;
        case 2:
            ret = sub(x, y);
            printf("%d\n", ret);
            break;
        case 3:
            ret = mul(x, y);
            printf("%d\n", ret);
            break;
        case 4:
            ret = div(x, y);
            printf("%d\n", ret);
            break;
        case 0:
            printf("退出计算器\n");
            break;
        default:
            printf("选择错误\n");
            break;
        }
    } while (input);
    return 0;
}

2.回调函数实现

⌚️⌚️⌚️ 把加减乘除函数,封装成一个函数指针calc,在用户输入需要什么功能时,只需要将函数的地址传到回调函数中,大大的提高了代码利用率,将功能封装起来,高内聚低耦合。
#include<stdio.h>
#include<string.h>

void menu()
{
    printf("****************************\n");
    printf("***** 1.add   2.sub   ******\n");
    printf("***** 3.mul   4.div   ******\n");
    printf("***** 0.exit          ******\n");
    printf("****************************\n");
}
int add(int x, int y)
{
    return x + y;
}
int sub(int x, int y)
{
    return x - y;
}
int mul(int x, int y)
{
    return x * y;
}
int div(int x, int y)
{
    return x / y;
}
void calc(int (*pf)(int, int))
{
    int x = 0;
    int y = 0;
    int ret = 0;
    printf("请输入2个操作数:>");
    scanf("%d %d", &x, &y);
    ret = pf(x, y);
    printf("%d\n", ret);
}
int main()
{
    int input = 0;
    do
    {
        menu();
        printf("请选择:>");
        scanf("%d", &input);
        switch (input)
        {
        case 1:
            calc(add);
            break;
        case 2:
            calc(sub);
            break;
        case 3:
            calc(mul);
            break;
        case 4:
            calc(div);
            break;
        case 0:
            printf("退出计算器\n");
            break;
        default:
            printf("选择错误\n");
            break;
        }
    } while (input);
    return 0;
}

二、qsort🔎

1.冒泡排序

在学习qsort之前先回顾一下冒泡排序
#include<stdio.h>
#include<string.h>
int main()
{
    int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
    int sz = sizeof(arr) / sizeof(arr[0]);
    int i = 0;
    for (i = 0; i < sz - 1; i++)
    {
        for (int j = 0; j < sz - i - 1; j++)
        {
            if (arr[j] > arr[j + 1])
            {
                int h = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = h;
            }
        }
    }
    for (i = 0; i < sz; i++) {
        printf("%d ", arr[i]);
    }
    return 0;
}

2.qsort

在这里插入图片描述

相信很多小伙伴会有疑问,不是已经学习了冒泡排序,为什么还要学习qsort,不是多此一举吗?但是,冒泡排序只能排整形数据,那浮点数,字符型,结构体又该怎么实现呢,这就发挥出qsort的作用了。==带大家解读一下qsort==

在这里插入图片描述

3.qsort排序浮点数

#include<stdio.h>
#include<stdlib.h>
cmp_float(const void* e1, const void* e2)
{
    return *(float*)e1 - *(float*)e2;
}

int main()
{
    float f[] = { 5.0,4.0,3.0,2.0,1.0 };
    int sz = sizeof(f) / sizeof(f[0]);
    qsort(f, sz, sizeof(f[0]), cmp_float);
    int i = 0;
    for (i = 0; i < sz; i++)
    {
        printf("%f ", f[i]);
    }
    return 0;
}

在这里插入图片描述

4.qsort排序字符型

int cmp_char(const void* e1, const void* e2)
{
    return *(char*)e1 - *(char*)e2;
}
int main()
{
    char ch[] = { 'f','e','d','c','b','a' };
    int sz = sizeof(ch) / sizeof(ch[0]);
    qsort(ch, sz, sizeof(ch[0]), cmp_char);
    int i = 0;
    for (i = 0; i < sz; i++)
    {
        printf("%c ", ch[i]);
    }
    return 0;
}

在这里插入图片描述

5.qsort排序结构体

struct Stu
{
    char name[30];
    int age;
};
int cmp_Stu_name(const void* e1, const void* e2)
{
    return strcmp(((struct Stu*)e1)->name,((struct Stu*)e2)->name);
}
int cmp_Stu_age(const void* e1, const void* e2)
{
    return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}

int main()
{
    
    struct Stu s[] = { {"zhaoding",20},{"zhangsan",19},{"wangwu",15} };
    int sz = sizeof(s) / sizeof(s[0]);
    qsort(s, sz, sizeof(s[0]), cmp_Stu_age);
    return 0;
}

在这里插入图片描述
在这里插入图片描述

6.自定义实现my_qsort

void Swap(char* buf1, char* buf2, int width)
{
    int i = 0;
    for (i = 0; i < width; i++)
    {
        char* h = *buf1;
        *buf1 = *buf2;
        *buf2 = h;
        buf1++;
        buf2++;
    }
}
void my_qsort(void* base, int sz, int width, int(*cmp)(const void* e1, const void* e2))
{
    int i = 0;
    for (i = 0; i < sz - 1; i++)
    {
        int j = 0;
        for (j = 0; j < sz - 1 - i; j++)
        {
            if (cmp((char*)base+j*width, (char*)base + (j + 1) * width) > 0)
            {
                Swap((char*)base + j * width, (char*)base + (j + 1) * width,width);
            }
}
        
    }
}
int main()
{
    int arr[] = { 9,8,7,6,5,4,3,2,1 };
    int sz = sizeof(arr) / sizeof(arr[0]);
    my_qsort(arr, sz, sizeof(arr[0]), Swap);
    int i = 0;
    for (i = 0; i < sz; i++)
    {
        printf("%d ", arr[i]);
    }
    return 0;
}

总结🔎

💌💌💌 今天的回调函数就到这里了,函数指针和回调函数的结合,小的程序看不出来优势,在一个大点程序中使用能够使程序更加的优化,完整。

在这里插入图片描述

目录
相关文章
|
C语言
通过模拟实现计算器介绍函数指针数组和回调函数的用法【C语言/指针/进阶】
通过模拟实现计算器介绍函数指针数组和回调函数的用法【C语言/指针/进阶】
84 0
|
8月前
|
机器学习/深度学习
PTA-阶乘函数实现
阶乘函数实现
83 0
|
8月前
回调函数,以qsort函数为例
回调函数,以qsort函数为例
35 0
|
C语言
扫雷游戏(数组与函数实现)
扫雷游戏(数组与函数实现)
|
算法 程序员 C语言
【进阶C语言】排序函数(qsort)与模拟实现(回调函数的实例)
回调函数为C语言重要知识点,以函数指针为主要知识;下面介绍回调函数的定义、回调函数的库函数举例即库函数模拟实现。
64 0
【进阶C语言】排序函数(qsort)与模拟实现(回调函数的实例)
回调函数与qsort函数
回调函数与qsort函数
49 0
|
搜索推荐 编译器 C++
指针进阶:函数指针 && 回调函数(真正理解qsort)
指针进阶:函数指针 && 回调函数(真正理解qsort)
|
存储 算法 测试技术
深入解析 qsort 函数(下),用冒泡排序模拟实现 qsort 函数
深入解析 qsort 函数(下),用冒泡排序模拟实现 qsort 函数
55 0
|
存储 小程序
计算器小程序+函数指针数组介绍
计算器是我们生活中重要的使用工具,那么我们要怎样写出计算机小程序呢?想必大家有很多种写出计算器程序的代码,在这里小编将用函数指针数组写出计算器程序.
68 0
|
搜索推荐 C语言
深入理解回调函数qsort:从入门到模拟实现(上)
深入理解回调函数qsort:从入门到模拟实现(上)
95 0

热门文章

最新文章