大一的一个c语言实验

img


大一的一个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;  //不会返回这个值的
}

运行结果:

img

img


运行环境VS2019,题主可自行验证

代码如下:

#include<stdio.h>
int main()
{
    int i = 0;
    int n = 18;
    int qz[17] = { 7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2 };
    char sfz[20]={0};
    
    int sum = 0;
    int gjr = 0;
    int N = 0;
    int m = 0;
    int q = 0;
    scanf("%d", &N);
    for (i = 0; i < N; i++)
    {
        scanf("%s", sfz);
        sum = 0;
        for (q = 0; q < 17; q++)
        {
            gjr = (sfz[q] - '0') * qz[q]; 
            sum = gjr + sum;
        }
        sum = sum % 11;

        switch (sum)
        {
        case 0:
            if (sfz[17] == '1') printf("Passed\n");
            else printf("Fail\n");
            break;
        case 1:
            if (sfz[17] == '0') printf("Passed\n");
            else printf("Fail\n");
            break;
        case 3:
            if (sfz[17] == '9') printf("Passed\n");
            else printf("Fail\n");
            break;
        case 4:
            if (sfz[17] == '8') printf("Passed\n");
            else printf("Fail\n");
            break;
        case 5:
            if (sfz[17] == '7') printf("Passed\n");
            else printf("Fail\n");
            break;
        case 6:
            if (sfz[17] == '6') printf("Passed\n");
            else printf("Fail\n");
            break;
        case 7:
            if (sfz[17] == '5') printf("Passed\n");
            else printf("Fail\n");
            break;
        case 8:
            if (sfz[17] == '4') printf("Passed\n");
            else printf("Fail\n");
            break;
        case 9:
            if (sfz[17] == '3') printf("Passed\n");
            else printf("Fail\n");
            break;
        case 10:
            if (sfz[17] == '2') printf("Passed\n");
            else printf("Fail\n");
            break;
        default:
            printf("Fail\n");
            break;
        }


        
    }
    
    return 0;
}

#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,count,both=0;   // n验证次数  count 局部变量,输出错误的身份证号    both 检验是否全部正确,输出ALL passed
    char result;  // 最后一位校验码
    scanf("%d",&n);
    getchar();
    char id[n][18];
    for(int i=0;i<n;i++)
    {
        scanf("%s",id[i]);
    }
    //验证前17位数字
    for(int i=0;i<n;i++)
    {
        count=0;
        for(int a=0;a<17;a++)
        {
            if(id[n][a]<'0'&&id[n][a]>'9')
            {
                count++;
            }
        }
        if(count>0)
        {
            for(int l=0;l<18;l++)
                printf("%c",id[i][l]);
            printf("\n");
            both++;
        }
        //进行下一步验证
        if(count==0)
        {
            int k=0;
            for(int j=0;j<17;j++)
            {
                k+=(id[i][j]-'0')*res[j];
            }
            k=k%11;
            result=fun(k);
            if(id[i][17]!=result)
            {
                for(int l=0;l<18;l++)
                    printf("%c",id[i][l]);
                printf("\n");
                both++;
            }
        }
    }
    if(both==0)
    {
        printf("All passed");
    }
    return 0;
}
char fun(int n)  //z值与M值对应  当然也可以一维数组,不过为了更好的匹配,于是用switch语句
{
    switch (n) {
        case 0: return '1';
        case 1: return '0';
        case 2: return '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 "hello World";  //不会返回这个值的
}

#include<stdio.h>
#include<string.h>
int main()
{
    int n;
    scanf("%d",&n);
    int weights[] = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
    //printf("%d",weights[1]);
    int match[] = {1,0,9,8,7,6,5,4,3,2};
    char result[20];
    char number[20];
    char number2[20];
    for(int i = 0;i < n;i++){
        scanf("%s",number);
        scanf("%s",number2);
        int weight_sum = 0;
        for(int j = 0;j < 17;j++){
            int value = number[j] - '0';
            weight_sum = weight_sum + value * weights[j];
        }
        //printf("sum = %d\n",weight_sum);
        int res = weight_sum % 11;
        //取模
        //printf("%d\n",res);
if(res <= 1){
res=res-1;
}
        res = match[res];
        int final = number2[17] - '0';
        if(final == res){
            printf("Passed\n");
        }else{
            printf("Fail\n");
        }
    }
    return 0;
}