程式要再加強囉~>"<~
關於Java的問題
-
mikimoto
- 初級玩家

- 文章: 31
- 註冊時間: 週五 9月 27, 2002 11:33 pm
註解1: 我比較不喜歡這種寫法,萬一 Ascii 碼編排方式改變呢?加上 Java 是要跨平台的程式,萬一有種平台不支援 Ascii 呢?,Sun一再強調使用Unicode ,就是這個道理Simon NP 寫:代碼: 選擇全部
class h6a1{ public static void main(String[]args){ char id[]=args[0].toCharArray(); int a=0,sum=0,d1=0,d2=0,sum2=0; for(int i=1;i<id.length;i++){ a=(int)id[i]-48;
註解2: 盡量不要養成在迴圈中,宣告變數的壞習慣,因為每跑一次迴圈,他都會再宣告一次,浪費不必要的寶貴時間代碼: 選擇全部
int b[]={8,7,6,5,4,3,2,1,1};
註解3: 下面這一段還是我不喜歡的寫法,不過重點不在這裡,而是在於維護程式的人可能沒辦法很直覺的看你的程式,會有維護上的困難,最好加個註解代碼: 選擇全部
sum+=a*b[i-1]; } char c[]={'A','B','C','D','E','F','G','H','J','K','L','M','N','P','Q','R','S','T','U','V','W','X','Y','Z','I','O'}; int d[]={10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35};
不會啦,我還不是最厲害的,人外有人嘛這我想了超久...不知道這樣寫法如何@@?麻煩指教一下....mikimoto兄寫的好....厲害阿...不過前三章要這樣串起來用我目前實在有待加強....我會繼續努力的代碼: 選擇全部
if(id[0]>96&id[0]<123) id[0]-=32; for(int j=0;j<26;j++) { if(id[0]==c[j]) { d1=d[j]/10; d2=d[j]-(d1*10); } sum2=d1*1+d2*9; } if((sum+sum2)%10==0){ System.out.println("身分證字號"+args[0]+"正確"); } else {System.out.println("身分證字號"+args[0]+"錯誤");} } }
我還是會把我寫的交作業吧^_^~~如果我沒寫錯的話@@
你可以自己寫出來,算是不錯了,再額外給你一點建議
Java 強調的是 OO 的概念,不過你的程式看起來卻把他當作程序化的程式在寫
已經回到 C 的老路子去了,完全沒有發揮OO的精神,建議你可以在學JAVA的語法外,多多學一些有關 OO 的概念,會使你的Java Programming的功力不可同日而語喔,另外能夠活用 Exception 的觀念,也會對你的 Coding 幫助匪淺,我提的這些建議,我的程式中都有用到,你可以多加參詳。
p.s. 你的程式有一些缺陷,不知道你自己看出來了嗎?
給一些提示:
1. 沒有判別身份證位數,有可能發生溢值或無法處理的危險
2. 沒有判別第一個字母是否為英文字母,萬一我輸入像 12209033xxx 呢
最後由 mikimoto 於 週一 10月 14, 2002 1:59 pm 編輯,總共編輯了 1 次。
-
Simon NP
- 頂級玩家

- 文章: 1151
- 註冊時間: 週一 7月 02, 2001 8:00 am
class h6a1{
public static void main(String[]args){
char id[]=args[0].toCharArray();
int a=0,sum=0,d1=0,d2=0,sum2=0;
for(int i=1;i<id.length;i++){
a=(int)id-48;
int b[]={8,7,6,5,4,3,2,1,1};
sum+=a*b[i-1];
}
char c[]={'A','B','C','D','E','F','G','H','J','K','L','M','N','P','Q','R','S','T','U','V','W','X','Y','Z','I','O'};
int d[]={10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35};
if(id[0]>96&id[0]<123)
id[0]-=32;
for(int j=0;j<26;j++)
{
if(id[0]==c[j])
{
d1=d[j]/10;
d2=d[j]-(d1*10);
}
sum2=d1*1+d2*9;
}
if((sum+sum2)%10==0){
System.out.println("身分證字號"+args[0]+"正確"); }
else
{System.out.println("身分證字號"+args[0]+"錯誤");}
}
}
這我想了超久...不知道這樣寫法如何@@?麻煩指教一下....mikimoto兄寫的好....厲害阿...不過前三章要這樣串起來用我目前實在有待加強....我會繼續努力的
我還是會把我寫的交作業吧^_^~~如果我沒寫錯的話@@
public static void main(String[]args){
char id[]=args[0].toCharArray();
int a=0,sum=0,d1=0,d2=0,sum2=0;
for(int i=1;i<id.length;i++){
a=(int)id-48;
int b[]={8,7,6,5,4,3,2,1,1};
sum+=a*b[i-1];
}
char c[]={'A','B','C','D','E','F','G','H','J','K','L','M','N','P','Q','R','S','T','U','V','W','X','Y','Z','I','O'};
int d[]={10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35};
if(id[0]>96&id[0]<123)
id[0]-=32;
for(int j=0;j<26;j++)
{
if(id[0]==c[j])
{
d1=d[j]/10;
d2=d[j]-(d1*10);
}
sum2=d1*1+d2*9;
}
if((sum+sum2)%10==0){
System.out.println("身分證字號"+args[0]+"正確"); }
else
{System.out.println("身分證字號"+args[0]+"錯誤");}
}
}
這我想了超久...不知道這樣寫法如何@@?麻煩指教一下....mikimoto兄寫的好....厲害阿...不過前三章要這樣串起來用我目前實在有待加強....我會繼續努力的
我還是會把我寫的交作業吧^_^~~如果我沒寫錯的話@@
天使折翼落紅塵
愛落紅塵心已死
最終一生逐於紅塵
難奈天意捉弄
愛落紅塵心已死
最終一生逐於紅塵
難奈天意捉弄
-
mikimoto
- 初級玩家

