//idoktest.cpp -- copyLeft by tsaiwn@csie.nctu.edu.tw //g++ idoktest.cpp; ./a.out #include #include using namespace std; int check(char *p); main() /*** Last upDate: Mon, 1 Feb 1999 ***/ { char what[][70]={ "對啦!!這是合法的身份證字號", //訊息0 "ㄟ..第一個字非字母", //訊息1 "你是第三性嗎?", //訊息2 "打錯啦!!應該是數字喔!!", //訊息3 "怎麼會有這麼多碼!!", //訊息4 "神秘數字算出來是錯的", //訊息5 "太短了!不足碼唷!!"}; //訊息6 cout << "*********************************" << endl; cout << "*********身份證驗證程式**********" << endl; cout << "*********************************" << endl; char id[16]; while(1){ cout << "請輸入身分證號碼 : "; cin.getline(id, 16); if (cin.fail()) { if (cin.eof()) { cout << endl; break; } cin.clear(); cin.ignore(0xffff, '\n'); cout << "字串太長!\n"; continue; } if( (id[0] == '.' && id[1] == 0) || (id[0]=='-') ) { break; } cout << "*********輸入 '.' 結束***********" << endl; cout << "====>" << what[check(id)] << endl ; } //輸出訊息 cout << "***********bye! bye!************" << endl; return 0; } //////// //////// //////// int check(char *p) { char y[26]={ 10,11,12,13,14,15,16,17, 34, //ABCDEFGH I 18,19,20,21,22, 35, //JKLMN O 23,24,25,26,27,28, //PQRSTU 29,32,30,31, 33 }; //VWXYZ int sum = 0; //sum是為了計算身份證是否為正確的變數 if (isalpha(p[0])) { char ktmp= toupper( p[0] ); //see "man isalpha",要用到 ktmp= y[ ktmp - 'A' ]; // 轉為 table y[] 中數值, 仍存回 ktmp sum += ( (int) ktmp / 10 ) + 9* ( ktmp % 10 ); //sum = sum + ( (int) ktmp/10 取整數部分加上9乘以ktmp除以10的餘數) } else { return 1; //若第一碼p[0]皆不為英文.表示輸入錯誤則傳回訊息1 } if (p[1] != '1' && p[1] != '2') return 2; //身份證第二碼為性別碼 //1為男.2為女.若都不是則傳回訊息2 int j; for (j = 1;j < 9; j++) { if (p[j] == 0) return 6; //出現空碼.表不足碼傳回訊息6 if (isdigit(p[j])) sum += (p[j]-'0') * (9-j) ; //接下來的9碼身份證號碼當然都是數字 // 將剩下號碼分別乘以8.7.6.5.4.3.2.1 else return 3; } if (p[10] != 0) return 4; //若最後一碼不是數字則跳開並傳回訊息3 //而第11碼不是空的就錯了並傳回訊息4 sum += p[9]-'0'; if ( (sum %10) != 0) return 5; //不可能有第11碼.傳回訊息5 return 0; }