首页 > 其他分享 >三种方法带你实现计算器

三种方法带你实现计算器

时间:2023-12-17 18:05:35浏览次数:31  
标签:case return int 计算器 break 三种 printf input 方法

一、

第一种:普通函数的调用+switch语句

#include<stdio.h>
void menu()
{
   printf("*************************");
   printf("*****1. add   2.sub******");
   printf("*****3. mul   4.div******");
   printf("*********0. exit*********");
   printf("*************************");
}
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,inty)
{
  return x/y;
}
int main()
{
  int input=0;
  int x=0;
  int y=0;
  do
  {
    menu();
    printf("请选择:>");
    scanf_s("%d",&input);
    //printf("请输入两个操作数:>");
    //scanf_s("%d%d",x.y);
    //上面这两句话如果放在这,那么就算是输入非0、1、2、3、4的数程序也会让输入两个操作符,显得啰嗦
    //所以将这两句话放在了case语句里面
    switch(input)
    {
      case 1:
        printf("请输入两个操作数:>");
        scanf_s("%d%d",&x,&y);
        printf("%d\n",add(x,y));
        break;
      case 2:
        printf("请输入两个操作数:>");
        scanf_s("%d%d",&x,&y);
        printf("%d\n",sub(x,y));
        break;
      case 3:
        printf("请输入两个操作数:>");
        scanf_s("%d%d",&x,&y);
        printf("%d\n",mul(x,y));
        break;
      case 4:
        printf("请输入两个操作数:>");
        scanf_s("%d%d",&x,&y); 
        printf("%d\n",div(x,y));
        break;
      case 0:
        printf("退出\n");
        break;
      default:
        printf("选择错误\n");
    }
  }
  while(input);
}


     我们不难看出来,第一种方法中的代码有两处地方显得很冗余:

  • 加减乘除函数的每次调用(细想一下:计算器中可不止加减乘除四个运算法则,而每一次都调用(case语句也会越来越多)会很费劲、很矬)
  • printf("请输入两个操作数:>");scanf_s("%d%d",&x,&y);这两句话在四个case语句中都重复出现,也会使代码显得很矬

所以我们依照这两个不足之处加以改进:

二、函数指针数组的使用

#include<stdio.h>
void menu()
{
   printf("*************************");
   printf("*****1. add   2.sub******");
   printf("*****3. mul   4.div******");
   printf("*********0. exit*********");
   printf("*************************");
}
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,inty)
{
  return x/y;
}
int main()
{
  int x=0;
  int y=0;
  int (*pfarr[])(int,int)={0,add,sub,mul,div};//函数指针数组
  int input=0;//这里input是pfarr数组的下标
  //这里函数指针数组中的第一位初始化为0是有原因的:和上面的menu函数中的对应起来
  do
  {
    menu();
    printf("请选择:>");
    scanf_s("%d",&input);
    if(input>=1&&input<=4)
    {
       printf("请输入两个操作数:>");
       scanf_s("%d%d",&x,&y);
       int ret=pfarr[input](x,y);
       printf("%d\n",ret);
    }
    else if(input==0)
    {
      printf("退出\n");
    }
    else
    {
      printf("选择错误\n");
    }
  }
  while(input);
}

三、回调函数(通过函数指针调用的函数)

用这个方法解决代码冗余的问题