- 文章: 31
- 註冊時間: 週五 9月 27, 2002 11:33 pm
Re: 關於Java的問題
Oh! God take me now!!如果是用命令列的話我覺得可以這樣
假設檔名是checkid 要檢查的號碼是f123456789
執行這程式時應該是打
c:\ java checkid f123456789
f123456789就是args[0](以空白鍵作分隔索引值為0的命令列)
洽鳥,這...這...是沒錯啦,但是哪一個 Programmer 會先考慮這個阿?
通常都是先考慮演算法的實做問題,這些參數怎麼輸入應該不是重點喔
洽...洽鳥,這一段實在慘不忍睹你要在程式中宣告
String s1 = new String;
s1 = args[0];
這時s1的內容就是 {'f','1','2','3','4','5','6','7','8','9'}
s1[0]=f , s1[1]=1 , .....(資料型態都是char)
我不知道要用 Java 還是 C++/C 來看你的文章
兩種語法您都犯了致命的錯誤
以 Java 而言
代碼: 選擇全部
String s1 = new String();
-
mikimoto
- 初級玩家

- 文章: 31
- 註冊時間: 週五 9月 27, 2002 11:33 pm
嘿嘿,我也亂入一下
後記:
1. 一時技癢,所以花了幾分鐘寫出來了,因為大部分的系統 Verify 的部分都不需要重複 new 以面浪費時間,所以我一開始就打算用 Singleton 模式寫
2. 給 Simon : 我所用到的 java 語法,前三章應該就已經全部涵蓋了,你可能還需要多融會貫通一下,這跟邏輯不太有關係,而是如何活用語言的問題,希望你不要拿我的程式去交作業,而是將他變成自己的東西,這樣我 po 我寫的程式才有意義
3. 給 wawater : 您的程式非常直譯,如果您不是要當 Programmer,能寫出這種程式也不簡單了,但是如果想當 Programmer ,亂寫也不應該會寫的如此喔,您還可以多多磨練程式技巧及邏輯概念,我們一起加油吧
代碼: 選擇全部
/** File: IdVerify.java **/
package idverify;
/**
* <p>Title: 身份證字號判別範例</p>
* <p>Description: 判別身份證字號的演算法之實做</p>
* <p>Copyright: Copyright (c) 2002</p>
* <p>Company: Storists.Net</p>
* @author Mikimoto C.
* @version 1.0
*/
public class IdVerify {
private static IdVerify _instance = new IdVerify();
private IdVerify() {}
public static IdVerify getInstance() { return _instance; }
public void verify(String id) throws VerifyException {
id = id.toUpperCase();
char[] idarray = id.toCharArray();
int total = 0;
if (id.length() != 10) throw new VerifyException("身份證字號位數不符");
String str = new String("ABCDEFGHJKLMNPQRSTUVXYWZIO");
int num = str.indexOf(str.valueOf(idarray[0]));
if (num == -1)
throw new VerifyException("身份證字號第一字母應為英文字母");
for (int i=1; i<id.length()-1; i++) {
total +=
(new Integer(id.valueOf(idarray[i])).intValue())*(id.length()-1-i);
}
total += new Integer(id.valueOf(idarray[id.length()-1])).intValue();
total += ((num%10)*9)+(num/10)+1;
if (total%10 != 0) throw new VerifyException("不正確的身份證字號");
}
}
/** File: VerifyException.java **/
package idverify;
public class VerifyException extends Exception {
public VerifyException() {
super();
}
public VerifyException(String msg) {
super(msg);
}
}
/** File: Main.java **/
import idverify.*;
public class Main {
public static void main(String[] args) {
if (args.length >0) {
if (args[0].length() > 0) {
try {
IdVerify.getInstance().verify(args[0]);
}
catch(VerifyException ex) {
ex.printStackTrace();
}
} else {
new VerifyException("身份證字號不能為空白");
}
}
}
}
1. 一時技癢,所以花了幾分鐘寫出來了,因為大部分的系統 Verify 的部分都不需要重複 new 以面浪費時間,所以我一開始就打算用 Singleton 模式寫
2. 給 Simon : 我所用到的 java 語法,前三章應該就已經全部涵蓋了,你可能還需要多融會貫通一下,這跟邏輯不太有關係,而是如何活用語言的問題,希望你不要拿我的程式去交作業,而是將他變成自己的東西,這樣我 po 我寫的程式才有意義
3. 給 wawater : 您的程式非常直譯,如果您不是要當 Programmer,能寫出這種程式也不簡單了,但是如果想當 Programmer ,亂寫也不應該會寫的如此喔,您還可以多多磨練程式技巧及邏輯概念,我們一起加油吧
最後由 mikimoto 於 週一 10月 14, 2002 11:27 am 編輯,總共編輯了 3 次。
-
wawater
- 頂級玩家

