四则运算 结对项目

github 地址:https://github.com/wangshicheng0213/HomeWork02

一、基本要求

1) 实现一个带有用户界面的四则运算。

2) 生成的题目不能重复。

3) 支持负数,例如-1,-1/2,-3‘4/5等。

4) 题目的数量(个人项目的要求)

5) 数值的范围

6) 题目中最多几个运算符

7) 题目中是否有乘除法

8) 题目中或运算过程中有无负数

根据老师的要求,我们做的程序中解决了以上的问题。因为在第一次制作的四则运算中我的代码就已经制作了一个用户操作的界面,只是比较粗糙不够完善,所以这次我和我的组员完善了四则运算的界面和一些具体的功能。在这些要求中的运算符有几个的问题里,第一次制作的四则运算的运算符是做了三个,所以这次依旧使用三个运算符,没有进行大的修改。

二、源代码

 

源代码:

 

复制代码
package com.nenu.calculation;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Scanner;
import java.util.Set;
import java.util.Stack;
import java.util.StringTokenizer;
import java.util.Map.Entry;

public class Main {
// public static void main(String[] args) {
//  System.out.println("请输入n,即想要产生练习题题目数量");
//  Scanner scanner = new Scanner(System.in);
//  boolean key1 = true;
//  String temp = null;
//  while(key1){
//   temp = scanner.next();//输入练习题的数量
//   if(!temp.matches("^\\d+$")){
//    System.out.println("输入错误,请再输入一次");
//   }
//   else
//    key1 = false;
//  }
//  int account = Integer.valueOf(temp);
//  int questionCount = 0;
//        File file = new File("../HomeWork01/result.txt");
//        PrintStream ps = null;
//  try {
//   ps = new PrintStream(new FileOutputStream(file));
//  } catch (FileNotFoundException e1) {
//   // TODO Auto-generated catch block
//   e1.printStackTrace();
//  }
//        ps.println("2018102996");// 往文件里写入学号字符串
//  //System.out.println(account);
//  while(questionCount != account){
//   //随机三到五个数字
//   Random random = new Random();
//   int nums = random.nextInt(3) + 3;
//   //System.out.println(nums);
//   ArrayList<Integer> numArrayList = new ArrayList<Integer>();
//   for (int j = 0; j < nums; j++) {
//    Random randomNum = new Random();
//    int number = randomNum.nextInt(101);
//    numArrayList.add(number);
//   }
   System.out.println(numArrayList);
//   //随机数字 - 1个运算符
//   Map<Integer, String> opeMap = new HashMap<Integer, String>();
//   opeMap.put(1, "+");
//   opeMap.put(2, "-");
//   opeMap.put(3, "*");
//   opeMap.put(4, "÷");
//   int opeNum = 0;
//   ArrayList<String> operrayList = new ArrayList<String>();
//   while(opeNum != nums - 1){
//    Random randomOpe = new Random();
//    int key = randomOpe.nextInt(4)+1;
//    String ope01 = opeMap.get(key);
//    operrayList.add(ope01);
//    opeNum ++;
//   }
   System.out.println(operrayList);
   Set<Entry<Integer, Character>> opeSet = opeMap.entrySet();
   Iterator<Entry<Integer, Character>> ope = opeSet.iterator();
   System.out.print("[");
   while(ope.hasNext()){
    Entry<Integer, Character> type = (Entry<Integer, Character>)ope.next();
    int k = type.getKey();
    Character v = type.getValue();
    System.out.print(v + ",");
   }
   System.out.println("]");
//   if(true){
    System.out.println(numArrayList);
    System.out.println(operrayList);
//    ArrayList<String> equString = new ArrayList<String>();
//    equString.add(numArrayList.get(0).toString());
//    for (int i = 1; i < nums; i++) {
//     equString.add(operrayList.get(i - 1).toString());
//     equString.add(numArrayList.get(i).toString());
//    }
    System.out.println(equString);
//    StringBuilder stringBuilder = new StringBuilder();
//    for (int i = 0; i < equString.size(); i++) {
//     stringBuilder.append(equString.get(i));
//    }
//          float data = 0;
//    try {
//     String expression = stringBuilder.toString();
//     Main nbl = new Main(expression);
//           String nbls_cc = new String();
//           float result = 0;
//           nbl.zz_hz();
           nbl.nbls_bc();
           System.out.println("对应的逆波兰式为 :" + nbls_cc);
           System.out.println("结果是:");
//           data = nbl.js_nbl();
//           //分数保留2位
//           DecimalFormat df = new DecimalFormat("0.00");
           String num3 = df.format(num);
//           String dataStr = df.format(data);
           System.out.println(result);
//           
     data = evaluateExpression(expression);
//           
//     stringBuilder.append("=" + dataStr);
//           System.out.println(stringBuilder);
           File dest = new File("../HomeWork01/result.txt");
           BufferedWriter writer = new BufferedWriter(new FileWriter(dest));
           writer.write(stringBuilder.toString());
           writer.flush();
           writer.close();
//    } catch (Exception e) {
//     questionCount = questionCount - 1;
//    }
//             ps.print(stringBuilder + "\n");// 在已有的基础上添加字符串
//    questionCount ++;
//   }//每生成一个题目+1
//  }
//  ps.flush();
//  ps.close();
// }
//  操作符栈
    private Stack<String> czf_stack = new Stack<>();        // 存放 运算符的栈
    private  ArrayList<String> ysbds_list = new ArrayList<>();     //存放 原始表达式的 arraylist
    private  ArrayList<String> nblbds_list = new ArrayList<>();      // 存放转换后的 逆波兰式
    private static final int One = 1;      //
    private static final int Two = 3;     //
    private static final int Three = 5;   //规定优先级   Three 最高
     //  定义一个运算栈
     private static Stack<String> ys_stack = new Stack<>();
    
