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

学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开发的一些书。

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值