javaweb-四则运算
这次作业,我们选择的是网页开发,后来我们小组才知道自己这方面的知识还是太匮乏了。
主要代码:
public class calcu extends HttpServlet{
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String smax="";
String smin="";
String snum="";
int[] control=new int[2];
smax=request.getParameter("Maxnum");
smin=request.getParameter("Minnum");
snum=request.getParameter("Num");
String a=request.getParameter("1");
String b=request.getParameter("2");
control[1]=Integer.parseInt(a);
control[0]=Integer.parseInt(b);
int max=Integer.parseInt(smax);
int min=Integer.parseInt(smin);
int num=Integer.parseInt(snum);
caculate(max,min,num,control);
}
char ops[] = { '+', '-', '*', '/', '(', ')', '=' };
char cmp[][] = { { '>', '>', '<', '<', '<', '>', '>' },
{ '>', '>', '<', '<', '<', '>', '>' },
{ '>', '>', '>', '>', '<', '>', '>' },
{ '>', '>', '>', '>', '<', '>', '>' },
{ '<', '<', '<', '<', '<', '=', ' ' },
{ '>', '>', '>', '>', ' ', '>', '>' },
{ '<', '<', '<', '<', '<', ' ', '=' } }; boolean IsOperator(char ch)
{
for (int i = 0; i < 7; i++)
if (ch == ops[i])
return true;
return false;
}
char Compare(char ch1, char ch2)
{
int i, m = 0, n = 0;
char priority;
for (i = 0; i < 7; i++) { //找到相比较的两个运算符在比较矩阵里的相对位置
if (ch1 == ops[i])
m = i;
if (ch2 == ops[i])
n = i;
}
priority = cmp[m][n];
return priority;
} Boolean Compute(double x, char op, double y, double z)
{
switch (op) {
case '+': z = x + y;
break;
case '-': z = x - y;
break;
case '*': z = x * y;
break;
case '/': if (y==0) {
z = x / y;
break;
}
return false;
}
return true;
}
int ExpEvaluation(char str[], int result)
{
double a, b, v = 0;
char ch, op;
int temp, i = 0;
Stack<Character> optr = new Stack<Character>();
Stack<Integer> opnd = new Stack<Integer>();
optr.push('=');
ch = str[i++];
while (ch != '=' || optr.pop() != '=') {
while (ch == ' ') //跳过空格
ch = str[i++];
if (IsOperator(ch)) { //是7种运算符之一
switch (Compare(optr.pop(), ch)) {
case '<': //栈顶运算符优先级低
optr.push(ch);
ch = str[i++];
break;
case '=': //脱括号并接收下一字符
optr.pop();
ch = str[i++];
break;
case '>': //栈顶运算符优先级高,退栈并将运算结果入栈
op = optr.pop();
optr.pop();
b = opnd.pop();
opnd.pop();
a = opnd.pop();
opnd.pop();
if (Compute(a, op, b, v)) { //计算v = a <op> b
opnd.push((int) v);
break;
}
else {
result = 0;
return result;
}
}
}
else { //是数字
temp = ch - '0'; //将字符转换为十进制数
ch = str[i++];
while (!IsOperator(ch) && ch != ' ') {
temp = temp * 10 + ch - '0'; //将逐个读入运算数的各位转化为十进制数
ch = str[i++];
}
opnd.push(temp); //数值入栈
}
}
result = opnd.pop();
return result;
} public void caculate(int num_max,int num_min,int itemnum,int control[]) {
int bracket_num;
int num_num;
String express = "";
char symbol[]=new char[]{'+','-','*','/'};
char[] c=new char[20];
String item[]=new String[itemnum];
int[] result = new int[itemnum];
for(int count=0; count<itemnum; count++)
{
num_num =(int) (Math.random() % 10);
String str[] = new String[num_num];
if (num_num == 0 || num_num == 1)
{
count--;
continue;
}
int num[] = new int[num_num];
int symnum[] = new int[num_num - 1];
char sym[] = new char[num_num - 1]; int bracket_leftposition, bracket_rightposition;
int bracket_left_time[] = new int[num_num]; //定义左、右括号生成次数数组,下标为数字位置
int bracket_right_time[] = new int[num_num];
String bracket_left[] = new String[num_num]; //定义左右括号字符串型数组
String bracket_right[] =new String[num_num];
for (int rcount = 0; rcount<num_num; rcount++) //左、右括号生成次数初始化
{
bracket_left_time[rcount] = 0;
bracket_right_time[rcount] = 0;
} //给参与计算的数赋值(指定数值范围)
for (int cnum = 0; cnum<num_num; cnum++)
{
num[cnum] =(int) (Math.random() % (num_max - num_min + 1) + num_min);
} //随机生成式子的各个位置的符号
for (int snum = 0; snum<num_num - 1; snum++)
{
symnum[snum] =(int) (Math.random() % control[0]);
sym[snum] = symbol[symnum[snum]];
} if (control[1] == 0)
{
bracket_num = (int) (Math.random() % 3 + 1);
//生成括号次数
for (int bcount = 0; bcount<bracket_num; bcount++)
{
bracket_leftposition = (int) (Math.random() % num_num); //随机生成左右括号的位置
bracket_rightposition = (int) (Math.random() % num_num);
if ((bracket_leftposition >= bracket_rightposition)||((bracket_leftposition==0)&&(bracket_rightposition==num_num-1))) //先剔除部分一次性在一个数左右同时生成左右括号和在整个式子前后生成式子的情况
{
continue;
}
bracket_left_time[bracket_leftposition]++; //该位置数左括号生成次数+1
bracket_right_time[bracket_rightposition]++;
}
}
for (int stnum = 0; stnum < num_num-2; stnum++)
{
if ((symbol[symnum[stnum]] == '/') && (symbol[symnum[stnum + 1]] == '/'))
{
bracket_left_time[stnum]++;
bracket_right_time[stnum + 1]++;
}
}
for (int snum = 0; snum < num_num ; snum++)
{ if (bracket_left_time[snum] == 1)
{
bracket_left[snum] = "(";
}
if (bracket_left_time[snum] == 2)
{
bracket_left[snum] = "((";
}
if (bracket_left_time[snum] == 3)
{
bracket_left[snum] = "(((";
}
if (bracket_right_time[snum] == 1)
{
bracket_right[snum] = ")";
}
if (bracket_right_time[snum] == 2)
{
bracket_right[snum] = "))";
}
if (bracket_right_time[snum] == 3)
{
bracket_right[snum] = ")))";
}
for (int bpcount = 0; bpcount<num_num; bpcount++) //再次扫描数字左右括号生成次数相等的情况并排除
{
if (bracket_left_time[bpcount] == bracket_right_time[bpcount])
{
bracket_right[bpcount] = "";
bracket_left[bpcount] = "";
}
}
} for (int i = 0; i < num_num; i++)
{
int temp = num[i];
str[i] = temp+"";
}
for (int ph = 0; ph<num_num - 1; ph++)
{
express =express+bracket_left[ph]+str[ph]+bracket_right[ph]+sym[ph];
}
express = express + bracket_left[num_num - 1] +str[num_num - 1]+ bracket_right[num_num - 1];
item[count] = express+"="; int ans=ExpEvaluation(c, result[count]); //求表达式的值
String anstr=ans+"";
JavaBean jBean=new JavaBean();
DBBean sBean=new DBBean();
jBean.setStr(item[count]);
jBean.setAnswer1(anstr);
String sql="insert into record(str,ans1) values(?,?)";
int numresult=sBean.getInsert(sql,jBean);
express="";
} } }
javaweb-四则运算的更多相关文章
- Javaweb——四则运算---18.11.01
---恢复内容开始--- test.jsp <%@ page language="java" contentType="text/html; charset=utf ...
- 四则运算自动出题之javaweb版
四则运算出题机之JAVAWEB版 要求还是和之前的出题形式一样 begin.jpg <%@ page language="java" contentType="te ...
- 四则运算————javaweb版
1.设计思路: 定义一个类arithmetic,在该类中的定义相关成员,随机产生的题目以及答案用数组承接,在第一个jsp里面用户输入题目数量以及设置做题时间,将这两个数传到第二个jsp页面,在此页面定 ...
- 悲催的二柱子们做小学二年级四则运算题(Javaweb)
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding= ...
- Javaweb版四则运算
显示出题界面shu01.jsp <%@ page language="java" contentType="text/html; charset=UTF-8&quo ...
- JavaWeb入门笔记
Java web笔记 一.HTTP协议 HTTP(超文本传输协议),它是一种主流B/S架构中应用的通信协议.具有以下特点: 1.无状态 服务端不会记录客户端每次提交的请求,服务器一旦相应客户端之后,就 ...
- 四则运算web版需求规格说明书
目录 1引言... 4 1.1 目的... 4 1.2 背景... 4 1.3 术语... 4 1.4 预期读者与阅读建议... 5 1.5 参考资料... 6 1.6 需求描述约定... ...
- 从啥也不会到可以胜任最基本的JavaWeb工作,推荐给新人的学习路线(二)
在上一节中,主要阐述了JavaScript方面的学习路线.先列举一下我朋友的经历,他去过培训机构,说是4个月后月薪过万,虽然他现在还未达到这个指标. 培训机构一般的套路是这样:先教JavaSE,什么都 ...
- JavaWeb——Servlet
一.基本概念 Servlet是运行在Web服务器上的小程序,通过http协议和客户端进行交互. 这里的客户端一般为浏览器,发送http请求(request)给服务器(如Tomcat).服务器接收到请求 ...
- JavaWeb——Listener
一.基本概念 JavaWeb里面的listener是通过观察者设计模式进行实现的.对于观察者模式,这里不做过多介绍,大概讲一下什么意思. 观察者模式又叫发布订阅模式或者监听器模式.在该模式中有两个角色 ...
随机推荐
- golang执行linux命令
golang exec 执行系统命令 golang 2014-09-25 13:17:44 2779 0 0 exec.Command() 最简单的方法: cmd := exe ...
- netbeans for php常用快捷键
文本编辑 复制当前行到上一行/下一行ctl+shf+up 移动当前行到上一行/下一行shf+alt+left/right/down/up 删除当前行ctl+E 生成下一行shf+enter(回车) 大 ...
- Velocity教程 (zhuan)
http://blog.csdn.net/qq_25237663/article/details/52262532 ****************************************** ...
- shelve模块
#coding:utf-8 __author__ = 'similarface' #email:similarface@outlook.com ''' shelve模块: 映射容器 存储对象,被存储的 ...
- idea项目部署
idea新建项目: http://blog.csdn.net/wo541075754/article/details/46348135 详细 http://www.cnblogs.com/wql02 ...
- php数据通信方式
一:curl$ch = curl_init();curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);curl_setopt($ch,CURLOPT_TIMEOU ...
- Linux 打包和压缩 方法详解
一般基因组的数据都非常大,所以都会 打包 压缩 后进行传输,拿到数据后的第一步必然就是要 解包 和 解压缩. 基本常识 首先要弄清两个概念:打包 和 压缩. 打包 是指将一大堆文件或目录变成一个总的文 ...
- computer English
算法常用术语中英对照Data Structures 基本数据结构Dictionaries 字典PriorityQueues 堆Graph Data Structures 图Set Data Struc ...
- hibernate执行sql的三种方式
方式一:直接使用HibernateTemplate的find()方法,find方法支持执行hql语句 List<T> list = this.getHibernateTemplate(). ...
- 一些用于数据整理的excel函数
我们经常要从外部数据源(如数据库.文本文件或网页等)将数据导入excel中,但是此类数据往往比较混乱,无法满足我们的要求,因此在进行数据分析之前,需要将这些数据进行整理清洗,excel由于将数据的管理 ...