如何写一个计算器?(写出计算器)

网友投稿 641 2022-08-31

本站部分文章、图片属于网络上可搜索到的公开信息,均用于学习和交流用途,不能代表睿象云的观点、立场或意见。我们接受网民的监督,如发现任何违法内容或侵犯了您的权益,请第一时间联系小编邮箱jiasou666@gmail.com 处理。

如何写一个计算器?(写出计算器)

考虑这样一个问题,给定一个字符串,“1+1+(3+4)-2*3+8/2”,如何将它转化为如下形式:

“1+1=2”

“3+4=7”

“2+7=9”

“2*3=6”

“9-6=3”

“8/2=4”

“3+4=7”

换句话说,就是如何将字符串按照四则运算计算出来,如何写一个计算器。拿 java 来举例,并且为了简单,我们只考虑个位数。这个过程大概分为这几个步骤,首先需要扫描字符串去除空白字符,其次将各个字符转换成对应的操作符或操作数,然后按照四则运算规则逐次计算并输出。

好,我们首先构造一个 scanner,它主要功能是顺序扫描字符串,返回字符并跳过其中的空白字符,如下2015年就要结束了,

public class Scanner { public Scanner(String source){ this.source = source.toCharArray(); } private char[] source; private int index = 0; private static char END = '\n'; public char getNext(){ char result; do{ if (index >= source.length){ return END; } result = source[index]; index += 1; }while (Character.isWhitespace(result)); return result; }}

在进行下一步之前,让我们思考一下这个算式的规律,算式中存在两种对象,一种是数字,一种是操作符,由于存在运算的优先级,我们分成三种对象,并用下面的形式来说明.

expr —> term + expr | term - expr | term term —> factor * term | factor/term | factor factor—> digit |(expr)

public class Parser { private Scanner scanner; public Parser(Scanner scanner){ this.scanner = scanner; } private char head; public void parse(){ if (Scanner.END != (head = scanner.getNext())){ expr(); } if (head != Scanner.END){ throw new RuntimeException(“syntax error at "+head); } } public int expr(){ int result = term(); int tempResult; char operate; while ((operate = head) == '+' || operate == '-') { head = scanner.getNext(); tempResult = term(); switch (operate) { case '+': System.out.println(result + "+" + tempResult + "=" + (result + tempResult)); result += tempResult; break; case '-': System.out.println(result + "-" + tempResult + "=" + (result - tempResult)); result -= tempResult; } } return result; } public int term(){ int result = factor(); int tempResult; char operate ; while ((operate=head) == '*' ||operate == '/') { head = scanner.getNext(); tempResult = factor(); switch (operate) { case '*': System.out.println(result + "*" + tempResult + "=" + (result * tempResult)); result *= tempResult; break; case '/': System.out.println(result + "/" + tempResult + "=" + (result / tempResult)); result /= tempResult; } } return result; } public int factor(){ int factor; if (Character.isDigit(head)){ factor = head - 48; //字符变量-48可以转换成对应的字面数字 head = scanner.getNext(); } else { match('('); factor = expr(); match(')'); } return factor; }

//match 方法用来断言 head 是什么字符,如果为真,将读取下一个字符赋值给 head public boolean match(char symbol){ if (symbol == head){ head = scanner.getNext(); return true; } throw new RuntimeException("syntax error at "+head); }

public static void main(String... args){ Scanner scanner = new Scanner("1+1+(3+4)-2*3+8/2"); Parser parser = new Parser(scanner); parser.parse();}

}

在这些过程中,递归的方法起到了非常重要的作用,有一句话说明了编译器的本质,编译器就是让你的源程序变成可执行程序的另一个程序。你会发现这个定义本身就是递归的。透过这些编译原理,可以让我们更加深入的理解编程语言,甚至发明一种编程语言。

上一篇:PHP 7.0 安装使用与性能监测!(php框架)
下一篇:Web-Scale IT 我之见
相关文章

 发表评论

暂时没有评论,来抢沙发吧~