软工作业02

实现要求:

一、实现功能模块;

校验省份、校验省份、校验出生日期、将15位的身份证转成18位身份证、数字验证、

将身份证的每位和对应位的加权因子相乘之后,再得到和值、将和值与11取模得到余数进行校验码判断、将字符数组转为整型数组.

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

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.Calendar;

import java.util.Date;

import java.util.Scanner;

/**

* <p>

* 身份证合法性校验

* </p>

*

* <pre>

* --15位身份证号码:第7、8位为出生年份(两位数),第9、10位为出生月份,第11、12位代表出生日期,第15位代表性别,奇数为男,偶数为女。

* --18位身份证号码:第7、8、9、10位为出生年份(四位数),第11、第12位为出生月份,第13、14位代表出生日期,第17位代表性别,奇数为男,偶数为女。

*    最后一位为校验位

*

*

* @author 313921

*/

public class IdcardValidator {

/**

* <pre>

* 省、直辖市代码表:

*     11 : 北京  12 : 天津  13 : 河北       14 : 山西  15 : 内蒙古

*     21 : 辽宁  22 : 吉林  23 : 黑龙江  31 : 上海  32 : 江苏

*     33 : 浙江  34 : 安徽  35 : 福建       36 : 江西  37 : 山东

*     41 : 河南  42 : 湖北  43 : 湖南       44 : 广东  45 : 广西      46 : 海南

*     50 : 重庆  51 : 四川  52 : 贵州       53 : 云南  54 : 西藏

*     61 : 陕西  62 : 甘肃  63 : 青海       64 : 宁夏  65 : 新疆

*     71 : 台湾

*     81 : 香港  82 : 澳门

*     91 : 国外

* </pre>

*/

private static String cityCode[] = { "11", "12", "13", "14", "15", "21",

"22", "23", "31", "32", "33", "34", "35", "36", "37", "41", "42",

"43", "44", "45", "46", "50", "51", "52", "53", "54", "61", "62",

"63", "64", "65", "71", "81", "82", "91" };

/**

* 每位加权因子

*/

private static intpower[] = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5,

8, 4, 2 };

/**

* 验证所有的身份证的合法性

*

* @paramidcard

*            身份证

* @return 合法返回true,否则返回false

*/

public static booleanisValidatedAllIdcard(String idcard) {

if (idcard == null || "".equals(idcard)) {

return false;

}

if (idcard.length() == 15) {

return validate15IDCard(idcard);

}

return validate18Idcard(idcard);

}

/**

* 判断18位身份证的合法性

* 根据〖中华人民共和国国家标准GB11643-1999〗中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。

* 排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。

* 顺序码: 表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。

* 1.前1、2位数字表示:所在省份的代码; 2.第3、4位数字表示:所在城市的代码; 3.第5、6位数字表示:所在区县的代码;

* 4.第7~14位数字表示:出生年、月、日; 5.第15、16位数字表示:所在地的派出所的代码;

* 6.第17位数字表示性别:奇数表示男性,偶数表示女性;

* 7.第18位数字是校检码:也有的说是个人信息码,一般是随计算机的随机产生,用来检验身份证的正确性。校检码可以是0~9的数字,有时也用x表示。

* 第十八位数字(校验码)的计算方法为: 1.将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7 9 10 5 8 4

* 2 1 6 3 7 9 10 5 8 4 2

* 2.将这17位数字和系数相乘的结果相加。

* 3.用加出来和除以11,看余数是多少

* 4.余数只可能有0 1 2 3 4 5 6 7 8 9 10这11个数字。其分别对应的最后一位身份证的号码为1 0 X 9 8 7 6 5 4 3

* 2。

* 5.通过上面得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的Ⅹ。如果余数是10,身份证的最后一位号码就是2。

* @paramidcard

* @return

*/

