<HTML>
 <head><meta http-equiv="Content-Type"
 content="text/html; charset=big5" /></head>

<BODY bgcolor=#ccddff>
<font color=blue size=4><b>
<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(

</pre>

</pre>
You are the

<img src="http://counter.nsysu.edu.tw/Count.cgi?dd=88">

-th visitors to this page.

<hr>
</pre>
<font color=blue size=5>
<a href="../">
^@~ؿ
</a>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
<a href="../../">
^ҵ{ؿ
</a><br>

<hr size=3> 
<font color=darkBlue size=4>
<pre>

   1 //idcheck.java -- by tsaiwn@csie.nctu.edu.tw  <font color=red>
   2 // Reference answer to the LAB04
   3 class idcheck extends c2java {
   4  // extends c2java unrPХHΥΨ fgets, scanf Ni!
   5  // `NY extends c2java, h c2java.java eۤJo
   6   /////// n`N constructor W!
   7    public static void main(String xx[]) {
   8       idcheck me = new idcheck( );
   9       me.main( );
  10    }   </font>
  11 //idcheck.c -- by tsaiwn@csie.nctu.edu.tw
  12 //gcc idcheck.c
  13 //gӵ{iHˬdҸXO_T
  14 //Extra credit: J 999 hͤ@ӥiΪXkҸX
  15 ////////////
  16 //#include &lt;stdio.h>
  17 //#include &lt;ctype.h>
  18 //void generateID( ), squeeze(char*); // ŧi function 
  19 //int testID(char*);  // d稭ҦUإi઺~ öǦ^~NX
  20 //void printError(int code); // print error message according code
  21 
  22 // `N Java ݭnŧi, ]b class SY 
  23 
  24 int main( ) {
  25    //static char id[99];  // 'a :-) Ҥ~ 10 X 
  26    String id;
  27    int code = 0;   // ΨӰO~NX 
  28    while(38 == 38) {   // for( ;; ) {
  29        printf("пJҸX Input ID: ");
  30        //fgets(id, sizeof(id), stdin); // CŪJ  id
  31        id = fgets( );
  32        // check EOF 
  33        //if(feof(stdin)) break;  //EOF == ^D in Unix; ^Z on DOS/Window
  34        if(id== null) break;   // EOF
  35        //squeeze(id); // Ҧťճh  white space
  36        id = id.replace(" ", "");
  37        if(id.equals("") ) break;  // empty string
  38        // `N check ==null, A replace(), A check .equald("") ...
  39        //printf("strlen(id)=%d\n", strlen(id));
  40        //if(strcmp(id, "-1") == 0) break; //Java  id.equals("-1")
  41        if(id.equals("-1")) break;
  42        //if(strcmp(id, ".") == 0) break; 
  43        if(id.equals(".")) break;
  44        //if(strcmp(id, "quit") == 0) break; 
  45        if(id.equals("quit")) break;
  46        //if(id[1] == 'U') break;  // QUIT ?  // Java  id.charAt(1)==
  47        if(id.length()>1 ) if(id.charAt(1) == 'U') break;
  48        //if(strcmp(id, "999") == 0) {generateID( ); continue; }
  49        if(id.equals("999"))  {generateID( ); continue; }
  50        code = testID(id);  // o~N, 0 ܵL :-)
  51        printf(" ID %s is ", id);
  52        if(code==0) printf(" OK.\n");   // LXoXT 
  53        else {
  54           printf(" Error ID! Reason(s):\n");
  55        }//if
  56        printError(code); // ̾ code LT 
  57    }// while(
  58    printf("\r\nThank you and bye bye!\n");
  59    return 0;
  60 }//main(
  61 
  62 
  63 //  int testID(char* id) : ̾ڨҳWhd id Ǧ^~NX
  64 int yy[ ]={ 10,11,12,13,14,15,16,17, 34,  //ABCDEFGH I
  65             18,19,20,21,22,  35,   //JKLMN O
  66             23,24,25,26,27,28,     //PQRSTU
  67             29,32,30,31, 33 };     //VWXY Z 
  68 int checkSum(String  id){  //  checkSum  testID(id)  
  69    int sum, i;    // ]sXSӦr, κ⪺nܦh if(...
  70    int ynum;
  71    // άdk table look up dXrƸ²檽ı !
  72    // حӪ int yy[ ] = { 10, 11, 12, 13, ...};  // ӳWw AB..
  73    // M Let i = id[0]rh 'A' o 0..25
  74    // AdX yy[i] ӥ: ynum = yy[i];  // 10..OO35..ZO35 !!
  75    i = Character.toUpperCase( id.charAt(0)) - 'A';
  76    ynum = yy[i];
  77    sum = ynum/10 + 9* (ynum%10);  // weight 1, 9, [876543211]
  78    for(i=1; i&lt;=8; ++i) sum += (id.charAt(i) - '0') *(9-i);  // 87654321
  79    sum += (id.charAt(9) - '0') ;  // *1   ˬdX weight ]O  1
  80    return sum;   // ڥutdX checksum
  81 }//checkSum(
  82 
  83 int testID(String id) {   //Ǧ^~NX, i bitwise "&amp;" BX 
  84    int i, ans = 0, sum=0;  // sum ΨӺ weighted check sum
  85    //id[0] = toupper(id[0]); // ରjg
  86    char id0 = id.charAt(0);
  87    if(!Character.isLetter(id0))  ans = ans + 1;  // 1   ans = ans | 1;
  88    if(id.length() > 1)
  89     if(id.charAt(1) != '1'  &amp;&amp; id.charAt(1) != '2') ans += 2; // 2  kͤk?
  90    if(id.length() &lt; 10) ans += 4;   // ӵu
  91    if(id.length() > 10) ans += 8;   // Ӫ
  92    for(i=1; i&lt; id.length(); ++i) 
  93           if(!Character.isDigit(id.charAt(i)))ans = ans | 16; // DƦr
  94    if((ans&amp;16) != 0) return ans;  // DƦrΦA check sum  
  95    if(ans != 0) return ans;  // N..NΦA check sum  
  96    sum = checkSum(id);   // ]SLǦrNX check sum
  97    if(sum%10 != 0) ans |= 32;   // H 10 oɤ~ 
  98    return ans;
  99 }// testID(
 100 
 101 String what[ ]={ "!!oOXkҦr", //T0
 102                 "..Ĥ@ӦrOr!",    // T1
 103                 "AOĤTʶ?",            // T2
 104               "ӵuF!X!!",      // T3
 105               "|ohX!!",     // T4
 106             "!!ӬOƦr!!",   // T5     
 107             "ƦrXӬO??"     // T6
 108                 };  // do NOT forget the ";"
 109 // String what[ ] = { ... };  // in Java 
 110 void printError(int code) {  // print all errors found use bitwise and
 111    int i, yy[ ] = {0, 1, 2, 4, 8, 16, 32, 64, 128};
 112    if(code == 0) { printf("%s\n", what[0]); return; }
 113    for(i=1; i &lt;= 6; ++i)if((code&amp;yy[i]) != 0)printf("%s\n", what[i]);
 114 }// printError(
 115 
 116 void generateID( ) {
 117    //char id[11]={ 0 };   // | 0  (NULL)  ==  '\0'   == 0
 118    String id="";
 119    int i;
 120    //id[0] = 'A' +  rand( ) % 26;  // 'A' .. 'Z'
 121    id = "" + (char)('A' +  rand( ) % 26 );  // 'A' .. 'Z'
 122    //id[1] = '1' + rand( ) % 2;   // '1' .. '2'
 123    id += (char) ('1' + rand( ) % 2);   // '1' .. '2'
 124    for(i=2; i&lt;=8; ++i) {
 125      // ζüƥͥX id[2] .. id[8]
 126      id += (char) ('0' + rand( )%10);   // '0' .. '9'
 127    } //
 128    /// id[9] OˬdX, n, i '0' s checkSum( )Aվ 
 129    //id[9] = '0';
 130    String id22 = id+"0";   // tmp id
 131    i = checkSum(id22);   // ɥ i Ӧs  checkSum
 132    i = i % 10;
 133    if(i != 0) id  += (char)('0' + (10-i));     // ˬdX 
 134    else id += "0";
 135    printf(" Good ID: %s\n", id);   // legal ID now
 136 }// generateID(
 137 
 138 }//class
</pre>
<hr color=red size=3>
<font color=red size=4><b>
<pre>
   1 //c2java.java
   2 import java.io.*;
   3 import java.util.*;
   4 //You can extends this class ..
   5 // .. so that you can quickly translate your C into Java program
   6 class c2java {
   7    BufferedReader cin = null;
   8    PrintStream cout = null;
   9    PrintStream cerr = null;
  10    c2java( ) { prepareIO( );  } // constructor
  11    void prepareIO( ) {
  12       try {
  13        cin = new BufferedReader(
  14         new InputStreamReader(System.in) );
  15       }catch(Exception e) {;}
  16       cout = System.out;
  17       cerr = System.err;
  18    }
  19    void printf(String fmt, Object... oo) {
  20         System.out.printf(fmt, oo); 
  21    }//printf
  22    void print(String fmt, Object... oo) {
  23         System.out.printf(fmt, oo); 
  24    }
  25    void println(String fmt, Object... oo) {
  26         System.out.printf(fmt+"\n", oo); 
  27    }//println
  28    int atol(String s) {   // atoi, atol
  29       int ans = 0;
  30       try {
  31         ans = Integer.parseInt(s);
  32       }catch(Exception e) { ; }
  33       return ans;
  34    }//atol
  35    double atof(String s) {
  36       double ans = 0;
  37       try {
  38         ans = Double.parseDouble(s);
  39       }catch(Exception e) { ; }
  40       return ans;
  41    }//atof
  42    int rand( ) {
  43       return (int) ( Math.random() * (1.0 + Integer.MAX_VALUE) );
  44    }//rand
  45    void srand(int x) {
  46       return;
  47    }
  48    String fgets( ) {
  49       String buf=null;
  50       try{
  51          buf = cin.readLine( );
  52       }catch(Exception e){;}
  53       return buf;
  54    }//fgets
  55 }//calss c2java 
</pre>

<hr size=5>


</pre>
You are the

<img src="http://counter.nsysu.edu.tw/Count.cgi?dd=88">

-th visitors to this page.

<hr>
</pre>
<font color=blue size=5>
<a href="../">
^@~ؿ
</a>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
<a href="../../">
^ҵ{ؿ
</a><br>

