求大神指教!!!
在進行Java學習時要寫一個實作計算器功能的代碼,由于沒有學習到可視化so…
計算器代碼1.0
import java.util.Scanner;
import java.util.concurrent.atomic.AtomicInteger;
public class Mathwork {
public static void main(String[] args) {
System.out.println("請進行您的運算:(以數字、運算子之間以空格隔開)");
Scanner sc=new Scanner(System.in);//鍵入第一個引數
String s=sc.next();//將第一個引數賦予s
double s1=Double.valueOf(s);//進行字串轉化為double
Scanner ac=new Scanner(System.in);//鍵入第二個引數
String a=sc.next();//將引數輸入字串a
Scanner bc=new Scanner(System.in);//鍵入第三個引數
String b=sc.next();//將引數賦值字串b
double b1=Double.valueOf(b);//字串轉化為double
sc.close();//結束輸入
switch (a){
case "+":
System.out.println(add(s1,b1));//若第二個引數為+則回傳s1+b1
break;
case "-":
System.out.println(sub(s1,b1));//若第二個引數為-則回傳s1-b1
break;
case "*":
System.out.println(mul(s1,b1));
break;
case "/":
System.out.println(div(s1,b1));
break;
default:
System.out.println("您輸入的運算子不合法!");
}
}
public static double add(double a,double b){
return a+b;
}
public static double sub(double a,double b){
return a-b;
}
public static double mul(double a,double b){
return a*b;
}
public static double div(double a,double b){
return a/b;
}
}
實作了一個兩個資料之間的運算,還必須在每次輸入后以空格或回車結尾,所以進行了改進,
計算器代碼2.0
import java.util.Scanner;
public class Mathwork2 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String str=sc.nextLine();
for (int i = 0; i < str.length(); i++) {
char chr=str.charAt(i);//回圈提取字串中的字符
if('+'==chr){//判斷如果為+則進行
double a=Double.valueOf(str.substring(0,str.indexOf("+")));
//將字串中從頭到運算子的字符變成double賦值給a
double b=Double.valueOf(str.substring(str.indexOf("+")+1,str.length()));
//將字串中從運算子到結束的字串double并賦值給b
System.out.println(add(a,b));
} else if('-'==chr){
double a=Double.valueOf(str.substring(0,str.indexOf("-")));
// String b= str.substring(str.indexOf("-")+1,str.length());
// String b= str.substring(str.indexOf("-")+1),;
double b=Double.valueOf(str.substring(str.indexOf("-")+1,str.length()));
System.out.println(sub(a,b));
}else if ('*'==chr){
double a=Double.valueOf(str.substring(0,str.indexOf("*")));
// String b= str.substring(str.indexOf("*")+1,str.length());
// String b= str.substring(str.indexOf("*")+1),;
double b=Double.valueOf(str.substring(str.indexOf("*")+1,str.length()));
System.out.println(mul(a,b));
}else if ('/'==chr){
double a=Double.valueOf(str.substring(0,str.indexOf("/")));
// String b= str.substring(str.indexOf("/")+1,str.length());
// String b= str.substring(str.indexOf("/")+1),;
double b=Double.valueOf(str.substring(str.indexOf("/")+1,str.length()));
System.out.println(div(a,b));
}
}
}
public static double add(double a,double b){
return a+b;
}
public static double sub(double a,double b){
return a-b;
}
public static double mul(double a,double b){
return a*b;
}
public static double div(double a,double b){
return a/b;
}
}
實作了兩個資料之間的加減乘除運算,但是還是不能進行多個資料間的操作,所以進行了改進,
計算機代碼3.0
在3.0 中發現了一處bug無法改正,如果有大佬的話希望能提出些修改意見,下面是我的思路:
1.對鍵入的字串進行挨個字符的提取(str.charAt(i)),
2.對該字符是否為運算子做判別,若為運算子,則count+1,并且將該運算子的位置賦值給陣列arr[],
3.創建一個陣列int b[]=new b[count+1],陣列長度為運算子個數加一,for (i=0;i<count ;count++),分別將第一個運算子位置前的字符、第一個到第二個運算子間的…一直到最后一個運算子到整個字串長度的字串分別放入陣列b中;
4.從第一個運算子一直往后回圈運算(運算后將值先放入一個臨時變數中進行下一次的運算子運算)
import java.util.Scanner;
public class Mathwork3 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
// String sc1=sc.nextLine();
String sc1="9*9*9*9*";
int count=0;
int place=0;
int[] arr= new int[100];
arr[0]=0;
for (int i = 0; i < sc1.length(); i++) {
char chr=sc1.charAt(i);
if(chr=='*'||chr=='+'||chr=='-'||chr=='/'){
if (count==0){
count=1;
}
arr[count]=sc1.indexOf(chr,arr[count-1]+1);
count++;
}else {
continue;
}
}System.out.println(count);
for (int i = 0; i < count; i++) {
System.out.println("第"+(i+1)+"個位置是"+arr[i]);
}
}
public static double add(double a,double b){
return a+b;
}
public static double sub(double a,double b){
return a-b;
}
public static double mul(double a,double b){
return a*b;
}
public static double div(double a,double b){
return a/b;
}
}
但進行到提取運算子位置的時候,就不行了,一旦前一個運算子與一個運算子相同的話,就一直會輸出前一個運算子的位置,因為indexof提取從一開始到當前第一個的位置,所以我將第一個運算子位置加入indexof代碼中,表示在第一個運算子的后面出現的第一個運算子的位置,記錄到陣列的下一個元素中,結果輸出時還是一直是第一個運算子位置,為什么啊,求大神指教,,,,,,
Thanks vary much…
更新代碼(10/19)
import java.util.Scanner;
public class Mathwork3 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String sc1 = sc.nextLine();
int count = 0;
int[] arr = new int[100];
arr[0] = 0;
int place1 = 0;
loop:
for (int i = 0; i < sc1.length(); i++) {
char chr = sc1.charAt(i);
if (chr == '1' || chr == '2' || chr == '3' || chr == '4' || chr == '5' || chr == '6' || chr == '7' || chr == '8' || chr == '9' || chr == '0' || chr == '+' || chr == '-' || chr == '*' || chr == '/') {
if (chr == '*' || chr == '+' || chr == '-' || chr == '/') {
arr[count] = sc1.indexOf(chr, place1 + 1);
place1 = arr[count];
count++;
}
} else {
System.out.println("輸入非法字符!");
break loop;
}
}
double[] brr = new double[count + 1];
double[] crr = new double[count];
brr[0] = Double.valueOf(sc1.substring(0, arr[0]));
for (int i = 1; i < count; i++) {
brr[i] = Double.valueOf(sc1.substring((arr[i])+1, arr[i+1])+1);
}
brr[count + 1] = Double.valueOf(sc1.substring((arr[count])+1 , sc1.length()+1));
if (count == 1) {
if (sc1.indexOf(arr[0])=='+'){
crr[0]=add(brr[0],brr[1]);
}
if (sc1.indexOf(arr[0])=='-'){
crr[0]=sub(brr[0],brr[1]);
}
if (sc1.indexOf(arr[0])=='*'){
crr[0]=mul(brr[0],brr[1]);
}
if (sc1.indexOf(arr[0])=='/'){
crr[0]=div(brr[0],brr[1]);
}
}else
for (int i = 1; i < count; i++) {
if (sc1.indexOf(arr[i])=='+'){
brr[i]=crr[i-1];
crr[i]=add(brr[i],brr[i+1]);
}
if (sc1.indexOf(arr[i])=='-'){
brr[i]=crr[i-1];
crr[i]=sub(brr[i],brr[i+1]);
}
if (sc1.indexOf(arr[i])=='*'){
brr[i]=crr[i-1];
crr[i]=mul(brr[i],brr[i+1]);
}
if (sc1.indexOf(arr[i])=='/'){
brr[i]=crr[i-1];
crr[i]=div(brr[i],brr[i+1]);
}
}
System.out.println(crr[count]);
}
public static double add(double a,double b){
return a+b;
}
public static double sub(double a,double b){
return a-b;
}
public static double mul(double a,double b){
return a*b;
}
public static double div(double a,double b){
return a/b;
}
}
new problem:
8*8*8
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: begin 4, end 0, length 5
at java.base/java.lang.String.checkBoundsBeginEnd(String.java:3734)
at java.base/java.lang.String.substring(String.java:1903)
at Mathwork3.main(Mathwork3.java:30)
Process finished with exit code 1
記錄一下,,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/182053.html
標籤:其他
下一篇:不必過萬建網站