      // 初始化                             使用StringTokenizer分割 字符串
     public Main(String bdString) {
         // TODO Auto-generated constructor stub
        StringTokenizer stringTokenizer = new StringTokenizer(bdString, "+-*÷()",true);
        while(stringTokenizer.hasMoreTokens()){
              ysbds_list.add(stringTokenizer.nextToken());
             //System.out.println(stringTokenizer.nextToken());
         }
    }
    
    
     // 判断 是否是数字
     public boolean isNum(String str){
         if(str.matches("[0-9]+")){    //这里使用正则表达式 验证是否是数字
             //System.out.println("Y");
            return true;
         }else{
             //System.out.println("N");
             return false;
         }
     }
    
     // 判断 是否是操作符
    public boolean isCzf(String str){
        if(str.matches("[\\+\\-\\*\\÷\\(\\)]")){
            //System.out.println("Y");
            return true;
         }else{
             //System.out.println("N");
             return false;
         }
     }
   
     // 获取 优先级
    public int getYxj(String str){
        
         switch(str){
         case "(":return Three;
         case "*":
         case "÷":return Two;
         case "+":
         case "-":return One;
         case ")":return 0;
        
         default : return -1;
         
         }
        
      }
   
     // 判断优先级
      public boolean isYxj(String str1,String str2){
          return getYxj(str1) > getYxj(str2);  
      }
      /**
       *
       * @author 李明阳
       * @title: stack_czf
       * @date 2016年3月28日 上午9:01:12
       * @param czf void
       */
      //   ********* 当 当前操作元素为 操作符时**********    这里是 核心代码, 用于操作符栈的判断
      public void stack_czf(String czf){
        
          //判断当前栈内是否为空
        if(czf_stack.isEmpty()){
             czf_stack.push(czf);
              return;
         }
         
          //判断是否为 (
         if("(".equals(czf)){
             czf_stack.push(czf);
             return;
         }
        
         //判断是否为 )
         if(")".equals(czf)){
            String string = "";
             while(!"(".equals(string = czf_stack.pop())){
                 nblbds_list.add(string);
             }
             return;
        }
         
         //如果 当前栈顶元素是  (  直接入栈
         if("(".equals(czf_stack.peek())){
             czf_stack.push(czf);
             return;
         }
        
         // 判断 与 栈顶元素的优先级 , > 为true
         if(isYxj(czf, czf_stack.peek())){
            czf_stack.push(czf);
             return;
         }
        
         if(!isYxj(czf, czf_stack.peek())){
             nblbds_list.add(czf_stack.pop());
             stack_czf(czf);   //这里调用函数 本身,并将本次的操作数传参
         }
        
     }
     
     // 中缀 —> 后缀
    public void zz_hz(){
        
         // 遍历原始表达式list
         for(String str:ysbds_list){
            
             //System.out.println("->  " + str);
            
             if(isNum(str)){
                 nblbds_list.add(str);
             }else if(isCzf(str)){
                 stack_czf(str);
             }else{
                 System.out.println("非法");
             }
            
         }
        
         // 遍历完原始表达式后  将操作符栈内元素 全部添加至 逆波兰表达式list
 
         while(!czf_stack.isEmpty()){
             //System.out.println("即将 " + czf_stack.peek());
            nblbds_list.add(czf_stack.pop());
         }
        
     }
     
