个人项目-四则运算2

题目:

1、定义参数控制生成题目的个数。 例如,参数n=10;则将生成10个题目。

2、定义参数控制题目中数值(自然数、真分数和真分数分母)的范围。 例如参数r= 10,将生成10以内(不包括10)的四则运算题目。该参数可以设置为1或其他自然数。 该参数必须给定,否则程序报错并给出帮助信息。

3、生成的题目中计算过程不能产生负数,也就是说算术表达式中如果存在形如e1 − e2的子表达式,那么e1 ≥ e2。

4、生成的题目中如果存在形如e1 ÷ e2的子表达式,那么其结果应是真分数。

5. 每道题目中出现的运算符个数不超过3个。

6.程序一次运行生成的题目不能重复,即任何两道题目不能通过有限次交换+和×左右的算术表达式变换为同一道题目 例如,23 + 45 = 和45 + 23 = 是重复的题目,6 × 8 = 和8 × 6 = 也是重复的题目。3+(2+1)和1+2+3这两个题目是重复的,由于+是左结合的,1+2+3等价于(1+2)+3,也就是3+(1+2),也就是3+(2+1)。但是1+2+3和3+2+1是不重复的两道题,因为1+2+3等价于(1+2)+3,而3+2+1等价于(3+2)+1,它们之间不能通过有限次交换变成同一个题目

7.生成的题目存储到数据库中, 格式如下: 1. 四则运算题目1 2. 四则运算题目2 …… 其中真分数在输入输出时采用如下格式,真分数五分之三表示为3/5,真分数二又八分之三表示为2’3/8。

8. 在生成题目的同时,计算出所有题目的答案,并存入数据库文件。 格式如下: 1. 答案1 2. 答案2 特别的,真分数的运算如下例所示:1/6 + 1/8 = 7/24。

9. 程序应能支持一万道题目的生成。

10. 程序支持对给定的题目文件和答案文件,判定答案中的对错并进行数量统计, 统计结果输出到数据表文件Grade,格式如下: Correct: 5 (1, 3, 5, 7, 9) Wrong: 5 (2, 4, 6, 8, 10) 其中“:”后面的数字5表示对/错的题目的数量,括号内的是对/错题目的编号。为简单起见,假设输入的题目都是按照顺序编号的符合规范的题目。

设计思想:在之前的基础上进行修改,改善了部分功能,诸如分数运算及除法运算。

源程序代码:

