**

7-1 水文数据校验及处理 (50 分)

**
使用Java中的字符串处理类以及正则表达式对输入字符串数据进行合法性校验及计算。(具体需求参见附件 2021-OO第04次作业-1指导书V1.0.pdf )

输入格式:

假定分水口门的数据上报时是采用人工输入的方式,每一行代表一个整点时刻的分水数据,各数据之间采用“|”符号进行分隔,每次可以输入多条数据,直到遇到用户输入“exit”为止,每一行输入数据共包含五部分:测量时间、目标水位、实际水位、开度(包含目标开度和实际开度,以“/”分隔)、流量。 各数据格式要求如下:

测量时间:格式为“年/月/日 时:分”,其中年份取值范围为[1,9999],“月”与“日”为一位数时之前不加“0”,日期与时间之间有一个空格,“时”与“分”之间采用冒号分隔(英文半角),“时”为一位数时之前不加“0”,“分”始终保持两位,且始终为“00”。注意:“时”数必须是24小时进制中的偶数值。
目标水位、实际水位、流量:均为实型数,取值范围为[1,1000), 小数点后保留1-3位小数或无小数(也无小数点)
目标开度、实际开度:实型数,取值范围为[1,10),必须保留2位小数,两个开度之间用“/”分隔

输出格式:

对输入的数据进行有效性校验,其规则如前所述,如遇到不符合规则的数据,系统应能够给出错误提示,提示规则如下:
如果每一行输入数据不是由“|”分隔的五部分,则输出:
Wrong Format
Data:输入的数据
如果某一部分数据有误,则按如下方式显示:
Row:行号,Column:列号Wrong Format
Data:输入的数据
其中,行号为输入数的行数(从1开始),列号为6个数据的序号(从1开始,最大为6,顺序参见输入数据结构说明)
由于人工输入数据可能存在疏忽,在每一个输入数据两端均可能存在多余的空格,程序应该能够自动过滤这些空格(不报错)。
如果用户未输入数据,则直接输出Max Actual Water Level和Total Water Flow的值即可(均为0)
若输入无误,则对数据进行如下处理:
当实际开度的值大于目标开度时,程序给出如下警告:
Row:1 GateOpening Warning
求出所输入数据中的最大实际水位值(保留2位小数),输出格式如下: Max Actual Water Level:实际水位值
根据每个整点时刻的瞬时流量求出所输入的所有时段的总流量(保留2位小数),其计算公式为(参见作业指导书):
p=∑n=1N2∗60∗60∗Flowp = \sum_{n=1}^N2*60*60*Flowp=n=1∑N​2∗60∗60∗Flow
输出格式如下:

Total Water Flow:总流量值

解题报告
1.输入数据的校验一律采用正则表达式,尤其是测量日期的校验,可自行百度,一定要弄懂
2.认真研究指导书中给的类结构,思考CheckData、DealData两个类的作用
3.编写代码务必弄懂需求(指导书),务必做到严谨

输入样例1:

2015/8/2 4:00|133.8400|133.070|1.11/1.21|75.780
2015/8/2 6:00|133.840|133.080|11.11/1.11|72.8a0
2015/8/2 8:00|133.830|133.070|1.11/1.11|73.890
2015/8/2 10:00|133.820|133.080|1.11/1.11|74.380
exit

输出样例1:

Row:1,Column:2Wrong Format
Data:2015/8/2 4:00|133.8400|133.070|1.11/1.21|75.780
Row:2,Column:4Wrong Format
Row:2,Column:6Wrong Format
Data:2015/8/2 6:00|133.840|133.080|11.11/1.11|72.8a0

输入样例2:

2015/8/5 2:00|133.800|133.080|1.11/1.11|73.870
2015/8/5 4:00|133.800|133.070|1.11/1.11|73.330
2015/8/5 6:00|133.830|133.110|1.11/1.21|70.610
2015/8/5 8:00|133.860|133.140|1.11/1.11|73.430
2015/8/5 10:00|133.91|133.15|1.11/1.11|73.06
2015/8/5 12:00|133.900|133.110|1.16/1.11|75.460
2015/8/5 14:00|133.920|133.140|1.16/1.11|77.030
2015/8/5 16:00|133.92|133.16|1.16/1.91|79.4
2015/8/5 18:00|133.940|133.170|1.16/1.11|76.810
2015/8/5 20:00|133.94|133.19|1.16/1.11|74.53
2015/8/5 22:00|133.930|133.200|1.16/1.11|74.400
2015/8/6 0:00|133.930|133.200|1.16/1.11|73.150
2015/8/6 2:00|133.930|133.180|1.16/1.11|74.830
2015/8/6 4:00|133.910|133.180|1.16/1.11|    73.270
exit