将重复性的语句分装成函数Calc;来接收函数名(地址

void Calc(int (*pf)(int,int))
{
  int x=0;
  int y=0;
  printf("请输入两个操作符:>");
  scanf_s("%d%d",x,y);
  printf("%d\n",pf(x,y));
}

所以case语句中变成了:

case 1:
Calc(add);
break;
case 2:
Calc(sub);
break;
case 3:
Calc(mul);
break;
case 4:
Calc(div);
break;

这样就显得很简洁明了,最后的代码就变成了:

#include<stdio.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,inty)
{
  return x/y;
}
void Calc(int(*pf)(int,int))
{
  int x=0;
  int y=0;
  printf("请输入两个操作符:>");
  scanf_s("%d%d",&x,&y);
  printf("%d\n",pf(x,y));
  break;
}
int main()
{
  int input=0;
  do
  {
    menu();
    printf("请选择:>");
    scanf_s("%d",&input);
    switch(input)
    {
        case 1:
        Calc(add);
        break;
        case 2:
        Calc(sub);
        break;
        case 3:
        Calc(mul);
        case 4:
        Calc(div);
        break;
      case 0:
        printf("退出\n");
        break;
      default:
        printf("选择错误\n");
    }
  }
  while(switch)






























标签:case,return,int,计算器,break,三种,printf,input,方法
From: https://blog.51cto.com/u_16351083/8862408

相关文章

  • #yyds干货盘点#MongoDB 封装 CRUD 方法
    CRUD是指创建(Create)、读取(Read)、更新(Update)和删除(Delete)四种基本的数据处理操作。在软件开发中,CRUD方法通常用于对数据库或其他存储系统中的数据进行操作。具体来说,CRUD方法包括以下四种操作:创建(Create) :向数据库或其他存储系统中插入新数据。读取(Read) :从数据库或其他......
  • 地方社区门户网站的SEO优化方法
    近年来,地方社区门户网站的竞争开始呈现白热化的程度,因为地方社区门户网站不仅仅要面临同类型的网站竞争,还需要和相关的地方网站如地方信息网、房地产网、人才招聘网等竞争相对饱和的用户市场,所以如果地方社区门户网站的优化工作没有做到位,那么就很难获得更多的忠诚用户,从而严重影......
  • 浅析浏览器数据库IndexedDB:基本概念、操作流程及各对象属性和方法
    一、概述随着浏览器的功能不断增强,越来越多的网站开始考虑,将大量数据储存在客户端,这样可以减少从服务器获取数据,直接从本地获取数据。Cookie的大小不超过4KB,且每次请求都会发送回服务器;LocalStorage在2.5MB到10MB之间(各家浏览器不同),而且不提供搜索功能,不能建......
  • 计算器(函数版)
    #include<stdio.h>voidprint(){ printf("******************计算器*******************\n"); printf("*****1.ADD2.SUB*******\n"); printf("*****3.DIV4.MUL*******\n"); printf(&qu......
  • 知识图谱的构建方法(思路篇)
    构建知识图谱的过程可以分为以下几个步骤:确定领域和范围:首先需要明确知识图谱所关注的领域和范围,这将决定知识图谱的用途和覆盖的知识领域。例如,可以是通用型知识图谱,也可以是特定领域的知识图谱,如医疗、金融、教育等。构建本体:本体是知识图谱的基础,用于描述领域内的概念、属性和关......
  • WinForm实现管理员权限运行的三种方式
    来源:https://mp.weixin.qq.com/s/ydBWABy7kwOWxNCQu4qYMA 在visualstudio开发winform程序,生成msi安装包以后,代码运行似乎没有问题。但是,若是软件安装到了C盘,软件在执行某些操作,比如写文件、读文件等操作时,有可能会因为操作系统用户权限不足导致读写不成功。关键这时候软件还不......
  • 云平台运维过程问题,以及解决方法
    1.裸金属替换下发,后bond1网络不通或者丢包。:排查用到的命令:ifdown  ifconfigeth0down/up ip-bra  demsg|grepDMI查看服务器厂家 、cat/etc/os-release查看操作系统版本#用带外看服务器的状态ipmitool-Ilanplus-H22.234.11.158-Uadmin-PPCfwq@psbc202......
  • Windows2008R2 IIS配置证书 ERR_SSL_VERSION_OR_CIPHER_MISMATCH 错误解决方法
    IISCrypto 用这个工具很方便,也可以手动修改注册表工具内置最佳实践,点击 BestPractices再Apply,然后重启服务器即可,设置前记得备份注册表。参考:https://blog.csdn.net/a873744779/article/details/103635882https://blog.csdn.net/jackbon8/article/details/82702563 ......
  • 结构化开发方法——03
    抽象化定义:从概要设计到详细设计的抽象化层次逐次降低。在最高的抽象层次上,可以使用问题所处环境的语言描述问题的解法;在较低的抽象层次上,则采用过程化的方法,产生源程序时到达最低的抽象层次。分为3种:过程的抽象:在从概要设计到详细设计的过程中,抽象化的层次逐次降低,当产生源程序时......
  • 进阶两数交换的方法论
    今天我们来看一个简单的问题,大家对交换两个数字有多少想法呢,先看看这个。以下我们全都以1,2,为例。#include<stdio.h>voidswap(inta,intb){ intt; t=a; a=b; b=t;}intmain(){ inta=1,b=2; swap(a,b); printf("a=%db=%d\n",a,b); return0;}请问这个代码会输出......