课外拓展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函数,

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

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

这就是回调函数。*/


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

目录
相关文章
|
Java
微信红包的模拟代码
微信红包的模拟代码
143 1
|
C语言
C语言 14 模拟计算器 版本更迭
C语言 14 模拟计算器 版本更迭
55 0
多功能计算器,解决计算难题!(支持手写)
多功能计算器,解决计算难题!(支持手写)
135 0
多功能计算器,解决计算难题!(支持手写)
|
Java
手把手一步一步教你使用Java开发一个大型街机动作闯关类游戏07游戏输入管理
手把手一步一步教你使用Java开发一个大型街机动作闯关类游戏07游戏输入管理
130 0
|
数据可视化 Java
手把手一步一步教你使用Java开发一个大型街机动作闯关类游戏14之人身攻击范围指定与获取
手把手一步一步教你使用Java开发一个大型街机动作闯关类游戏14之人身攻击范围指定与获取
148 0
|
数据可视化 Java
手把手一步一步教你使用Java开发一个大型街机动作闯关类游戏15之拳击范围
手把手一步一步教你使用Java开发一个大型街机动作闯关类游戏15之拳击范围
189 0
|
Java
手把手一步一步教你使用Java开发一个大型街机动作闯关类游戏16之敌人来了
手把手一步一步教你使用Java开发一个大型街机动作闯关类游戏16之敌人来了
142 0
|
Java 领域建模
java面向对象思维程序设计开发以及案例 -电梯运行问题对象分析与程序设计(1)
java面向对象思维程序设计开发以及案例 -电梯运行问题对象分析与程序设计(1)
java面向对象思维程序设计开发以及案例 -电梯运行问题对象分析与程序设计(1)
|
对象存储 索引
终极:用集合模拟斗地主
1.买一副扑克牌将花色和数字分别进行组合,生成所有的普通牌手动添加“大王”、“小王” 2.洗牌使用Collections工具类的shuffle()方法打乱牌的顺序 3.发牌遍历牌堆,将每一张牌分发到三个玩家集合中留三张作为底牌 4.看牌分别打印每个玩家集合的内容
终极:用集合模拟斗地主
|
物联网 程序员 测试技术
厉害了我的“猿”!程序员手工建造波音 737 模拟驾驶舱,几乎模拟全部功能
厉害了我的“猿”!程序员手工建造波音 737 模拟驾驶舱,几乎模拟全部功能
厉害了我的“猿”!程序员手工建造波音 737 模拟驾驶舱,几乎模拟全部功能