任务说明:
一、实现模块判断传入的身份证号码的正确性;
实现要求:
一、实现功能模块;
身份证号码结构:17位数字和1位校验码:6位地址码数字,8位生日数字,3位出生时间顺序号,1位校验码。
1,检验位数是否为18位。
2,检验校验位,前17位计算出的余数所对应的字符是否==第18位的字符。
3,校验年月日,分别校验年份,月份,日期是否在正确范围内。
二、针对所实现的模块编写对应的单元测试代码;
package pdID;
import java.util.Calendar; import java.util.HashMap; import java.util.Map; import javax.xml.bind.Validator; public class pdID{ final static int[] A = {‘1‘, ‘0‘, ‘X‘, ‘9‘, ‘8‘, ‘7‘, ‘6‘, ‘5‘, ‘4‘, ‘3‘, ‘2‘}; final static int[] P = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2}; public static boolean isIdcard(String s){//校验位数是否==18
if(s == null || s.length() != 18)) return false; final char[] cs = s.toUpperCase().toCharArray(); int power = 0; for(int i=0; i<cs.length; i++){ if(i==cs.length-1 && cs[i] == ‘X‘) break; (cs[i]<‘0‘ || cs[i]>‘9‘) return false; < cs.length -1){ power += (cs[i] - ‘0‘) * POWER_LIST[i]; } } //1校验前17位计算所得余数是否==校验码 if(cs[cs.length -1 ] == PARITYBIT[power % 11]){ //2校验年份 String year = s.substring(6, 10); final int iyear = Integer.parseInt(year); if(iyear < 1900 || iyear > Calendar.getInstance().get(Calendar.YEAR)) return false;//<1900年的错,>今年的错 //3校验月份 String month =s.substring(10,12); final int imonth = Integer.parseInt(month); if(imonth <1 || imonth >12){ return false; } //4校验日期 String day =s.substring(12, 14); final int iday = Integer.parseInt(day); if(iday < 1 || iday > 31) return false; }else return false; } public static void main(String[] args) { for(int i=0;i<10;i++){ final String s = "330482199607070616"; System.out.println(s+" --> "+isIdcard(s)); } } }
三、需要按PSP流程进行工作量估算,填写任务清单工作量估算表。
任务清单工作量估算表:
PSP阶段 | 时间估算(小时) | 实际实际(小时) | |
计划 | 估计每个阶段的时间成本 | 0.5 | 0.6 |
开发 | 需求分析 | 0.5 | 0.4 |
系统设计 | 0.6 | 0.6 | |
设计复审 | 0.3 | 0.3 | |
代码实现 | 0.7 | 0.8 | |
代码复审 | 0.3 | 0.3 | |
测试 | 0.4 | 0.3 | |
报告 | 测试报告 | 0.4 | 0.4 |
总结 | 0.2 | 0.2 |