zoukankan      html  css  js  c++  java
  • Java Web ClassProgram_3

    针对四则运算,进行了进一步的修改,基于类的思想,将项目拆解成随机数字生成和随机操作符生成和运算两大类

    随机数字采用 分子/分母 的表达方式,可以表示所有的数字类型。如分数,整数,小数

    由于运算采用了新的数据类型,导致需要编写一定的计算原则;

    代码如下:

    centrue.class

    package pro2;

    import java.awt.BorderLayout;

    import javax.swing.JFrame;


    public class centrue extends JFrame{
    NorthPanel north;
    public centrue(){
    north=new NorthPanel();
    this.setSize(800, 600);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.add(north, BorderLayout.NORTH);
    this.setVisible(true);
    }
    public static void main(String[] args) {
    centrue c=new centrue();

    }

    }

    Count.java

    package pro2;

    import java.util.LinkedList;
    import java.util.Random;
    import java.util.Stack;

    public class Count {
    int min;
    int max;
    int list[];
    int bound; // 表示list中有几个type数字
    boolean isbracket; // 是否有括号
    int number; //数字范围2-5
    LinkedList<Figure> figure;
    char[] operatelist;
    String shizi;
    String daan;
    public Count(int min, int max, int list[], int bound, int number,boolean isbracket) {

    this.max = max;
    this.min = min;
    this.list = list;
    this.bound = bound;
    this.number = number;
    this.isbracket = isbracket;
    figure=new LinkedList<Figure>();
    this.getCompound();
    this.getString();
    System.out.println(this.shizi);
    this.calculation();
    }

    // 获得计算堆栈,包括括号
    public void getCompound() {
    int braIndex[] ={0,0,0,0};
    int braNum=0;
    Random ran = new Random();
    if(!isbracket){
    operatelist=new char[number+1];
    }
    if (number < 6 && number >= 3 && isbracket) {
    braNum = 2;
    operatelist=new char[number+braNum+1];

    braIndex[0] = ran.nextInt(number - 1) + 1;
    operatelist[braIndex[0]]='(';
    braIndex[1] = ran.nextInt(number-braIndex[0]) + braIndex[0]+2;
    if(braIndex[0]==1&&braIndex[1]==braNum+number-1){
    braIndex[1]--;
    }
    operatelist[braIndex[1]]=')';
    }
    //数字插入限制受限
    // 六个数字的括号插入等待实现
    else if (number >= 6 && number >= 3 && isbracket) {
    }
    // 数字进队列
    for (int i = 0; i < number; i++) {
    int type = list[ran.nextInt(bound)];
    figure.add(new Figure(min, max, type));
    }
    // 操作符生成
    for (int i = 1; i < number+braNum; i++) {
    int type = ran.nextInt(4);
    char a='+';
    switch (type) {
    case 0:
    a = '+';
    break;
    case 1:
    a = '-';
    break;
    case 2:
    a = '*';
    break;
    case 3:
    a = '/';
    break;
    }
    boolean flag=true;
    for(int j=0;j<braNum;j++){
    if(braIndex[j]==i){
    flag=false;
    }
    }
    if(flag){
    operatelist[i]=a;
    }
    }
    //添加前后两个神奇字符
    operatelist[0]='#';
    operatelist[number+braNum]='#';
    }
    public void show(){
    System.out.println("操作符数组");
    for(int i=0;i<operatelist.length;i++){
    System.out.println(operatelist[i]);
    }
    for(int i=0;i<figure.size();i++){
    System.out.println(figure.get(i));
    }
    }
    public void getString(){
    String shi="";
    int i=0;
    int j=0;
    while(true){
    shi=shi+operatelist[j];
    if(operatelist[j+1]=='('){
    j++;
    shi=shi+operatelist[j];
    }
    j++;
    shi=shi+figure.get(i);
    if(operatelist[j]==')'){
    shi=shi+operatelist[j];
    j++;
    }
    i++;
    if(j==operatelist.length-1){
    break;
    }
    }
    shizi=shi;
    }
    public String toString(){
    return shizi;
    }
    public void calculation(){
    Stack<Figure> fiStack=new Stack<Figure>(); //figure 数据栈
    Stackchar chStack=new Stackchar(); //char 数据栈
    int charIndex=0;
    int FigureIndex=0;
    //#字符压入栈中
    chStack.push(operatelist[charIndex++]);
    //第一个字符压入
    if(operatelist[charIndex]!='('){
    chStack.push(operatelist[charIndex++]);
    //防止 * (
    if(operatelist[charIndex]=='('){
    chStack.push(operatelist[charIndex++]);
    }
    }
    else{
    chStack.push(operatelist[charIndex++]);
    chStack.push(operatelist[charIndex++]);
    }
    //两个数字压入栈中
    fiStack.add(figure.get(FigureIndex++));
    fiStack.add(figure.get(FigureIndex++));
    while(true){
    if(this.compare(chStack.getTop(),operatelist[charIndex])){

    System.out.println("tan栈操作");
    System.out.println("剩余数字数量"+fiStack.size());
    System.out.println("剩余字符数量"+chStack.size());
    System.out.println(FigureIndex);
    char ope=chStack.pop();
    if(ope=='('){
    charIndex++;
    }
    else{
    Figure f1=fiStack.pop();
    Figure f2=fiStack.pop();
    fiStack.push(SimpleCount.count(f1, f2, ope));
    }
    }
    else{
    chStack.push(operatelist[charIndex++]);

    System.out.println("进栈操作");
    System.out.println("剩余数字数量"+fiStack.size());
    System.out.println("剩余字符数量"+chStack.size());
    System.out.println(FigureIndex);


    fiStack.push(figure.get(FigureIndex++));
    if(operatelist[charIndex]=='('){
    chStack.push(operatelist[charIndex++]);
    }
    }
    if(fiStack.size()==1&&FigureIndex==figure.size()){
    Figure ff;
    ff=fiStack.pop();
    ff.type=1;
    ff.huajian();
    daan=ff.toString();
    break;
    }
    }

    }
    public boolean compare(char a,char b) {
    int a1=0,b1=0;
    if(a=='+'||a=='-'){
    a1=2;
    }
    if(a=='*'||a=='/'){
    a1=3;
    }
    if(a=='('){
    a1=1;
    }
    if(a=='#'){
    a1=0;
    }
    if(b==')'||b=='#'){
    b1=1;
    }
    if(b=='+'||b=='-'){
    b1=2;
    }
    if(b=='*'||b=='/'){
    b1=3;
    }
    if(b=='('){
    b1=4;
    }
    if(a1>=b1){
    return true;
    }
    else{
    return false;
    }
    }
    }

    Figure.java

    /**
    * min返回数字的最小值 max 最大值 type返回数字类型
    * type=0 返回整数
    */
    package pro2;

    import java.util.Random;

    public class Figure {
    int zi;
    int mu;

    int min;
    int max;

    int type;
    public Figure(int min,int max,int type){
    this.max=max;
    this.min=min;
    this.type=type;
    this.returnFigure();
    }
    public Figure(int zi,int mu){
    this.zi=zi;
    this.mu=mu;
    }
    public void returnFigure(){
    Random ran=new Random();
    switch (type) {
    //生成整数
    case 0:
    zi=(int)((max-min)*Math.random())+min;
    mu=1;
    break;
    //生成分数
    case 1:
    zi=ran.nextInt((int)((max-min)*Math.random())+min);
    mu=ran.nextInt(zi*10+1)+1;
    System.out.println("zi="+zi+"mu="+mu);
    this.huajian();
    break;
    //生成double
    case 2:
    zi=(int)((((max-min)*Math.random())+min)*100);
    mu=100;
    break;
    }
    }
    public void huajian(){
    int chu=1;
    for(int i=1;i<=Math.min(zi, mu);i++){
    if(zi%i==0&&mu%i==0){
    chu=i;
    }
    }
    zi=zi/chu;
    mu=mu/chu;
    }
    public String toString(){
    switch (type) {
    case 0:
    return String.valueOf(zi);
    case 1:
    return zi+"%"+mu;
    case 2:
    double ok=((double)zi)/mu;
    return ok+"";
    default:
    return null;
    }
    }
    }

    NorthPanel.java

    package pro2;

    import java.awt.BorderLayout;
    import java.awt.Checkbox;
    import java.awt.CheckboxGroup;
    import java.awt.Component;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;

    import javax.swing.JButton;
    import javax.swing.JCheckBox;
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    import javax.swing.JRadioButton;
    import javax.swing.JTextArea;
    import javax.swing.plaf.basic.BasicBorders.RadioButtonBorder;

    public class NorthPanel extends JPanel implements ActionListener{

    //题目数据
    int min=0;
    int max=0;
    int list[]=new int[4];
    int bound=0; // 表示list中有几个type数字
    boolean isbracket=false; // 是否有括号
    int number=4; //数字范围2-5


    JPanel Northjp;
    SouthPanel south;
    JCheckBox r1=new JCheckBox("整数", true);
    JCheckBox r2=new JCheckBox("分数", false);
    JCheckBox r3=new JCheckBox("小数", false);

    JRadioButton jr=new JRadioButton("有括号",false);

    JLabel jl=new JLabel("题目数字个数");
    JTextArea num=new JTextArea("4");

    JLabel jll=new JLabel("最大最小值");
    JTextArea minText=new JTextArea("10");
    JTextArea maxText=new JTextArea("100");

    JButton jb=new JButton("出题目");
    public NorthPanel(){
    this.setLayout(new BorderLayout());
    Northjp=new JPanel();
    Northjp.setLayout(new GridLayout(2,6));
    Northjp.add(r1);
    Northjp.add(r2);
    Northjp.add(r3);
    Northjp.add(jr);
    Northjp.add(jl);
    Northjp.add(num);
    Northjp.add(jll);
    Northjp.add(minText);
    Northjp.add(maxText);
    Northjp.add(jb);

    this.add(Northjp, BorderLayout.NORTH);

    jb.addActionListener(this);
    }
    public void chuti(){
    if(south!=null){
    south.setVisible(false);
    }
    south=new SouthPanel(min, max, list, bound, number, isbracket);
    this.add(south, BorderLayout.SOUTH);
    this.setVisible(false);
    this.setVisible(true);
    }
    @Override
    public void actionPerformed(ActionEvent e) {
    // TODO Auto-generated method stub
    min=Integer.parseInt(minText.getText());
    max=Integer.parseInt(maxText.getText());
    number=Integer.parseInt(num.getText());
    bound=0;
    if(jr.isSelected()){
    isbracket=true;
    }
    if(r1.isSelected()){
    list[bound++]=0;
    }
    if(r2.isSelected()){
    list[bound++]=1;
    }
    if(r3.isSelected()){
    list[bound++]=2;
    }

    String message = "";
    boolean flag=true;
    if(min>max){
    message=message+";应该左小又大";
    flag=false;
    }
    if(number<2||number>5){
    message=message+";数字数量应该小于6大于2";
    flag=false;
    }
    if(bound<1){
    message=message+";至少选中一个数据,如整数";
    flag=false;
    }
    if(flag){
    this.chuti();
    }
    else{
    JOptionPane.showMessageDialog(null, message);
    }
    }
    }

    SimpleCount.java

    package pro2;

    public class SimpleCount {
    public static Figure count(Figure f1, Figure f2, char a) {
    Figure value;
    int zi=1;
    int mu=1;
    switch (a) {
    case '+':
    zi=f1.zi*f2.mu+f2.zi*f1.mu;
    mu=f1.mu*f2.mu;
    break;
    case '-':
    zi=f2.zi*f1.mu-f1.zi*f2.mu;
    mu=f1.mu*f2.mu;
    break;
    case '*':
    zi=f1.zi*f2.zi;
    mu=f1.mu*f2.mu;
    break;
    case '/':
    zi=f2.zi*f1.mu;
    mu=f2.mu*f1.zi;
    break;
    }
    value=new Figure(zi, mu);
    return value;
    }
    }

    SouthPanel.java

    package pro2;

    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;

    import javax.swing.JButton;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JTextArea;

    public class SouthPanel extends JPanel implements ActionListener{
    int min;
    int max;
    int list[];
    int bound; // 表示list中有几个type数字
    boolean isbracket; // 是否有括号
    int number; //数字范围2-5
    String count[]=new String[30];
    String result[]=new String[30];

    JLabel jlCount[]=new JLabel[30];
    JLabel jResult[]=new JLabel[30];
    JTextArea jAnswer[]=new JTextArea[30];

    JButton jb=new JButton("提交答案");

    public SouthPanel(int min, int max, int list[], int bound, int number,boolean isbracket){
    this.max = max;
    this.min = min;
    this.list = list;
    this.bound = bound;
    this.number = number;
    this.isbracket = isbracket;
    this.setLayout(new GridLayout(16,6));
    this.addCount();
    jb.addActionListener(this);
    this.setVisible(false);
    this.setVisible(true);
    }

    public void addCount(){

    for(int i=0;i<30;i++){
    Count c=new Count(min, max, list, bound, number, isbracket);
    count[i]=c.toString();
    result[i]=c.daan;
    jlCount[i]=new JLabel(count[i]);
    this.add(jlCount[i]);
    jAnswer[i]=new JTextArea();
    this.add(jAnswer[i]);
    jResult[i]=new JLabel("");
    this.add(jResult[i]);
    }

    this.add(jb);
    }
    public void result(){
    for(int i=0;i<30;i++){
    if(!result[i].equals(jAnswer[i].getText())){
    jResult[i].setText(result[i]);
    }
    }
    }

    @Override
    public void actionPerformed(ActionEvent e) {
    // TODO Auto-generated method stub
    this.result();
    }
    }

    Stackchar.java

    package pro2;

    public class Stackchar {
    char a[];
    int index;
    public Stackchar(){
    a=new char[10];
    index=0;
    }
    public void push(char b){
    a[index]=b;
    index++;
    }
    public char pop(){
    char k=a[index-1];
    index--;
    return k;
    }
    public char getTop(){
    return a[index-1];
    }
    public int size(){
    return index;
    }
    }

  • 相关阅读:
    Java实现 蓝桥杯VIP 算法提高 排队打水问题
    Java实现 蓝桥杯VIP 算法提高 排队打水问题
    Java实现 蓝桥杯VIP 算法提高 排队打水问题
    Java实现 蓝桥杯VIP 算法提高 特殊的质数肋骨
    Java实现 蓝桥杯VIP 算法提高 特殊的质数肋骨
    Java实现 蓝桥杯VIP 算法提高 特殊的质数肋骨
    Java实现 蓝桥杯VIP 算法提高 特殊的质数肋骨
    现在使用控件, 更喜欢继承(覆盖控件已有的函数,很奇怪的一种使用方式)
    Controls 属性与继承 TShape 类的小练习(使用TShape可以解决很多图形问题)
    QT创建窗口程序、消息循环和WinMain函数(为主线程建立了一个QEventLoop,并执行exec函数)
  • 原文地址:https://www.cnblogs.com/zhanghengstdu/p/6547905.html
Copyright © 2011-2022 走看看