public static boolean validate18Idcard(String idcard) {

if (idcard == null) {

return false;

}

// 非18位为假

if (idcard.length() != 18) {

return false;

}

// 获取前17位

String idcard17 = idcard.substring(0, 17);

// 前17位全部为数字

if (!isDigital(idcard17)) {

return false;

}

String provinceid = idcard.substring(0, 2);

// 校验省份

if (!checkProvinceid(provinceid)) {

return false;

}

// 校验出生日期

String birthday = idcard.substring(6, 14);

SimpleDateFormatsdf = new SimpleDateFormat("yyyyMMdd");

try {

Date birthDate = sdf.parse(birthday);

String tmpDate = sdf.format(birthDate);

if (!tmpDate.equals(birthday)) {// 出生年月日不正确

return false;

}

} catch (ParseException e1) {

return false;

}

// 获取第18位

String idcard18Code = idcard.substring(17, 18);

char c[] = idcard17.toCharArray();

intbit[] = converCharToInt(c);

int sum17 = 0;

sum17 = getPowerSum(bit);

// 将和值与11取模得到余数进行校验码判断

String checkCode = getCheckCodeBySum(sum17);

if (null == checkCode) {

return false;

}

// 将身份证的第18位与算出来的校码进行匹配,不相等就为假

if (!idcard18Code.equalsIgnoreCase(checkCode)) {

return false;

}

return true;

}

/**

* 校验15位身份证

*

* <pre>

* 只校验省份和出生年月日

* </pre>

*

* @paramidcard

* @return

*/

public static boolean validate15IDCard(String idcard) {

if (idcard == null) {

return false;

}

// 非15位为假

if (idcard.length() != 15) {

return false;

}

// 15全部为数字

if (!isDigital(idcard)) {

return false;

}

String provinceid = idcard.substring(0, 2);

// 校验省份

if (!checkProvinceid(provinceid)) {

return false;

}

String birthday = idcard.substring(6, 12);

SimpleDateFormatsdf = new SimpleDateFormat("yyMMdd");

try {

Date birthDate = sdf.parse(birthday);

String tmpDate = sdf.format(birthDate);

if (!tmpDate.equals(birthday)) {// 身份证日期错误

return false;

}

} catch (ParseException e1) {

return false;

}

return true;

}

/**

* 将15位的身份证转成18位身份证

*

* @paramidcard

* @return

*/

public static String convertIdcarBy15bit(String idcard) {

if (idcard == null) {

return null;

}

// 非15位身份证

if (idcard.length() != 15) {

return null;

}

// 15全部为数字

if (!isDigital(idcard)) {

return null;

}

String provinceid = idcard.substring(0, 2);

// 校验省份

if (!checkProvinceid(provinceid)) {

return null;

}

String birthday = idcard.substring(6, 12);

SimpleDateFormatsdf = new SimpleDateFormat("yyMMdd");

Date birthdate = null;

try {

birthdate = sdf.parse(birthday);

String tmpDate = sdf.format(birthdate);

if (!tmpDate.equals(birthday)) {// 身份证日期错误

return null;

}

} catch (ParseException e1) {

return null;

}

Calendar cday = Calendar.getInstance();

cday.setTime(birthdate);

String year = String.valueOf(cday.get(Calendar.YEAR));

String idcard17 = idcard.substring(0, 6) + year + idcard.substring(8);

char c[] = idcard17.toCharArray();

String checkCode = "";

// 将字符数组转为整型数组

intbit[] = converCharToInt(c);

int sum17 = 0;

sum17 = getPowerSum(bit);

// 获取和值与11取模得到余数进行校验码

checkCode = getCheckCodeBySum(sum17);

// 获取不到校验位

if (null == checkCode) {

return null;

}

// 将前17位与第18位校验码拼接

idcard17 += checkCode;

return idcard17;

}

/**

* 校验省份

*

* @paramprovinceid

* @return 合法返回TRUE,否则返回FALSE

*/

private static booleancheckProvinceid(String provinceid) {

for (String id :cityCode) {

if (id.equals(provinceid)) {

return true;

}

}

return false;

}

/**

* 数字验证

*

* @paramstr

* @return

*/

private static booleanisDigital(String str) {

return str.matches("^[0-9]*$");

}

/**

* 将身份证的每位和对应位的加权因子相乘之后,再得到和值

*

* @param bit

* @return

*/