package size;
import java.util.Scanner;
public class yunsuan {
    public static Scanner in=new Scanner(System.in);
    static int b1,b2,b3,b4;
    static int a1=0;
    static int a2=0;
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int s;
        while(true)
        {
            System.out.println("请输入要进行的运算:");
            System.out.println("1.整数四则运算:");
            System.out.println("2.真分数四则运算:");
            System.out.println("3.退出:");
            s=in.nextInt();
            if(s==1)
            {
                System.out.println("请输入要生成题目的个数:");
                int n=in.nextInt();
                System.out.println("请输入数值范围(自然数0-2147483647):");
                int p=in.nextInt();
                int q=in.nextInt();
                System.out.println("是否有括号? 1:有 2:否");
                int k=in.nextInt();
                if(k==1)
                {
                    parentheses(n,p,q);
                }
                else
                {
                    IntYuan(n,p,q);
                }
                continue;
            }
            if(s==2)
            {
                System.out.println("请输入要生成题目的个数:");
                int m=in.nextInt();
                System.out.println("请输入数值范围(自然数0-2147483647):");
                int p=in.nextInt();
                int q=in.nextInt();
                Fraction F1=new Fraction();
                for(int j=0;j<m;j++)
                {
                F1.TrueNum(p,q);
                }
                continue;
            }
            if(s==3)
            {
                break;
            }
            else
            {
                System.out.println("输入错误,请重新输入:");
                s=in.nextInt();
            }
        }
        in.close();
    }
    public static void IntYuan(int n,int p,int q)
    {
        int result1=-2147483648;//假设结果值为int类型的最小值
        String result2="";//当为除法运算时结果写为String类型
        String result3="";//当为除法运算时计算结果转化为String类型
        char ch;//将生成的运算符赋值
        String[] re = new String[20000];
        int[] re1 = new int[100];
        int[] re2 = new int[100];
       
        System.out.print("是否有乘除法? 1:有 2:否");
        int c=in.nextInt();
        System.out.print("加减有无负数? 1:有 2:否");
        int f=in.nextInt();
        System.out.print("除法有无余数? 1:有 2:否");
        int y=in.nextInt();
        for(int i=0;i<n;i++) 
        {
            a1=ranNum(a1,p,q);
            a2=ranNum(a2,p,q);
            if(c==1)
            {
                ch=ranChar1();
            }
            else
            {
                ch=ranChar2();
            }
            //查重
            re[i]=String.valueOf(a1)+String.valueOf(ch)+String.valueOf(a2);
            for(int j=0;j<i;j++)
            {
                if(re[j].equals(re[i]))
                {
                    i--;
                }
            }
            //当运算符为"+"或"*"时重复
            if(ch=='+'||ch=='*')
            {
                re1[i]=a1;
                re2[i]=a2;
                for(int j=0;j<i;j++)
                {
                    if(re1[j]==re2[i] && (re2[j]==re1[i]))
                    {
                        i--;
                    }
                }
            }
            //当加减不能出现负数时执行此操作
            if(f==2 &&((a1<0||a2<0)||(a1<a2 && ch=='-')))
            {
                i--;
            }
            //生成的题目中如果存在形如e1 ÷ e2的子表达式,那么其结果应是真分数
            else if((y==1)&&(ch=='/')&&(a1>a2)&&(a1%a2!=0))
            {
                i--;
            }
            //当除法不能有余数时执行此操作
            else if(y==2 && ch=='/' && a1%a2!=0)
            {
                i--;
            }
            else
            {
                System.out.print(a1);
                System.out.print(ch);
                System.out.println(a2+"=");
                
                System.out.print("请输入答案:");
                if(ch!='/')
                {
                    result1=in.nextInt();
                }
                else
                {
                    Fraction F2=new Fraction(a1,a2);
                    F2.yuefen();
                    result3=F2.toString(F2);
                    //result3=String.valueOf(F2.fenzi)+"/"+String.valueOf(F2.fenmu);
                    result2=in.next();
                }
                if(ch=='+'&&(result1==a1+a2))
                {
                    
                    System.out.println("计算正确!");
                }
                else if(ch=='-'&&(result1==a1-a2))
                {
                    System.out.println("计算正确!");
                }
                else if(ch=='*'&&(result1==a1*a2))
                {
                    System.out.println("计算正确!");
                }
                else if(ch=='/'&&(result2.equals(result3)))
                {
                    System.out.println("计算正确!");
                }
                else
                {
                    System.out.println("计算错误!");
                }
            }
         }
    }
    public static void parentheses(int n,int p,int q)//带括号运算
    {
        for(int i=0;i<n;i++)
        {
            int num=(int)(Math.random()*8+3);//随机生成参与运算的数字数
            int num1=(int)(Math.random()*7+2);//随机生成括号内的数字数
            int num2=(int)(Math.random()*2+1);//随机生成括号后的数字数
            if(num1+num2<num)
            {
                
            int[] a={0,0,0,0,0,0,0,0,0,0};
            for(int m=0;m<num;m++)
            {
                a[m]=ranNum(a[m],p,q);
            }
            for(int m1=0;m1<num-num1-num2-1;m1++)//输出括号外的运算数
            {
                System.out.print(a[m1]);
                System.out.print(ranChar1());
            }
            System.out.print(a[num-num1-num2-1]);
            System.out.print(ranChar3());//打印括号
            for(int m2=num-num1-num2;m2<num-num2-1;m2++)
            {
                System.out.print(a[m2]);
                System.out.print(ranChar1());
            }
            System.out.print(a[num-num2-1]);
            System.out.print(ranChar4());
            for(int m3=num-num2;m3<num-1;m3++)
            {
                System.out.print(a[m3]);
            }
            System.out.println(a[num-1]+"=");
        }
        }
    }
    public static int ranNum(int a,int b,int c)
    {
        a=(int)(Math.random()*(c-b+1)+b);//随机数值范围为从b到c
        return a;
    }
    public static char ranChar1()//随机生成“+、-、*、/”运算符
    {
        char[] b={'+','-','*','/'};
        int c=(int)(Math.random()*4);
        return b[c];
    }
    public static char ranChar2()//随机生成“+、-”运算符
    {
        char[] b={'+','-'};
        int c=(int)(Math.random()*2);
        return b[c];
    }
    public static String ranChar3()//随机生成“+、-、*、/、(”运算符
    {
        String[] b={"+(","-(","*(","/("};
        int c=(int)(Math.random()*4);
        return b[c];
    }
    public static String ranChar4()//随机生成“+、-、*、/、(”运算符
    {
        String[] b={")+",")-",")*",")/"};
        int c=(int)(Math.random()*4);
        return b[c];
    }
}
class Fraction
{
    int fenzi,fenmu;
    public Fraction(){}
    public Fraction(int fenzi,int fenmu)
    {
        this.fenzi=fenzi;
        this.fenmu=fenmu;
        yuefen();
    }
    public int getFenzi()
    {
        return fenzi;
    }
    public int getFenmu()
    {
        return fenmu;
    }
    public void setFenzi(int fenzi)
    {
        this.fenzi=fenzi;
    }
    public void setFenmu(int fenmu)
    {
        this.fenmu=fenmu;
    }
    public void yuefen()//约分
    {
        int min=Math.abs(fenzi)<Math.abs(fenmu)?Math.abs(fenzi):Math.abs(fenmu);
        int yueshu=1;
        for(int i=min;i>=1;i--)
        {
            if((fenzi%i==0)&&(fenmu%i==0))
            {
                yueshu=i;
                break;
            }
        }
        fenzi=fenzi/yueshu;
        fenmu=fenmu/yueshu;
    }
    public Fraction add(Fraction a,Fraction b)//
    {
        Fraction c=new Fraction();
        c.fenzi=a.fenzi*b.fenmu+a.fenmu*b.fenzi;
        c.fenmu=a.fenmu*b.fenmu;
        c=new Fraction(c.fenzi,c.fenmu);
        return c;
    }
    public Fraction subtract(Fraction a,Fraction b)//
    {
        Fraction c=new Fraction();
        c.fenzi=a.fenzi*b.fenmu-a.fenmu*b.fenzi;
        c.fenmu=a.fenmu*b.fenmu;
        c=new Fraction(c.fenzi,c.fenmu);
        return c;
    }
    public Fraction  multiply(Fraction a,Fraction b)//
    {
        Fraction c=new Fraction();
        c.fenzi=a.fenzi*b.fenzi;
        c.fenmu=a.fenmu*b.fenmu;
        c=new Fraction(c.fenzi,c.fenmu);
        return c;
    }
    public Fraction division(Fraction a,Fraction b)//
    {
        Fraction c=new Fraction();
        c.fenzi=a.fenzi*b.fenmu;
        c.fenmu=a.fenmu*b.fenzi;
        c=new Fraction(c.fenzi,c.fenmu);
        return c;
    }
    public int ranNum(int b,int c)
    {
        int a;
        a=(int)(Math.random()*(c-b+1)+b);//随机数值范围为从b到c
        return a;
    }
    public static char ranChar()//随机生成“+、-、*、/”运算符
    {
        char[] b={'+','-','*','/'};
        int c=(int)(Math.random()*4);
        return b[c];
    }
    public String toString(Fraction Fra3)
    {
        String resultS="";
        if(Fra3.fenzi>Fra3.fenmu&&(Fra3.fenzi%Fra3.fenmu!=0))
        {
            int z=Fra3.fenzi/Fra3.fenmu;
            resultS+=z+"'"+(Fra3.fenzi-z*Fra3.fenmu)+"/"+Fra3.fenmu;
        }
        else if(Fra3.fenzi%Fra3.fenmu==0)
        {
            resultS+=Fra3.fenzi/Fra3.fenmu;
        }
        else
        {
            resultS+=Fra3.fenzi+"/"+Fra3.fenmu;
        }
        return resultS;
    }
    public void TrueNum(int b,int c)
    {
        Scanner in=new Scanner(System.in);
        Fraction Fra1=new Fraction();//第一个分数
        Fraction Fra2=new Fraction();//第二个分数
        Fraction Fra3=new Fraction();
        
        Fra1.fenzi=ranNum(b,c);
        Fra1.fenmu=ranNum(b,c);
        Fra2.fenzi=ranNum(b,c);
        Fra2.fenmu=ranNum(b,c);
        Fra1.yuefen();
        Fra2.yuefen();
        char ch=ranChar();
        String resultF="";
        if((Fra1.fenzi<Fra1.fenmu) && (Fra2.fenzi<Fra2.fenmu))
        {
            System.out.print(Fra1.fenzi+"/"+Fra1.fenmu);
            System.out.print(ch);
            System.out.println(Fra2.fenzi+"/"+Fra2.fenmu+"=");
            System.out.println("请输入结果:");
            String resultS=in.next();//输入的结果
            if(ch=='+')
            {
                Fra3=add(Fra1,Fra2);
                resultF=toString(Fra3);
                if(resultS.equals(resultF))
                {
                    System.out.println("计算正确!");
                }
                else
                {
                    System.out.println("计算错误!");
                }
            }
            if(ch=='-')
            {
                Fra3=subtract(Fra1,Fra2);
                resultF=toString(Fra3);
                if(resultS.equals(resultF))
                {
                    System.out.println("计算正确!");
                }
                else
                {
                    System.out.println("计算错误!");
                }
            }
            if(ch=='*')
            {
                Fra3=multiply(Fra1,Fra2);
                resultF=toString(Fra3);
                if(resultS.equals(resultF))
                {
                    System.out.println("计算正确!");
                }
                else
                {
                    System.out.println("计算错误!");
                }
            }
            if(ch=='/')
            {
                Fra3=division(Fra1,Fra2);
                resultF=toString(Fra3);
                if(resultS.equals(resultF))
                {
                    System.out.println("计算正确!");
                }
                else
                {
                    System.out.println("计算错误!");
                }
            }
        }
        else
        {
            TrueNum(b,c);
        }
    }
}