- 文章: 1244
- 註冊時間: 週日 7月 01, 2001 8:00 am
啊~~~亂寫的啦~~
class app{
public static void main(String args[]){
String s1=new String(args[0]);
char c1[]=new char[11];
for(int i=1;i<11;i++){
c1=s1.charAt(i-1);
}
if(c1[1]=='A'){
c1[0]='1';
c1[1]='0';
}else if(c1[1]=='B'){
c1[0]='1';
c1[1]='1';
}else if(c1[1]=='C'){
c1[0]='1';
c1[1]='2';
}else if(c1[1]=='D'){
c1[0]='1';
c1[1]='3';
}else if(c1[1]=='E'){
c1[0]='1';
c1[1]='4';
}else if(c1[1]=='F'){
c1[0]='1';
c1[1]='5';
}else if(c1[1]=='G'){
c1[0]='1';
c1[1]='6';
}else if(c1[1]=='H'){
c1[0]='1';
c1[1]='7';
}else if(c1[1]=='J'){
c1[0]='1';
c1[1]='8';
}else if(c1[1]=='K'){
c1[0]='1';
c1[1]='9';
}else if(c1[1]=='L'){
c1[0]='2';
c1[1]='0';
}else if(c1[1]=='M'){
c1[0]='2';
c1[1]='1';
}else if(c1[1]=='N'){
c1[0]='2';
c1[1]='2';
}else if(c1[1]=='P'){
c1[0]='2';
c1[1]='3';
}else if(c1[1]=='Q'){
c1[0]='2';
c1[1]='4';
}else if(c1[1]=='R'){
c1[0]='2';
c1[1]='5';
}else if(c1[1]=='S'){
c1[0]='2';
c1[1]='6';
}else if(c1[1]=='T'){
c1[0]='2';
c1[1]='7';
}else if(c1[1]=='U'){
c1[0]='2';
c1[1]='8';
}else if(c1[1]=='V'){
c1[0]='2';
c1[1]='9';
}else if(c1[1]=='W'){
c1[0]='3';
c1[1]='0';
}else if(c1[1]=='X'){
c1[0]='3';
c1[1]='1';
}else if(c1[1]=='Y'){
c1[0]='3';
c1[1]='2';
}else if(c1[1]=='Z'){
c1[0]='3';
c1[1]='3';
}else if(c1[1]=='I'){
c1[0]='3';
c1[1]='4';
}else if(c1[1]=='O'){
c1[0]='3';
c1[1]='5';
}
int check1[]=new int[11],check2[]={1,9,8,7,6,5,4,3,2,1,1},sum=0;
for(int k=0;k<11;k++){
check1[k]=(int)(c1[k])-48;
sum+=check1[k]*check2[k];
}
if(sum%10==0){
System.out.println("身份正字號正確!!");
}else{
System.out.println("身份正字號錯誤!!");
}
}
}
class app{
public static void main(String args[]){
String s1=new String(args[0]);
char c1[]=new char[11];
for(int i=1;i<11;i++){
c1=s1.charAt(i-1);
}
if(c1[1]=='A'){
c1[0]='1';
c1[1]='0';
}else if(c1[1]=='B'){
c1[0]='1';
c1[1]='1';
}else if(c1[1]=='C'){
c1[0]='1';
c1[1]='2';
}else if(c1[1]=='D'){
c1[0]='1';
c1[1]='3';
}else if(c1[1]=='E'){
c1[0]='1';
c1[1]='4';
}else if(c1[1]=='F'){
c1[0]='1';
c1[1]='5';
}else if(c1[1]=='G'){
c1[0]='1';
c1[1]='6';
}else if(c1[1]=='H'){
c1[0]='1';
c1[1]='7';
}else if(c1[1]=='J'){
c1[0]='1';
c1[1]='8';
}else if(c1[1]=='K'){
c1[0]='1';
c1[1]='9';
}else if(c1[1]=='L'){
c1[0]='2';
c1[1]='0';
}else if(c1[1]=='M'){
c1[0]='2';
c1[1]='1';
}else if(c1[1]=='N'){
c1[0]='2';
c1[1]='2';
}else if(c1[1]=='P'){
c1[0]='2';
c1[1]='3';
}else if(c1[1]=='Q'){
c1[0]='2';
c1[1]='4';
}else if(c1[1]=='R'){
c1[0]='2';
c1[1]='5';
}else if(c1[1]=='S'){
c1[0]='2';
c1[1]='6';
}else if(c1[1]=='T'){
c1[0]='2';
c1[1]='7';
}else if(c1[1]=='U'){
c1[0]='2';
c1[1]='8';
}else if(c1[1]=='V'){
c1[0]='2';
c1[1]='9';
}else if(c1[1]=='W'){
c1[0]='3';
c1[1]='0';
}else if(c1[1]=='X'){
c1[0]='3';
c1[1]='1';
}else if(c1[1]=='Y'){
c1[0]='3';
c1[1]='2';
}else if(c1[1]=='Z'){
c1[0]='3';
c1[1]='3';
}else if(c1[1]=='I'){
c1[0]='3';
c1[1]='4';
}else if(c1[1]=='O'){
c1[0]='3';
c1[1]='5';
}
int check1[]=new int[11],check2[]={1,9,8,7,6,5,4,3,2,1,1},sum=0;
for(int k=0;k<11;k++){
check1[k]=(int)(c1[k])-48;
sum+=check1[k]*check2[k];
}
if(sum%10==0){
System.out.println("身份正字號正確!!");
}else{
System.out.println("身份正字號錯誤!!");
}
}
}
-
chanow
- 高級玩家

