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

时间: 2024-10-14 06:50:18

Java Web ClassProgram_3的相关文章

java web环境搭建

1. 根据自己电脑版本下载对应的tomcat和eclipse安装包 2. 在eclipse中找到preferences 找到 runtime environments 找到add 3. 选择tomcat的版本 next 4. 选择browse  tomcat解压的地方选择对应的版本,最后finsih 5. 数据库方面 只需要下载Mysql的安装包即可. 最后完成了java web环境的搭建.

Java Web -- Servlet(1) 必备知识

学习Java WEB开发必备的基本概念: 1.WEB 本意是蜘蛛网和网的意思,在网页设计中我们称为网页的意思.现广泛译作网络.互联网等技术领域.表现为三种形式,即超文本(hypertext).超媒体(hypermedia).超文本传输协议(HTTP)等. 2.静态网页(可简单理解为html) 是指网页的内容是固定的,不会根据浏览器者的不同需求而改变.(实实在在保存在服务器上的文件) 3.动态网页 是指在接到用户访问要求后动态生成的页面,页面内容会随着访问时间和访问者发生变化(并不是独立存在于服务

[Java Web]2\Web开发中的一些架构

1.企业开发架构: 企业平台开发大量采用B/S开发模式,不管采用何种动态Web实现手段,其操作形式都是一样的,其核心操作的大部分都是围绕着数据库进行的.但是如果使用编程语言进行数据库开发,要涉及很多诸如事务.安全等操作问题,所以现在开发往往要通过中间件进行过渡,即,程序运行在中间件上,并通过中间件进行操作系统的操作,而具体一些相关的处理,如事务.安全等完全由中间件来负责,这样程序员只要完成具体的功能开发即可. 2.Java EE架构: Java EE 是在 Java SE 的基础上构建的,.NE

在java web项目中集成webservice

公司要求在项目中加入webservice服务,因为项目中使用了spring框架,所以在这里使用与spring兼容性较好的cxf来实现 cxf所需jar包 spring的jar包就不贴了 一:创建webservice服务器 1)创建一个服务接口 package com.service; import javax.jws.WebParam; import javax.jws.WebService; @WebService public interface IHelloWorld { public S

Java Web项目中缺少Java EE 6 Libraries怎么添加

具体步骤如下: 1.项目名称上点击鼠标右键,选择"Build Path-->Configure Build Path-->Java Build Path" 2.单击"Add Library..." 3.选择"User Library",单击"Next" 4.单击"User Libraries...",选择需要的Java EE 6 Libraries Java Web项目中缺少Java EE 6

java web 程序---购物车选商品,购买,付款

虚函数使用的时机 为什么虚函数不总是适用? 1. 虚函数有事会带来很大的消耗: 2. 虚函数不总是提供所需的行为: 3. 当我们不考虑继承当前类时,不必使用虚函数. 必须使用虚函数的情况: 1. 当你想删除一个表面上指向基类对象,实际却是指向派生类对象的指针,就需要虚析构函数. java web 程序---购物车选商品,购买,付款,布布扣,bubuko.com

使用Struts框架的Java Web项目中的两个Session的区别和常见的Session取值为空的错误

我的百度知道回答,感觉这个知识很有意义,专门贴出来. 不过还有待验证的地方,就是 ActionContext.getContext().getSession("name", "Tom"); //如果在JSP中通过 EL 或者 Struts2 标签怎么显示? 以下是回答正文. 很多初学Java Web的同学因为使用 Strut2框架而分不清两个 Session的区别. 1.   JSP/Servlety有个原生的 session 对象,这是9大内置对象中的一个,书上写

java Web(2)

Servlet与web容器的配合: 1)客户端向Web服务器发起一个HTTP请求. 2)HTTP请求被Web服务器接受,如果请求的是静态页面,则由Web服务器负责处理.如果请求的是Java Web组件(Servlet或者JSP),则移交给Web容器.Web容器可以在主               机的同一个进程.不同的进程或其他的Web服务主机的进程中启动. 3)Web容器根据Servlet的配置文件确定调用的具体Servlet类,并把request对象.response对象传给它. 4)Ser

java web 数据库开发1

一个完整的数据库部署架构通常由客户端和服务器端两部分组成.客户端封装数据库请求将其发送给服务器端,服务器端执行完毕将其及结果返回给服务器端. 以mysql为例 介绍java应用程序对数据库的访问 JDBC意义:应用程序通过调用统一接口实现对任意数据库的访问,为我们屏蔽了客户端与服务器端交互协议的实现细节. 对java而言,JDBC是一个类库,对数据库而言,JDBC是接口规范. 有了JDBC,应用程序变得更加简单,提高了程序开发的效率,使java web面向不同的数据库时,具有跨平台性,基于JDB