这不是一个简单的计算器,是时候展现真正的技术了。

菜鸡比尔 2014-03-18 08:14:14
今天老师布置了个作业...让我们写个计算器...
你以为是普通的计算器?你还是图样吧少年...跪求大神,是时候展现真正的技术了...

项目描述如下:
读取如下格式的txt文件,
Input:
i=1;
j=32/3.1+i;
print i;
print j;

将读取内容转化为计算式,根据计算式输出结果
这是个涉及编译原理的小项目...
我这种渣渣琢磨了下,感觉主要有两个难点:
一:把读入的字符串编译为数学计算式(还要实现print功能)。
二:当出现变量未赋值、除数为0,缺少分号等号等操作符的的情况时,如何判断,并输出错误提示信息。

跪求帮助...毫无思路...
...全文
220 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
suciver 2014-03-20
  • 打赏
  • 举报
回复
如果txt文本的格式是这样的话我可以投机取巧下吗,利用jdk1.6提供的脚本引擎技术。代码变得非常简单

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;

public class Test {
	public static void main(String[] args) throws Exception {
		ScriptEngineManager manager=new ScriptEngineManager();
		ScriptEngine engine=manager.getEngineByExtension("js");
		String script="input:i=1;j=32/3.1+i;print i;print j;";
		script=script.replaceAll("print\\s+(\\w+);","println($1);");
		engine.eval(script);
	}
}
yanjianbin2 2014-03-20
  • 打赏
  • 举报
回复
代码给你。不过我这里定义的都是int 类型的,并且只解答了一般的问题。楼主可以自己修改:
public static void main(String args[]){
		int i = test("1+(4+(2*1+1)+4*2)*2/2 + (1+2)");
		System.out.println(i);
	}
	
	public static int test(String str){
		String sub = null; 
		Stack <Integer> stack = new Stack <Integer>();
		str = str.trim();
		for(int i = 0;i<str.length();i++){
			char c = str.charAt(i);
			if(c == '('){
				stack.push(i);
			}
			
			if(c == ')'){
				int k = stack.pop();
				sub = jiaANDjian(str.substring(k+1, i))+"";
				str = str.substring(0,k)+ sub + str.substring(i+1,str.length());
				break;
			}	
		}
		
		if(str.indexOf(String.valueOf('(')) == -1){
			return jiaANDjian(str.trim().replaceAll(" ", ""));
		}else{		 							
			return test(str);
		}
	}	
	
	/**本方法用来计算诸如:str = "6*7-12*2+3" 这样加减乘除全都具备的算式
	 * */
	public static int jiaANDjian(String sub){
		Stack <Integer> stack = new Stack <Integer>();
		Stack <Integer> stackValue = new Stack <Integer>();
		Stack<Character> stackSymbol = new Stack<Character>();
		int num =0;
		for(int j=0;j<sub.length();j++){
	 		char b = sub.charAt(j);
	 		switch(b){
		 		case '+':
		 		case '-':
		 			if(stackValue.isEmpty()){		
		 				stack.push(forEasy(sub.substring(0,j)));
		 				stackValue.push(j);
		 				stackSymbol.push(b);		 				
		 			}else{
		 				num = forEasy(sub.substring(stackValue.pop() + 1,j));
		 				if(stackSymbol.pop() == '+'){	
		 					stack.push(num);
		 				}else{
		 					stack.push(0-num);
		 				}
		 				stackValue.push(j);
		 				stackSymbol.push(b);		 	
		 			}
		 			break;
	 		} 	
		}
		num = forEasy(sub.substring(stackValue.pop() + 1,sub.length()));
		if(stackSymbol.pop() == '+'){	
			stack.push(num);
		}else{
			stack.push(0-num);
		}
		
		num = 0;
		while(!stack.isEmpty()){
			num = num + stack.pop();
		}
		return num;
	}	   

	/*由于本段代码常常用到,故而单独抽出作为一个方法判断*/
	public static int forEasy(String str){
		if(str.indexOf(String.valueOf('*')) == -1 && str.indexOf(String.valueOf('/')) == -1 ){
			return Integer.valueOf(str);	
		}else{		 					
			return chengANDchu(str);
		}
	}
	
	/** 本方法用来计算用于连续的乘除运算,如sub = "1*5*4/2*6" */
	public static int chengANDchu(String sub){
		Stack<Character>stack2 = new Stack<Character>();
		Stack<Integer>stack3 = new Stack<Integer>();
		int sum = 1;
		for(int j=0;j<sub.length();j++){
	 		char b = sub.charAt(j);
	 		switch(b){	
		 		case '*':
		 		case '/':
		 			if(stack2.isEmpty()){
		 				sum = Integer.valueOf(sub.substring(0,j));
		 				stack2.push(b);
		 				stack3.push(j);
		 			}else{
		 				if(stack2.pop() == '*'){
		 					sum = sum * Integer.valueOf(sub.substring(stack3.pop()+1,j));
		 				}else{
		 					sum = sum / Integer.valueOf(sub.substring(stack3.pop()+1,j));
		 				}
		 				stack2.push(b);
		 				stack3.push(j);
		 			}
		 		break; 			
	 		} 	
		}
		if(stack2.pop() == '*'){
			sum = sum * Integer.valueOf(sub.substring(stack3.pop()+1,sub.length()));
		}else{
			sum = sum / Integer.valueOf(sub.substring(stack3.pop()+1,sub.length()));
		}
		
		return sum;
	}
forgetsam 2014-03-19
  • 打赏
  • 举报
回复
1 会用栈吗。 2 你想多了。
菜鸡比尔 2014-03-19
  • 打赏
  • 举报
回复
引用 2 楼 forgetsam 的回复:
1 会用栈吗。 2 你想多了。
自己建了个容器去实现类似栈的功能...建了个类parameter用于存储变量。 但有个问题没想明白。像下面这种输入: Input: i=10; j=21.1+i; print i,j; 如果我已经获得了 i 的值,并创建了一个parameter 对象p1:name=i;value=10; 我在读j=21.1+i 时,读到 i 处,我要怎么通过 parameter的对象name,获得它的value,并导入到 j 的计算中。
代码间的舞者 2014-03-18
  • 打赏
  • 举报
回复
楼主都已经把难点都列出来了,怎么算没有思路呢? 这个程序不会很难得,楼主加油

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