C语言——实验一:查验身份证(身份证号码的校验码)

前言

为什么我这个萌新要来写这篇文章?事情还要从上周三说起。

在上周三的程序设计基础课上,我们老师给我们全班同学布置了一项题为《实验一:查验身份证》的实验作业,这也是我第一次接触到实验作业,作为一名开学不到一个月的大一新生,这项作业对我来说,还是不简单的。接到这项作业后的第二天,我怀着无比愧疚的心情打开CSDN,想要学(fu)习(zhi)一下前辈们解决这道题的代码,结果搜索无果,只搜到了用Python解决类似题目的方法,于是我陷入了沉思————

我该怎么办 ,老师只给了一个星期的时间,完不成会影响期末考试的分数,万一挂科了。。。。。。

咦~,既然CSDN上还没有相应的文章,我为什么不能弥补它的空白,于是我花了几个小时去学习同学写的代码,并写了属于自己的代码,又自学用软件画出来程序框图,完成了我的作业。

这是我——一个萌新开始写文章的初衷,它会激励我不断地去成长。

接下来上——

——正文

题目

实验一:查验身份证

一、实验目的:

  1. 正确定义一个能够存储非常大的整数的类型;
  2. 熟练应用嵌套的if语句和switch语句实现多分支结构程序设计,能够根据不同状态取出不同值并做计算; 
  3. 熟练应用for()、while()和do-while()三种语句实现循环结构的设计; 
  4. 灵活运用break和continue语句控制循环过程的流向;
  5. 能够利用循环结构取出一个整数各个位中的数字;
  6. 熟悉简单的调试程序方法,如单步调试、设置信息的输出等;
  7. 通过对身份证号的校验码了解信息系统编码中校验码的意义、原理及真伪的判定。

二、实验要求: 

一个合法的身份证号码共18位,由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下:

首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};然后将计算的和对11取模得到值Z;最后按照以下关系对应Z值与校验码M的值:

Z: 0  1  3  4  5  6  7  8  9  10(删掉了2)

M:1  0  9  8  7  6  5  4  3  2(删掉了2对应的X)

现在给定一些身份证号码,请你验证校验码的有效性,并输出有问题的号码。

输入、输出格式:

输入第一行给出正整数N(≤100)是输入的身份证号码的个数。随后N行,每行给出1个18位身份证号码,18位必须全部是数字。

不检验身份证前17位是否合理,只检查对前17位计算出的校验码是否与身份证第18位一致。如果一致,则输出“身份证号 passed”,否则输出“身份证号 Fail”。

输入、输出样例1:

2

320124198808240056

320124198808240056 Passed

110108196711301866

110108196711301866 Fail

输入样例2:

2

320124198808240056

320124198808240056 Passed

110108196711301862

110108196711301862 Passed

三、实验内容和结果: 

(将实验完成中的一些内容记录于此,包括算法流程图、程序源代码、测试用例、运行结果截图、调试过程等)

四、实验总结:

(描述实验过程中的收获和遇到的困难)

五、思考与拓展:

1.在没有学习一维数组之前,现在我们是如何存储一批相同类型的数据的?大概有两种方法,第1种,定义一个变量,所有数据都保存在这一个变量中;第2种,定义一批简单变量,不同数据存储在不同的变量中。试问,第1种方法在一批数据处理过程中有什么缺陷?如果这批数据要在循环结构中处理的话,第2种方法适合吗? 

2.一般我们处理的整数定义为int类型即可,如果整数的位数超出了int类型所能表示的数据范围时,可以定义为long long int类型,为什么呢?还有其它数据类型可以提高数据的表示范围吗?它与整数的操作有什么不同吗? 

3. 身份证号码的校验码末位实际包含字符“X”,在学习了字符数组后我们就可以对身份证按照字符串处理了,并且保存在数组中,保存在数组中的数据可以重复使用。届时,大家可以重新设计本实验,解决当前不能解决的问题。

——————解答——————

三、实验内容和结果: 

(将实验完成中的一些内容记录于此,包括算法流程图、程序源代码、测试用例、运行结果截图、调试过程等)

1.算法流程图(自己用  亿图图示 画的)

 

2.源代码

#include<stdio.h>
int main()
{
	int QuanZhong[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
	int z[10]={0,1,3,4,5,6,7,8,9,10};
	int m[10]={1,0,9,8,7,6,5,4,3,2};
	int x[18];
	int n, i, j, k, l, sum, c;
	scanf("%d", &n);
	for(i=1;i<=n;i++)
	{
		sum = 0;
		for(j=0;j<=17;j++)
		{
			scanf("%1d", &x[j]);
		}
		for(l=0;l<=16;l++)
		{
			sum += x[l] * QuanZhong[l];
		}
		c=sum%11;
		for(k=0;k<=9;k++)
		{
			if(c==z[k])
			{
				break;
			}
		}
		if(m[k]==x[17])
		{
			for(j=0;j<=17;j++)
			{
				printf("%1d", x[j]);
			}
			printf(" Passed\n");
		}
		else
		{
			for(j=0;j<=17;j++)
			{
				printf("%1d", x[j]);
			}
			printf(" Fail\n");
		}
	}
	return 0;
	}

3.运行截图

以上就是本篇文章的全部内容啦,以后会不定时更新。

 希望这篇文章能对大家有所帮助

拒绝白嫖     记得点赞

 

点个关注支持一下呗~

  • 51
    点赞
  • 85
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值