赞
踩
一个简单的计算器功能,我是按照老师的课程设计指导书分步骤来的,所以写的垃圾代码比较多,形成了一座“大屎山”,如果正常写的话,完全可以用最后一步将输入数字以及操作符放在栈中进行操作,当select=3时的代码会有一些帮助,输入格式都是带空格的,这里面也包含了一些其他功能:
1.存储最近计算结果
2.浏览所有计算历史
3.根据id查找结果
4.清空历史记录
5.与最近计算结果进行二次运算(支持(opera n)形式)
6.进行带括号运算(但只支持(n opera n) opera (n opera n)形式)
7.包含很多对于输入格式不正确的异常捕捉
这是我写的第一个略微长一点的java程序,垃圾代码比有用代码多哈哈哈
- package shiyan.Project;
-
- import java.util.ArrayList;
- import java.util.Scanner;
- import java.util.Stack;
-
- class calculator { //计算器类
- String expre; //表达式
- int type=0; //表达式是double型运算还是int型运算,type为0,int;为1,double
- int div0=0; //evaluate中div0>0,则第二个数字为0
- int div1=0; //evalua1中判断除数是否为0
- double recent=0; //最近存储
- public static ArrayList list=new ArrayList<>(); //集合声明,存储列表
- float result=0;
- double firstDouble;
- double secondDouble;
- //构造函数初始化
- public calculator(){} //创建存储列表
- public calculator(String expre){
- this.expre=expre;
- }
- //判断表达式是否合法
- public float evaluate(String expression) {
- //以空格为分界符分割
- String[] str = expression.split(" ");
- //判断str数组长度,不等于3,则error
- if (str.length != 3 ) {
- System.out.println("Invaild input.");
- return Float.MIN_VALUE;
- }
- //判断是浮点型还是整形
- int flag = 0; //标志位,判断是否有小数点,flag=0,则为int
- char[] num1 = str[0].toCharArray(); //第一数字字符串,检查是否有小数点
- for (int i = 0; i < num1.length; i++) {
- if (num1[i] == '.') {
- flag++;
- }
- }
- char[] num2 = str[2].toCharArray(); //第二数字字符串,检查是否有小数点
- for (int i = 0; i < num2.length; i++) {
- if (num2[i] == '.') {
- flag++;
- }
- }
- //判断flag
- if (flag == 0) {
- type = 0;
- } else {
- type = 1;
- }
- //转换为数字
- //将字符串转换成double形式,若错误输入如:9@ + 9等等,会报错,所以采用异常处理
- try{
- firstDouble = Double.parseDouble(str[0]);
- secondDouble = Double.parseDouble(str[2]);
- }
- catch(Exception ex){ //若转换出现异常,则报错
- System.out.println("Invaild input.");
- return Float.MIN_VALUE;//若不合法,则输出MIN_VALUE
- }
- if (secondDouble == 0) {
- div0++; //判断第二个数字是否为0
- }
- //判断运算符是否有效 and 计算结果,暂时都是double型
- switch (str[1]) {
- case "+": {
- result = (float) (firstDouble + secondDouble);
- break;
- }
- case "-": {
- result = (float) (firstDouble - secondDouble);
- break;
- }
- case "*": {
- result = (float) (firstDouble * secondDouble);
- break;
- }
- case "/": {
- if (div0 != 0) { //判断第二个数字是否为0
- System.out.println("Invaild input.");
- return Float.MIN_VALUE;//若不合法,则输出MIN_VALUE
- } else {
- result = (float) (firstDouble / secondDouble);
- break;
- }
- }
- default:{System.out.println("Invaild input.");
- return Float.MIN_VALUE;//若不合法,则输出MIN_VALUE
- }
- }
- return 1;
- }
- //返回运行结果
- public float getCurrentValue(){
- if (type==0){ //int型输出
- int FianlResult=(int)(result);
- System.out.println("运算结果为"+FianlResult);
- return FianlResult;
- }
- else{ //double型输出
- System.out.println("运算结果为"+result);
- return (float)(result);
- }
- }
- //设置最近存储结果
- public void setMemoryValue(float memval){
- recent=memval;
- list.add(recent);
- //System.out.println("历史记录为"+list);
- }
- //清空列表
- public void clearMemory(){
- list.clear();
- }
- //获取全部存储结果
- public float getMemoryValue(){
- for (int i=0;i<list.size();i++){
- System.out.print(list.get(i));
- System.out.print(" ");
- }
- return 0;
- }
- //获得某个存储结果
- public float getHistoryValue(int index){
- try{ //可能出现数组越界,有异常捕捉
- System.out.println(list.get(index));
- }catch(Exception ex){
- System.out.println("数组越界,输入错误");
- }
- return 0;
- }
- //再次计算
- public float evaluate1(String expression1,float m){
- String[] str1=expression1.split(" ");
- if (str1.length != 2) {
- System.out.println(expression1);
- System.out.println("Invaild input.");
- return Float.MIN_VALUE;
- }
- //判断是浮点型还是整形
- int flag = 0; //标志位,判断是否有小数点,flag=0,则为int
- char[] num1 = str1[1].toCharArray();
- for (int i = 0; i < num1.length; i++) {
- if (num1[i] == '.') {
- flag++;
- }
- }
- //判断flag
- if (flag == 0) {
- type = 0;
- } else {
- type = 1;
- }
- try {
- firstDouble = Double.parseDouble(str1[1]);
- }
- catch(Exception ex){ //若转换出现异常,则报错
- System.out.println("Invaild input.");
- return Float.MIN_VALUE;//若不合法,则输出MIN_VALUE
- }
- if (firstDouble == 0) {
- div1++; //判断第二个数字是否为0
- }
- //判断运算符是否有效 and 计算结果,暂时都是double型
- switch (str1[0]) {
- case "+": {
- result = (float) (firstDouble + m);
- break;
- }
- case "-": {
- result = (float) (m-firstDouble );
- break;
- }
- case "*": {
- result = (float) (firstDouble * m);
- break;
- }
- case "/": {
- if (div1 != 0) { //判断第二个数字是否为0
- System.out.println("Invaild input.");
- return Float.MIN_VALUE;//若不合法,则输出MIN_VALUE
- } else {
- result = (float) (m/firstDouble);
- break;
- }
- }
- default:{System.out.println("Invaild input.");
- return Float.MIN_VALUE;//若不合法,则输出MIN_VALUE
- }
- }
- return result;
- }
- //带括号计算
- public float evaluate2(String expression){
- //以空格为分界符分割
- String[] str = expression.split(" ");
- //判断str数组长度,不等于7,则error
- //System.out.println(str.length);
- if (str.length != 7 ) {
- System.out.println("Invaild input1.");
- return Float.MIN_VALUE;
- }
- //处理括号
- str[0]= str[0].substring(1);
- str[2]=str[2].substring(0,str[2].length()-1);
- String opera=str[3];
- str[4]= str[4].substring(1);
- str[6]=str[6].substring(0,str[6].length()-1);
- //转换为数字
- //将字符串转换成double形式,若错误输入如:9@ + 9等等,会报错,所以采用异常处理
- try{
- firstDouble = Double.parseDouble(str[0]);
- secondDouble = Double.parseDouble(str[2]);
- }
- catch(Exception ex){ //若转换出现异常,则报错
- System.out.println("Invaild input2.");
- return Float.MIN_VALUE;//若不合法,则输出MIN_VALUE
- }
- //System.out.println(str[1]);
- //判断运算符是否有效 and 计算结果,暂时都是double型
- switch (str[1]) {
- case "+": {
- result = (float) (firstDouble + secondDouble);
- break;
- }
- case "-": {
- result = (float) (firstDouble - secondDouble);
- break;
- }
- case "*": {
- result = (float) (firstDouble * secondDouble);
- break;
- }
- case "/": {
- if (div0 != 0) { //判断第二个数字是否为0
- System.out.println("Invaild input3.");
- return Float.MIN_VALUE;//若不合法,则输出MIN_VALUE
- } else {
- result = (float) (firstDouble / secondDouble);
- break;
- }
- }
- default:{System.out.println("Invaild input5.");
- return Float.MIN_VALUE;//若不合法,则输出MIN_VALUE
- }
- }
- float r1=result;
- //处理第二个表达式
- try{
- firstDouble = Double.parseDouble(str[4]);
- secondDouble = Double.parseDouble(str[6]);
- }
- catch(Exception ex){ //若转换出现异常,则报错
- System.out.println("Invaild input2.");
- return Float.MIN_VALUE;//若不合法,则输出MIN_VALUE
- }
- //判断运算符是否有效 and 计算结果,暂时都是double型
- switch (str[5]) {
- case "+": {
- result = (float) (firstDouble + secondDouble);
- break;
- }
- case "-": {
- result = (float) (firstDouble - secondDouble);
- break;
- }
- case "*": {
- result = (float) (firstDouble * secondDouble);
- break;
- }
- case "/": {
- if (div0 != 0) { //判断第二个数字是否为0
- System.out.println("Invaild input3.");
- return Float.MIN_VALUE;//若不合法,则输出MIN_VALUE
- } else {
- result = (float) (firstDouble / secondDouble);
- break;
- }
- }
- default:{System.out.println("Invaild input4.");
- return Float.MIN_VALUE;//若不合法,则输出MIN_VALUE
- }
- }
- float r2=result;
-
- switch (opera) {
- case "+": {
- result = r1 + r2;
- break;
- }
- case "-": {
- result = r1 - r2;
- break;
- }
- case "*": {
- result = r1 * r2;
- break;
- }
- case "/": {
- if (div0 != 0) { //判断第二个数字是否为0
- System.out.println("Invaild input3.");
- return Float.MIN_VALUE;//若不合法,则输出MIN_VALUE
- } else {
- result = r1 / r2;
- break;
- }
- }
- default:{System.out.println("Invaild input5.");
- return Float.MIN_VALUE;//若不合法,则输出MIN_VALUE
- }
- }
- System.out.println("运算结果为:"+result);
- return result;
- }
- }
-
- public class Homework {
- //main 函数
- public static void main(String[] args) {
- Stack s1=new Stack<>();//运算栈
- Stack s2=new Stack<>();//中间结果栈
- Stack s3=new Stack<>();
- calculator c=new calculator();//存储对象,用来存储计算记录
- float m=0; //存储最近一次计算结果
- while (true){
- System.out.println();
- System.out.println("输入表达式:");
- Scanner input=new Scanner(System.in);
- String expression= input.nextLine(); //输入带空格表达式
- System.out.println("选择模式:(1-不带括号的简单运算,2-带括号的多值运算,3-不带括号的多值运算)");
- int select=input.nextInt();
- if (select==2){
- calculator d=new calculator(expression);
- m=d.evaluate2(expression);
- }
- else if (select==1){
- calculator d=new calculator(expression);
- double Isok=d.evaluate(expression); //判断是否有效
- if (Isok==1) { //有效继续
- m=d.getCurrentValue(); //返回计算结果
- }
- }
- else if (select==3){
- String[] opera=expression.split(" ");
- //System.out.println(opera.length);
- for (int i=0;i< opera.length;i++){
- if (i%2==0){
- try{
- float temp=Float.parseFloat(opera[i]);
- s2.push(temp);
- }catch(Exception ex){
- System.out.println("Input Illegelly");
- }
- }
- else{
- if (s1.isEmpty()){
- s1.push(opera[i]);
- }
- else if ((opera[i].equals("*") || opera[i].equals("/")&&(s1.peek().equals("+")||s1.peek().equals("-")))){
- s1.push(opera[i]);
-
- }
- else{
- s2.push(s1.pop());
- i--;
- }
- }
- }
- while (!s1.isEmpty()){
- s2.push(s1.pop());
- }
- while(!s2.isEmpty()){
- s1.push(s2.pop());
- }
- while (!s1.isEmpty()){
- String op="";
- float result=0;
- try{
- op=s1.pop().toString();
- float temp=Float.parseFloat(op);
- s3.push(temp);
- }catch(Exception exception){
- float op1= Float.parseFloat(s3.pop().toString());
- float op2= Float.parseFloat(s3.pop().toString());
- switch (op){
- case "+":{result=op2+op1;break;}
- case "-":{result=op2-op1;break;}
- case "*":{result=op1*op2;break;}
- case "/":{result=op2/op1;break;}
- }
- s3.push(result);
- }
- }
- m=(float)(s3.pop());
- System.out.println(m);
- }
- System.out.println("解下来的操作(m-存储、c-清空、mr-历史结果、h-查找、over-结束任务):");
- Scanner next=new Scanner(System.in);
- String key=next.next(); //输入接下来的操作
- switch (key){
- case "m":{c.setMemoryValue(m); //存储并且选择实现第二次运算
- System.out.println("接下来的操作(i-输入表达式、n-取消):");
- String n= input.next();
- switch (n){
- case "n":{continue;} //不进行运算
- case "i":{ //进行运算并输入表达式
- System.out.println("上一次运算结果为"+m);
- System.out.println("输入表达式(operator[space]operand):");
- Scanner input1=new Scanner(System.in);
- String expression1=input1.nextLine();
- float k =c.evaluate1(expression1,m); //返回结果
- if (k!=Float.MIN_VALUE){
- System.out.println("运算结果为"+k);
- }
- break;}
- }
- break;}
- case "c":{c.clearMemory();break;} //清空
- case "mr":{c.getMemoryValue();break;}
- case "h":{
- System.out.println("选择你想要查找的id:");
- int id=next.nextInt(); //输入想要查找的id
- c.getHistoryValue(id);break;}
- case "over":{return;}
- default:{System.out.println("Invaild input.");}
- }
- }}}

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。