C#实例 项目七 公民身份证号码生成与查询2

公开课教案
教    师
班级
科  目
C#程序设计
开课时间
地  点
机房
课题名称
项目七:公民身份证号码生成与查询
课时数
6
背景分析
本课程是为软件技术专业的学生开设的一门很重要的程序设计类课程。本次项目学习了部分新控件的属性和事件,尤其是组合框的DisplayMember和ValueMember两个属性的运用。进一步学习了随机数,巩固了如何向List中添加不重复的数字。另外,自定义方法的编写,进一步训练了程序设计的逻辑思维。本项目涉及知识点比较多,学习者应该仔细体会运用。学生已经具备一定的应用软件能力。
根据课程教学目标和学生的专业特点,教学中应当注重培养学生的操作能力、思维能力和学习能力。本课采用以项目教学为主,边讲边做,让学生在做的过程中学会探索、学会合作。
学习目标
设    定
1. 控件属性与事件、随机数类、控件数据绑定以及读文件等
2. 培养学生积极思考、敢于尝试,让学生体验学习的乐趣,激发学生对本课程的学习兴趣。
学习任务
描    述
学习任务围绕学生成绩统计的综合运用而展开,根据教师设计的项目,并将其分解为任务完成。通过任务的设定,在对比中,引导学生自主学习、合作学习、竞争学习。
教学情境
创    设
本节课通过对一个贴近学生生活的项目学习,引导学生做中学习、合作学习。围绕课堂总目标,让学生在不断的成功体验中进行快乐学习。
教学资源
准    备
时间资源:课前资料收集、课堂教学、课后资料整理、完成作业
信息资源:教案、教学素材
人员资源:1位专业教师,1位专业指导教师,学生小组
设备资源:2.2 GHz 或速度更快的 CPU、1GB或更大容量的 RAM、1280x1024 显示器、7200 RPM 或更高转速的硬盘;
操作系统:Windows 7或以上;
开发软件:Visual Studio 2012 中文版(含MSDN);
教  学  过  程  实  施
内    容
方法
导入
目前国内不少邮箱、网盘等申请时要求填写身份证号码,而用户又不想公开自己的真实信息,从而需要一个相对“真实”的身份证号码。
新课】
项目七:公民身份证号码生成与查询
项目描述
制作如图所示的身份证号码生成与查询系统,本项目主要有三个任务:
1.制作项目界面 (包括数据绑定)
2.身份证号码生成 (随机数,控件  延伸:生成的号码编序号)
3.身份证号码验证与解读
【项目分析】
身份证号码生成与查询系统包含身份证号码生成和身份证号码查询两大功能。中国公民的身份证号码的编制是有规则的,在生成和查询身份证号码时,我们必须要要遵守这个规则。制作身份证号码生成与查询系统的主要步骤如下:
1.制作项目界面
2.身份证号码生成
3.身份证号码验证与解读
任务二 生成身份证号码
【任务实施】
2. 随机生成500个所属行政区域的身份证号。
(1)生成身份证号的最后一位校验码是本次任务的一个难点,下面介绍下校验码的生成步骤:
校验码是通过一系列数学计算得出来的,具体校验的计算方式如下:
对前17位数字本体码加权求和
  公式为:S = Sum(Ai * Wi), i = 0, ... , 16
  其中Ai表示第i位置上的身份证号码数字值,Wi表示第i位置上的加权因子,其各位对应的值依次为: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
通俗解释:身份证第一位数字X7+第二位X9+第三位X10+第四位X5+第五位X5+第六位X8+第七位X4+第八位X1+第九位X6+第十位X3+十一位X7+十二位X9+十三位X10+十四位X5+十五位X8+十六位X4+十七位X2;计算出总和(用S)表示。
以11对计算结果取模
Y = mod(S, 11)
通俗解释:用S除以11,看最后的余数。如果除尽,为0;余数为1,则计为1;最大余数为10;全部数字为0-10共11个数字。(用Y表示)。
根据模的值得到对应的校验码
  对应关系为:
    Y值:   0 1 2 3 4 5 6 7 8 9 10
  校验码: 1 0 X 9 8 7 6 5 4 3 2
    通俗解释:余数为0,则校验码为1;依次类推:余数为1,则校验码对应0;以下:2--X;3--9;4--8;5--7;6--6;7--5;8--4;9-3;10-2。如果校验码不符合这个规则,则肯定是假号码。