    // 具体计算方法
     public Float jsff(String s1,String s2,String s3){
         float a = Float.parseFloat(s2);
         float b = Float.parseFloat(s1);
         switch(s3){
         case "+":return a+b;
         case "-":return a-b;
         case "*":return a*b;
         case "÷":return a/b;
         default : return (float) 0.0;
        }
     }
  
     //  计算 逆波兰式
     public Float js_nbl(){
         for(String str:nblbds_list){
             if(isNum(str)){
                 ys_stack.push(str);
             }else{
                 ys_stack.push(String.valueOf(jsff(ys_stack.pop(), ys_stack.pop(), str)));
            }
         }
         return Float.parseFloat(ys_stack.pop());  //最后 栈中元素 即为结果
     }
    
 //    public void nbls_bc(){
 //        for(String string:nblbds_list){
 //            nbls_cc += string;
 //        }
 //    }
}
复制代码

三.实验心得

在做的过程中,出现了很多的问题,在逆波兰式的调用过程中接口没有对应,GUi设计也很粗糙,对待学习的任务还是要认真一点,并不是说任务重要,而是要时刻保持做任务的严谨的心态,保持心态是最重要的。

与此同时,通过上网查阅资料和同学的帮助让我顺利的解决了自己的问题,也让我慢慢看到了自己的不足之处还有很多,需要学习和努力的地方还有很多,并不能因为自己会一些基础的编程就骄傲,当真正制作东西的时候这些小问题就会暴露出来,让我手足无措。我会继续完善自己的四则运算,也会让自己的基本功和一些进阶的编程操作更加扎实。相信自己下一次制作出来的东西会更加完美。

转载于:https://www.cnblogs.com/wangshicheng/p/10007627.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/570135.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux部署redis集群遇到的问题

版本信息&#xff1a; redis&#xff1a;5.0.8 linux服务器&#xff1a;CentOS 7 不同版本问题处理方式可能有所不同 1、在java程序中&#xff0c;连接不上redisCluster。 报错信息&#xff1a; no reachable node in cluster 原因&#xff1a;创建集群时&#xff0c;使用了127…

大型数据库

over&#xff08;order by salary&#xff09; 按照salary排序进行累计&#xff0c;order by是个默认的开窗函数 over&#xff08;partition by deptno&#xff09;按照部门分区 如何使用Oracle Round 函数 (四舍五入)描述 : 传回一个数值&#xff0c;该数值是按照指定的小数位…

mysql服务自动关闭的解决

笔记本上设置成合上板子不休眠&#xff0c;于是干脆把笔记本放在书包里面&#xff0c;通过远程桌面连接笔记本电脑&#xff0c;经过了很长的时间&#xff0c;再去连接数据库&#xff0c;结果出现cann’t connect 10061错误&#xff0c;发现原来是MySQL服务不知怎么的就关闭了&a…

thinkPHP 数据库操作和分页类

转载于:https://www.cnblogs.com/finddata/p/10013962.html

RHCE基础环境系统的搭建

RHCE基础环境系统的搭建 安装前提&#xff1a; 安装的时候对系统和硬件的要求&#xff1a; 红帽系统安装队系统的要求&#xff1a;Windows操作系统选择64位的内存至少6GCPU需要支持虚拟化技术在做红帽系统实验的时候&#xff0c;把360类似这样的杀毒或是管家软件退出了&#xf…

Chrome Extension Dark Theme

Chrome Extension & Dark Theme https://chrome.google.com/webstore/detail/eimadpbcbfnmbkopoojfekhnkhdbieeh https://github.com/darkreader/darkreader https://github.com/xyz-data/darkreader 转载于:https://www.cnblogs.com/xgqfrms/p/10017780.html

安装版win7安装时分区

先创建一个主分区&#xff0c;用于安装系统然后按下 ShiftF10 启动命令窗口&#xff0c;输入如下命令输入 diskpart 并回车list disk //显示所有硬盘select disk 0 //选择你的硬盘create partition extended //把剩下的…

mybatis 控制台打印执行的SQL语句

