<font color=blue size=4><b><pre>
     1	//idcheck.c -- by tsaiwn@csie.nctu.edu.tw
     2	//gcc idcheck.c
     3	//gӵ{iHˬdҸXO_T
     4	//Extra credit: J 999 hͤ@ӥiΪXkҸX
     5	////////////
     6	#include &lt;stdio.h>
     7	#include &lt;ctype.h>
     8	void generateID( ), squeeze(char*); // ŧi function 
     9	int testID(char*);  // d稭ҦUإi઺~ öǦ^~NX
    10	void printError(int code); // print error message according code
    11	
    12	// `N Java ݭnŧi, ]b class SY 
    13	
    14	int main( ) {
    15	   static char id[99];  // 'a :-) Ҥ~ 10 X 
    16	   int code = 0;   // ΨӰO~NX 
    17	   while(38 == 38) {   // for( ;; ) {
    18	       printf("пJҸX Input ID: ");
    19	       fgets(id, sizeof(id), stdin); // CŪJ  id
    20	       // check EOF 
    21	       if(feof(stdin)) break;  //EOF == ^D in Unix; ^Z on DOS/Window
    22	       squeeze(id); // Ҧťճh  white space
    23	       //printf("strlen(id)=%d\n", strlen(id));
    24	       if(strcmp(id, "-1") == 0) break; //Java  id.equals("-1")
    25	       if(strcmp(id, ".") == 0) break; 
    26	       if(strcmp(id, "quit") == 0) break; 
    27	       if(id[1] == 'U') break;  // QUIT ?  // Java  id.charAt(1)==
    28	       if(strcmp(id, "999") == 0) {generateID( ); continue; }
    29	       code = testID(id);  // o~N, 0 ܵL :-)
    30	       printf(" ID %s is ", id);
    31	       if(code==0) printf(" OK.\n");   // LXoXT 
    32	       else {
    33	          printf(" Error ID! Reason(s):\n");
    34	       }//if
    35	       printError(code); // ̾ code LT 
    36	   }// while(
    37	   printf("\r\nThank you and bye bye!\n");
    38	   return 0;
    39	}//main(
    40	
    41	//  squeeze(char*) onΪ function, ] C {wS,ۤvg:
    42	//`N NewLine ] white space, ҥHoƤ]|ڪ '\n' !
    43	// ] fgets ŪJƧڦ NewLine; C++  getline hS NewLine!
    44	void squeeze(char*p) {    // Ҧ white space; Java np󰵩O?
    45	   char*p2 = p;    
    46	   if(*p == 0)return;   // NULL terminated, @}lNr굲: Ŧr
    47	   while(*p2 !=0) {  // white space Ь  K&amp;RҥĤGP B
    48	      if(isspace(*p2)) { ++p2; continue; }  // ᱼ white space
    49	      *p = *p2; 
    50	      p++; ++p2;   // advance one char
    51	   }//while
    52	   *p = *p2;  // 0 == '\0'   == NULL 
    53	}// squeeze(
    54	
    55	//  int testID(char* id) : ̾ڨҳWhd id Ǧ^~NX
    56	int yy[ ]={ 10,11,12,13,14,15,16,17, 34,  //ABCDEFGH I
    57	            18,19,20,21,22,  35,   //JKLMN O
    58	            23,24,25,26,27,28,     //PQRSTU
    59	            29,32,30,31, 33 };     //VWXY Z 
    60	int checkSum(char * id){  //  checkSum  testID(id)  
    61	   int sum, i;    // ]sXSӦr, κ⪺nܦh if(...
    62	   int ynum;
    63	   // άdk table look up dXrƸ²檽ı !
    64	   // حӪ int yy[ ] = { 10, 11, 12, 13, ...};  // ӳWw AB..
    65	   // M Let i = id[0]rh 'A' o 0..25
    66	   // AdX yy[i] ӥ: ynum = yy[i];  // 10..OO35..ZO35 !!
    67	   i = id[0] - 'A';
    68	   ynum = yy[i];
    69	   sum = ynum/10 + 9* (ynum%10);  // weight 1, 9, [876543211]
    70	   for(i=1; i&lt;=8; ++i) sum += (id[i] - '0') *(9-i);  // 87654321
    71	   sum += (id[9] - '0') ;  // *1   ˬdX weight ]O  1
    72	   return sum;   // ڥutdX checksum
    73	}//checkSum(
    74	
    75	int testID(char* id) {   //Ǧ^~NX, i bitwise "&amp;" BX 
    76	   int i, ans = 0, sum=0;  // sum ΨӺ weighted check sum
    77	   id[0] = toupper(id[0]); // ରjg
    78	   if(!isalpha(id[0])) ans = ans + 1;  // 1   ans = ans | 1;
    79	   if(id[1] != '1'  &amp;&amp; id[1] != '2') ans += 2; // 2  kͤk?
    80	   if(strlen(id) &lt; 10) ans += 4;   // ӵu
    81	   if(strlen(id) > 10) ans += 8;   // Ӫ
    82	   for(i=1; i&lt;=9; ++i) if(!isdigit(id[i])) ans = ans | 16; // DƦr
    83	   if((ans&amp;16) != 0) return ans;  // DƦrΦA check sum  
    84	   if(ans != 0) return ans;  // N..NΦA check sum  
    85	   sum = checkSum(id);   // ]SLǦrNX check sum
    86	   if(sum%10 != 0) ans |= 32;   // H 10 oɤ~ 
    87	   return ans;
    88	}// testID(
    89	
    90	char what[ ][88]={ "!!oOXkҦr", //T0
    91	                "..Ĥ@ӦrOr!",    // T1
    92	                "AOĤTʶ?",            // T2
    93	              "ӵuF!X!!",      // T3
    94	              "|ohX!!",     // T4
    95	            "!!ӬOƦr!!",   // T5     
    96	            "ƦrXӬO??"     // T6
    97	                };  // do NOT forget the ";"
    98	// String what[ ] = { ... };  // in Java 
    99	void printError(int code) {  // print all errors found use bitwise and
   100	   int i, yy[ ] = {0, 1, 2, 4, 8, 16, 32, 64, 128};
   101	   if(code == 0) { printf("%s\n", what[0]); return; }
   102	   for(i=1; i &lt;= 6; ++i)if((code&amp;yy[i]) != 0)printf("%s\n", what[i]);
   103	}// printError(
   104	
   105	void generateID( ) {
   106	   char id[11]={ 0 };   // | 0  (NULL)  ==  '\0'   == 0
   107	   int i;
   108	   id[0] = 'A' +  rand( ) % 26;  // 'A' .. 'Z'
   109	   id[1] = '1' + rand( ) % 2;   // '1' .. '2'
   110	   for(i=2; i&lt;=8; ++i) {
   111	     // ζüƥͥX id[2] .. id[8]
   112	     id[i] = '0' + rand( )%10;   // '0' .. '9'
   113	   } //
   114	   /// id[9] OˬdX, n, i '0' s checkSum( )Aվ 
   115	   id[9] = '0';
   116	   i = checkSum(id);   // ɥ i Ӧs  checkSum
   117	   i = i % 10;
   118	   if(i != 0) id[9] = '0' + (10-i);     // ˬdX 
   119	   printf(" Good ID: %s\n", id);   // legal ID now
   120	}// generateID(
