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是通过观察者设计模式进行实现的.对于观察者模式,这里不做过多介绍,大概讲一下什么意思. 观察者模式又叫发布订阅模式或者监听器模式.在该模式中有两个角色 ...
随机推荐
- D3.js 其他选择元素方法
在上一节中,已经讲解了 select 和 selectAll,以及选择集的概念.本节具体讲解这两个函数的用法. 假设在 body 中有三个段落元素: <p>Apple</p> ...
- python语法笔记(五)
1.python内存管理 (1)对象内存使用 &nsbp;&nsbp;&nsbp;&nsbp;在python中通过执行内建函数 id(obj) 可以获得对象obj在内存 ...
- VC++导入导出类
一.导出类 VC++中导出类很简单,下面列出了两个等价的方法: 方法1: class __declspec(dllexport) CTest { public: int m_nValue ...
- java 多线程8(守护线程)
比如:后台偷偷运行的那些,qq下载更新包 如果一个进程中只剩下了守护线程,那么守护线程也会死亡.. 一个线程默认都不是守护线程. 判断是否是守护线程:例:d.isDaemon(); 当一个线程随着你的 ...
- 高可用性中的脑裂问题(split-brain problem in HA)(转)
欢迎关注我的社交账号: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://gith ...
- 20145218 《Java程序设计》第9周学习总结
20145218 <Java程序设计>第9周学习总结 教材学习内容总结 16.1.1 JDBC简介 JDBC全名Java DataBase Connectivity,是java联机数据库的 ...
- c头文件包含关系--记今天调试的郁闷经历
c头文件包含关系--记今天调试的郁闷经历 彭会锋 2016-08-05 21:54:08 c头文件的包含
- Columbia遗留问题
本来Columbia只是按照顺序,导航不可以点击,数组按照顺序push的小东西 在leader的要求下,要变成导航可以点击,无顺序的一团浆糊,经过了大概长达两天(我是不是太适合做程序!)的反复纠结,浆 ...
- kellogg项目总结
1.题目的去随机值去重 (当时做的是每次点击取出一个随机数,并删除数组中位置,后来改成获取10个随机数组成的数组,二者略有差距,修改颇长时间) function getArr(num){ totalA ...
- jquery json 操作(转)
原文:http://www.vososo.com/?p=919 Jquery-json 是 jQuery 的一个插件,可轻松实现对象和 JSON 字符串之间的转换.可序列化 JavaScript 对象 ...