private static intgetPowerSum(int[] bit) {

int sum = 0;

if (power.length != bit.length) {

return sum;

}

for (inti = 0; i<bit.length; i++) {

for (int j = 0; j <power.length; j++) {

if (i == j) {

sum = sum + bit[i] * power[j];

}

}

}

return sum;

}

/**

* 将和值与11取模得到余数进行校验码判断

*

* @paramcheckCode

* @param sum17

* @return 校验位

*/

private static String getCheckCodeBySum(int sum17) {

String checkCode = null;

switch (sum17 % 11) {

case 10:

checkCode = "2";

break;

case 9:

checkCode = "3";

break;

case 8:

checkCode = "4";

break;

case 7:

checkCode = "5";

break;

case 6:

checkCode = "6";

break;

case 5:

checkCode = "7";

break;

case 4:

checkCode = "8";

break;

case 3:

checkCode = "9";

break;

case 2:

checkCode = "x";

break;

case 1:

checkCode = "0";

break;

case 0:

checkCode = "1";

break;

}

return checkCode;

}

/**

* 将字符数组转为整型数组

*

* @param c

* @return

* @throws NumberFormatException

*/

private static int[] converCharToInt(char[] c) throws NumberFormatException {

int[] a = new int[c.length];

int k = 0;

for (char temp : c) {

a[k++] = Integer.parseInt(String.valueOf(temp));

}

return a;

}

public static void main(String[] args) throws Exception {

Scanner sc=new Scanner(System.in);

String idcard=sc.next();

if (idcard.length()==18){

// 18位身份证

System.out.println(isValidatedAllIdcard(idcard));

}else if(idcard.length()==15){

// 15位身份证

System.out.println(isValidatedAllIdcard(idcard));

// 15位身份证转18位身份证

System.out.println(convertIdcarBy15bit(idcard));

}else{

System.out.println(idcard+"不是有效身份证号码");

}

}

}

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

任务清单工作量估算表:


PSP阶段


时间估算(小时)


实际实际(小时)


计划


估计每个阶段的时间成本


5.0


7.0


开发


需求分析


0.6


0.4


系统设计


0.6


0.6


设计复审


0.4


0.2


代码实现


2.0


3.0


代码复审


0.4


0.6


测试


0.6


1.4


报告


测试报告


0.2


0.4


总结


0.2


0.4

原文地址:https://www.cnblogs.com/seven153/p/8576363.html

时间: 2024-10-01 21:49:29

软工作业02的相关文章

15软工作业02 验证电子邮箱账号的正确性