运行结果截图:

编程总结分析:对于除法(或分数)应用字符串形式判断输入的计算值是否正确,未能成功连接数据库。

项目计划日志:

周活动总结表

学生:曹婷婷                              日期:2017.3.20

日期 听课(min) 编写程序(min) 查阅资料(min) 日总计(min)
周一3.6   60   60
周二3.7        
周三3.8   30   30
周四3.9        
周五3.10 60 30 10 40
周六3.11   60 30 90
周日3.12   3000   3000
周总计: 60 3180 40 3220

 

时间记录日志:

时间记录日志

学生:曹婷婷                                                               日期:2017.3.20

教师:王建民                                                             课程:软件工程概论

日期 开始时间 结束时间 中断时间 净时间 活动 备注
3.18 14:00 16:00 10min 110min 上课 休息
18:30 19:00 0 30min 在“二柱子02”基础上做改动  
3.19 10:00 11:35 13min 82min 写“二柱子02”,改进除法部分 休息
3.20 9:30 11:30 30min 90min 写“二柱子02”完善分数计算的方法 休息
14:30 17:00 30min 2h 写“二柱子03”完成查重功能 玩儿
18:00 20:00 30,min 90min 写连接数据库部分,未完成 休息

缺陷记录日志:

缺陷记录日志

学生:曹婷婷                             教师:王建民

程序:“二柱子03                   日期:2017/3/20

日期 编号 引入阶段 排除阶段 修复时间 修复缺陷
3.18 1 编码 编译 30min 控制除法有余数时的输入
3.19 2 编码 编译 30min 控制分数的运算
3.20 3 编码 编译 10min 括号运算的改进
posted on 2017-03-17 19:32  曹婷婷  阅读(209)  评论(0编辑  收藏  举报