springboot 实现积分计算和猜数字游戏
本内容代码已提交到git上
https://github.com/2325616550/springBoot_jibite.git
git地址
一、目的
掌握Servlet编程,包括Servlet处理请求与响应,会话Session机制,熟悉Eclipse/MyEclipse开发Java Web应用框架。
二、实验内容与设计思想
1.设计思路
1、求函数y=x*e-x在区间[a,b]上的定积分值,其中a,b由页面表单传入(即使用参数传递),并假定a小于b。要求使用数值方法求得定积分值的近似值(不能使用定积分公式来计算),常用的近似求法有:矩形法、梯形法、抛物线法,任意选择一种或多种实现均可,详见附件。
本题要求使用迭代法实现定积分值的近似计算。
2、使用Session实现“猜数字游戏”。猜数字是一个简单的游戏,标准游戏规则如下:
通常由两个人玩,一方出数字,一方猜。出数字的人要想好一个没有重复数字的4位数,不能让猜的人知道。猜的人就可以开始猜。每猜一个数字,出数者就要根据这个数字给出几A几B,其中A前面的数字表示位置正确的数的个数,而B前的数字表示数字正确而位置不对的数的个数。
如正确答案为 5234,而猜的人猜 5346,则是 1A2B,其中有一个5的位置对了,记为1A,而3和4这两个数字对了,而位置没对,因此记为 2B,合起来就是 1A2B。
接着猜的人再根据出题者的几A几B继续猜,直到猜中(即 4A0B)为止。
本题要求计算机模拟出数字的一方(4位数字不能重复),并提供Web页面让游戏者猜测,同时根据比对结果给出相应的提示。一旦用户猜中数字,则显示成功信息,并给出答案及游戏者猜测的次数。
2.主要数据结构
@Service
public class NumberGameServiceImpl implements NumberGameService {
private int answer;
public int getAnswer() {
return answer;
}
public void setAnswer(int answer) {
this.answer = answer;
}
public List<Integer> getResult(int input){
List<Integer> result=new ArrayList<>(2); //0-A 1-B
int numOfA=0,numOfB=0;
result.add(numOfA);
result.add(numOfB);
int correctNumber,answerNumber;
for (int i = 3; i >=0; i--) {
correctNumber = (int) (answer/pow(10,i)%10);
answerNumber = (int) (input/pow(10,i)%10);
// System.out.println(i + "---->" + correctNumber + "---->" + answerNumber);
if(correctNumber==answerNumber) {
numOfA++;
result.set(0,numOfA);
} else{
for (int j = 0; j <=3; j++) {
if(j==i)
continue;
else{
correctNumber = (int) (answer/pow(10,j)%10);
if(answerNumber==correctNumber){
numOfB++;
result.set(1,numOfB);
break;
}
}
}
}
}
return result;
}
}
上图是猜数字游戏的
属性就一个int整数 是指要猜的正确答案
然后一个获得猜测结果的方法,接口传入玩家猜测的数字
3.主要代码结构
3个controller 用来处理1.积分2.猜数字的业务3.页面的跳转
1个service 用来写获得猜测结果的逻辑
4.主要代码段分析
@RequestMapping("setNumber")
public void setNumber(HttpServletRequest req){
HttpSession session = req.getSession();
StringBuilder num = new StringBuilder();
int correctNum;
int a;
while (true) {
a = (int)(10*Math.random());
//第一位不能为0
if(num.length()<1){
while(true) {
if (a == 0) {
a = (int) (10 * Math.random());
} else {
break;
}
}
}
//检查重复
boolean isRepeat;
while(true){
isRepeat = false;
for (int i=0; i<num.length();i++) {
if (num.charAt(i)==(a+'0')) {
a = (int) (10 * Math.random());
isRepeat=true;
break;
}
}
if(!isRepeat)
break;
}
num.append(a);
if(num.length()>3)
break;
}
correctNum=Integer.parseInt( num.toString());
session.setAttribute("correctNumber",correctNum);
System.out.println(session.getAttribute("correctNumber"));
}
这个方法处理的是设置正确答案的业务。
因为数字不能重复,就单独每一位随机再和之前已经获得的数字进行比较 如若相同就继续随机直至都不同。这里要注意下第一位数字不能为0.
2.
@RequestMapping("integration")
public double getIntegration(String parm){
//x*e-x
Map<String,String> map ;
double x,a,b;
double y=0.0;
List<Object> json =JSON.parseArray(parm);
String idea=json.get(0).toString();
Gson gson = new Gson();
map = gson.fromJson(idea, new TypeToken<HashMap<String,String>>(){}.getType());
String valueOfA = map.get("value");
a=Double.parseDouble(valueOfA);
idea=json.get(1).toString();
map = gson.fromJson(idea, new TypeToken<HashMap<String,String>>(){}.getType());
String valueOfB = map.get("value");
b=Double.parseDouble(valueOfB);
double eps = 0.0001;
int n = 512; //初始分割
double step = (b - a) / n;
double s1,s2,diff;
s1=0.0;
for (int i = 0; i < n; i++)
{
s1 += func(a + step * i)*step; //计算初始面积
}
do
{
n = 2 * n; //分割加倍
s2=s1/2;
step = (b - a) / n;
for (int i = 1; i < n; i+=2) {
s2+=func(a + step * i)*step;
}
diff = (s1 - s2)>0?(s1-s2):(s2-s1); //计算两次迭代的结果差值
s1 = s2; //更新迭代变量
} while (diff >= eps);
return s1;
}
这个是处理积分功能的,通过前端将表单数据序列化传回后端,处理积分用的是迭代求法。
三、实验使用环境
IDEA开发和Spring Boot框架
四、实验步骤和调试过程
1.实验步骤
(1).先将前端页面写好,这里用的是ajax局部刷新来处理本次实验要求的功能。
前端页面展示:
(2).编写后台代码和脚本,启动运行
2.测试数据设计
(1).页面中两个按钮都绑定了单机事件,点击会触发ajax局部刷新页面。点击后的页面:
(2).处理积分的数据设计
可能会出现1.积分上下限大小不对,2.没填数据就点确定,3.有填入空格,4.数字中混了字母等可能意外的情况。这些都有写脚本用正则表达式去检验。
(3).猜数字的数据设计
可能会出现1.没填数据就点确认,2.有填入空格,3.没填满4位数字,4.多填数字等可能出现意外的情况。这些也都有考虑到并进行了校验。
3.测试结果分析。
(1).积分的数据处理结果
1.什么都不填或其中有没填
2.出现填入不能表示数据的字符
3.出现填写了空格
4.错误的上下限
5.正确的情况
(2).猜数字的数据结果
1.什么都不填或没填满4位数
2.出现了非数字的字符
3.由于在输入标签中加入了 ,则解决了输入可能超过4位数的情况
4,正常的情况
1).在设置正确数字的代码中添加一行将正确数字打印到控制台,我们可以发现我们本次要猜的数字。
2).第一次我们输入0A0B的情况
3).第二次我们输入1A1B的情况
4).第三次我们输入正确的情况
五、实验小结
1.实验中产生的错误及原因分析
实验中的猜数字游戏中的模态框出现过点击空白区就消失的情况,后来查询资料是要加一个 backdrop : ‘static’ 属性,其中 ,backdrop:’static’ 指的是点击背景空白处不被关闭。
2.实验体会和收获。
Servlet 是运行在服务器上的一个 java 小程序, 它可以接收客户端发送过来的请求, 并响应数据给客户端。
六、附录
可线上验证本次实验:http://39.100.64.245/springboot/smallFeature
部署的远程服务