软工作业PSP与单元测试训练

一、实现模块判断传入的身份证号码的正确性;

二、针对所实现的模块编写对应的单元测试代码;

  import java.text.ParseException;  import java.text.SimpleDateFormat;  import java.util.Calendar;  import java.util.GregorianCalendar;  import java.util.Hashtable;  import java.util.Scanner;  import java.util.regex.Matcher;  import java.util.regex.Pattern;  public class ExcelCreateUserAction {  public static String IDCardValidate(String IDStr) throws ParseException {          String tipInfo = "该身份证有效!";String Ai = "";  if (IDStr.length() != 15 && IDStr.length() != 18) {  tipInfo = "身份证号码长度应该为15位或18位。";  return tipInfo;  }  if (IDStr.length() == 18) {  Ai = IDStr.substring(0, 17);  } else if (IDStr.length() == 15) {  Ai = IDStr.substring(0, 6) + "19" + IDStr.substring(6, 15);  }  if (isNumeric(Ai) == false) {  tipInfo = "身份证15位号码都应为数字 ; 18位号码除最后一位外,都应为数字。";  return tipInfo;  }  String strYear = Ai.substring(6, 10);// 年份  String strMonth = Ai.substring(10, 12);// 月份  String strDay = Ai.substring(12, 14);// 日期  if (isDate(strYear + "-" + strMonth + "-" + strDay) == false) {  tipInfo = "身份证出生日期无效。";  return tipInfo;  }  GregorianCalendar gc = new GregorianCalendar();  SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd");  try {  if ((gc.get(Calendar.YEAR) - Integer.parseInt(strYear)) > 150  || (gc.getTime().getTime() - s.parse(  strYear + "-" + strMonth + "-" + strDay).getTime()) < 0) {  tipInfo = "身份证生日不在有效范围。";  return tipInfo;  }  } catch (NumberFormatException e) {  e.printStackTrace();  } catch (java.text.ParseException e) {  e.printStackTrace();  }  if (Integer.parseInt(strMonth) > 12 || Integer.parseInt(strMonth) == 0) {  tipInfo = "身份证月份无效";  return tipInfo;  }  if (Integer.parseInt(strDay) > 31 || Integer.parseInt(strDay) == 0) {  tipInfo = "身份证日期无效";  return tipInfo;  }  Hashtable areacode = GetAreaCode();  if (areacode.get(Ai.substring(0, 2)) == null) {  tipInfo = "身份证地区编码错误。";  return tipInfo;  }  if(isVarifyCode(Ai,IDStr)==false){  tipInfo = "身份证校验码无效,不是合法的身份证号码";  return tipInfo;  }  return tipInfo;  }  private static boolean isVarifyCode(String Ai,String IDStr) {  String[] VarifyCode = { "1", "0", "X", "9", "8", "7", "6", "5", "4","3", "2" };  String[] Wi = { "7", "9", "10", "5", "8", "4", "2", "1", "6", "3", "7","9", "10", "5", "8", "4", "2" };  int sum = 0;  for (int i = 0; i < 17; i++) {  sum = sum + Integer.parseInt(String.valueOf(Ai.charAt(i))) * Integer.parseInt(Wi[i]);  }  int modValue = sum % 11;  String strVerifyCode = VarifyCode[modValue];  Ai = Ai + strVerifyCode;  if (IDStr.length() == 18) {  if (Ai.equals(IDStr) == false) {  return false;  }  }   return true;  }  private static Hashtable GetAreaCode() {  Hashtable hashtable = new Hashtable();  hashtable.put("11", "北京");  hashtable.put("12", "天津");  hashtable.put("13", "河北");  hashtable.put("14", "山西");  hashtable.put("15", "内蒙古");  hashtable.put("21", "辽宁");  hashtable.put("22", "吉林");  hashtable.put("23", "黑龙江");  hashtable.put("31", "上海");  hashtable.put("32", "江苏");  hashtable.put("33", "浙江");  hashtable.put("34", "安徽");  hashtable.put("35", "福建");  hashtable.put("36", "江西");  hashtable.put("37", "山东");  hashtable.put("41", "河南");  hashtable.put("42", "湖北");  hashtable.put("43", "湖南");  hashtable.put("44", "广东");  hashtable.put("45", "广西");  hashtable.put("46", "海南");  hashtable.put("50", "重庆");  hashtable.put("51", "四川");  hashtable.put("52", "贵州");  hashtable.put("53", "云南");  hashtable.put("54", "西藏");  hashtable.put("61", "陕西");  hashtable.put("62", "甘肃");  hashtable.put("63", "青海");  hashtable.put("64", "宁夏");  hashtable.put("65", "新疆");  hashtable.put("71", "台湾");  hashtable.put("81", "香港");  hashtable.put("82", "澳门");  hashtable.put("91", "国外");  return hashtable;  }  private static boolean isNumeric(String strnum) {  Pattern pattern = Pattern.compile("[0-9]*");  Matcher isNum = pattern.matcher(strnum);  if (isNum.matches()) {  return true;  } else {  return false;  }  }  public static boolean isDate(String strDate) {  Pattern pattern = Pattern  .compile("^((\\d{2}(([02468][048])|([13579][26]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])))))|(\\d{2}(([02468][1235679])|([13579][01345789]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|(1[0-9])|(2[0-8]))))))?$");  Matcher m = pattern.matcher(strDate);  if (m.matches()) {  return true;  } else {  return false;  }  }  public static void main(String[] args) throws ParseException {  Scanner s=new Scanner(System.in);  System.out.println("请输入你的身份证号码:");  String IdCard=new String(s.next());  IdCard = IdCard.toUpperCase();  System.out.println(IDCardValidate(IdCard));  }  }

  

三、需要按PSP流程进行工作量估算,填写任务清单工作量估算表。

任务清单工作量估算表:

 

PSP阶段

时间估算(小时)

实际实际(小时)

计划

估计每个阶段的时间成本

 0.2

0.4

开发

需求分析

 0.3

 0.7

系统设计

 0.3

 0.5

设计复审

 0.1

 0.2

代码实现

 0.2

 0.2

代码复审

 0.5

 0.2

测试

 0.1

 0.5

报告

测试报告

 0.3

 0.3

总结

 0.3

 0.3

 

转载于:https://www.cnblogs.com/362xu/p/8593635.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/250776.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DNN模型训练词向量原理

转自&#xff1a;https://blog.csdn.net/fendouaini/article/details/79821852 1 词向量 在NLP里&#xff0c;最细的粒度是词语&#xff0c;由词语再组成句子&#xff0c;段落&#xff0c;文章。所以处理NLP问题时&#xff0c;怎么合理的表示词语就成了NLP领域中最先需要解决的…

算法 --- reduce的使用.

描述: 难点: 将[[‘a’,‘b’,‘c’],[‘d’,‘e’,‘f’]]输出为[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”]. 关键代码描述: 1.假设我们已经根据输入的数字得到了 rawArr [[‘a’,‘b’,‘c’],[‘d’,‘e’,‘f’]] 2. 下一步将rawArr[0…

算法 --- 递归生成括号

问题描述 思路: 1.首先生成n个括号 2.左括号数量(记为l)不超过n 3.右括号数量(记为r)不超过n,且优先生成左括号(即 l < r) 4.需要设计一个递归式h(str,l,r) // 一开始,str , l 0, r 0 // 第一步进去,添加左括号, str(, l 1, r 0 // 然后因为 l < n . r < l 所以…

使用 TypeScript 改造构建工具及测试用例

最近的一段时间一直在搞TypeScript&#xff0c;一个巨硬出品、赋予JavaScript语言静态类型和编译的语言。 第一个完全使用TypeScript重构的纯Node.js项目已经上线并稳定运行了。 第二个前后端的项目目前也在重构中&#xff0c;关于前端基于webpack的TypeScript套路之前也有提到…

solr7.4 安装与使用

1.solr7环境要求 solr7需要java8环境&#xff0c;且需要在环境变量中添加 JAVA_HOME变量。 2.solr 安装 下载地址 https://lucene.apache.org/solr/mirrors-solr-latest-redir.html 我下载为7.4版本 在solr5以前solr的启动都有tomcat作为容器&#xff0c;但是从solr5以后solr内…

ReactiveCocoa基础

本文转载自最快让你上手ReactiveCocoa之基础篇&#xff0c;在此基础上稍作修改&#xff0c;欢迎交流。 有关对 ReactiveCocoa 的看法可以看一下唐巧的这篇ReactiveCocoa 讨论会 ReactiveCocoa思维导图ReactiveCocoa简介 ReactiveCocoa&#xff08;简称为RAC&#xff09;,是由Gi…

配置OpenCV产生flann\logger.h(66): error C4996: ‘fopen': This function or variable may be unsafe问题

转载自&#xff1a;http://guoming.me/%E9%85%8D%E7%BD%AEopencv%E4%BA%A7%E7%94%9Fflannlogger-h66-error-c4996-fopen-this-function-or-variable-may-be-unsafe%E9%97%AE%E9%A2%98 今天使用vs2012配置OpenCV编译出现问题: 1>—— 已启动生成: 项目: Win32ForOpenCV245, 配…

javascript --- repeat的用处

描述 思路: 最多重复s.length次使用String.prototype.repeat(n)方法可以将字符串重复n次 核心: while( i < len/2){if( s s.slice(0,i).repeat(len /i) ) {return ture;} }总体代码: var repeatedSubstringPattern function(s) {let i 1;let len s.length;while (i …

模型评估——定量分析预测的质量

https://blog.csdn.net/hustqb/article/details/77922031 评分参数定义模型评价规则 公共案例预定义值根据度量函数定义你的评分策略应用你自己的评分对象使用多种度量指标分类度量 从二分类到多分类多标签精确度Cohens kappa混乱矩阵分类报告汉明损失Jaccard 相似性相关系数准…

javascript --- 对象的方式体验链式调用

将功能相近的方法写入同一个对象中,是一个很好的编程习惯,便于后期的维护和前期的开发. foo1 var fooObj {foo1: function() {console.log(foo1);return this;} } fooObj.foo1();此有一个对象: fooObj它有一个方法: foo1()foo1打印了一个字符串’foo1’,然后返回了当前的执行…

OPENCV-3 学习笔记

OPENCV-3 学习笔记 imread()读入图&#xff0c;第一个参数&#xff0c;const string&类型的filename&#xff0c;填我们需要载入的图片路径名&#xff0c; 第二个参数&#xff0c;int类型的flags&#xff0c;为载入标识&#xff0c;它指定一个加载图像的颜色类型。 named…

前端换行显示,后端返回br

转载于:https://www.cnblogs.com/lml-lml/p/9597547.html

MySql随笔part3 表操作

一:什么是表 表(table): 表似一种结构化的文件,可用来存储某种特定类型的数据.表中的一条记录有对应的标题,标题称之为表的字段 二:创建表 1 create table table_name( 2 字段名1 类型[(宽度) 约束条件], 3 字段名2 类型[(宽度) 约束条件], 4 字段名3 类型[(宽度) 约束条件] 5 …

node --- 监听文件变化(静态、动态、子进程)

静态版本:监听的文件名写死了 // watcher.js use strict const fs require(fs); fs.watch(target.txt, () > console.log(File changed!)); console.log(Now watching target.txt for changes...);命令行启动 node watcher.js动态版本:在命令行输入需要监听的文件名. pr…

es6 --- Promise封装读取文件操作

Promise: es6中为了解决回调地狱问题而产生的 Promise的参数 Promise的参数是一个函数.每个Promise在实例化时,都会立即执行参数里的函数 const p new Promise(()>{console.log(1); })// 解释了上面的第2条Promise参数的参数 Promise的参数(函数),默认有2个参数(resol…

杂项:E-Learning

ylbtech-杂项&#xff1a;E-Learning1.返回顶部 1、E-Learning&#xff1a;英文全称为&#xff08;Electronic Learning&#xff09;&#xff0c;中文译作“数字&#xff08;化&#xff09;学习”、“电子&#xff08;化&#xff09;学习”、“网络&#xff08;化&#xff09;学…

css --- flex布局的应用(between)

between 想把发布时间放在左边,点击放在右边 页面结构如下: 可以看到发布时间和点击是在类 .mui-ellipsis 下.使用css3的 flex 布局中的: space-between .mui-ellipsis{display: flex;justify-content: space-between; }

WeUI

介绍&#xff1a; WeUI是微信设计团队为微信网站开发量身定做的微信类UI界面&#xff0c;旨在改善和规范微信用户体验。包括组分如button&#xff0c;cell&#xff0c;dialog&#xff0c;progress&#xff0c;toast&#xff0c;article&#xff0c;actionsheet&#xff0c;icon…

vue --- 全局配置过滤函数,使用moment函数来格式化时间

效果1 YYYY-MM-DD 效果2 YYYY-MM-DD HH:mm:ss 配置注意事项 由于时间格式化,在大多数页面中都会用到,因此建议配置在全局中 使用moment函数 -> http://momentjs.cn/ npm 安装 # 命令行 cnpm i moment -S在全局中配置 // main.js import moment from momentVue.f…

2018ICPC南京赛区网络赛J Sum(素数筛+找规律)

素数筛链接&#xff1a;https://blog.csdn.net/dl962454/article/details/76595623 【题意】 f(i)&#xff1a;能拆成两个数的乘积&#xff0c;并且这两个数要求没有平方因子&#xff0c;并且两个数的位置互换算两种方案。 最后求f(1)f(2)f(3)...f(n&#xff09;。 【解题思路】…