) int checkID(char *ID); (7分) 判别身份证校验位是否正确的函数。其中参数 ID 代表一个 18 位身份证号,如果校验位正确,函数返回 1,否则返回 0。
时间: 2024-02-11 17:05:27 浏览: 30
以下是一个简单的实现,用于判别身份证校验位是否正确:
```
int checkID(char *ID) {
int weight[] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
char checkCode[] = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};
int sum = 0;
for (int i = 0; i < 17; i++) {
sum += (ID[i] - '0') * weight[i];
}
int index = sum % 11;
return ID[17] == checkCode[index];
}
```
这个函数的实现基于以下的校验规则:
1. 前 17 位数字分别乘以对应的权重,然后求和。
2. 将上面的和除以 11 取余数,得到一个数字。
3. 根据余数查表得到一个校验码。
4. 如果身份证号的最后一位是上面得到的校验码,那么校验成功。
注意,这个实现并没有对输入的身份证号进行任何格式检查,比如说长度是否为 18 位,前 17 位是否都是数字等等。如果需要更严格的检查,可以在函数中加入相应的代码。
相关问题
C语言运用结构体 指针函数写一个简单程序 int checkID(char *ID); (7分) 判别身份证校验位是否正确的函数。其中参数 ID 代表一个 18 位身份证号,如果校验位正确,函数返回 1,否则返回 0。
好的,下面是程序的实现:
```c
#include <stdio.h>
#include <string.h>
struct IDInfo {
char province[3];
char city[3];
char county[3];
int year;
int month;
int day;
int order;
char gender;
};
int getCheckCode(const char *ID) {
int factors[17] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
char checkCodes[11] = "10X98765432";
int sum = 0;
for (int i = 0; i < 17; i++) {
sum += (ID[i] - '0') * factors[i];
}
return checkCodes[sum % 11] - '0';
}
struct IDInfo parseID(const char *ID) {
struct IDInfo info;
strncpy(info.province, ID, 2);
info.province[2] = '\0';
strncpy(info.city, ID + 2, 2);
info.city[2] = '\0';
strncpy(info.county, ID + 4, 2);
info.county[2] = '\0';
sscanf(ID + 6, "%4d%2d%2d%3d%c", &info.year, &info.month, &info.day, &info.order, &info.gender);
return info;
}
int checkID(char *ID) {
int checkCode = getCheckCode(ID);
if (ID[17] == checkCode + '0') {
return 1;
} else {
return 0;
}
}
int main() {
char ID[19];
printf("请输入身份证号码:");
scanf("%s", ID);
if (strlen(ID) != 18) {
printf("输入的身份证号码不是18位\n");
return 0;
}
if (checkID(ID)) {
printf("身份证号码校验通过\n");
} else {
printf("身份证号码校验不通过\n");
}
return 0;
}
```
程序中定义了一个结构体 `IDInfo`,用于存储身份证号码中的各个字段。其中,`getCheckCode` 函数计算校验位,`parseID` 函数解析身份证号码中的各个字段,并将其存储到 `IDInfo` 结构体中。`checkID` 函数判断校验位是否正确,如果正确返回 1,否则返回 0。在 `main` 函数中,用户输入身份证号码,程序对其进行校验并输出结果。
按照以下所给方法写出下列C语言结构体程序并注释 int checkID(char *ID); (7分) 判别身份证校验位是否正确的函数。其中参数 ID 代表一个 18 位身份证号,如果校验位正确,函数返回 1,否则返回 0。方法:校验位产生办法 如果已经知道一个人的身份证前17位,可以通过如下步骤得到第18位: (1)将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。 (2)将这17位数字和系数相乘的结果相加。 (3)用相加结果除以11,得出余数。 (4)余数只可能有0-1-2-3-4-5-6-7-8-9-10这11个数字。其分别对应的最后一位身份证的号码为1-0-X-9-8-7-6-5-4-3-2,这就是身份证号码的校验位。
```
// 定义结构体
struct IDCard {
char ID[18]; // 身份证号
};
// 校验身份证号码
int checkID(char *ID) {
int i, sum = 0;
int factors[17] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
char checkCodes[11] = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};
for (i = 0; i < 17; i++) {
sum += (ID[i] - '0') * factors[i];
}
return checkCodes[sum % 11] == ID[17];
}
```
注释:
- 第1行:定义了一个名为 IDCard 的结构体,其中包含一个长度为 18 的字符数组 ID,用于存储身份证号码。
- 第3行:定义了一个名为 checkID 的函数,接收一个 char* 类型的参数 ID,代表一个 18 位身份证号。
- 第4行:定义了两个 int 类型的变量 i 和 sum,其中 i 用于循环计数,sum 用于计算身份证号码前17位的加权和。
- 第5行:定义了一个长度为 17 的 int 类型数组 factors,用于存储每一位身份证号码对应的加权因子。
- 第6行:定义了一个长度为 11 的字符数组 checkCodes,用于存储身份证号码校验位对应的字符。
- 第7行:使用 for 循环,将前17位身份证号码分别乘以对应的加权因子,然后累加到 sum 变量中。
- 第8行:使用模运算,计算出校验位对应的字符,并将其与身份证号码的最后一位进行比较。
- 第9行:如果校验位正确,返回 1;否则返回 0。