首页 > 其他分享 >结对项目--四则运算

结对项目--四则运算

时间:2024-09-27 22:53:44浏览次数:10  
标签:结对 denominator return String -- 四则运算 int Fraction new

结对项目--四则运算

这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/CSGrade22-34/
这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/CSGrade22-34/homework/13230
这个作业的目标 四则运算
成员 3122004564方伟城

psp表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 30 40
Estimate 估计这个任务需要多少时间 20 15
Development 开发 360 400
Analysis 需求分析 (包括学习新技术) 80 60
Design Spec 生成设计文档 30 30
Design Review 设计复审 30 30
Coding Standard 代码规范 (为目前的开发制定合适的规范) 20 20
Design 具体设计 60 70
Coding 具体编码 90 110
Code Review 代码复审 30 15
Test 测试(自我测试,修改代码,提交修改) 60 45
Reporting 报告 60 50
Test Repor 测试报告 20 20
Size Measurement 计算工作量 20 20
Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计划 40 30
合计 1020 955

代码设计

1. Fraction类:两个真分数的四则运算,如果不是真分数就先转换城真分数 `public class Fraction { private int numerator; // 分子 private int denominator; // 分母
// 构造器,number:
public Fraction(int[] numbers) {
    int len = numbers.length;
    switch (len) {
        case 1://整数
            pre(numbers[0], 1);
            break;
        case 2://真分数
            pre(numbers[0], numbers[1]);
            break;
        case 3://假分数
            pre(numbers[1] + numbers[2] * numbers[0], numbers[2]);
            break;
    }
}

//numerator:分子 denominator分母
public void pre(int numerator, int denominator) {
    if (denominator == 0) {
        throw new IllegalArgumentException("Denominator cannot be zero.");
    }
    this.numerator = numerator;
    this.denominator = denominator;
    simplify(); // 初始化时简化分数
}

// 简化分数
private void simplify() {
    int gcd = gcd(Math.abs(numerator), Math.abs(denominator));
    numerator /= gcd;
    denominator /= gcd;
    // 确保分母为正
    if (denominator < 0) {
        numerator = -numerator;
        denominator = -denominator;
    }
}

// 最大公约数算法(欧几里得算法)
private int gcd(int a, int b) {
    while (b != 0) {
        int temp = b;
        b = a % b;
        a = temp;
    }
    return a;
}

// 加法
public Fraction add(Fraction other) {
    int newNumerator = numerator * other.denominator + other.numerator * denominator;
    int newDenominator = denominator * other.denominator;
    return new Fraction(new int[]{newNumerator, newDenominator});
}

// 减法
public Fraction subtract(Fraction other) {
    int newNumerator = numerator * other.denominator - other.numerator * denominator;
    int newDenominator = denominator * other.denominator;
    return new Fraction(new int[]{newNumerator, newDenominator});
}

// 乘法
public Fraction multiply(Fraction other) {
    int newNumerator = numerator * other.numerator;
    int newDenominator = denominator * other.denominator;
    return new Fraction(new int[]{newNumerator, newDenominator});
}

// 除法
public Fraction divide(Fraction other) {
    if (other.numerator == 0) {
        throw new ArithmeticException("Division by zero.");
    }
    int newNumerator = numerator * other.denominator;
    int newDenominator = denominator * other.numerator;
    return new Fraction(new int[]{newNumerator, newDenominator});
}

public boolean compare(Fraction other) {
    Fraction fraction = subtract(other);
    return fraction.numerator >= 0;
}

// 重写toString方法,方便输出
@Override
public String toString() {
    return numerator + "/" + denominator;
}

// 测试
public static void main(String[] args) {
    Fraction f1 = new Fraction(new int[]{2, 1, 6});
    Fraction f2 = new Fraction(new int[]{3, 1, 3});
    System.out.println(f1);
    System.out.println("f1 + f2 = " + f1.add(f2));
    System.out.println("f1 - f2 = " + f1.subtract(f2));
    System.out.println("f1 * f2 = " + f1.multiply(f2));
    System.out.println("f1 / f2 = " + f1.divide(f2));
}

}`

  1. MathQuizGenerator类:生成题目并测试
    `
    import java.io.FileWriter;
    import java.io.IOException;
    import java.util.Random;
    import java.util.Scanner;

public class MathQuizGenerator {
//生成题目的个数
public static int count;
// //题目中数值(自然数、真分数和真分数分母)的范围
public static int range;
public static Random random = new Random();
public static final String[] OPERATORS = {" + ", " - ", " × ", " ÷ "};

public static void main(String[] args) throws IOException {
    FileWriter writer = new FileWriter("Exercises.txt");


    Scanner sc = new Scanner(System.in);
    count = sc.nextInt();
    range = sc.nextInt();
    for (int i = 0; i < count; i++) {
        writer.write( i+1+". "+ generate()+"\n");

    } writer.close();
  ;

}

//生成真分数
private static String createZhengFenshu() {
    // 随机生成两个操作数,且num2必须大于num1,所以也保证了分母不为0
    int num1 = random.nextInt(range);
    int num2 = random.nextInt(range);
    if (num1 > num2) {
        return num2 + "/" + num1;
    } else {
        return num1 + "/" + num2;
    }

}

//生成假分数
private static String createJiaFenshu() {

    int num1 = random.nextInt(range);
    int num2 = random.nextInt(range);

    int num3 = random.nextInt(range);
    ;
    if (num3 < num2) {
        return num1 + "'" + num3 + "/" + num2;
    }

    return num1 + "'" + num2 + "/" + num3;
}

//生成整数
private static String createZhengshu() {
    return random.nextInt(range) + "";
}

private static String addKuohao(String s) {
    return "(" + s + ")";
}

//生成数,包括可能的括号
private static String createNum() {
    //选择是整数/真分数/假分数
    int number1 = random.nextInt(3);
    String num1 = "";
    switch (number1) {
        case 0:
            num1 = createZhengshu();
            break;
        case 1:
            num1 = createZhengFenshu();
            break;
        case 2:
            num1 = createJiaFenshu();
            break;
    }
    return canAddKuohao(num1);
}

private static String canAddKuohao(String s) {
    if (random.nextInt(10) == 1) {
        s = addKuohao(s);
    }
    return s;
}

//生成运算符
private static String creanteoperator() {
    // 随机选择运算符:0为加法,1为减法,2为乘法,3为除法
    return OPERATORS[random.nextInt(4)];
}
//创建简单表达式,即只有一个运算符

// 连接2个子表达式,并括号
private static String link(String a, String b) {
    String operator = creanteoperator();
    return canAddKuohao(a + operator + b);
}

private static String link(String a, String b, String operator) {
    return canAddKuohao(a + operator + b);
}

//生成题目
private static String generate() {
    //运算符个数
    int operatorCount = random.nextInt(3) + 1;

    String[] nums = new String[operatorCount + 1];
    for (int j = 0; j < operatorCount + 1; j++) {
        nums[j] = createNum();
    }
  //  System.out.println(Arrays.toString(nums));
    //题目
    String result = nums[0];
    //计算结果
    String out = nums[0];
    for (int i = 0; i < operatorCount; i++) {
        String operator = creanteoperator();
        result = link(result, nums[i + 1], operator);
      /* boolean right = isRight(out, nums[i + 1],operator);
        if (right){
         out=calulate(out,nums[i+1],operator);
            result=link(result,nums[i+1],operator);
        }
    else {
            out=calulate(nums[i+1],out,operator);
            result=link(nums[i+1],result,operator);
       }*/

    }

return result;
}

//根据表达式s得出结果
private static String out(String s) {
    s = s.trim();
    return null;
}

private static boolean isRight(String num1, String num2, String operator) {
    if (operator.equals(OPERATORS[1]) && !compare(num1, num2)) {
        return false;
    }
    if (operator.equals(OPERATORS[3]) && compare(num1, num2)) {
        return false;
    }
    return true;
}

//比较两个数大小,num1不小于num2返回ture
private static boolean compare(String num1, String num2) {
    //根据数组大小判断是整数/真分数/假分数,真分数<1,假分数<其中的整数+1
    String[] split1 = num1.split("'|//");
    String[] split2 = num2.split("'|//");
    int[] number1 = new int[split1.length];
    for (int i = 0; i < split1.length; i++) {
        number1[i] = Integer.parseInt(split1[i]);
    }
    int[] number2 = new int[split2.length];
    for (int i = 0; i < split2.length; i++) {
        number2[i] = Integer.parseInt(split2[i]);
    }
    Fraction fraction21 = new Fraction(number1);
    Fraction fraction = new Fraction(number2);
    return fraction21.compare(fraction);
}

//计算两个数的运算
private static String calulate(String num1, String num2, String operator) {
//根据数组大小判断是整数/真分数/假分数,真分数<1,假分数<其中的整数+1
String[] split1 = num1.split("'|//");
String[] split2 = num2.split("'|//");
int[] number1 = new int[split1.length];
for (int i = 0; i < split1.length; i++) {
number1[i] = Integer.parseInt(split1[i]);
}
int[] number2 = new int[split2.length];
for (int i = 0; i < split2.length; i++) {
number2[i] = Integer.parseInt(split2[i]);
}
Fraction fraction21 = new Fraction(number1);
Fraction fraction = new Fraction(number2);
if (operator.equals(OPERATORS[0])) {
return fraction21.add(fraction).toString();
}
if (operator.equals(OPERATORS[1])) {
return fraction21.subtract(fraction).toString();
}
if (operator.equals(OPERATORS[2])) {
return fraction21.multiply(fraction).toString();
}
return fraction21.divide(fraction).toString();

}

}

`