1. Spring boot 集成 mybatis 【转载】SpringBoot中Mybatis打印sql 1.1 如果使用的是application.properties文件&#xff0c;加入如下配置&#xff1a; 1 logging.level.com.example.demo.daodebug 红色部分指的是mybatis对应的方法接口所在的包路径。 1.2 如果使用的是appli…

详细介绍nagios基本配置

配置文件路径/usr/local/nagios/etc/objects类型名 包含文件 作用基类配置文件 templates.cfg 定义基类时间配置文件 timeperiods.cfg 定义控制时间联系人文件 contacts.cfg 定义联系人信息和联系人组监控文件 localhost…

轻知 | 为什么全球只有13组根域名服务器?

欢迎大家前往腾讯云社区&#xff0c;获取更多腾讯海量技术实践干货哦~ 本文由9527发表 根域名服务器是域名解析系统&#xff08;DNS&#xff09;中最为顶级的域名服务器&#xff0c;它们负责管理顶级域的权威域名服务器地址。作为互联网基础设施的重要部分&#xff0c;所有域名…

Openssl更新步骤

openssl下载地址&#xff1a;http://www.openssl.org/source/安装openssl#tar zxvf openssl-0.9.8i.tar.gz#cd openssl-0.9.8i#./config shared zlib #make #make test #make install mv /usr/bin/openssl /usr/bin/openssl.OFF &#xff08;关闭系统自带的&#xff09;mv /us…

HDU 3861 The King’s Problem (强连通缩点+DAG最小路径覆盖)

<题目链接> 题目大意&#xff1a; 一个有向图&#xff0c;让你按规则划分区域&#xff0c;要求划分的区域数最少。 规则如下&#xff1a;1.所有点只能属于一块区域&#xff1b;2&#xff0c;如果两点相互可达&#xff0c;则这两点必然要属于同一区域&#xff1b;3&#x…

nagios常见问题

1.错误“CHECK_NRPE: Received 0 bytes from daemon. Check the remote server logs for error messages.”解决&#xff1a;启用了NRPE的命令行参数功能&#xff0c;不过可能会带来严重的安全问题。$ /usr/local/nagios/etc/nrpe.cfgdont_blame_nrpe12.在Nagios中&#xff0c;…

【Linux 命令】- find 命令

find 是日常工具箱中功能更强大、更灵活的命令行工具之一&#xff0c;因此值得花费更多的时间。 最简单的&#xff0c;find 跟上路径寻找一些东西。例如&#xff1a; find / 它将找到&#xff08;并打印出&#xff09;系统中的每个文件。而且由于一切都是文件&#xff0c;你会得…

CentOS提示另一个目前运行的程序正在访问软件信息

原因是&#xff1a;yum&#xff0d;updatesd服务一起的&#xff0c;这个服务会时不时的访问网络&#xff0c;如果卡住了&#xff0c;同时你又在运行yum&#xff0c;就会总是提示你另一程序在访问软件信息用 rm -f /var/run/yum.pid 杀掉 yum-updatesd 就好了命令如下&#xff1…

一个注解搞定

JsonIgnore 转载于:https://www.cnblogs.com/cnchengv/p/10033524.html

check_http语法和选项

check_http H hostname (or) -I ip-address {optional options} 常用的几个例子 1. 检测http协议 $ check_http -H 192.168.1.50 HTTP OK HTTP/1.1 200 OK - 332 bytes in 0.004 seconds |time0.004144s;;;0.000000 size332B;;;0 2.检测https协议 $ check_http -H 192.168.1.50…

LinkedList源码学习

链表数据结构 当前节点会保存上一个、下一个节点。 参见 LinkedList的Node类   实现&#xff1a;     1. 内部链表的方式。       1.1 添加元素。追加的方式&#xff0c;创建一个新的节点[Node]&#xff0c;用最后一个节点关联新的节点。       1.2 删除元素…

nagios使用check_mysql监控mysql

如果没有check_mysql插件&#xff0c;需要安装Mysql数据库 1、建立专用数据库&#xff1a; [rootsvr3 ~]#mysql -u root -pEnter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 51910 Server version: 5.5.3-m3-log Sou…

python_文件操作代码实例

"""提示&#xff1a;代码中的内容均被注释&#xff0c;请参考&#xff0c;切勿照搬""" 1 #文件的打开和关闭2 3 文件对象 open(文件名,使用方式)4 rt&#xff1a;读取一个txt文件5 wt: 只写打开一个txt文件&#xff0c;&#xff08;如果没有该…