结对编程练习_四则运算(第一周)

结对编程练习_四则运算

1.栈的一个应用是用来对四则运算表达式进行求值。规则如下:

操作数之间的相对次序不变;

运算符的相对次序不同;

中缀式丢失了括弧信息,致使运算次序不确定;

前缀式的运算规则为:连续出现的两个操作数和在它们之前且紧靠它们的运算符构成一个最小表达式;

后缀式的运算规则为:运算符在式中出现的顺序恰为表达式的运算顺序;每个运算符和在它之前出现且紧靠它的两个操作数构成一个最小表达式。

后缀表示法是波兰逻辑学家J.Lukasiewicz于1929年提出的,又叫做逆波兰表达式。

2.Linux命令 dc 可以用来对逆波兰式表达式进行求值,dc的打印类命令:

p:打印栈顶元素并换行

n: 打印栈顶元素并将其弹出栈,完毕后不换行

P: putchar ( int(栈顶元素) % 256) 并弹栈顶,不换行

f: 从栈顶至栈底打印栈中所有值,每个一行

3. dc的运算符:

+: 依次弹出w1与w2,将w2+w1压栈。精度为结果值精度

-: 依次弹出w1与w2,将w2-w1压栈

: 依次弹出w1与w2,将w2w1压栈。精度为结果值精度与precision中较大值

/ : 依次弹出w1与w2,将w2/w1压栈。精度为precision

% : 依次弹出w1与w2,将w2-w2/w1*w1压栈

~ : 依次弹出w1与w2,依次将w2/w1与w2%w1压栈

^ : 依次弹出w1与w2,将w2^((int)w1)压栈。精度为w2精度与precision中较大值

| : 依次弹出w1 w2与w3,将 w3 ^ ((int)w2) (mod w1) 压栈。w1 w3 需为整数

v : 弹出w1,将sqrt(v)压栈。精度为precision

4. dc支持栈操作:

c : 清空栈

d : 将栈顶元素复制并压栈

r : 交换栈顶两元素 XXX

5.对逆波兰式求值时,不需要再考虑运算符的优先级,只需从左到右扫描一遍后缀表达式即可。求值伪代码如下:

设置一个操作数栈,开始栈为空;

从左到右扫描后缀表达式,遇操作数,进栈;

若遇运算符,则从栈中退出两个元素,先退出的放到运算符的右边,后退出的放到运算符左边,运算后的结果再进栈,直到后缀表达式扫描完毕。

此时,栈中仅有一个元素,即为运算的结果。

6.由中缀式求得后缀式可以使用栈,伪代码如下:

设立一个栈,存放运算符,首先栈为空;

从左到右扫描中缀式,若遇到操作数,直接输出,并输出一个空格作为两个操作数的分隔符;

若遇到运算符,则与栈顶比较,比栈顶级别高则进栈,否则退出栈顶元素并输出,然后输出一个空格作分隔符;

若遇到左括号,进栈;若遇到右括号,则一直退栈输出,直到退到左括号止。

当栈变成空时,输出的结果即为后缀表达式。

需求分析

  • 实现一个命令行程序,要求:

    • 自动生成小学四则运算题目(加、减、乘、除)
    • 支持整数
    • 支持多运算符(比如生成包含100个运算符的题目)
    • 支持真分数
    • 统计正确率
  • 扩展需求,文件:

    • 处理生成题目并输出到文件
    • 完成题目后从文件读入并判题
    • 多语言支持:简体中文, 繁體中文, English
    • 生成题目去重

设计思路

1.明确设计目的--自动生成小学四则运算题目(加、减、乘、除)

2.将问题逐一解决,eg:如何生成随机数

3.完善条件--支持整数、多运算符、真分数、统计正确率

4.编译运行并测试

实现过程中的关键代码解释

Random rand =new Random( ); 生成随机数

原文地址:https://www.cnblogs.com/IconicV/p/8850304.html