⑴ 利用c语言数组验证
⑵ C语言设计程序判断身份证号的合法性,并输出到指定日期的天数
天数包括2019.4.2这天吗?
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#defineTHISYEAR2019
#defineTHISMONTH4
#defineTODAY2
#defineDATA20190402
#defineMOD11
constintdays[2][12]={
{31,28,31,30,31,30,31,31,30,31,30,31},
{31,29,31,30,31,30,31,31,30,31,30,31}
};
constintWF[17]={
7,9,10,5,8,4,2,1,6,
3,7,9,10,5,8,4,2
};
constcharPIN[11]={
'1','0','X','9','8','7',
'6','5','4','3','2'
};
intleapyear(int);//判断闰年
ints2d(char*,int,int);
intcountdays(int,int,int);
intmain(void){
intis_valid=1;//ID是否合格的标志
inty,m,d;
charID[19];
scanf("%s",ID);
if(strlen(ID)!=18){
is_valid=0;
}
else{
for(inti=0;i<17;i++){
if(!isdigit(ID[i])){
is_valid=0;
break;
}
}
y=s2d(ID,6,9);
m=s2d(ID,10,11);
d=s2d(ID,12,13);
if(m<1||m>12||d>31||d<1||
(leapyear(y)&&m==2&&d>29)||
10000*y+100*m+d>=DATA)
is_valid=0;
intsum=0;
for(inti=0;i<17;i++){
sum+=(ID[i]-'0')*WF[i];
}
if(toupper(PIN[sum%MOD])!=toupper(ID[17]))
is_valid=0;
}
if(is_valid){
inttotaldays=countdays(y,m,d);
printf("%d ",totaldays);
}
else
puts("No");
return0;
}
intleapyear(inty){
return(y%4==0&&y%100!=0)||(y%400==0);
}
ints2d(char*id,ints,inte){
intresult=0;
for(inti=s;i<=e;i++)
result=10*result+(id[i]-'0');
returnresult;
}
intcountdays(inty,intm,intd){
inttotal=0;
if(y<THISYEAR){
for(inti=11;i>=m;i--){
total+=days[leapyear(y)][i];
}
total+=days[leapyear(y)][m-1]-d+1;
for(inti=y+1;i<THISYEAR;i++)
total+=leapyear(i)?366:365;
for(inti=0;i<THISMONTH-1;i++)
total+=days[leapyear(THISYEAR)][i];
total+=TODAY;
}
else{
for(inti=y-1;i<THISMONTH-1;i++)
total+=days[leapyear(THISYEAR)][i];
total+=TODAY;
}
returntotal;
}
⑶ C语言.设计身份证号合法性验证程序
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
char st[18];
int num[18],w[18],s=0;
int i ;
scanf("%18s",st);
for(i=0; i<18; i++)
num[i]=st[i]-'0';
for( i=0; i<18; i++)
printf("%2d ",num[i]);
printf("\n");
if(num[16]%2==0)
printf("女的\n");
else printf("男的\n");
for( i=0; i<17; i++)
{
w[i]=(int)pow(2,18-i-1)%11;
printf("%2d ",w[i]);
s+=num[i]*w[i];
}
printf("\ns=%d\n",s);
for( i=0; i<17; i++)
{
printf("%2d ",num[i]*w[i]);
}
s%=11;
printf(" = %d\n",s);
if(s==0 && num[17]==1)
{
printf("\nok\n");
return 0;
}
if(s==1 && num[17]==0)
{
printf("\nok\n");
return 0;
}
if(s==2 && (st[17]=='X' || st[17]=='x'))
{
printf("\nok\n");
return 0;
}
if((s>=3 && s<=10) && (s+num[17]==12))
{
printf("\nok\n");
return 0;
}
printf("\nerrer\n");
return 0;
}
⑷ c语言输入身份证输出生日,性别,并判断身份证是否合法
voidmain()
{
inta[18]
for(inti=0;i<18;i++)
{
inttemp;
scanf("%d",&temp);
a[i]=temp;
}
printf("生日: ");
for(intj=0;j<8;j++)
{printf("%d ",a[6+i]);}
charsex[2]={’女‘,’男‘};
printf("性别:%c ",sex[a[16]%2]);//
printf("位数:%d ",18);
}
⑸ C语言中,如何生成身份证年份的随机数(用rank()函数),并校验身份证是否合法
最后4位数字中的前两位表示当地派出所的编码;
倒数第二位表示公民是男性还是女性(男性用单数,女性用双数);
最后一位数字是一个随机数,又称为校验码。 用来检验身份证的正确性。校检码可以是0~9的数字,有时也用x表示。
⑹ 用c语言编程求 18位 身份证的验证码
除了楼上所说的,在补充一点
1:char id[19]; //最后一个字节是用于'\0'的
2:除了这个原因,还有一个更重要的是gets得到的都是字符,在你的jisuan函数里,for循环中
result+=((*p)*(*q));
这句话其实是字符的ascII码相乘的,并不是数字相乘,可以改成
(((*p) - '0') * ((*q) - '0'));
这样就是对应字符的数字相乘了(这个很好理解吧?)
3:虽然jisuan返回的是个比较小的数,但是在for循环里计算的时候result定义成char型的会有溢出,会对你的结果有影响吧,我建议改成unsigned int