软件工程第一周作业----小学生四则运算题

实现功能:

1.整数和真分数的四则运算, 运算数和运算结果都可以是整数或分数;

2.能生成任意个运算数的算式(不超过100);

3.算式的个数、数的范围、运算数的个数由命令行输入;

4.不支持括号。

实现思路:

1.定义算式类,数据成员包含两个数组,分别存储运算数和算符;以及算式的结果;

方法成员包括一个初始化函数,随机生成算式并计算结果;一个输出函数,用来打印算式;以及其他辅助函数。

2.定义运算数类,数据成员包含两个整数,即分子和分母。

3.在主类里调用算式类的方法,来生成和输出算式;接受用户输入并判断正误。

结果截图:

程序代码:

主类Week1:

import java.util.Scanner;

public class Week1 {
    
    public static void main (String args[]) {
        
        Scanner scan = new Scanner(System.in);
        question q = new question();                       //创建一个算式的实例
           
        int r = Integer.parseInt(args[0]);                 //运算数的范围,由命令行输入
        int n = Integer.parseInt(args[1]);                 //算式的数量,由命令行输入
        int l = Integer.parseInt(args[2]);                 //运算数的个数,由命令行输入
        int count = 0;                                     //用户答对的题数
        
        for (int i = 0; i < n; i ++ ) {
            
            q.initialize(r,l);                             //随机生成算式
            q.print(l);                                    //将算式打印到屏幕上
            
            if (scan.nextLine().equals (q.res))  {         //接受用户输入的答案并判断正误              
                System.out.println("回答正确!\n");
                count ++;
            }

else  {
                System.out.println("回答错误! 正确答案是: " + q.res + "\n");
            }
            
        }
        
        //输出分数
        System.out.println("您答对了" + count + "道题目,得分:" + 100 * count / n + "!\n");

scan.close();
    }

}

运算数类number:

/*操作数类的定义*/
public class number {
        
    int n;                     //分子
    int d;                     //分母
        
}

算式类question:

import java.util.Stack;

