Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <time.h>
- 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};
- const char A[27]="ABCDEFGHJKLMNPQRSTUVXYWZIO";
- void UI(int mode){
- switch(mode){
- case 0:
- printf("|-------------------|\n");
- printf("| 1. 身分證檢查 |\n");
- printf("| 2. 身分證地區猜測 |\n");
- printf("| 3. 身分證隨機生成 |\n");
- printf("|-------------------|\n");
- printf("請輸入你想要的模式: ");
- return;
- case 1:
- printf("\n|---------------------|\n");
- printf( "| 1. 設定首碼英文 |\n");
- printf( "| 2. 設定英文及第二碼 |\n");
- printf( "| 3. 全隨機 |\n");
- printf( "|---------------------|\n");
- printf( "請輸入你想要的模式: ");
- return;
- }
- }
- void check_ID(char *ID){
- int len=strlen(ID), sum=0, i;
- if(len<10){
- printf("錯誤: 長度太短\n\n");
- return;
- }
- else if(len>10){
- printf("錯誤: 長度太長\n\n");
- return;
- }
- else if(ID[0]<'A' || ID[0]>'Z'){
- printf("錯誤: 首碼英文格式錯誤\n\n");
- return;
- }
- else if(ID[1]!='1' && ID[1]!='2'){
- printf("錯誤: 第二碼性別碼錯誤\n\n");
- return;
- }
- else{
- for(i=1;i<9;i++){
- if(ID[i]>='0' && ID[i]<='9'){
- sum+=(9-i)*(ID[i]-'0');
- }
- else{
- printf("錯誤: 數字格式錯誤\n\n");
- return;
- }
- }
- if(ID[9]>='0' && ID[9]<='9'){
- sum+=ID[i]-'0';
- }
- else{
- printf("錯誤: 數字格式錯誤\n\n");
- return;
- }
- sum+=L[ID[0]-'A']/10+L[ID[0]-'A']%10*9;
- if(sum%10==0){
- printf("正確: 身分證無誤\n\n");
- return;
- }
- else{
- printf("錯誤: 檢核數錯誤\n\n");
- return;
- }
- }
- }
- void check_ID_L(char *ID){
- int i, j, c, P=0, O=0, sum=0, len=strlen(ID);
- if(len<9){
- printf("錯誤: 長度太短\n\n");
- return;
- }
- else if(len>9){
- printf("錯誤: 長度太長\n\n");
- return;
- }
- for(i=0;i<8;i++){
- if(ID[i]>='0' && ID[i]<='9'){
- sum+=(8-i)*(ID[i]-'0');
- }
- else{
- printf("錯誤: 數字格式錯誤\n\n");
- return;
- }
- }
- if(!(ID[8]>='0' && ID[8]<='9')){
- printf("錯誤: 數字格式錯誤\n\n");
- return;
- }
- else if(ID[8]-'0'==0)
- c=10;
- else
- c=ID[8]-'0';
- printf("有可能的字母有: ");
- for(i=1;i<=3;i++){
- for(j=0;j<=9;j++){
- if(i==3&&j>5)
- break;
- if(10-((sum+i+j*9)%10)==c){
- if(A[(i*10+j)-10]=='P' && 10-((sum+3+4*9)%10)==c){
- printf("IP");
- P=1;
- }
- if(A[(i*10+j)-10]=='Q' && 10-((sum+3+5*9)%10)==c){
- printf("OQ");
- O=1;
- }
- if(P!=1 && O!=1)
- printf("%c", A[(i*10+j)-10]);
- }
- }
- }
- printf("\n\n");
- }
- void ran_ID_gen(int situation, char mode){
- char ID_FL, ID_sexcode=NULL;
- int i, sum=0, temp;
- srand((unsigned) time(NULL));
- if(situation==0){
- UI(1);
- }
- if(mode==NULL){
- scanf("%s", &mode);
- }
- switch(mode){
- case '1':
- printf("請輸入身分證首碼: ");
- scanf("%s", &ID_FL);
- if(ID_FL<'A' || ID_FL>'Z'){
- printf("錯誤: 首碼英文格式錯誤,請再輸入一次\n");
- ran_ID_gen(1, '1');
- return;
- }
- break;
- case '2':
- printf("請輸入身分證首碼及第二碼(以空格隔開): ");
- //except '\n'
- getchar();
- scanf("%c %c", &ID_FL, &ID_sexcode);
- //printf("%c %c", ID_FL, ID_sexcode);
- if(ID_FL<'A' || ID_FL>'Z'){
- printf("錯誤: 首碼英文格式錯誤,請再輸入一次\n");
- ran_ID_gen(1, '2');
- return;
- }
- else if(ID_sexcode!='1' && ID_sexcode!='2'){
- printf("錯誤: 第二碼性別錯誤,請再輸入一次\n");
- ran_ID_gen(1, '2');
- return;
- }
- sum+=(ID_sexcode-'0')*8;
- printf("生成結果: %c%c", ID_FL, ID_sexcode);
- break;
- case '3':
- ID_FL=rand()%26+'A';
- break;
- default:
- printf("模式選擇錯誤,請再輸入一次\n請輸入你想要的模式: ");
- ran_ID_gen(1, NULL);
- return;
- }
- if(mode!='2'){
- //sex code generate and print letter
- temp=rand()%2+1;
- sum+=temp*8;
- printf("生成結果: %c%d", ID_FL, temp);
- }
- //random number generate
- for(i=2;i<9;i++){
- temp=rand()%10;
- printf("%d", temp);
- sum+=temp*(9-i);
- }
- //calculate check digit
- sum+=L[ID_FL-'A']/10+L[ID_FL-'A']%10*9;
- printf("%d\n\n", (10-sum%10)%10);
- }
- int main(){
- char n;
- UI(0);
- while(scanf("%s", &n)!=EOF){
- char ID[11];
- switch(n){
- case '1':
- printf("請輸入身分證字號(10位):\n");
- scanf("%s", &ID);
- check_ID(ID);
- break;
- case '2':
- printf("請輸入身分證字號(9位不包含英文字母):\n");
- scanf("%s", &ID);
- check_ID_L(ID);
- break;
- case '3':
- ran_ID_gen(0, NULL);
- break;
- default:
- printf("模式選擇錯誤,請再輸入一次\n\n");
- break;
- }
- UI(0);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement