课外拓展1.模拟计算器的三种方法

简介: 回调函数的参数就是一个函数指针,这个指针便可以接收函数了,因为指针并没有指向,所以这个指针可以接收任意一个函数、

模拟计算器的三种方法-总结前面所学的案例


一,第一种方法(暴力方法)


switch结构


#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void menu(void) {
  //提供菜单
  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() {
  //因为计算器可以反复使用,所以用循环来写
  //至于用while还是do-while都是看自己喜好
  do {
    //在循环中定义变量,每次循环开始时初始化数据,就不会影响后面的运算
    int x, y, ret;
    x = y = ret = 0;
    int input=0;
    //输出菜单
    menu();
    //选择函数来运行程序,达到自己的目的
    printf("请选择:>");
    scanf("%d",&input);
    //因为选项很多,太过复杂。选择用switch结构
    switch (input) {
    case 1:
      printf("请输入2个操作数:>");
      scanf("%d%d", &x, &y);
      //调用函数
      ret = Add(x, y);
      printf("ret=%d\n", ret);
      break;
    case 2:
      printf("请输入2个操作数:>");
      scanf("%d%d", &x, &y);
      ret = Sub(x, y);
      printf("ret=%d\n", ret);
      break;
    case 3:
      printf("请输入2个操作数:>");
      scanf("%d%d", &x, &y);
      ret = Mul(x, y);
      printf("ret=%d\n", ret);
      break;
    case 4:
      printf("请输入2个操作数:>");
      scanf("%d%d", &x, &y);
      ret = Div(x, y);
      printf("ret=%d\n", ret);
      break;
    //如果输入为0,程序结束,直接跳出
    case 0:printf("程序结束");
      break;
    //如果输入的是其他数,给用户继续选择的机会。
    default:printf("选择错误,请重新选择");
      break;
    }
  } while (input);
  return 0;
}


上面都有解释,可以多看看。


二,第二种方法(函数指针数组)


#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void menu(void) {
  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() {
  //这里并没有用switch结构,这里跟第一个程序不同,上一个程序中input定义在了switch外面,所以没啥问题
  //但是在这里,函数的主体就只有一个循环,由于我们用的是do-while循环,最后while后面的input是在循环体外面的,
  //如果在里面定义input的话,作用域就到不了外面,故,我们把input定义在外面。
  int input = 0;
  do {
    //这里我们采用函数指针数组的方法。
    int (*parr[5])(int, int) = { NULL,Add,Sub,Mul,Div };
    int x, y, ret;
    x = y = ret = 0;
    //输出菜单
    menu();
    //选择方法
    printf("请选择:>");
    scanf("%d", &input);
    if (input >= 1 && input <= 4) {
      //初始化数据
      printf("请输入2个操作数:");
      scanf("%d%d", &x, &y);
      //用函数指针的方法,用指针调用函数
      ret = (parr[input])(x, y);
      printf("ret =%d\n", ret);
    }
    else if (input == 0)
      printf("程序结束。");
    else
      printf("选择错误,请重新选择\n");
  } while (input);
  return 0;
}
/*首先我们来分析一下,计算器有五种选择,我们用目前所学的方法来解决这个问题,我这里写了三种办法
第一种方法就是switch结构(变态的循环),第二种我选择函数指针数组的方法,即用数组存放函数的地址
给予用户多种函数,主要是数组的便利性,可以提供多种选择,第三种方法我们对第一种方法进行改良,我们
习惯对重复的操作写成自定义函数。同时我们采取函数指针做参数的方法。返回值为调用完函数后得到的值*/


/*首先我们来分析一下,计算器有五种选择,我们用目前所学的方法来解决这个问题,我这里写了三种办法

第一种方法就是switch结构(变态的循环),第二种我选择函数指针数组的方法,即用数组存放函数的地址

给予用户多种函数,主要是数组的便利性,可以提供多种选择,第三种方法我们对第一种方法进行改良,我们

习惯对重复的操作写成自定义函数。同时我们采取函数指针做参数的方法。返回值为调用完函数后得到的值*/


三,第三种方法(回调函数)