- 文章: 589
- 註冊時間: 週五 10月 26, 2001 8:00 am
Re: 關於Java的問題
如果是用命令列的話我覺得可以這樣Simon NP 寫:像是輸入F123456789好了....要怎麼把他分開變成F 1 2 4 .....然後再轉成數字型態作運算???
請懂Java的朋友能夠告訴我可以參考哪些方法~~拜託ㄌ~~~
假設檔名是checkid 要檢查的號碼是f123456789
執行這程式時應該是打
c:\ java checkid f123456789
f123456789就是args[0](以空白鍵作分隔索引值為0的命令列)
你要在程式中宣告
String s1 = new String;
s1 = args[0];
這時s1的內容就是 {'f','1','2','3','4','5','6','7','8','9'}
s1[0]=f , s1[1]=1 , .....(資料型態都是char)
接著就...
不知道了
-
Mark
- 頂級玩家

- 文章: 1714
- 註冊時間: 週六 7月 14, 2001 8:00 am
Re: 關於Java的問題
恩~~簡單!Simon NP 寫:我初學程式語言...所以很多邏輯的概念還沒弄得很好....
很多Java的方法也還沒學會....想請問一下各位懂Java設計的人
關於我現在有一題回家作業實在解不出來....能不能夠告訴我應該使用哪些Java的方法來解題......
以下是題目
設計一方法檢查身分證字號是否正確
(一)身分證字母轉成號碼對照表
字母 A B C D E F G H J K L M N
編號 10 11 12 13 14 15 16 17 18 19 20 21 22
字母 P Q R S T U V X Y W Z I O
編號 23 24 25 26 27 28 29 30 31 32 33 34 35
(二)計算公式
1.將英文字母轉換後,身份証號變成 11 碼
例 A 1 2 3 4 5 6 7 8 9
變成 1 0
2.各數字分別乘:1, 9, 8, 7, 6, 5, 4, 3, 2, 1, 1
3.將各位數乘積相加, 若為10的倍數則身分證號碼正確
(三)範例 G220903332
編號 1 6 2 2 0 9 0 3 3 3 2
* 1 9 8 7 6 5 4 3 2 1 1
乘積 1 54 16 14 0 45 0 9 6 3 2
1+ 54 +16 +14 + 0 + 45 +0 + 9 + 6 + 3 + 2 = 150
因 150 能被 10 整除,故身分證編號正確。
就是這個題目....
目前我看那本Java書才看到第六章...實在找不出有什麼方式可以把輸入的字串轉成一個一個的字元再放到陣列裡面作比對....
像是輸入F123456789好了....要怎麼把他分開變成F 1 2 4 .....然後再轉成數字型態作運算???
請懂Java的朋友能夠告訴我可以參考哪些方法~~拜託ㄌ~~~
就一句話~~~
我不會........
-
Simon NP
- 頂級玩家