(2)身份证的随机生成的另个难点是随机数的选择,其中要考虑性别问题。
任务三 身份证号码验证与解读
任务描述
给出一个身份证号码能给验证该号码是否合法,如果合法解读出其详细信息,如果不合法给出错误信息。
【任务实施】
1.验证行政区域的合法性,代码如下:
        //验证行政区域的合法性
        private bool isDiscValid(string s)
        {
            bool iFlag = false;
            foreach (clsAdministrativeDivisionsCode cadc in cityCode)
            {
                if (cadc.AdCode == s)
                {
                    string st = s.Substring(0, 2);
                    foreach (clsAdministrativeDivisionsCode capc in provinceCode)
                    {
                        if (capc.AdCode.Substring(0, 2) == st)
                        {
                            lbCardInfo.Items.Add("省或直辖市名称:" + capc.AdName);
                            break;
                        }
                    }
                    foreach (clsAdministrativeDivisionsCode caac in cityCode)
                    {
                        if (caac.AdCode == s.Substring(0, 4) + "00")
                        {
                            lbCardInfo.Items.Add("市名称:" + caac.AdName.TrimStart());
                            break;
                        }
                    }
                    lbCardInfo.Items.Add("地区名称:" + cadc.AdName.TrimStart());
                    iFlag = true;
                    break;
                }
            }
            return iFlag;
    }
2.验证出生日期的合法性,代码如下:
        //验证出生日期的合法性
        private bool isBirthValid(string s)
        {
            string sYear = s.Substring(0, 4);
            string sMonth = s.Substring(4, 2);
            string sDay = s.Substring(6, 2);
            DateTime dt;
            if (DateTime.TryParse(string.Format("{0}-{1}-{2}", sYear, sMonth, sDay), out dt))
            {
                if (dt > DateTime.Now)
                    return false;
                else
                    return true;
            }
            else
                return false;
        }
3.验证性别的合法性,代码如下:
        //验证性别的合法性
        private bool isSexValid(string s)
        {
            return s == "000" ? false : true;
    }
4.验证校验码的合法性,代码如下:
        //验证校验码的合法性
        private bool isParityValid(string s18)
        {
            int[] Weight = new int[] { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };
            string Parity = "10X98765432";
            string s17 = s18.Substring(0, 17);
            int s = 0;
            for (int i = 0; i < s17.Length; i++)
            {
                s += Int32.Parse(s17[i].ToString()) * Weight[i];
            }
            return Parity[s % 11].ToString() == s18.Substring(17, 1) ? true : false;
    }
5.编写验证按钮btnVerification控件的事件,代码如下:
        private void btnVerification_Click(object sender, EventArgs e)
        {
            Regex reg = new Regex(@"^\d{17}(\d|X)");
            string sTemp = tbVerification.Text;
            lbCardInfo.Items.Clear();
            if (sTemp == string.Empty)
            {
                MessageBox.Show("没有输入任何身份证号码", "请注意", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }
            if (sTemp.Length != 18)
            {
                MessageBox.Show("输入身份证号码的长度应为位", "请注意", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }
            if (reg.Matches(sTemp).Count == 0)
            {
                MessageBox.Show("输入身份证号码的格式有误", "请注意", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }
            if (!isDiscValid(sTemp.Substring(0, 6)))
            {
                MessageBox.Show("输入的身份证号码行政区划代码无效", "请注意", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }
            if (!isBirthValid(sTemp.Substring(6, 8)))
            {
                MessageBox.Show("输入的身份证号码出生日期无效", "请注意", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }
            else
                lbCardInfo.Items.Add(string.Format("出生日期:{0}{1}{2}", sTemp.Substring(6, 4), sTemp.Substring(10, 2), sTemp.Substring(12, 2)));
            if (!isSexValid(sTemp.Substring(14, 3)))
            {
                MessageBox.Show("输入的身份证号码性别顺序码无效", "请注意", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }
            else
            {
                lbCardInfo.Items.Add("性别:" + ((Convert.ToInt32(sTemp.Substring(14, 3)) % 2 == 0) ? "" : ""));
            }
            if (!isParityValid(sTemp))
            {
                MessageBox.Show("输入的身份证号码验证码无效", "请注意", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }
            lbCardInfo.Items.Insert(0, "身份证号:" + sTemp);
            lbCardInfo.Items.Insert(0, "验证解读信息:");
            lbCardInfo.Items.Add("完成验证!");
            gbCardInfo.Visible = true;
        }
项目小结
    本次项目学习了部分新控件的属性和事件,尤其是组合框的DisplayMember和ValueMember两个属性的运用。进一步学习了随机数,巩固了如何向List中添加不重复的数字。另外,自定义方法的编写,进一步训练了程序设计的逻辑思维。本项目涉及知识点比较多,学习者应该仔细体会运用。
【思考与练习】
1. 制作程序“手机号所在地查询”。
创设情境、激发学习兴趣营造良好的学习氛围
明确任务,通过系列实验逐步呈现知识
学生自主学习
师生互动
学习环节包括“实验与思考”、“观察与思考”、“交流与分享”
巡回指导
师生互动
学习环节包括“实验与思考”、“观察与思考”、“交流与分享”
教师及时引导与评价
学习环节分为“合作与探索”、“交流与分享”、“实践与体验”
教师巡回指导
教师及时评价与引导
学习环节分为“合作与探
索”、“成功的体验”、“思考与提高”
教师巡回指导
学习环节分为“合作与探索”、“成功的体验”
学生评价、教师评价

本文发布于:2024-09-20 10:54:09,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/818280.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:号码   身份证   学习   学生   生成   项目   验证   查询
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议