/*算式类的定义*/
public class question {

char opr[] = {‘+‘,‘-‘,‘*‘,‘/‘};           //四则运算符
    
    
    number oprd[] = new number[100];          //存储运算数的数组
    char op[] = new char [100];               //存储运算符的数组
    number result = new number();             //运算结果
    String res;                               //运算结果的字符串形式
    
    
    /*算式类的构造函数:随机生成运算数和算符,并计算出结果*/
    public void initialize (int r, int l) {              //参数r是运算数的范围, l是运算数的个数
        
        int i,j;
        
        //随机生成算式
        for (i = 0; i < l; i++) {                        //随机生成运算数
            oprd[i]  =  new number();
            oprd[i].d  =  (int) (Math.random() * r) + 1;               //分子
            oprd[i].n  =  (int) (Math.random() * (oprd[i].d-1)) + 1;   //分母
            yf(oprd[i]);                                               //约分
        }

for (i = 0; i < l-1; i++) {                      //随机生成运算符
            op[i]  =  opr[(int) (Math.random() * 4)];
        }
        op[l-1] = ‘=‘;
        
        //计算该算式的结果
        Stack <Character> operator = new Stack <Character>();       //运算符栈
        Stack <number> operand  = new Stack <number>();             //运算数栈
        
        number x = new number(), y = new number(), z = new number();
        i = j = 0;
        
        while (true) {                                   //扫描栈
            
            operand.push(oprd[i++]);                     //运算数入栈

if (j == l-1)    break;                      //所有运算符已入栈,则停止扫描
            
            //如果当前运算符的优先级较低
            while (!operator.isEmpty() && PRI(op[j]) <= PRI(operator.peek()))  {
                y = operand.pop();                       //两个运算数出栈
                x = operand.pop();
                z = solve (x, y, operator.pop());        //运算符出栈,计算
                operand.push(z);                         //结果入栈
            }
            
            operator.push(op[j++]);                      //直接入栈
            
        }
        
        while (operand.size() != 1)  {                   //清空栈,直到运算数栈只剩最后一个数,即结果
            y = operand.pop();                           //两个运算数出栈
            x = operand.pop();
            z = solve (x, y, operator.pop());            //运算符出栈,计算两个运算数的结果
            operand.push(z);                             //结果入栈
            
        }
        
        result = operand.pop();                          //运算数栈底元素为最终结果
        
        //运算结果转换成字符串
        if (result.n == 0)  res = String.valueOf(0);     //结果为0
        else if (result.d == 1)  res = String.valueOf(result.n);     //结果为整数
        else res = String.valueOf(result.n) + ‘/‘ + String.valueOf(result.d);    //结果为分数
        
    }
    
    
    /*求两运算数表达式的值*/
    public number solve (number x, number y, char op)  {
        
        number t1 = new number(), t2 = new number();
        int lcm = LCM (x.d, y.d);
        
        t1.n = x.n * lcm / x.d;            //将两数通分
        t2.n = y.n * lcm / y.d;
        t1.d = t2.d = lcm;

switch (op) {                      //计算结果
        
            case ‘+‘:
                t1.n += t2.n;
                break;
                
            case ‘-‘:
                t1.n -= t2.n;
                break;
                
            case ‘*‘:
                t1.n = x.n * y.n;
                t1.d = x.d * y.d;
                break;
                
            case ‘/‘:
                t1.n = x.n * y.d;
                t1.d = x.d * y.n;
                break;
                
            default:
                break;
                
        }
        
        yf (t1);           //将结果进行约分
        return t1;
        
    }
    
    
    /*计算运算符的优先级*/
    public int PRI (char c)  {
        if (c == ‘+‘ || c == ‘-‘)    return 0;        //加减优先级较低
        else if (c == ‘*‘ || c == ‘/‘)    return 1;   //乘除优先级较高
        else    return -1;                            //其他情况
    }
    
    
    /*输出算式*/
    public void print (int l) {
        
        String exp = new String();
        
        for (int i = 0; i < l; i ++)  {
            if (oprd[i].d == 1)  exp += String.valueOf(oprd[i].n);      //整数
            else exp += String.valueOf(oprd[i].n) + ‘/‘ + String.valueOf(oprd[i].d);     //分数
            exp += " " + op[i] + " ";
        }

System.out.println(exp);
        
    }
    
    
    /*求最大公约数*/
    public int GCD (int a, int b) {
        
        int gcd = 1;
        
        for (int i = 1; i <= a; i ++) {
            if (a % i == 0 && b % i == 0) {
                gcd = i;
            }
        }
        
        return gcd;
    }
    
    
    /*求最小公倍数*/
    public int LCM (int a, int b) {
        
        return a * b / GCD(a,b);
        
    }
    
    
    /*对分数进行约分*/
    public void yf (number p) {
        
        int gcd = GCD (p.d, p.n);
        
        p.d /= gcd;
        p.n /= gcd;
        
    }
    
}

时间: 2024-07-31 14:28:16

软件工程第一周作业----小学生四则运算题的相关文章

软件工程第一周作业----小学生四则运算题2.0

实现功能: 1.整数和真分数的四则运算, 运算数和运算结果都可以是整数或分数: 2.能生成任意个运算数的算式: 3.算式的个数.数的范围.运算数的个数由命令行输入: 4.保证生成的算式不重复; 5.支持括号. 实现思路: 1.新定义了表达式类,数据成员包含表达式的值,表达式的字符串形式,以及两个子表达式中间的算符. 方法成员包括两个构造函数,其中一个随机生成算式并计算结果,另一个是默认的,用来分配空间:一个输出函数,用来打印算式:以及其他辅助函数. 构造函数的思路:构造两个较短的子表达式,然后用

第一周作业——小学四则运算题