测试结果

![](/i/l/?n=24&i=blog/3048689/202409/3048689-20240927230321728-1977545003.png)

标签:结对,denominator,return,String,--,四则运算,int,Fraction,new
From: https://www.cnblogs.com/fwc4564/p/18436721

相关文章

  • 适航规章、标准,书籍资料下载汇总(更新中)
    以下是一些收集到的适航相关的资料,分享给大家。(如果没有你想要的资料,请留言,等找到会及时更新!)适航规章(文章末尾会有下载链接):《21部-民用航空产品和零部件合格审定规定》PDF下载《23部-正常类飞机适航标准》PDF下载《25部-运输类飞机适航标准》PDF下载《27部-正常类旋翼......
  • 双端之Nginx+Php结合PostgreSQL搭建Wordpress
    第一台虚拟机:安装Nginx更新系统包列表:sudoaptupdate安装Nginx及php扩展:sudoaptinstallnginxphp-fpmphp-pgsqlphp-mysqli-y启动Nginx服务:sudosystemctlstartnginx检查Nginx是否正常运行:xdg-openhttp://localhost注意:终端命令打开网址打......
  • 没有网络编程就拿不下小美
    一入Java情几许?大家好,我是深山夕照深秋雨。网络编程和我们的生活息息相关。它可以让设备中的程序与网络上其他设备中的程序进行数据交互。你与小美在微信上的聊天,就要依赖网络编程来实现。基本的通信架构有2种形式:CS架构(Client客户端/Server服务端)——WeChat 、BS架构(B......
  • 字符串内置方法一
    数据类型的内置方法:数据类型对象.方法名(参数)upper 转大写  lower转小写例:s1=HELLO WORLDs2=HELLO YUANstartswith 是否以xxx开头endswith 是否以xxx结尾......
  • C语言VS实用调试技巧
    文章目录一、什么是bug?二、什么是调试?三、Debug和Release四、VS调试快捷键4.1环境准备4.2调试快捷键五、监视和内存观察5.1监视5.2内存六、调试举例七、编程常见错误归类7.1编译型错误7.2链接型错误7.3运行时错误一、什么是bug?......
  • 计算机毕业设计-基于Java+SSM架构的电影购票系统项目开发实战(附源码+论文)
    大家好!我是程序员一帆,感谢您阅读本文,欢迎一键三连哦。......
  • 软件工程的理解
    软件工程的理解软件工程是应用计算机科学原理、工程原则、项目管理技巧来开发、运行和维护软件的过程。它是一个系统的、规范的方法,旨在确保软件产品的质量和可靠性。1.软件工程的核心概念1.1需求分析目的:确定软件所要解决的问题和实现的功能。方法:与客户沟通,使用用例、用......
  • 计算机毕业设计-基于Java+SSM架构的游泳会员管理系统项目开发实战(附源码+论文)
    大家好!我是程序员一帆,感谢您阅读本文,欢迎一键三连哦。......
  • 计算机毕业设计-基于Java+SSM架构的在线电影票购买系统项目开发实战(附源码+论文)
    大家好!我是程序员一帆,感谢您阅读本文,欢迎一键三连哦。......
  • 深度学习:迁移学习
    目录一、迁移学习1.什么是迁移学习2.迁移学习的步骤1、选择预训练的模型和适当的层2、冻结预训练模型的参数3、在新数据集上训练新增加的层4、微调预训练模型的层5、评估和测试二、迁移学习实例1.导入模型2.冻结模型参数3.修改参数4.创建类,数据增强,导入数据5.定......