- 文章: 1151
- 註冊時間: 週一 7月 02, 2001 8:00 am
關於Java的問題
我初學程式語言...所以很多邏輯的概念還沒弄得很好....
很多Java的方法也還沒學會....想請問一下各位懂Java設計的人
關於我現在有一題回家作業實在解不出來....能不能夠告訴我應該使用哪些Java的方法來解題......
以下是題目
設計一方法檢查身分證字號是否正確
(一)身分證字母轉成號碼對照表
字母 A B C D E F G H J K L M N
編號 10 11 12 13 14 15 16 17 18 19 20 21 22
字母 P Q R S T U V X Y W Z I O
編號 23 24 25 26 27 28 29 30 31 32 33 34 35
(二)計算公式
1.將英文字母轉換後,身份証號變成 11 碼
例 A 1 2 3 4 5 6 7 8 9
變成 1 0
2.各數字分別乘:1, 9, 8, 7, 6, 5, 4, 3, 2, 1, 1
3.將各位數乘積相加, 若為10的倍數則身分證號碼正確
(三)範例 G220903332
編號 1 6 2 2 0 9 0 3 3 3 2
* 1 9 8 7 6 5 4 3 2 1 1
乘積 1 54 16 14 0 45 0 9 6 3 2
1+ 54 +16 +14 + 0 + 45 +0 + 9 + 6 + 3 + 2 = 150
因 150 能被 10 整除,故身分證編號正確。
就是這個題目....
目前我看那本Java書才看到第六章...實在找不出有什麼方式可以把輸入的字串轉成一個一個的字元再放到陣列裡面作比對....
像是輸入F123456789好了....要怎麼把他分開變成F 1 2 4 .....然後再轉成數字型態作運算???
請懂Java的朋友能夠告訴我可以參考哪些方法~~拜託ㄌ~~~
很多Java的方法也還沒學會....想請問一下各位懂Java設計的人
關於我現在有一題回家作業實在解不出來....能不能夠告訴我應該使用哪些Java的方法來解題......
以下是題目
設計一方法檢查身分證字號是否正確
(一)身分證字母轉成號碼對照表
字母 A B C D E F G H J K L M N
編號 10 11 12 13 14 15 16 17 18 19 20 21 22
字母 P Q R S T U V X Y W Z I O
編號 23 24 25 26 27 28 29 30 31 32 33 34 35
(二)計算公式
1.將英文字母轉換後,身份証號變成 11 碼
例 A 1 2 3 4 5 6 7 8 9
變成 1 0
2.各數字分別乘:1, 9, 8, 7, 6, 5, 4, 3, 2, 1, 1
3.將各位數乘積相加, 若為10的倍數則身分證號碼正確
(三)範例 G220903332
編號 1 6 2 2 0 9 0 3 3 3 2
* 1 9 8 7 6 5 4 3 2 1 1
乘積 1 54 16 14 0 45 0 9 6 3 2
1+ 54 +16 +14 + 0 + 45 +0 + 9 + 6 + 3 + 2 = 150
因 150 能被 10 整除,故身分證編號正確。
就是這個題目....
目前我看那本Java書才看到第六章...實在找不出有什麼方式可以把輸入的字串轉成一個一個的字元再放到陣列裡面作比對....
像是輸入F123456789好了....要怎麼把他分開變成F 1 2 4 .....然後再轉成數字型態作運算???
請懂Java的朋友能夠告訴我可以參考哪些方法~~拜託ㄌ~~~
天使折翼落紅塵
愛落紅塵心已死
最終一生逐於紅塵
難奈天意捉弄
愛落紅塵心已死
最終一生逐於紅塵
難奈天意捉弄
誰在線上
正在瀏覽這個版面的使用者:沒有註冊會員 和 10 位訪客



