Java新手写的一个计算器程序

最近刚学完Java的循环,结合上学期学习的C语言稍微练习了一下,希望各位大佬对我的程序做出评点!感激不尽!

import sun.management.snmp.jvmmib.JVM_MANAGEMENT_MIBOidTable;

import java.util.Arrays;
import java.util.Scanner;

public class 计算器程序 {
    public static void main(String[] args) {
        float numb = 0;//输入数字以准备计算
        char relation = 0;//输入符号

        String[] input;
        input = new String[100];//用于记录用户输入的所有信息

        int i, j, k;//循环变量
        int temp;
        double temp1, temp2, temp5 = 0, temp6 = 0,temp8=0;
        int length;
        int zerocount = 0;
        char temp3 = 'a';
        int check = 0;
        Scanner scanner = new Scanner(System.in);


        while (true) {
            System.out.print("请输入:");

            for (i = 1; i <= i + 1; i++) {

                if ((i - 1) % 2 == 0) {
                    numb = scanner.nextFloat();
                    input[i] = "" + numb;
                } else {
                    relation = scanner.next().charAt(0);
                    input[i] = "" + relation;
                }

                if (relation == '=') {
                    break;
                }
            }

            temp = i;//temp用于储存之前i的值,i下一次会改变

            //总思路:通过检测偶数位
            //第一段代码思路(算法1),优先判断乘除
            //如果是乘除,就将前一项和后一项相乘,赋值给后一项,并将本项和前一项赋值为0(前一项i-1,本项i,后一项i+1)
            //使用遍历数组判断符号位是否为0,是就清除本项和前一项的数组元素
            for (i = 1; i <= temp; i++) {
                //犯下的错误1: 内部的值temp经过相乘后成为了条件终止值
                //如果temp>=5后,由于循环值超过输入的字符串数(刚刚开始输入字符串只是a*b= 四个值,超过了四个后就会报错),
                //因此会出现之前值超到达5就报错的情况
                if (i % 2 == 0) {
                    temp3 = input[i].charAt(0);
                    //字符串转字符型公式: 字符变量=字符串变量,charAt(0);
                    if (temp3 == '*') {
                        temp1 = Double.parseDouble(input[i - 1]);
                        //字符串转整型公式:整型字符=Interger.parseInt(字符串);
                        //浮点型 浮点型= Double.parseDouble(字符串);
                        temp2 = Double.parseDouble(input[i + 1]);
                        temp5 = temp1 * temp2;

                    } else if (temp3 == '/') {
                        temp1 = Double.parseDouble(input[i - 1]);
                        temp2 = Double.parseDouble(input[i + 1]);
                        temp5 = temp1 / temp2;
                    } else if (temp3 == '+' || temp3 == '-') continue;
                    input[i + 1] = "" + temp5;

                    if (temp3 == '=') break;

                    input[i] = "0";

                    input[i - 1] = "0";
                }
            }

            temp = i;

            for (i = 1; i <= temp; i++) {
                if (i % 2 == 0) {
                    if (input[i] == "0" && input[i - 1] == "0")
                        zerocount = zerocount + 1;
                }
            }

            //check
            check = temp;
            System.out.print("check1: ");
            for (i = 1; i <= check; i++) {
                System.out.print(input[i] + " ");
            }
            System.out.println();


            //以下删除第i个和第i-1个元素
            //想法是 把第i+1个赋给第i个,在将i+1个缩掉
            //以此实现删除
            String[] tempArray;
            tempArray = new String[input.length - 2 * zerocount];
            for (j = 1, k = 1; j <= i; j++) {

                if (input[j] == "=") break;
                else if (input[j] != "0") {
                    tempArray[k] = input[j];
                    k = k + 1;
                }//if才k++

            }
            input = tempArray;

            //check乘除
            check = i;
            System.out.print("check2: ");
            for (i = 1; i <= check; i++) {
                System.out.print(input[i] + " ");
            }
            System.out.println();
            System.out.println("check2.temp5=" + temp5);



            //第二段思路:检测完乘除,检测加减法
            //和上面相似的思路,但没有后面的加0删0法,直接将结果赋给后一项,线性计算并输出
            for (i = 1; i <= temp - 3; i++) {

                if (i % 2 == 0) {
                    temp3 = input[i].charAt(0);
                    if (temp3 == '+') {
                        temp1 = Double.parseDouble(input[i - 1]);
                        temp2 = Double.parseDouble(input[i + 1]);
                        temp5 = temp1 + temp2;
                    } else if (temp3 == '-') {
                        temp1 = Double.parseDouble(input[i - 1]);
                        temp2 = Double.parseDouble(input[i + 1]);
                        temp5 = temp1 - temp2;
                    }
                    input[i + 1] = "" + temp5;
                }
            }

            //check乘除
            check = i;
            System.out.print("check3: ");
            for (i = 1; i <= check; i++) {
                System.out.print(input[i] + " ");
            }
            System.out.println();
            System.out.println("check3.temp5=" + temp5);

        }
    }
}

运行结果:

正确可运行:

请输入:777 - 123 * 321 / 89 =
check1: 777.0 - 0 0 0 0 443.6292134831461 = 
check2: 777.0 - 443.6292134831461 = 443.6292134831461 null null null null 
check2.temp5=443.6292134831461
check3: 777.0 - 333.3707865168539 = 333.3707865168539 null 
check3.temp5=333.3707865168539

报错:(本人不才,不知道其中的原因)

请输入:888 - 652 * 89 / 72 - 100 * 7 =
check1: 888.0 - 0 0 0 0 805.9444444444445 - 0 0 700.0 = 
check2: 888.0 - 805.9444444444445 - 700.0 = 700.0 null null null null null null 
check2.temp5=700.0
Exception in thread "main" java.lang.NullPointerException
	at 计算器程序.main(计算器程序.java:127)

P.S check3.temp5是运行结果

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值