学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类型转为List
public 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>() ; //存储数字的String
List<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开发的一些书。
这个计算器我准备过段时间更新一次。等对数据结构算法之内的熟悉了点之后,相信程序会好看点。不像现在这么烂。而且还没有实现正弦余弦等很多功能。