四则运算 结对项目

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,一经查实,立即删除!

相关文章

大型数据库

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

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

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…

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

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

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…

CentOs如何挂载硬盘

远程SSH登录上Centos服务器后&#xff0c;进行如下操作提醒&#xff1a;挂载操作会清空数据&#xff0c;请确认挂载盘无数据或者未使用第一步&#xff1a;列出所有磁盘 命令&#xff1a; ll /dev/disk/by-path 提示&#xff1a;如果无法确认数据盘设备名称&#xff0c;请使…

挂载

df -Th 查看磁盘挂载情况 ls /dev/sdx* fdisk -l 查看分区情况 fdisk /dev/sdb 分区mnpw uuid:设备的唯一号 blkidUUID"0a59654a-6f2c-4bc1-bbaf-df844e60e2e3" UUID"fe8c9dd4-571c-40a4-837a-a4ab6e4ae7e转载于:https://www.cnblogs.com/finddata/p/10041496.h…

AWS EC2实例Ubuntu系统设置root用户密码并使用root/ubuntu用户登录

参考链接&#xff1a;http://www.wangchao.info/1137.html 注意&#xff1a;链接中写的简化了&#xff0c;其中重启服务的命令似乎不太适用&#xff0c;可能是不通用&#xff0c;我下面描述的方式亲测可行&#xff0c;如有其他疑问请留言&#xff1b; https://blog.csdn.net/p…

坑题

题目描述 小姐姐想要配 n 把钥匙&#xff0c;她走过开锁铺问老板价钱&#xff0c;老板是这么说的&#xff1a; 小姐姐想知道完成配n把钥匙的任务最少需要花费多少钱 输入描述: 题目有多组测试数据。第一行输入一个整数T&#xff08;组数少于100组&#xff09;&#xff0c;表示测…

最简单的nginx教程 - 如何把一个web应用部署到nginx上

Nginx (engine x) 是一个高性能的HTTP和反向代理服务&#xff0c;也是一个IMAP/POP3/SMTP服务。Nginx是由伊戈尔赛索耶夫为俄罗斯访问量第二的Rambler.ru站点&#xff08;俄文&#xff1a;Рамблер&#xff09;开发的&#xff0c;第一个公开版本0.1.0发布于2004年10月4日…

Median(二分+二分)

Median http://poj.org/problem?id3579 Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 11225 Accepted: 4016Description Given N numbers, X1, X2, ... , XN, let us calculate the difference of every pair of numbers: ∣Xi - Xj∣ (1 ≤ i &#xff1c; j …

Judy alpha 第七天

SCRUM 今天 debugger 部分由 Yu Xing 继续完成断点功能&#xff0c;由 Zhiqi Lin 开始实现查看变量功能。项目整体打包测试仍有困难&#xff0c;VS Code extension 的文档质量不佳&#xff0c;大家感到难以调试。成员昨日进展今日任务Zibo Wang协助打包、追踪开发进度协助打包、…

Phaser3让超级玛丽实现轻跳、高跳及加上对应的跳跃声音

mario jumper在线测试地址&#xff1a;http://www.ifiero.com/uploads/phaserjs3/jumper/ 空格键&#xff1a;轻按&#xff1a;跳低 &#xff0c;长按&#xff1a;跳高键盘&#xff1a;--> 向右 , <-- 向左 请确保已打开电脑的音乐开关 var config {type: Phaser.AUTO,w…

Mysql partition by

一&#xff0c;看原表 select * from user; 二&#xff0c;查询同组年级最大的 select username ,SUBSTRING_INDEX( GROUP_CONCAT(age order by age desc) ,,,1) uuid from ( select uuid ,username ,password ,age from user )b GROUP BY uuid asc; 转载于:https://www.cn…

Mysql导入大容量SQL文件数据问题

mysql在通过导入sql文件可能会出现下面二个问题:1.如果sql文件过大,会出现"MySQL server has gone away"问题;2.如果sql文件数据有中文,会出现乱码 解决问题:问题1:出现MySQL server has gone away"问题,是因为mysql默认的"max_allowed_packet"变量…

鼠标滑过抖动图标

在线演示 本地下载 转载于:https://www.cnblogs.com/qixidi/p/10079608.html

每日站立会议 12.06

每日站立会议 今天我们开始了对button按钮中素菜部分代码的编写&#xff0c;我负责编写时代码的复审。转载于:https://www.cnblogs.com/grrd17s/p/10079973.html

Spring的两种代理方式:JDK动态代理和CGLIB动态代理

代理模式 代理模式的英文叫做Proxy或Surrogate&#xff0c;中文都可译为”代理“&#xff0c;所谓代理&#xff0c;就是一个人或者一个机构代表另一个人或者另一个机构采取行动。在一些情况下&#xff0c;一个客户不想或者不能够直接引用一个对象&#xff0c;而代理对象可以在客…