作业要求: 写一个能自动生成小学四则运算题目的命令行 “软件”, 分别满足下面的各种需求,这些需求都可以用命令行参数的形式来指定: a) 支持整数.真分数的四则运算.例如:  1/6 + 1/8 = 7/24 b) 逐步扩展功能和可以支持的表达式类型,最后希望能支持下面类型的题目(最多 10 个运算符,括号的数量不限制) 25 - 3 * 4 - 2 / 2 + 89 = ?      1/2 + 1/3 - 1/4 = ?       ( 5 - 4 ) * ( 3 +28 ) =? 设计思路

软件工程第一周作业 - 导航

本周作业内容链接 软件工程第一周作业 - 关于计算机.职业生涯 http://www.cnblogs.com/vector121/p/7496387.html

软件工程第一周作业----个人项目总结

需求分析: 写一个自动生成小学生四则运算题的程序,要求: 1.支持整数.真分数: 2.允许有多个运算数和括号组成的复杂表达式: 3.能接受用户输入并判断正误: 4.能接受命令行参数. 计划估计: 1.计划先实现两个整数间的四则运算,然后再加入真分数,最后实现多运算数和含有括号的表达式. 2.估计大概用时4个小时,代码行大约100行左右. 遇到的问题: 1.一开始实现整数的四则运算时,运算数都是用的整型:后来再加入真分数时,感觉如果整数用整型数据表示的话,没法和分数一起处理,比较麻烦,所以就把整数

软件工程第一周作业:软件工程和代码托管平台

0x01 :请问 "软件" 和 "软件工程" 这些词汇是如何出现的 - 何时.何地.何人 软件:最早的软件的概念,由Richard R. Carhart在1953年8月,Rand Corporation的备忘录中提出,并将其使用于工程背景中(The earliest known publication of the term "software" in an engineering context was in August 1953 by Ri

现代软件工程第一周作业

2.  软件有很多种,也有各种分类办法: ShrinkWrap (在包装盒子里面的软件,软件在CD/DVD上):   Web APP (基于网页的软件):   Internal Software (企业或学校或某组织内部的软件): Games (游戏):   Mobile Apps (手机应用):    Operating Systems (操作系统):    Tools (工具软件)      选取一类软件,  请分析: 1) 此类软件是什么时候开始出现的, 这些软件是怎么说服你(陌生人)成为

软件工程第一周作业 - 每周例行报告

本周PSP C(类别) C(内容) S(开始时间) E(结束时间) I(耽误时间) △(实际时间) Part One 个人情况阐述 9:10 9:35 2分钟 25分钟 Part Two 阅读<构建之法> 12:40 次日18:46 495+32+41+10-36 19小时52分钟 Part Three 评价作品 8:20 12:48 2+10+5 4小时11分钟 Part Four 采访往届同学 14:00 14:56 2 56分钟 总结 第一次作业       25小时24分钟 本周进度条

软件工程第一周作业 - 针对“天天向上”团队的采访

针对“天天向上”团队的采访 1.当时的项目有多少用户,给用户多少价值? 现在还有人用吗? 因为我们团队开发的是一款单机游戏,所以具体有多少用户我们也不太清楚,当时我们将项目放到CSDN上,我删除项目之前看到的下载量是56个,如果可以的话,这个就算是用户量了.因为我们的项目是款游戏,所以带给用户的当然就是娱乐消遣的价值了,希望大家每天早上打开电脑的时候先玩几盘连连看,开启一天的好心情.至于现在还有多少人用我就不太清楚了,反正我(张政)还是偶尔无聊时玩几盘. 2.这个项目能否给我们团队继续开发,源代

解题报告——2018级2016第二学期第一周作业

解题报告——2018级2016第二学期第一周作业 D 算24 题目描述 描述 给出4个小于10个正整数,你可以使用加减乘除4种运算以及括号把这4个数连接起来得到一个表达式.现在的问题是,是否存在一种方式使得得到的表达式的结果等于24. 这里加减乘除以及括号的运算结果和运算的优先级跟我们平常的定义一致(这里的除法定义是实数除法). 比如,对于5,5,5,1,我们知道5 * (5 – 1 / 5) = 24,因此可以得到24.又比如,对于1,1,4,2,我们怎么都不能得到24. 输入 输入数据包括多