Java基本功練習四(用方法的思想編程舉例,如顯示當前時間、檢驗信用卡號合法性與類別、擲骰子游戲等)

       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進行調整,以方便調試。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章