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;
    }
    }

  • 相关阅读:
    WebBrowser
    hibernate关系映射(多对多)
    hibernate关系映射(多对一)
    使用maven构建hibernate
    使用maven构建web项目
    Chapter 6 ViewController
    Chapter 5 带颜色的同心圆
    Symbol(s) not found for architecture arm64
    反射实现NSCodingProtocol 帮助类
    UITableView默认选中第一行
  • 原文地址:https://www.cnblogs.com/zhanghengstdu/p/6547905.html
Copyright © 2011-2022 走看看