函数指针的优越性体现《C语言计算器》

简介: 函数指针的优越性体现《C语言计算器》

目录

🔊🔊🔊

🇨🇳大家好,我是_奇奇,暂时为一名C语言博主。河牧院大一在读。

🔔喜欢交朋友,欢迎大家和我一起交流学习

❤️编程的前途是光明的,道路是曲折的。笑到最后才是赢家🍺

🌳我觉得坦途在前,人又何必为了一些小障碍而不走路呢 --鲁迅

0.前言

  • 学了这么长时间指针了,还不知道怎么用。但今天终于可以体现一下指针的优越性了。这篇博客我将用函数指针来实现加减乘除等简单的运算来模拟计算。来学习函数指针的优越性。
    函数指针可以使计算器代码变的简洁不冗余。
  • 先普及几个需要用到的英语。(英语大佬自行略过)

addition 加法 缩写 Add

subtraction 减法 缩写 Sub

multiplication 乘法 缩写 Mul

division 除法 缩写 Div

calculator 计算器 缩写 Cal


  • 假如让你写一个计算器你会怎么写?很自然的你会想到把加减乘除等运算分别封装成函数然后需要用哪个操作的时候依次去调用他们。所以你的代码逻辑可能就是以下特别冗余的这个。
  • 创建一个菜单进行选择去执行哪个操作。然后输入两个操作数进行计算。

1.普通冗余代码

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
menu()
{
  printf("******1.加法*******\n");
  printf("******2.减法*******\n");
  printf("******3.乘法*******\n");
  printf("******4.除法*******\n");
}
Add(int x, int y)
{
  return x + y;
}
Sub(int x, int y)
{
  return x - y;
}
Mul(int x, int y)
{
  return x * y;
}
Div(int x, int y)
{
  return x / y;
}
int main()
{
  int n = 0;
  int x = 0;
  int y = 0;
  int result = 0;
  do
  {
    menu();
    scanf("%d", &n);
    switch (n)
    {
    case 1:
      printf("请输入两个操作数\n");
      scanf("%d %d", &x, &y);
      result = Add(x, y);
      printf("结果是%d\n", result);
      break;
    case 2:
      printf("请输入两个操作数\n");
      scanf("%d %d", &x, &y);
      result = Sub(x, y);
      printf("结果是%d\n", result);
      break;
    case 3:
      printf("请输入两个操作数\n");
      scanf("%d %d", &x, &y);
      result = Mul(x, y);
      printf("结果是%d\n", result);
      break;
    case 4:
      printf("请输入两个操作数\n");
      scanf("%d %d", &x, &y);
      result = Div(x, y);
      printf("结果是%d\n", result);
      break;
    case 0:
      printf("退出计算器\n");
      break;
    default:
      printf("选择错误,请重新选择\n");
      break;
    }
  } while (n);
  return 0;
}

看以下图片。你会发现除了每次调用的函数名不一样以外,其他的全部是一模一样的,所以我们可以把这部分想方设法封装成一个函数。但由于函数名不一样,所以没办法封装!这时候函数指针就派上用场啦。

可以把重复的部分抽离出来编成一个Cal函数,然后Cal函数的参数用函数指针int (*p)(int, int)来接收加法Add,减法Sub,乘法Mul,或者除法Div的函数名。然后在这个函数内部调用需要用到的 加减乘除 函数。

2.整体改进代码

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
menu()
{
  printf("******1.加法*******\n");
  printf("******2.减法*******\n");
  printf("******3.乘法*******\n");
  printf("******4.除法*******\n");
}
Add(int x, int y)
{
  return x + y;
}
Sub(int x, int y)
{
  return x - y;
}
Mul(int x, int y)
{
  return x * y;
}
Div(int x, int y)
{
  return x / y;
}
Cal(int (*p)(int, int))
{
  int x = 0;
  int y = 0;
  int result = 0;
  printf("请输入两个操作数\n");
  scanf("%d %d", &x, &y);
  result = p(x, y);
  printf("结果是%d\n", result);
}
int main()
{
  int n = 0;
  do
  {
    menu();
    scanf("%d", &n);
    switch (n)
    {
    case 1:
      Cal(Add);
      break;
    case 2:
      Cal(Sub);
      break;
    case 3:
      Cal(Mul);
      break;
    case 4:
      Cal(Div);
      break;
    case 0:
      printf("退出计算器\n");
      break;
    default:
      printf("选择错误,请重新选择\n");
      break;
    }
  } while (n);
  return 0;
}

3.具体改进分析(画图分析)

  1. 如图所示,本质是回调函数
    2.回调函数就是一个被作为参数传递的函数。回调函数的使用可以大大提升编程的效率,这使得它在现代编程中被非常多地使用。同时,有一些需求必须要使用回调函数来实现。(百度百科)
相关文章
|
21天前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
81 12
|
6月前
|
C语言
指针进阶(C语言终)
指针进阶(C语言终)
|
2月前
|
C语言
无头链表二级指针方式实现(C语言描述)
本文介绍了如何在C语言中使用二级指针实现无头链表,并提供了创建节点、插入、删除、查找、销毁链表等操作的函数实现,以及一个示例程序来演示这些操作。
32 0
|
3月前
|
存储 人工智能 C语言
C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
本文详细讲解了C语言中的指针,包括指针变量的定义与引用、指向数组及字符串的指针变量等。首先介绍了指针变量的基本概念和定义格式,随后通过多个示例展示了如何使用指针变量来操作普通变量、数组和字符串。文章还深入探讨了指向函数的指针变量以及指针数组的概念,并解释了空指针的意义和使用场景。通过丰富的代码示例和图形化展示,帮助读者更好地理解和掌握C语言中的指针知识。
110 4
|
4月前
|
C语言
【C初阶——指针5】鹏哥C语言系列文章,基本语法知识全面讲解——指针(5)
【C初阶——指针5】鹏哥C语言系列文章,基本语法知识全面讲解——指针(5)
|
4月前
|
C语言
【C初阶——指针4】鹏哥C语言系列文章,基本语法知识全面讲解——指针(4)
【C初阶——指针4】鹏哥C语言系列文章,基本语法知识全面讲解——指针(4)
|
4月前
|
存储 编译器 C语言
【C初阶——指针3】鹏哥C语言系列文章,基本语法知识全面讲解——指针(3)
【C初阶——指针3】鹏哥C语言系列文章,基本语法知识全面讲解——指针(3)
|
5月前
|
编译器 C语言
【C语言初阶】指针篇—下
【C语言初阶】指针篇—下
|
5月前
|
存储 C语言
【C语言初阶】指针篇—上
【C语言初阶】指针篇—上
|
6月前
|
搜索推荐 程序员 C语言
指针赋值与引用传递:C语言的基础知识与实践技巧
指针赋值与引用传递:C语言的基础知识与实践技巧