输出样例2:

Row:3 GateOpening Warning
Row:8 GateOpening Warning
Max Actual Water Level:133.20
Total Water Flow:7510896.00
//有一个测试点没有通过!!!
import java.util.Scanner;
import java.util.regex.Pattern;public class Main {public static void main(String[] args) {Scanner x = new Scanner(System.in);StringBuilder a=new StringBuilder(x.nextLine());//输入数据给aString a1=x.nextLine();String exit="exit";int i,h,flag,flag1=0;double sum=0,max=0;while (!a1.equals(exit)){a.append('\n').append(a1);a1=x.nextLine();//输入数据给a}String kp= String.valueOf(a);String[] b =kp.split("\n");//把输入的数据根据行放在数组b里Double[] sjsw =new Double[b.length];//创建实际水位的数组Double[] ll =new Double[b.length];//创建流量数组String time1= "(((([1-9])|([1-9][0-9])|([1-9][0-9]{2})|([1-9][0-9]{3})/((([13578]|1[02])/([1-9]|[12][0-9]|3[01]))|(([469]|11)/([1-9]|[12][0-9]|30))|(2/([1-9]|[1][0-9]|2[0-8])))))|(((([1-9][0-9])(0[48]|[2468][048]|[13579][26]))|(([48]|[2468][048]|[3579][26])00))/2/29)) ((([02468])|(1[02468])|(2[02])):00)";//匹配时间String kp1="([1-9][0-9]{0,2}(\\.[0-9]{1,3})?)";//匹配水位和匹配流量String kdkp="([1-9]\\.[0-9]{2})";//匹配开度Pattern swll=Pattern.compile(kp1);Pattern kd1=Pattern.compile(kdkp);Pattern timekp=Pattern.compile(time1);for (i=0,h=0;i<b.length;i++){//按照行循环String[] hang =b[i].split("\\|");//每行通过|分隔成行数组String[] kd =hang[3].split("\\/");//把每行的开度通过/分开存入开度数组里String shijian1=hang[0].trim();//时间,去掉每一行输入的头尾的空格String mbsw1=hang[1].trim();//目标水位,去掉每一行输入的头尾的空格String sjsw1=hang[2].trim();//实际水位,去掉每一行输入的头尾的空格String kaidu1=hang[3].trim();//开度,去掉每一行输入的头尾的空格String liuliang1=hang[4].trim();//流量,去掉每一行输入的头尾的空格String mbkd1=kd[0].trim();//目标开度,去掉每一行输入的头尾的空格String sjkd1=kd[1].trim();//实际开度,去掉每一行输入的头尾的空格flag=0;if(!timekp.matcher(shijian1).matches()){//如果时间不合法flag=1;flag1=1;System.out.println("Row:"+(i+1)+",Column:1Wrong Format");}if(!swll.matcher(mbsw1).matches()){//如果目标水位不合法flag=1;flag1=1;System.out.println("Row:"+(i+1)+",Column:2Wrong Format");}if(!swll.matcher(sjsw1).matches()){//如果实际水位不合法flag=1;flag1=1;System.out.println("Row:"+(i+1)+",Column:3Wrong Format");}if(!kd1.matcher(mbkd1).matches()){//如果目标开度不合法flag=1;flag1=1;System.out.println("Row:"+(i+1)+",Column:4Wrong Format");}if(!kd1.matcher(sjkd1).matches()){//如果实际开度不合法flag=1;flag1=1;System.out.println("Row:"+(i+1)+",Column:5Wrong Format");}if(!swll.matcher(liuliang1).matches()){//如果流量不合法flag=1;flag1=1;System.out.println("Row:"+(i+1)+",Column:6Wrong Format");}if(flag==1){System.out.println("Data:"+b[i]);}else {if(Double.parseDouble(kd[0])<Double.parseDouble(kd[1])){//目标开度和实际开度相比较System.out.println("Row:"+(i+1)+" GateOpening Warning");}sjsw[i]= Double.parseDouble(hang[2]);//把每行的实际水位的数据放入实际水位的数组里ll[i]=Double.parseDouble(hang[4]);//把每行的流量的数据放入流量的数组里h++;}}if(flag1==0){for(i=0;i<h;i++){//按照行循环if(max<sjsw[i]){max=sjsw[i];}sum=sum+7200*ll[i];//计算每行总流量并与之前的流量相加}System.out.printf("Max Actual Water Level:%.2f\n",max);System.out.printf("Total Water Flow:%.2f",sum);}}
}

7-1 水文数据校验及处理 (50 分)相关推荐

  1. Struts2 类型转换和数据校验

    学习内容 Struts 2类型转换 Struts 2数据校验 能力目标 熟悉Struts 2自带类型转换器 能自定义类型转换器 自定义输入校验功能 熟悉Struts 2内置校验器 本章简介 Strut ...

  2. [C#.NET 拾遗补漏]09:数据标注与数据校验

    数据标注(Data Annotation)是类或类成员添加上下文信息的一种方式,在 C# 通常用特性(Attribute)类来描述.它的用途主要可以分为下面这三类: 验证 Validation:向数据 ...

  3. python数据校验_最近抽空造了一个数据校验的轮子 Python -validator

    最近抽空造了一个数据校验的轮子 python-validator. 在开发 web 应用时,经常需要校验前端传入的数据.如果使用 Django,那么可以使用自带的 forms 进行数据校验. pyth ...

  4. wpf datagrid 数据为null时 显示背景图_[C#.NET 拾遗补漏]09:数据标注与数据校验

    数据标注(Data Annotation)是类或类成员添加上下文信息的一种方式,在 C# 通常用特性(Attribute)类来描述.它的用途主要可以分为下面这三类: 验证 Validation:向数据 ...

  5. struts2之token,类型转换和数据校验

    文章目录 1 Token防重 1.1 token内部原理 1.2 实现步骤 1.2.1 在页面中添加标签 1.2.2 配置strtus.xml配置 2 类型转换器 2.1 Struts2类型转换 2. ...

  6. 常用算法 之五 数据校验(CRC 原理、LRC、奇偶校验、校验和)详解

    数据校验   数据在传输的过程中,会受到各种干扰的影响,如脉冲干扰,随机噪声干扰和人为干扰等,这会使数据产生差错.为了能够控制传输过程的差错,通信系统必须采用有效措施来控制差错的产生,并保证数据的完整 ...

  7. Validated数据校验,看这一篇就够了

    目录 1 介绍 1.1 什么是数据校验 1.2 Java提供的数据校验工具 1.3 @Validated和@Valid的区别 1.4 依赖导入 1.5 常用数据校验注解 2 使用 2.1 校验实体类 ...

  8. JSON Schema数据校验入门

    快速开始 我们用一个例子来介绍说明 JSON Schema,虽然不可能面面俱到,但是对JSON Schema的基本概念.语法.使用有个较为全面的了解是完全没问题的. 这里假设我们有一个产品类目接口是用 ...

  9. c语言实现java接口_五分钟带你了解Java是如何从容而优雅地实现接口数据校验

    本篇文章给大家分享平时开发中总结的一点小技巧!在工作中写过Java程序的朋友都知道,目前使用Java开发服务最主流的方式就是通过Spring MVC定义一个Controller层接口,并将接口请求或返 ...

最新文章

  1. LINUX系统中进程如何管理控制(一)
  2. android mysql 搜索功能_android利用数据库实现搜索联想功能
  3. Mysql5.7安装错误处理与主从同步及!
  4. python怎样导入excel数据_python导入excel数据
  5. spark读取文件源码分析-1
  6. 分布式链路追踪框架的基本实现原理
  7. apache 重写和虚拟目录配置
  8. 教你如何挑选深度学习GPU
  9. Python 高等数学问题的符号解
  10. 2020软考架构设计师真题
  11. 云课堂让职业院校Web前端教学更简单
  12. python 多张图片合成pdf_Python多图片合并PDF的方法
  13. Python——域名解析成IP地址
  14. 认识一下,JavaScript今年25岁啦
  15. 记账软件分享,教你如何记账并管理所有账目
  16. 【面试宝典】准备面试了~集合
  17. 解决该内存不能为read或written
  18. 小菜鸟的python学习之路(7)
  19. 【05】数据可视化:02-ECharts数据可视化案例_立可得智能看板
  20. 工具及方法 - 斗地主技巧

热门文章

  1. 软考信息安全工程师培训精品课-更新中
  2. java后台传一个对象到前台_前台判断对象中的一个布尔值_前后台分离的项目中,如何优雅的传输boolean类型的参数...
  3. php 统计二维数组次数最多_前端面试题(数组篇)
  4. python numpy遍历_NumPy 迭代数组
  5. python中怎么比较两个列表的大小_python中对列表元素大小排序(冒泡排序法,选择排序法和插入排序法)—排序算法...
  6. 笔记本电脑风扇声音大_笔记本风扇噪音太大?教你怎么降低笔记本风扇噪音
  7. ES6-使用let关键字定义变量
  8. Spring数据分析思维课
  9. Url几个常用的函数
  10. java必会的英语单词