java计算器(第一版)(初学者)

来源:互联网 发布:黄金策略软件 编辑:程序博客网 时间:2024/06/15 13:45

学C++也快一年了,但这大一一年几乎是水过来的。学了C++却不知道去干些啥,因为难,更重要的是不像java那样网上视频教程多。。所以当时对于编程的兴趣不大。。有些人会说基础很重要,c++难,学它好。但殊不知有时候太难的东西容易让人失去兴趣。

经过这一年,感觉自己就是深受"基础重要论”的影响。。学习是慢慢深入的过程,一来就被打蒙了,就学不下去了。。经常听到很多人到处宣扬“”语言不是核心算法操作系统才是王道“。。虽然说这些话一点都没错,很对。但这些都是大牛们说出来的。对于像我这样的入门级别的人来说,掌握一门语言应该摆在第一位。

鉴于以上经历,暑假开始看java,虽然不确定以后做不做java的相关工作,但我认为java不失为一门好的入门语言。应用层有j2ee和Android在那摆着。不像C/C++那样,想做点实际的东西都很难。天天对着黑框框练习,我相信对于初学者不疯掉都难。

昨天刚刚把java大概上给看完的,是看的李兴华老师《java开发实战经典视频教程》 我很喜欢李兴华老师讲课的风格,速度超快。一点都不浪费时间。不像很多培训视频都讲的很慢,听着累。然后自己买了本《java编程思想》结合着视频一起看。但是该书只看了200页,就没怎么看了,因为知识太多了,记得头都快炸了,以后当工具书查吧。所以后面都是直接看视频的。。

昨天晚上12点多刚刚把java类集看完,就迫不及待的想写出个计算器来,(急性子没办法)。。然后写到凌晨3点才把加减乘除的功能实现了,想着一会儿也不能把括号功能给实现,所以就睡了。早上磨叽到11点多开始添加识别括号功能。写了两三个小时终于一个粗糙的计算器写出来了。

在这个过程中主要遇到的难点有

1》removeRange()方法的调用,本来想用它来删除ArrayList中的内容,看文档知道它是个Protected方法,必须先继承ArrayList类,但是继承之后还是弄不了。

所以就没使用它,而是换成循环删除的方法。

2》循环删除List中的内容时,直接使用for中的i值来删除指定位置的元素,但是i值是一值增加的,而List要删除的元素位置是不变的,所以每次删除元素的位置应该是一致的

不多说了,上程序:

