最近刚学完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是运行结果