Advertisement
ZRE0412

C-HomeWork-02-ID Checker

Dec 8th, 2020
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.52 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <time.h>
  5.  
  6. const int L[27]={10, 11, 12, 13, 14, 15, 16, 17, 34, 18, 19, 20, 21, 22, 35, 23, 24, 25, 26, 27, 28, 29, 32, 30, 31, 33};
  7. const char A[27]="ABCDEFGHJKLMNPQRSTUVXYWZIO";
  8.  
  9. void UI(int mode){
  10.     switch(mode){
  11.         case 0:
  12.             printf("|-------------------|\n");
  13.             printf("| 1. 身分證檢查     |\n");
  14.             printf("| 2. 身分證地區猜測 |\n");
  15.             printf("| 3. 身分證隨機生成 |\n");
  16.             printf("|-------------------|\n");
  17.             printf("請輸入你想要的模式: ");
  18.             return;
  19.         case 1:
  20.             printf("\n|---------------------|\n");
  21.             printf(  "| 1. 設定首碼英文     |\n");
  22.             printf(  "| 2. 設定英文及第二碼 |\n");
  23.             printf(  "| 3. 全隨機           |\n");
  24.             printf(  "|---------------------|\n");
  25.             printf(  "請輸入你想要的模式: ");
  26.             return;
  27.     }
  28. }
  29.  
  30. void check_ID(char *ID){
  31.     int len=strlen(ID), sum=0, i;
  32.     if(len<10){
  33.         printf("錯誤: 長度太短\n\n");
  34.         return;
  35.     }
  36.     else if(len>10){
  37.         printf("錯誤: 長度太長\n\n");
  38.         return;
  39.     }
  40.     else if(ID[0]<'A' || ID[0]>'Z'){
  41.         printf("錯誤: 首碼英文格式錯誤\n\n");
  42.         return;
  43.     }
  44.     else if(ID[1]!='1' && ID[1]!='2'){
  45.         printf("錯誤: 第二碼性別碼錯誤\n\n");
  46.         return;
  47.     }
  48.     else{
  49.         for(i=1;i<9;i++){
  50.             if(ID[i]>='0' && ID[i]<='9'){
  51.                 sum+=(9-i)*(ID[i]-'0');
  52.             }
  53.             else{
  54.                 printf("錯誤: 數字格式錯誤\n\n");
  55.                 return;
  56.             }
  57.         }
  58.         if(ID[9]>='0' && ID[9]<='9'){
  59.             sum+=ID[i]-'0';
  60.         }
  61.         else{
  62.             printf("錯誤: 數字格式錯誤\n\n");
  63.             return;
  64.         }
  65.         sum+=L[ID[0]-'A']/10+L[ID[0]-'A']%10*9;
  66.         if(sum%10==0){
  67.             printf("正確: 身分證無誤\n\n");
  68.             return;
  69.         }
  70.         else{
  71.             printf("錯誤: 檢核數錯誤\n\n");
  72.             return;
  73.         }
  74.     }
  75. }
  76.  
  77. void check_ID_L(char *ID){
  78.     int i, j, c, P=0, O=0, sum=0, len=strlen(ID);
  79.     if(len<9){
  80.         printf("錯誤: 長度太短\n\n");
  81.         return;
  82.     }
  83.     else if(len>9){
  84.         printf("錯誤: 長度太長\n\n");
  85.         return;
  86.     }
  87.     for(i=0;i<8;i++){
  88.         if(ID[i]>='0' && ID[i]<='9'){
  89.             sum+=(8-i)*(ID[i]-'0');
  90.         }
  91.         else{
  92.             printf("錯誤: 數字格式錯誤\n\n");
  93.             return;
  94.         }
  95.     }
  96.     if(!(ID[8]>='0' && ID[8]<='9')){
  97.         printf("錯誤: 數字格式錯誤\n\n");
  98.         return;
  99.     }
  100.     else if(ID[8]-'0'==0)
  101.         c=10;
  102.     else
  103.         c=ID[8]-'0';
  104.     printf("有可能的字母有: ");
  105.     for(i=1;i<=3;i++){
  106.         for(j=0;j<=9;j++){
  107.             if(i==3&&j>5)
  108.                 break;
  109.             if(10-((sum+i+j*9)%10)==c){
  110.                 if(A[(i*10+j)-10]=='P' && 10-((sum+3+4*9)%10)==c){
  111.                     printf("IP");
  112.                     P=1;
  113.                 }
  114.                 if(A[(i*10+j)-10]=='Q' && 10-((sum+3+5*9)%10)==c){
  115.                     printf("OQ");
  116.                     O=1;
  117.                 }
  118.                 if(P!=1 && O!=1)
  119.                     printf("%c", A[(i*10+j)-10]);
  120.             }
  121.         }
  122.     }
  123.     printf("\n\n");
  124. }
  125.  
  126. void ran_ID_gen(int situation, char mode){
  127.     char ID_FL, ID_sexcode=NULL;
  128.     int i, sum=0, temp;
  129.     srand((unsigned) time(NULL));
  130.     if(situation==0){
  131.         UI(1);
  132.     }
  133.  
  134.     if(mode==NULL){
  135.        scanf("%s", &mode);
  136.     }
  137.     switch(mode){
  138.         case '1':
  139.             printf("請輸入身分證首碼: ");
  140.             scanf("%s", &ID_FL);
  141.             if(ID_FL<'A' || ID_FL>'Z'){
  142.                 printf("錯誤: 首碼英文格式錯誤,請再輸入一次\n");
  143.                 ran_ID_gen(1, '1');
  144.                 return;
  145.             }
  146.             break;
  147.         case '2':
  148.             printf("請輸入身分證首碼及第二碼(以空格隔開): ");
  149.             //except '\n'
  150.             getchar();
  151.             scanf("%c %c", &ID_FL, &ID_sexcode);
  152.             //printf("%c %c", ID_FL, ID_sexcode);
  153.             if(ID_FL<'A' || ID_FL>'Z'){
  154.                 printf("錯誤: 首碼英文格式錯誤,請再輸入一次\n");
  155.                 ran_ID_gen(1, '2');
  156.                 return;
  157.             }
  158.             else if(ID_sexcode!='1' && ID_sexcode!='2'){
  159.                 printf("錯誤: 第二碼性別錯誤,請再輸入一次\n");
  160.                 ran_ID_gen(1, '2');
  161.                 return;
  162.             }
  163.             sum+=(ID_sexcode-'0')*8;
  164.             printf("生成結果: %c%c", ID_FL, ID_sexcode);
  165.             break;
  166.         case '3':
  167.             ID_FL=rand()%26+'A';
  168.             break;
  169.         default:
  170.             printf("模式選擇錯誤,請再輸入一次\n請輸入你想要的模式: ");
  171.             ran_ID_gen(1, NULL);
  172.             return;
  173.     }
  174.     if(mode!='2'){
  175.         //sex code generate and print letter
  176.         temp=rand()%2+1;
  177.         sum+=temp*8;
  178.         printf("生成結果: %c%d", ID_FL, temp);
  179.     }
  180.  
  181.     //random number generate
  182.     for(i=2;i<9;i++){
  183.         temp=rand()%10;
  184.         printf("%d", temp);
  185.         sum+=temp*(9-i);
  186.     }
  187.  
  188.     //calculate check digit
  189.     sum+=L[ID_FL-'A']/10+L[ID_FL-'A']%10*9;
  190.     printf("%d\n\n", (10-sum%10)%10);
  191. }
  192.  
  193. int main(){
  194.     char n;
  195.     UI(0);
  196.     while(scanf("%s", &n)!=EOF){
  197.         char ID[11];
  198.         switch(n){
  199.             case '1':
  200.                 printf("請輸入身分證字號(10位):\n");
  201.                 scanf("%s", &ID);
  202.                 check_ID(ID);
  203.                 break;
  204.             case '2':
  205.                 printf("請輸入身分證字號(9位不包含英文字母):\n");
  206.                 scanf("%s", &ID);
  207.                 check_ID_L(ID);
  208.                 break;
  209.             case '3':
  210.                 ran_ID_gen(0, NULL);
  211.                 break;
  212.             default:
  213.                 printf("模式選擇錯誤,請再輸入一次\n\n");
  214.                 break;
  215.         }
  216.         UI(0);
  217.     }
  218.     return 0;
  219. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement