您的位置:首页 > 编程语言 > Java开发

【课堂程序整理】身份证效验码

2015-06-06 15:41 417 查看
作业要求:

/**

1)
理清需求(搞清楚要做什么?What)
l
编写 GUI
应用程序,输出身份证号的校验位,要求处理自定义异常。
2)
知识准备
18
位公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。
六位数字地址码:常住户口所在县(市、旗、区)的行政区划代码,按
GB/T 2260
执行。
八位数字出生日期码:按
GB/T 7408
的规定执行。
三位数字顺序码:表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数千分配给女性。
l
一位数字校验码:采用 ISO 7064:1983,MOD
11­2 校验码系统。
3)
算法设计(怎么做?How)
校验码的计算方法:
十七位数字
id[17]本体码加权求和公式:S = Sum(Ai*Wi),i=0,...,16,先对前17
位数字的权求和,其中
Ai 表示身份证号码第
i 位的数字,Wi:表示第
i
位的加权因子,分别为
w[17]={7 ,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2}
计算除以
11
的余数:y = S%11通 过 模 得 到 对 应 的 校 验 码
v[11]={'1','0','x','9','8','7','6','5','4','3','2'}

*/

完整代码:

package chap05;
import java.awt.FlowLayout;
import javax.swing.*;
import java.awt.event.*;

class MyException extends Exception{
private int idnumber;
//覆盖原有的Exception方法
public MyException(String message,int id){
super(message);
this.idnumber=id;
}
public int getId(){
return idnumber;
}
@Override
public String toString() {
return this.getMessage();
}
}

public class IDVerify extends JFrame implements ActionListener{
//自定义异常
public void regist(String num) throws MyException{
boolean b=false;
for(int i=0;i<num.length();i++){
if(num.charAt(i)<48||num.charAt(i)>57){
b=true;
}
}
if(num.length()!=17){
throw new MyException("异常:请输入身份证的前17位:", 3);
}
if(b){
throw new MyException("异常:身份证号为数字:", 4);
}
}

//swing组件定义
private JLabel jl_id;
private JLabel jl_id2;
private JTextField jtf_name;
private JButton jb_ok;
private JButton jb_exit;
private JTextField jta_contend;
public IDVerify(){
super("身份证校验码计算");
init();
}
/**
* init()方法提供了JFrame的初始化功能
*/
public void init(){
setLayout(new FlowLayout()); //设置为Flow布局管理器
//实例化组件
jl_id=new JLabel("身份证号:");
jl_id2=new JLabel("校验码:");
jtf_name=new JTextField(20);
jb_ok=new JButton("校验");
jb_exit=new JButton("退出");
jta_contend=new JTextField(2);
//将组件加入父容器
this.add(jl_id);
this.add(jtf_name);
this.add(jl_id2);
this.add(jta_contend);
this.add(jb_ok);
this.add(jb_exit);
//this.add(jta_contend);
//将时间源(命令按钮产生单击时间)和监听器(实现了ActionListener接口的类的对象)关联
jb_ok.addActionListener(this);
jb_exit.addActionListener(this);
//使窗口关闭生效
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setSize(600, 100);
setLocationRelativeTo(null);
this.setVisible(true);
}
public void actionPerformed(ActionEvent a){
int w[]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
String v[]= {"1","0","x","9","8","7","6","5","4","3","2"};
int S=0;
//当单击了jb_ok命令按钮要执行的事件处理程序
if(a.getSource(
9c1c
).equals(jb_ok)){

try{
String ID =new String(jtf_name.getText().trim());
regist( ID);
for(int i=0;i<ID.length();i++){
S+=(ID.charAt(i)-48)*w[i];
}
int y=S%11;
jta_contend.setText(v[y]);
JOptionPane.showMessageDialog(this,"校验成功!完整的身份证号为:"+ID+v[y]);
}catch(MyException e){
if(e.getId()==3){
JOptionPane.showMessageDialog(this,e.toString()+e.getId());
jtf_name.requestFocus(); //当抛出异常时,自动全选文本框中的内容
jtf_name.selectAll();
}
if(e.getId()==4){
JOptionPane.showMessageDialog(this,e.toString()+e.getId());
jtf_name.requestFocus();
jtf_name.selectAll();
}
}
}

if(a.getSource().equals(jb_exit)){
int j=JOptionPane.showConfirmDialog(this,"确认退出?");
if(j==0){
System.exit(0);
}
}
}
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable(){
public void run(){
new IDVerify().setVisible(true);
}
});
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息