
大一的一个c语言实验,下午六点上课要用了,有点急,凑个字数,加急
关注该答案完全符合题目要求,该题的特点是输出要按身份证+结果的方式,并且要求全数字输入
#include <stdio.h>
#include <string.h>
char fun(int n);
int res[17] = { 7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2 };
int main()
{
int n; // n验证次数
char result; // 最后一位校验码
scanf("%d", &n);
getchar();
char id[18];
for (int i = 0; i < n; i++)
{
int count = 0;
for (int m = 0; m < 18; m++)
{
scanf("%c", &id[m]);
}
getchar();
for (int m = 0; m < 18; m++)
{
if (id[m] >= '0' && id[m] <= '9')//题目要求必须输入18位数字
{
count++;
}
printf("%c", id[m]);
}
printf(" ");
if (count != 18)
{
printf("Fail\n\n");
continue;
}
else
{
int k = 0;
for (int j = 0; j < 17; j++)
{
k += (id[j] - '0') * res[j];
}
k = k % 11;
result = fun(k);
if (id[17] == result)
{
printf("Passed\n\n");
}
else printf("Fail\n\n");
}
}
return 0;
}
char fun(int n) //z值与M值对应 当然也可以一维数组,不过为了更好的匹配,于是用switch语句
{
switch (n) {
case 0: return '1';
case 1: return '0';
//case 2: return 'X'; //题目要求删掉2对应的X
case 3: return '9';
case 4: return '8';
case 5: return '7';
case 6: return '6';
case 7: return '5';
case 8: return '4';
case 9: return '3';
case 10:return '2';
}
return -1; //不会返回这个值的
}
运行结果:

