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

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

参考资料及学习笔记

结对编程练习_四则运算

数据结构应用

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.由中缀式求得后缀式可以使用栈,伪代码如下:

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

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

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

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

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

7.Random类

Math类调用static方法random()返回一个0~1之间的随机数(包括0.0但不包括1.0),即随机数取值范围是[0.0,1.0)左闭右开区间。

例如: (int)(Math.random()*100+1; 得到1~100之间的一个随机数(包括1和100)。

需求分析

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

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

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

设计思路

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

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

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

4.编译运行并测试

代码及注释

import java.util.Scanner;
public class szys2906 {
    public static void main(String[] args)
    {
        int answer;//answer代表答题者的回答
        int count=0;//count代表题目数量
        int key=0;//key代表计算机计算出来的答案
        int right=0;//right代表回答正确的题目数量
        System.out.println("题目数量:");
        Scanner input=new Scanner(System.in );
        count=input.nextInt();
        szys2906 question=new szys2906();
        for(int n=0;n<count;n++)//注意n从0开始!
        {
            int i=(int)(Math.random()*100);
            int j=(int)(Math.random()*100);
            switch((int)(Math.random()*4))
            {
                case 0://加法
                    System.out.println(i+"+"+j+"=");
                    key=i+j;
                    break;
                case 1://减法
                    if(i<j)
                    {
                        int temp=i;
                        i=j;
                        j=temp;
                    }
                    System.out.println(i+"-"+j+"=");
                    key=i-j;
                    break;
                case 2://乘法
                    System.out.println(i+"*"+j+"=");
                    key=i*j;
                    break;
                case 3://除法
                    while(j==0)
                         j= (int)(Math.random()*100);//分母若为0,则重新取随机数
                    System.out.println(i+"/"+j+"=");
                    key=i/j;
                    break;
            }
            Scanner reply=new Scanner(System.in );
            answer=reply.nextInt();
            if(answer==key){
                 System.out.println("回答正确!");
                 right++;
            }
            else{
                 System.out.println("回答错误!");
            }
        }
        float rate=(float)right/(float)count;
        System.out.println("正确率为"+rate);
    }
}

运行过程截图

代码托管地址

码云链接

UML图:

遇到的困难及解决方法

  • 遇到的问题:正确率出现了1.5的错误情况

  • 解决方法:将 for(n=0;n<=count;n++) 改成了 for(n=0;n<count;n++)

  • 本次实验扩展需求中“多语言支持:简体中文, 繁體中文, English”“生成题目去重”没有实现,希望以后能解决。

对结对的小伙伴做出评价(重点指出需要改进的地方)

此次结对编程我感受最深的就是赵先生的责任感。赵先生不放弃的精神始终鼓励着我,使我对计算机的恐惧和抵触不那么强烈了。结对编程在增强我合作意识的同时,也使我更加自立。我们最需要改进的地方就是时间观念不强,完成任务拖拖拉拉,总是在周日截止时间前上演生死时速的戏码,以后要打好提前量,争取早些完成任务,留出总结反思的时间。

PSP

PSP2.1 Personal Software Process Stages 预估耗时(小时) 实际耗时(小时)
Planning 计划 2.0 1.5
Estimate 估计这个任务需要多少时间 16.5 17.5
Analysis 需求分析 (包括学习新技术) 2.0 1.5
Design Spec 生成设计文档 1.0 1.5
Design Review 设计复审 (和同事审核设计文档) 1.0 0.5
Coding Standard 代码规范 (为目前的开发制定合适的规范) 1.5 2.0
Design 具体设计 1.0 1.5
Coding 具体编码 2.0 3.0
Code Review 代码复审 0.5 0.5
Test 测试(自我测试,修改代码,提交修改) 1 1
Reporting 报告 1.5 2.0
Test Report 测试报告 0.5 0.5
Size Measurement 计算工作量 0.5 0.5
Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计划 2.0 1.0
原文地址:https://www.cnblogs.com/5306xyh/p/8850017.html