#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void menu(void) {
  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 Calc(int(*pf)(int, int)) {
  int x, y;
  x = y  = 0;
  printf("请输入两个操作数:");
  scanf("%d%d",&x,&y);
  return pf(x, y);
}
int main() {
  int input=0;
  menu();
  printf("请选择:>");
  scanf("%d",&input);
  do {
    switch (input) {
    case 1:
      printf("ret=%d\n",Calc(Add));
    case 2:
      printf("ret =%d\n",Calc(Sub));
    case 3:
      printf("ret=%d\n", Calc(Mul));
    case 4:
      printf("ret=%d\n", Calc(Div));
    case 0:
      printf("退出程序");
    default:
      printf("请重新选择:");
    }
  } while (input);
  return 0;
}
/*其实这个地方就是一个回调函数的方法,首先,我们要清楚回调函数的作用和定义,回调函数就是在b函数调用a函数,
那么回调函数的作用是什么呢?就是在有多个函数选择时,我们可以另外定义一个函数,这个函数就是就是回调函数了,
回调函数的参数就是一个函数指针,这个指针便可以接收函数了,因为指针并没有指向,所以这个指针可以接收任意一个函数、
这就是回调函数。*/


/*其实这个地方就是一个回调函数的方法,首先,我们要清楚回调函数的作用和定义,回调函数就是在b函数调用a函数,

那么回调函数的作用是什么呢?就是在有多个函数选择时,我们可以另外定义一个函数,这个函数就是就是回调函数了,

回调函数的参数就是一个函数指针,这个指针便可以接收函数了,因为指针并没有指向,所以这个指针可以接收任意一个函数、

这就是回调函数。*/


上述就是模拟计算器的三种方法,静待各位大佬斧正和指教!!!

目录
相关文章
|
9月前
|
安全 Java 数据库连接
【Java每日一题】——第四十四题:综合案例:编程模拟智能手机和普通手机功能。
【Java每日一题】——第四十四题:综合案例:编程模拟智能手机和普通手机功能。
|
前端开发 芯片
【芯片前端】保持代码手感——编写常值乘法器和一些拓展
【芯片前端】保持代码手感——编写常值乘法器和一些拓展
|
3月前
|
存储 算法 C语言
用C语言开发游戏的实践过程,包括选择游戏类型、设计游戏框架、实现图形界面、游戏逻辑、调整游戏难度、添加音效音乐、性能优化、测试调试等内容
本文探讨了用C语言开发游戏的实践过程,包括选择游戏类型、设计游戏框架、实现图形界面、游戏逻辑、调整游戏难度、添加音效音乐、性能优化、测试调试等内容,旨在为开发者提供全面的指导和灵感。
91 2
|
6月前
|
开发者 图形学 Java
Unity物理引擎深度揭秘:从刚体碰撞到软体模拟,全面解析实现复杂物理交互的技巧与秘诀,助你打造超真实游戏体验
【8月更文挑战第31天】物理模拟在游戏开发中至关重要,可让虚拟世界更真实。Unity作为强大的跨平台游戏引擎,内置物理系统,支持从刚体碰撞到布料模拟的多种功能。通过添加Rigidbody组件,可实现物体受力和碰撞;使用AddForce()施加力;通过关节(如Fixed Joint)连接刚体以模拟复杂结构。Unity还支持软体物理,如布料和绳索模拟,进一步增强场景丰富度。掌握这些技术,可大幅提升游戏的真实感和玩家体验。
272 0
NFT卡牌游戏链游系统开发(开发方案)/详情规则/成熟技术/设计界面/案例项目/源码程序
NFT (Non Homogeneous Token) card chain game refers to a game based on blockchain technology where NFT is used as the card in the game. NFT is a unique and non interchangeable digital asset that can represent various virtual cards, props, or characters in the game.
多功能计算器,解决计算难题!(支持手写)
多功能计算器,解决计算难题!(支持手写)
151 0
多功能计算器,解决计算难题!(支持手写)
循环互助游戏开发部署逻辑分析
循环互助游戏开发需要结合游戏开发和互动技术来实现。以下是一些循环互助游戏开发需要考虑的方面:
|
Java
手把手一步一步教你使用Java开发一个大型街机动作闯关类游戏07游戏输入管理
手把手一步一步教你使用Java开发一个大型街机动作闯关类游戏07游戏输入管理
137 0
|
数据可视化 Java
手把手一步一步教你使用Java开发一个大型街机动作闯关类游戏15之拳击范围
手把手一步一步教你使用Java开发一个大型街机动作闯关类游戏15之拳击范围
197 0
|
数据可视化 Java
手把手一步一步教你使用Java开发一个大型街机动作闯关类游戏14之人身攻击范围指定与获取
手把手一步一步教你使用Java开发一个大型街机动作闯关类游戏14之人身攻击范围指定与获取
157 0