如何把 C 程式改為 Java Application?
(1) 最前面補上這些:
import java.io.*;
import ... 看有用到啥...
class ggyy { // 名稱要與檔案名伊樣
(2) 最後面補上這個, 這樣整個 C 程式被 class 包起來
} // class ends here
(3) 在 class 裡面寫這些: (前後不重要, 習慣上放前面)
BufferedReader cin = null;
PrintStream cout = null;
PrintStream cerr = null;
public static void main(String xxx[ ]) {
ggyy me = new ggyy( ); // ggyy 是你的 class name
me.prepareIO( );
me.main( ); // call 原先 C/C++ 的 main( )
}
public ggyy( ) { } // 目前沒有事情做
void prepareIO( ) {
try{
cin = new BufferedReader(new InputStreamReader(System.in));
}catch(Exception e) {;} // Exception handling
cout = System.out;
cerr = System.err;
} // that's OK now
void printf(String fmt, Object... yy) {
cout.printf(fmt, yy);
}
(4) 若有寫 #include .. 通通殺掉
因為 Java 不認帳!
(5) 若有寫 #define xx yy
或是 const int xx=yy;
都改用 public static final int xx=yy;
例如 #define MAX_STONE 31
要改成:
public static final int MAX_STONE = 31;
(6) 關於指標, (a)若不是文字的指標就改成 array,
(b)若是文字的指標阿就是字串就改為 String
這時要善用 String 的 .charAt(?)
例如 C 的 char *id; 或是 char id[99];
常會搭配使用 if(id[k] == ...) ...
這 if(id[k] == ...)... 就改為 if(id.charAt(k) == ...) ...
若要改變 id[k] 內容則不可用 String, 要改用 StringBuffer
StringBuffer s = "haha how are you?";
s.setCharAt(1, 'e'); s.setCharAt(3, 'e'); // ==> "hehe how are you?"
System.out.println("s=" +s);
** 注意 String s 的 內容不能改: s.charAt(2) = 'x'; // 錯錯錯
StringBuffer ss 才能改: ss.setCharAt(2, 'x');
(7) 關於亂數
C/C++ 的 inr rand( ) 在 Java 要用 Math.random()且不一樣
阿就是 0 <= Math.random( ) < 1 是 double 實數
那就寫一支int rand() 就可:
int rand( ) {
return (int) (32767* Math.random( ) );
} // 這樣是 0..32766
或這樣
int rand( ) {
return (int) ( Integer.MAX_VALUE * Math.random( ) );
} // 這樣是 0..MAX_VALUE -1
// 注意 Java 的 int 是 32-bit, 等於 C/C++ 的 long int;
// Java 的 long 是 64-bit, Java 整數都是 sign integer
// 還有 Java Math.random( ) 是自動換 SEED
// 注意 C 的 rand( ) 若不手動換 SEED 則每次重新執行都相同
(8) 程式中的 squeeze( ) 要怎辦?
Java 的 String 有 replace 函數, Try this:
String aa = " haha hehe how are you ";
String bb = aa.replace(" ", "");
bb = bb.replace("\t", "");
System.out.println("bb="+bb);
這樣大概就可以了! 包括你所有 printf 都 OK 了!
剩下是輸入以及字串處理...
** Java 要讀一整列要這樣(C 的 gets 或 fgets):
String s = null;
try {
s = cin.readLine( );
}catch(Exception e) {;}
** Java 要讀一個 char 要這樣:
int c = 0;
try {
c = cin.read( );
}catch(Exception e) {;}
if(c == -1 ) // EOF encounted 檔案結束!
** Java 要讀一整列上只有一個整數:
String stmp=null;
int ans=0;
try {
stmp = cin.readLine( );
ans = Integer.parseInt(stmp); // Double.parseDouble(stmp);
}catch(Exception e) {;}
// ans is what you want
** 若程式內有用到 scanf 那就比較麻煩 :-(
此時可以用 java.util.Scanner 一個一個讀入
或是改為用 readLine() 讀入整列後用 StringTokenizer 處理
** 如何使用 java.util.Scanner?
java.util.Scanner gg = new java.util.Scanner(System.in);
int n;
double x;
String haha;
if(gg.hasNextInt( )) n = gg.nextInt( );
if(gg.hasNextDouble( ) ) x = gg.nextDouble( );
if(gg.hasNext( )) haha = gg.next( );
可寫 while Loop 抓到 hasNext( ) 不成立為止 !
** Java 的字串處理更簡單
Java 的 String 是物件 (與 C++ class string 一樣 )
C 的 int strcmp(char*, char*) ?
String s = "abcd235 78ha ha ";
if(s.equals("hehehe") //... 字串是否相等 ?
if(s.startsWith("haha")) //...
s.substring(2,5) 是 "cd2" 表示 2-th 到 4-th (5-1 = 4)
s.replace(' ', ''); // 去掉所有的空白
s.charAt(3) 是 'd' 因為從第0字算起
if(s.charA(0) == 'q' ) // 開始是 q
if(s.equalsIgnoreCase("quit")) // 大小寫不管是否等於 "quit"
Please see javap java.lang.String
或用 Browser 看 java.sun.com 的 Java API References
You are the
-th visitors to this page.
回到作業目錄
回到課程目錄