import java.util.* ;public class Calculator{public static void main(String args[]) throws Exception{String str = args[0] ;char[] charAll = str.toCharArray() ;List<Character> listAll = new ArrayList<Character>() ;         //存储所有数据List<Character> listBracket = new ArrayList<Character>() ;     //存储括号List<Character> listTemp1 = new ArrayList<Character>() ;        //存储括号内的算式List<Character> listTemp2 = new ArrayList<Character>() ;        //存储带左括号的算式,得出括号内结果后需要替换的内容for(int i=0;i<charAll.length;i++){listAll.add(charAll[i]) ;                                     //存储所有数据到listAll中           char[]类型转为ArrayList类型}int tempFir = 0 ;int tempSec = 0 ;int tempThr = 0 ;int tempFif = 0 ;for(int i=0;i<charAll.length;i++){if(charAll[i]=='('||charAll[i]==')'){tempFir++ ;                                     //得到左右括号总数}}boolean bool = true ; int tempnum = tempFir/2 ;while(tempnum!=-1){int tempFor = 0 ;if(tempnum!=0&&listAll.size()!=1){for(int i=0;i<listAll.size();i++){if(listAll.get(i)=='('){tempSec++ ;tempThr = i ;                                   //得到中间的左括号位置}}for(int i=tempThr;i<listAll.size();i++){if(listAll.get(i)==')'&&tempFor==0){tempFor++ ;tempFif = i ;                                   //得到对应的右号位置}}listTemp1 = (List<Character>)listAll.subList(tempThr+1,tempFif) ;        //存储括号内的算式,不带括号listTemp2 = (List<Character>)listAll.subList(tempThr,tempFif+1) ;       //存储带左括号的算式,以便替换String strTemp1 = new Operator(listTemp1).toString() ;for(int i=tempThr;i<=tempFif;i++){listAll.remove(tempThr) ;}listAll.addAll(tempThr,changeString(strTemp1)) ;tempnum-- ;}else{String strTemp2 = new Operator(listAll).toString() ;System.out.print(strTemp2) ;tempnum = -1 ;}}}//String类型转为Listpublic static List<Character> changeString(String str){List<Character> listTem = new ArrayList<Character>() ;char[] cha = str.toCharArray() ;for(int i=0;i<cha.length;i++){listTem.add(cha[i]) ;                                     }return listTem ;}}//计算单个括号内的算式的类class Operator{private String pass = null ;public Operator(List<Character> lis){this.Calculate(lis) ;}public  String Calculate(List<Character> lis){List<Character> lis1 = new ArrayList<Character>() ;       //存储符号的List<String> lis2 = new ArrayList<String>() ;             //存储数字的StringList<Character> lis3 = new ArrayList<Character>() ;             //存储括号int temp1 = 0 ;int temp2 = 0 ; int temp3 = 0 ;int temp4 = 0 ;int temp5 = 0 ;for(int i=0;i<lis.size();i++){//存储符号到了lis1中if(lis.get(i)=='+'||lis.get(i)=='-'||lis.get(i)=='*'||lis.get(i)=='/'){lis1.add(lis.get(i)) ;temp2 = i ;temp3++ ;}/********************开始存储数字************************/if((temp3==1)&&(!(temp1==temp2))){Character[] character = lis.subList(temp1,temp2).toArray(new Character[]{}) ;String strList = new String(change(character)) ;lis2.add(strList) ;}else if(!(temp1==temp2)){Character[] character = lis.subList(temp1+1,temp2).toArray(new Character[]{}) ;String strList = new String(change(character)) ;lis2.add(strList) ;                                       }temp1=temp2 ;}Character[] character = lis.subList(temp1+1,lis.size()).toArray(new Character[]{}) ;String strList = new String(change(character)) ;lis2.add(strList) ;                                                 /*********************结束存储数字************************//*********************开始计算乘除法**********************/for(int x=0;x<lis1.size();x++){if(lis1.get(x)=='*'||lis1.get(x)=='/'){double left = Double.parseDouble(lis2.get(x-temp4)) ;double right = Double.parseDouble(lis2.get(x+1-temp4)) ;double result ;if(lis1.get(x)=='*'){lis1.remove(x-temp4) ;result = left * right ;}else{lis1.remove(x-temp4) ;result = left / right ;}lis2.set(x-temp4,""+result) ;lis2.remove(x+1-temp4) ;temp4++ ;                                                  //X值在增加,而lis2长度在减小,所以remove和set对应的位置不对;利用temp4调整}}/*********************乘除法结束**********************///开始加减法double end ;for(int x=0;x<lis1.size();x++){double left = Double.parseDouble(lis2.get(x-temp5)) ;double right = Double.parseDouble(lis2.get(x+1-temp5)) ;if(lis1.get(x)=='+'){end = left + right ;}else{end =left + right ;}lis2.set(x-temp5,""+end) ;lis2.remove(x+1-temp5) ;temp5++ ;}this.pass = lis2.get(0) ;return lis2.get(0) ;}public static char[] change(Character[] character){char[] charch = new char[character.length] ;for(int k=0;k<character.length;k++){charch[k] = character[k] ;}return charch ;}public String toString(){return this.pass ;}}

因为还没有看过数据结构与算法,所以写的程序很烂。。但接下来我也准备开始看看《数据结构与算法java描述》这本书了。。顺便看看android开发的一些书。

这个计算器我准备过段时间更新一次。等对数据结构算法之内的熟悉了点之后,相信程序会好看点。不像现在这么烂。而且还没有实现正弦余弦等很多功能。



原创粉丝点击