#include #include using namespace std; /*** idlast.cpp, ver. 0.9, @CopyLeft by tsaiwn, Last upDate: Mon, 1 Feb 1999 ***/ int testID(char id[]); void genID( ) { } // todo main( ) { char what[][88]={ "對啦!!這是合法的身份證字號", //訊息0 "ㄟ..第一個字非字母", //訊息1 "你是第三性嗎?", //訊息2 "打錯啦!!應該是數字喔!!", //訊息3 "怎麼會有這麼多碼!!", //訊息4 "神秘數字算出來是錯的", //訊息5 "太短了!不足碼唷!!"}; //訊息6 cout << "*********************************" << endl; cout << "*********身份證驗證程式**********" << endl; cout << "*********************************" << endl; char id[16]; /* 夠用了啦 */ while(1){ // Java 不可以這樣寫 ! cout << "請輸入身分證號碼 : "; cin.getline(id, 16); // 注意 getline 讀入不會有 newLine if (cin.fail()) { if (cin.eof()) { cout << endl; break; }// EOF cin.clear(); // clear Error status cin.ignore(0xffff, '\n'); //略去打太多的字 cout << "字串太長!\n"; continue; /* 回到 while(1) 繼續*/ }//if(cin.fail( if(strcmp(id, "999")==0){ genID( ); continue; } if (id[0] == '.' && id[1] == 0) break; // 只輸入 "." if (id[0] == '-' && id[1] == '1') break; // "-1" if (id[1] == 'U' || id[1] == 'u') break; // quit cout << "*********輸入 '.' 結束***********" << endl; cout<<" " << id << "==>" << what[testID(id)] << endl ; } //輸出訊息 cout << "***********bye! bye!************" << endl; return 0; }// main( int testID(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 }; //VWXY Z int sum = 0; //sum是為了計算身份證是否為正確的變數 if (!isalpha(p[0])) { return 1; //若第一碼p[0]不為英文, 則傳回訊息1 表示輸入錯誤 } 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的餘數) if (p[1] != '1' && p[1] != '2') return 2; //身份證第二碼為性別碼 //1為男, 2為女. 若都不是則傳回訊息2 int j; /* 若是 C 程式則要先在前面宣告或定義 */ for (j = 1;j < 9; j++) { //接下來的9碼身份證號碼當然都是數字 // 將剩下號碼分別乘以8.7.6.5.4.3.2.1 if (p[j] == 0) return 6; //太早出現空碼, 表不足碼傳回訊息6 if (isdigit(p[j])) sum += (p[j]-'0') * (9-j) ; else return 3; //若有一碼不是數字則跳開並傳回訊息3 } if (p[10] != 0 && p[10]!= '\n') return 4; //而第11碼不是空的就錯了並傳回訊息4 (萬一用 gets 最後會是 \n ) if (!isdigit(p[9])) return 3; //最後一碼也須是數字 sum += p[9]-'0'; // 檢查碼的 weight 也是 1 if ( (sum %10) != 0) return 5; //檢查碼有錯,傳回訊息5 return 0; }// testID(