Java基本功練習三中介紹了方法的抽象,爲了更好的理解和強化,本篇博文再舉幾例進行訓練。
方法的抽象這一程序開發設計的思想一定要多加練習,形成潛意識,以後在main方法中多寫幾句就會忍不住想要用方法來實現,這樣開發的代碼有很好的重用性。
示例一:顯示程序運行的當前時間。(本例使用消息對話框的方式顯示輸出的)
運行效果如右圖所示:
提示:我們知道Java中系統類可以返回從1970年1月1日到當前時間的毫秒數,本例就是從這點出發的。參照《Java基本功練習三》中的設計思路,請童鞋們自己設計。
以下是實現的源代碼:
package Blog;
import javax.swing.JOptionPane;
public class blogTryProject {
//顯示當前的時間,北京時間
public static void main(String[]args){
String currentTime = printBeJingTime();
JOptionPane.showMessageDialog(null, currentTime,"顯示當前的北京時間"
,JOptionPane.INFORMATION_MESSAGE);
}
//打印北京時間
public static String printBeJingTime(){
long totalMilliSeconds = System.currentTimeMillis();
long totalSeconds = totalMilliSeconds / 1000;
long currentSecond = totalSeconds % 60;
long totalMinutes = totalSeconds / 60;
long currentMinute = totalMinutes % 60;
long totalHours = totalMinutes / 60;
long currentHour = totalHours % 24;
long totalDays = totalHours / 24;
long GMT = 8;//北京時間比格林尼治時間快8小時,位於東8時區
long BeJingCurrentHour = (currentHour + GMT) % 24;
String BeJingTime = "";
String YearMonthDay = yearMonthDay(totalDays);//得到年月日
BeJingTime += YearMonthDay+"\n";
BeJingTime = BeJingTime +/*"當前是北京時間:"*/" "+BeJingCurrentHour+":"+
currentMinute+":"+currentSecond+"\n\nDesigned by : HarryKate\n"+"Time:2014/12/4";
return BeJingTime;
}
//得到當前時間的年月日
public static String yearMonthDay(long totalDays){
totalDays += 1;//與格林尼治時間相差一天,補回來
String YearMonthDay = "";
int yearCount = 1970;//年份計數
while(totalDays > 366 || totalDays >=365){
if(isLeapYear(yearCount))
totalDays -= 366;
else
totalDays -= 365;
yearCount++;
}
int monthCount = 1;//月份計數
while(totalDays >= 28 || totalDays >=29 || totalDays >= 30 || totalDays > 31){
totalDays -= daysInMonth(monthCount,yearCount);
monthCount++;
}
YearMonthDay = yearCount+"年"+monthCount+"月"+totalDays+"日";
return YearMonthDay;
}
//得到某月的天數
public static int daysInMonth(int monthCount,int yearCount){
if(monthCount == 1 || monthCount == 3 || monthCount == 5 || monthCount == 7
|| monthCount == 8 || monthCount == 10 || monthCount == 12)
return 31;
else if(monthCount == 4 || monthCount == 6 || monthCount == 9 || monthCount == 11)
return 30;
else
return isLeapYear(yearCount) ? 29 :28;
}
//判斷是否是閏年
public static boolean isLeapYear(int yearCount){
return yearCount % 400 == 0||(yearCount % 4 == 0 && yearCount % 100 != 0);
}
}
示例二:(要求)用戶輸入一個long型整數的信用卡號,顯示這個卡是否合法,並判斷出屬於哪一類卡。注意:不能使用數組,只能使用基本的數據類型來實現。
假如信用卡遵循以下的模式:一個信用卡必須是13位到16位的整數,它的開頭必須是:4,指Visa卡;5,Master卡;37,指American Express卡;6,指Discover卡。而其數字遵循的規律(爲了敘述方便舉例說明)。
假如卡號爲:3788586118412,它必須遵循以下幾點:
1)從右到做對每個數字翻倍。如果對某個數字翻倍之後的結果是一個兩位數,那麼就將這個兩位數加在一起得到一位數。如8*2 = 16(1+6=7);3*2 = 6;5*2=10(1+0=1)
2)現將第一步得到的所有一位數相加。(6+5+7+7+1+7+3+2+2+7+8+2+4=71)
3)將卡號裏從右到左在奇數位上的所有數字相加。(3+8+5+6+1+4+2=29)
4)將第二步和第三步得到的結果相加。(71+29=100)
5)如果第四步得到結果能被10整除,那麼卡號合法,否則非法。(100%10=0合法)
運行效果如右圖所示:
爲了給童鞋們鍛鍊的空間,本作者只寫了判斷13位或16位的程序,完善的工作留給童鞋們鍛鍊!實現的代碼如下所示:
package Blog;
import java.util.Scanner;
public class blogTryProject {
public static void main(String [] args){
Scanner input = new Scanner(System.in);
System.out.println("請輸入13位或16位信用卡號,如下是測試用例\n"
+ "e.g 16位:4388576018402621是合法的,而4388586018402626是非法的。 "
+ "\ne.g 13位:3788586118412是合法的,而3788576118412是非法的");
for(int i = 0;i < 4;i++){
System.out.print("第"+(i+1)+"次輸入: ");
long cardNumber = input.nextLong();
cardJudge(cardNumber);
}
}
//判斷卡的合法性和類別並輸出結果
public static void cardJudge(long cardNumber){
String name = kindOfCard(cardNumber);
if(name == "Invalid Card!")
System.out.println("卡號爲:"+cardNumber+" 的卡是非法信用卡!\n");
else
System.out.println("卡號爲:"+cardNumber+" 的卡是合法的信用卡,"
+ "卡的類型爲: "+name+"\n");
}
//判斷卡的類型
public static String kindOfCard(long cardNumber){
String name = "Invalid Card!";
int countWeiShu = 0;
long numberForWeiShu = cardNumber;
while(numberForWeiShu != 0){
countWeiShu++;
numberForWeiShu /= 10;
}
if(countWeiShu == 13 || countWeiShu == 16){
if(isLegalLaw(cardNumber)){
if(countWeiShu == 13)
name = kindOfCard13(cardNumber);
else
name = kindOfCard16(cardNumber);
}
}
return name;
}
//判斷13位卡的類型
public static String kindOfCard13(long cardNumber) {
String name = "";
long numberForKindOfCard = cardNumber;
int countKindOfCard = 1;
long lastNumber = 0;
while (numberForKindOfCard != 0) {
long number = 0;
number = numberForKindOfCard % 10;
numberForKindOfCard /= 10;
if (countKindOfCard == 12) {
if (number == 7) {
lastNumber = number;
}
}
if (countKindOfCard == 13) {
switch ((int) number) {
case 3:
if (lastNumber == 7)
name = "American Express";
break;
case 4:
name = "Visa";
break;
case 5:
name = "Master";
break;
case 6:
name = "Discover";
break;
}
}
countKindOfCard++;
}
return name;
}
//判斷16位卡的類型
public static String kindOfCard16(long cardNumber) {
String name = "";
long numberForKindOfCard = cardNumber;
long countKindOfCard = 1;
long lastNumber = 0;
while (numberForKindOfCard != 0) {
long number = 0;
number = numberForKindOfCard % 10;
numberForKindOfCard /= 10;
if (countKindOfCard == 15) {
if (number == 7) {
lastNumber = number;
}
}
if (countKindOfCard == 16) {
switch ((int) number) {
case 3:
if (lastNumber == 7)
name = "American Express";
break;
case 4:
name = "Visa";
break;
case 5:
name = "Master";
break;
case 6:
name = "Discover";
break;
}
}
countKindOfCard++;
}
return name;
}
//判斷卡是否符合幾條規則的限制
public static boolean isLegalLaw(long cardNumber) {
long sumOfEachNumber = eachNumber(cardNumber);
long sumOfOddNumber = oddNumber(cardNumber);
long sumOfEachNumbrAndOddNumber = sumOfEachNumber + sumOfOddNumber;
if (sumOfEachNumbrAndOddNumber % 10 == 0)
return true;
else
return false;
}
//計算卡的每一位數字之和
public static long eachNumber(long cardNumber){
long sumOfEachNumber = 0;
while(cardNumber != 0){
long number = 0;
number = cardNumber % 10;
cardNumber /= 10;
number *= 2;
if(number < 10)
sumOfEachNumber += number;
else{
sumOfEachNumber += number % 10;
sumOfEachNumber += number / 10;
}
}
return sumOfEachNumber;
}
//計算卡的奇數位的和
public static long oddNumber(long cardNumber){
int oddEvenCount = 1;
long sumOfOdd = 0;
long number = 0;
while(cardNumber != 0){
number = cardNumber % 10;
cardNumber /= 10;
if(oddEvenCount % 2 == 1)
sumOfOdd += number;
oddEvenCount++;
}
return sumOfOdd;
}
}
示例三:擲骰子游戲(相對基礎,可以練練手)。擲兩個骰子,每個骰子六面表示值爲:1,2,3,4,5,6。檢查兩個骰子的和。1)如果和爲2、3或12,你就輸了;2)如果和是7或11,你就贏了;3)如果和是其他數,就確定了一個點。繼續擲出一個7或擲出和剛纔相同的點數。如果擲出7,你就輸了,如果和剛纔的點數一樣,你就贏了。用程序扮演一個獨立的玩家。
運行效果如下圖所示(四種情況下的運行結果):
實現的源代碼如下所示:
package XiTi5;
public class XiTi {
public static void main(String[]args){
while(true){
int num1 = (int)(Math.random()*6+1);
int num2 = (int)(Math.random()*6+1);
int sum = num1 + num2;
if(sum == 2 || sum == 3 || sum == 12){
System.out.println("You rolled "+num1+" + "+num2+" = "+sum
+"\nYou Lose!");
break;
}
else if(sum == 7 || sum == 11){
System.out.println("You rolled "+num1+" + "+num2+" = "+sum
+"\nYou Win!");
break;
}
else{
int sumLast = sum;
System.out.println("The first time you rolled "+num1+" + "
+num2+" = "+sum);
System.out.println("You must roll "+sum+",or your will lose!");
while(true){
num1 = (int)(Math.random()*6+1);
num2 = (int)(Math.random()*6+1);
sum = num1 + num2;
if(sum == sumLast){
System.out.println("You rolled "+num1+" + "+num2+" = "+sum
+"\nYou Win!");
break;
}
if(sum == 7){
System.out.println("You rolled "+num1+" + "+num2+" = "+sum
+"\nYou Lose!");
break;
}
System.out.println("You rolled "+num1+" + "+num2+" = "+sum);
}
break;
}
}
}
}
總結:一定要自己先設計調試看看,思路很簡單,但思路只是方案,要將方案轉換成程序化的語言也是需要功夫的,切記!
另外調試第二題的時候由於之前用了太多的if語句,以至於後來大括號太多而影響調試,總是有錯,就反覆更改,後來發現更改時不小心刪了個大括號,所以一定要排版規範。方法是:選中代碼,右鍵選擇Source-->Format進行調整,以方便調試。