任务说明 实现模块判断传入的电子邮箱账号的正确性: 实现要求: 一.实现功能模块: 主模块.判断(@ 和  .)字符模块.判断字符串(判断邮箱账户)模块.邮箱验证模块 二.针对所实现的模块编写对应的单元测试代码: 实现代码: 测试代码: 三.需要按PSP流程进行工作量估算,填写任务清单工作量估算表. 任务清单工作量估算表: PSP阶段 时间估算(小时) 实际实际(小时) 计划 估计每个阶段的时间成本 3.6(220min) 4.0(240min) 开发 需求分析 0.6(40min) 0.4(2

软工作业: (2)硬币游戏—— 代码分析与改进

软工作业: (2)硬币游戏-- 代码分析与改进 一.作业要求 1.Python 程序阅读理解 2.学习Python 编码风格指南中译版(Google SOC)(http://blog.csdn.net/damotiansheng/article/details/43867175),改进Python程序 3.设计游戏规则,使得慈善事业可持续. 地铁口放置硬币箱(初始值500硬币),顾客可取.可放.请设计一组规则,使得该钱箱永远有钱取(尽量符合实际) 注:参考http://www.cnblogs.c

第二次软工作业

1.必做: 两人组成一队,进行结对编程,从第一次软件工程作业中选出一人的作业作为这次作业的基础设计一个图形界面(GUI)的四则运算应用程序,可以是PC桌面的图形界面程序.网页程序或者手机程序设计的应用程序可以完成加法.减法.乘法.除法运算应用程序可以完成真分数的四则运算. 基本版面如下: 回答真确时的版面: 回答错误的版面 2.选做: 1.逐步扩展功能和可以支持的表达式类型,最后希望能支持下面类型的题目 (最多10个运算符,括号的数量不限制): 25 - 3 * 4 - 2 / 2 + 89 =

第0次软工作业

第一部分:结缘计算机 1.你为什么选择计算机专业?你认为你的条件如何?和这些博主比呢?(必答) 我最开始有选择计算机相关专业的念头的时候是高二的时候,我们学校开了一门学习VB语言编程的选修课,当时我觉得写程序很有意思,然后再加上我很喜欢打游戏,以后想从事游戏制作方面的工作,所以就萌生了学习软件工程这个专业的念头.当时我订的目标是北工大的软件工程专业.后来高考的时候成绩考冒了,分数正好够北航高工,听说在里面也可以学习软件工程,我就选择了北航高工,经过大一一年的了解,我发现计算机科学与技术这个专业比

第一次软工作业 个人项目 词频统计

1.预计完成时间: 在一开始的时候,我并不认为这项作业的完成难度有多大.因为觉得这个程序主要的部分就是三块码,读入当前目录下的所有内容,统计单词和排序,但是我对于C++和C#两种语言都不熟悉,所以准备先用两天来熟悉语言(后来发现这个决定是错误的..至少 不应该用这么长的时间).在程序的具体模块中,我划分了四个模块: 主函数:处理整个流程,包括读入目录中的所有内容和对于所执行模式的判断,预计用时1小时. 分割函数:将文件中的单词分割出来.由于有三种模式,预计用时3小时. 计数函数:统计频率,作为统

软工作业2:硬币游戏——代码的分析与改进

目的: Python 程序阅读理解 学习Python 编码风格指南中译版(Google SOC), 改进Python程序 如何设计游戏规则,使得慈善事业可持续. 地铁口放置硬币箱(初始值500硬币),顾客可取.可放.请设计一组规则,使得该钱箱永远有钱取(尽量符合实际) 参考:地铁口钱箱 作业步骤: step 1: fork 老师的仓库 +硬币游戏:http://git.oschina.net/juking2017/Game.git 将其 fork 到自己的码云仓库. step2:clone 到本

软工作业9.19

首先下载必备的软件: 一:安装git 调试git并进行用户名的配置: 二:安装python 设置环境变量: 另外,为了python能够运行我们的程序,还要下载相应的第三方插件 三:fork仓库 四:在python进行软件修改,修改具体效果如图所示,注释里我标明了自己的修改思路, 在这里我大概解释一下: 我的想法是:既然人数4:1时能够实现长期循环,而取钱和放钱的值以及其多取少放的规则使其相对来说不好限定, 所以我从人数方面着手,当放钱人>=4时,才可以有一人能够取钱 我还将阀值Threshold

[SakuraiYo][软工作业(2)]硬币游戏—— 代码分析与改进

作业目标 Python 程序阅读理解 学习Python 编码风格指南中译版(Google SOC), 改进Python程序 如何设计游戏规则,使得慈善事业可持续. 地铁口放置硬币箱(初始值500硬币),顾客可取.可放.请设计一组规则,使得该钱箱永远有钱取(尽量符合实际) 参考:地铁口钱箱 截至日期:作业布置一周内 作业过程 step 1: fork 老师的仓库 +硬币游戏:http://git.oschina.net/juking2017/Game.git 将其 fork 到你的码云仓库. st

软工作业

(因本人水平有限,所写内容如有不对,请多多包涵) 一.一个能自动生成小学四则运算题目的"软件".(要求:除了整数以外,还要支持真分数的四则运算.) 由于本人能力有限,此次作业用c++来完成,也没有实现一个友好的用户界面. [代码地址] 二.在一周之内快速看了<构建之法>,列出一些不懂的问题. 1)第二章的单元测试那一小节,书中说"如何能让自己负责的模块功能定义尽量明确,模块内部的改变不会影响其他模块的,而且模块的质量能得到稳定的.量化的保证?单元测试就是一个很有效