第二講 Java基礎(chǔ)
《第二講 Java基礎(chǔ)》由會(huì)員分享,可在線閱讀,更多相關(guān)《第二講 Java基礎(chǔ)(17頁珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、第二章 Java基礎(chǔ)知識(shí) 2 加1為啥變少 2 數(shù)據(jù)類型轉(zhuǎn)換 2 位運(yùn)算 3 調(diào)試之美 4 高手點(diǎn)拔-萬年歷的編寫 6 任務(wù): 7 需求分析 8 階段1判斷是否是閏年 8 階段2編程計(jì)算輸入月份的天數(shù) 9 階段3 編程計(jì)算輸入的月份距離1900年1月1日的天數(shù) 11 階段4 編程計(jì)算輸入月份的第一天是星期幾 13 階段5 格式化輸出× ×年× ×月日歷 14 完整源程序 14 第二章 Java基礎(chǔ)知識(shí) 這一章將演示Java的基本語法,如果您已經(jīng)有其他語言的編程經(jīng)驗(yàn),這一章可能很簡單。學(xué)習(xí)一門新的編程語言首先要掌握這門語言的基礎(chǔ)知識(shí)。如數(shù)據(jù)類型、if/else、sw
2、itch分支語句和while 、for循環(huán)語句和輸出等等。學(xué)習(xí)程序的目的就是為了解決實(shí)際的問題,對(duì)實(shí)際的問題進(jìn)行分析,從抽象的描述轉(zhuǎn)換為具體的計(jì)算機(jī)語言。編程的感覺總是在實(shí)踐中一步一步得到提高。 加1為啥變少 我們知道在Java語言中,數(shù)據(jù)類型分為基本數(shù)據(jù)類型和引用數(shù)據(jù)類型。基本數(shù)據(jù)為字節(jié)byte、短整型short、整型int和長整型long。布爾型boolean,字符型char。 但是下面這個(gè)程序會(huì)是什么問題呢? 示例: public class DataTypeDemo { public static void main(String[] args) { // TO
3、DO Auto-generated method stub byte b=127; b+=1; System.out.println(b); //b=b+1; b=(byte)(b+1); } } 程序輸出: 代碼詳解: 上面的例子中,我們還定義了一個(gè)字節(jié)類型的數(shù)據(jù)。當(dāng)加一時(shí),為什么變?yōu)榱素?fù)數(shù)?這是因?yàn)樵贘ava語言中,byte是8位的,最多只能是127,當(dāng)再加一時(shí),數(shù)據(jù)溢出,就變?yōu)?128啦。 數(shù)據(jù)類型轉(zhuǎn)換 有時(shí)我們需要將一種數(shù)據(jù)類型轉(zhuǎn)換為另一種數(shù)據(jù)類型。從小的可以自動(dòng)轉(zhuǎn)變?yōu)榇蟮臄?shù)據(jù)類型。但是從大的數(shù)據(jù)類型到小的數(shù)據(jù)類型要強(qiáng)制轉(zhuǎn)換。 示例:
4、 public class DataRevert { public static void main(String[] args) { // TODO Auto-generated method stub int i=1; short s=2; i=s+1; //s=i+1; s=(short)(i+1); char c='a'; c=(char)(i+97); i=(int)c; int m=9/2; int i2=Integer.parseInt("123"); String s3 = Integer.t
5、oString(999); System.out.println("c= "+c+" i="+i+" m="+m+" i2="+i2+" s3="+s3); } } 程序輸出: 代碼詳解: 在上面注釋的一行中,s=s+1為什么出錯(cuò)啦,這是因?yàn)楹竺娴?是當(dāng)作int類型處理的,而int 類型是128位的。解決方式第一種是寫成b+=1,另一種就是強(qiáng)制類型轉(zhuǎn)換,寫成下一行。 另外,字符類型的也可以和數(shù)據(jù)類型轉(zhuǎn)換,字符類型對(duì)應(yīng)于相應(yīng)的ASCII碼。 位運(yùn)算 在計(jì)算機(jī)語言中,位運(yùn)算是將數(shù)據(jù)轉(zhuǎn)換成二進(jìn)制度形式,一位一位進(jìn)行比較,得到最后的結(jié)果。位運(yùn)算
6、有兩種方式 與和或。當(dāng)兩個(gè)都為1時(shí),與才為1,其他結(jié)果都為0。當(dāng)兩個(gè)都為0時(shí),或結(jié)果為0,其他結(jié)果為1。 示例: int i=3; int j=4; int k=3|4; int m=3&4; System.out.println("k的值為: "+k+" m的值為:"+m); 程序輸出: 代碼詳解: 在上面的程序中,當(dāng)進(jìn)行與運(yùn)算時(shí),3的二進(jìn)制為011,4轉(zhuǎn)換為二進(jìn)制為100當(dāng)一位一位的與時(shí),最后結(jié)果為0,當(dāng)進(jìn)行或運(yùn)算時(shí),最后的二進(jìn)制結(jié)果為111,也就是十進(jìn)制的7。 調(diào)試之美 每一個(gè)程序員要掌握的最基本的一個(gè)功能就是程序的調(diào)試。
7、有些邏輯錯(cuò)誤可能我們無法一眼看出問題出在哪個(gè)地方,那么通過對(duì)程序進(jìn)行調(diào)試,我們一步一步地執(zhí)行程序的運(yùn)行,觀察每個(gè)變量的值的變化和執(zhí)行的步驟,可能就能發(fā)現(xiàn)問題所在。 下面我們以以下的程序來演示程序的調(diào)試。 /** * 演示程序調(diào)試 * @author dongyc * */ public class DoWhileDemo { public static void main(String[] args) { // TODO Auto-generated method stub int i = 1; do { System.ou
8、t.println("我能出現(xiàn)幾次?"); i = i + 1; } while ( i < 3 ); } } 親愛的同學(xué)們,當(dāng)你運(yùn)行這個(gè)程序時(shí),“我能出現(xiàn)幾次”會(huì)不會(huì)出現(xiàn)3次呢?如果不是,哪里有問題?通過程序調(diào)試一目了然。 程序的調(diào)試主要包括: 1. 設(shè)置斷點(diǎn) 通常在懷疑出錯(cuò)的位置前后進(jìn)行,雙擊這一行的最左邊就可以啦 看到左邊的圓點(diǎn)沒,那個(gè)就是斷點(diǎn)的位置,當(dāng)程序在調(diào)試時(shí),停在那個(gè)位置,供程序員觀察變量的值或程序的運(yùn)行情況。 2. 單步執(zhí)行 點(diǎn)擊窗口上的按鈕,開始執(zhí)行程序的調(diào)試。這時(shí)會(huì)出現(xiàn)一個(gè)如圖所示的對(duì)話框 這段話的意思
9、是是否打開調(diào)試窗口,當(dāng)然選擇Yes啦。這時(shí)會(huì)切換到調(diào)試窗口。 在這里主要包括三個(gè)小窗口,最上邊標(biāo)記為1的為調(diào)試窗口,2為變量窗口,3為源代碼窗口。在工具欄上面有調(diào)試工具,F(xiàn)5為跳時(shí)程序方法中執(zhí)行,F(xiàn)6為跳出。 3. 觀察變量和程序的運(yùn)行 通過反復(fù)點(diǎn)擊F6單步運(yùn)行程序,觀察程序運(yùn)行過程,并注意窗口2變量的變化情況。 4. 修正代碼,重新運(yùn)行,當(dāng)變量為3時(shí),退出了程序的執(zhí)行。 5. 改正錯(cuò)誤 如果想輸出3次的話,是不是應(yīng)將int i=1修改為int i=0呀。 程序的主要作用就是找出缺陷原因,修正缺陷,你一定要好好練練呀。 高手點(diǎn)拔-萬年歷的編寫 上面的程序是熱
10、身之作,下面我們來點(diǎn)復(fù)雜的。下面例子訓(xùn)練的技能點(diǎn)是通過分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu)的組合來實(shí)現(xiàn)萬年歷的顯示。也許你見過類似于圖2-7 windows中的時(shí)間日期畫面,那么我們能不能自己寫一個(gè)這樣的程序呢。我們通過類似這樣的例子一步一步的講解,相信你的編程能力會(huì)得到逐步的提高。 圖2-7 windows中的時(shí)間和日期窗口 任務(wù): 要求從控制臺(tái)輸入年份和月份,在控制臺(tái)上輸出該月日歷(已知1900年1月1日是星期一)。如圖2-8所示,例如當(dāng)輸入年份2007和月份5后,控制臺(tái)上輸出2007年5月的月歷信息。 圖2-8 萬年歷的輸出 需求分析 請(qǐng)你深吸幾口氣,看看有沒有思路。第一個(gè)我
11、們首先想到的是這個(gè)月有多少天,但是有可能是2月,在這之前是不是還要看這一年是不是閏年?得到這一月有多少天后,是不是得排這個(gè)月的1號(hào)在哪個(gè)位置,也就是星期幾?我們僅有的信息是1900年1月1號(hào)是星期一,是不是得看這個(gè)月的第一天和1900年1月1號(hào)相隔幾天,如果是一天的話,那么是不是這個(gè)月的1號(hào)是星期二?依此類推。最后這月的1號(hào)在輸出時(shí),左邊要留幾個(gè)空格是不是也是我們要考慮的問題?格式化換行輸出是大功告的最后一步。那么我們要做的步驟是: 1. 實(shí)現(xiàn)從控制臺(tái)接收年和月,判斷是否是閏年 2. 編程計(jì)算輸入月份的天 3. 編程計(jì)算輸入的月份距離1900年1月1日的天數(shù) 4. 編程計(jì)算輸入月份的第
12、一天是星期幾 5. 格式化輸出× ×年× ×月日歷 好啦,思路清晰后,下面每個(gè)階段將完成不同的任務(wù),最后我們自己的月歷將會(huì)出現(xiàn)在控制臺(tái)上。加油! 階段1判斷是否是閏年 這一階段所做的工作為實(shí)現(xiàn)從控制臺(tái)接收年和月,判斷是否是閏年,從數(shù)學(xué)的角度來講, 判斷是否是閏年的條件為:能被4整除但不能被100整除;或者能被400整除,程序是怎么實(shí)現(xiàn)的呢? 其中關(guān)鍵的語句為: if (year % 4 == 0 && !(year % 100 == 0) || year % 400 == 0) 完整的源程序如下: import java.util.Scanner; /** * 判
13、斷是否是閏年 * @author dongyc * */ public class PrintCalendar1 { /** * @param args */ public static void main(String[] args) { System.out.println("****************** 萬 年 歷-日期******************"); Scanner input = new Scanner(System.in); System.out.print("\n請(qǐng)選擇年份: "); int year =
14、 input.nextInt(); System.out.print("\n請(qǐng)選擇月份: "); int month = input.nextInt(); System.out.println(); int days = 0; // 存儲(chǔ)當(dāng)月的天數(shù) boolean isRn; /* 判斷是否是閏年 */ if (year % 4 == 0 && !(year % 100 == 0) || year % 400 == 0) { // 判斷是否為閏年 isRn = true; // 閏年 } else { isRn = false
15、;// 平年 } if (isRn) { System.out.println(year + " 閏年"); } else { System.out.println(year + " 平年"); } } } 階段2編程計(jì)算輸入月份的天數(shù) 在一年中,1月、3月、5月、7月、8月、10月、12月為31天,4月、6月、9月、11月為30天,2月如果是閏月則為29天,平年為28天。類似這樣的用什么實(shí)現(xiàn)好呢。switch語句?對(duì)!直接上源程序。 import java.util.Scanner; /** * 日歷-計(jì)算輸入
16、月份的天數(shù) * @author dongyc * */ public class PrintCalendar2 { /** * @param args */ public static void main(String[] args) { …省略前面的部分代碼 int days = 0; // 存儲(chǔ)當(dāng)月的天數(shù) boolean isRn; /* 判斷是否是閏年 */ if (year % 4 == 0 && !(year % 100 == 0) || year % 400 == 0) { // 判斷是否為閏年 isR
17、n = true; // 閏年 } else { isRn = false;// 平年 } if (isRn) { System.out.println(year + "\t閏年"); } else { System.out.println(year + "\t平年"); } /* 計(jì)算當(dāng)月的天數(shù) */ switch (month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12:
18、 days = 31; break; case 2: if (isRn) { days = 29; } else { days = 28; } break; default: days = 30; break; } System.out.println(month + "\t共" + days + "天"); } } 階段1所定義的isRn是不是在判斷是否是閏年時(shí)起到了作用? 階段3 編程計(jì)算輸入的月份距離1900年1月1日的天數(shù) 在這個(gè)階段,我們要分步來解
19、決問題。 第一步,計(jì)算輸入的年份之前的天數(shù)。 …省略前面的部分代碼 /* 計(jì)算當(dāng)月的天數(shù) */ switch (month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: days = 31; break; case 2: if (isRn) { days = 29; } else { days = 28; } break; default:
20、 days = 30; break; } System.out.println(month + "\t共" + days + "天"); /* 計(jì)算輸入的年份之前的天數(shù) */ int totalDays = 0; for (int i = 1900; i < year; i++) { /* 判斷閏年或平年,并進(jìn)行天數(shù)累加 */ if (i % 4 == 0 && !(i % 100 == 0) || i % 400 == 0) { // 判斷是否為閏年 totalDays = totalDays + 366; // 閏年36
21、6天 } else { totalDays = totalDays + 365; // 平年365天 } } System.out.println("輸入年份距離1900年1月1日的天數(shù):" + totalDays); 注意年份中有的是閏年則為366天,不是閏年,則為365天。 第二步,計(jì)算計(jì)算輸入月份之前的天數(shù),兩者累加則為輸入的月份距離1900年1月1日的天數(shù)。 …省略前面的部分代碼 /* 計(jì)算輸入的年份之前的天數(shù) */ int totalDays = 0; for (int i = 1900; i < year; i++) {
22、 /* 判斷閏年或平年,并進(jìn)行天數(shù)累加 */ if (i % 4 == 0 && !(i % 100 == 0) || i % 400 == 0) { // 判斷是否為閏年 totalDays = totalDays + 366; // 閏年366天 } else { totalDays = totalDays + 365; // 平年365天 } } System.out.println("輸入年份距離1900年1月1日的天數(shù):" + totalDays); /* 計(jì)算輸入月份之前的天數(shù) */ int beforeD
23、ays = 0; for (int i = 1; i <= month; i++) { switch (i) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: days = 31; break; case 2: if (isRn) { days = 29; } else { days = 28; } break; defa
24、ult: days = 30; break; } if (i < month) { beforeDays = beforeDays + days; } } totalDays = totalDays + beforeDays; // 距離1900年1月1日的天數(shù) System.out.println("輸入月份距離1900年1月1日的天數(shù):" + totalDays); System.out.println("當(dāng)前月份的天數(shù):" + days); 階段4 編程計(jì)算輸入月份的第一天是星期幾 要判斷輸入月份的第一
25、天是星期幾,得從1900年1月1日起推算,看相差的天數(shù),如果是差一天,則為星期二,如果相差10天呢,100天呢?用除7求余法是不是更好些?關(guān)鍵代碼為: int temp = 1 + totalDays % 7; // 從1900年1月1日推算 部分源程序如下: …省略前面的部分代碼 /* 計(jì)算輸入月份之前的天數(shù) */ int beforeDays = 0; for (int i = 1; i <= month; i++) { switch (i) { case 1: case 3: case 5: case 7:
26、 case 8: case 10: case 12: days = 31; break; case 2: if (isRn) { days = 29; } else { days = 28; } break; default: days = 30; break; } if (i < month) { beforeDays = beforeDays + days; } } totalDays =
27、 totalDays + beforeDays; // 距離1900年1月1日的天數(shù) System.out.println("輸入月份距離1900年1月1日的天數(shù):" + totalDays); System.out.println("當(dāng)前月份的天數(shù):" + days); /* 計(jì)算星期幾 */ int firstDayOfWeek; // 存儲(chǔ)當(dāng)月第一天是星期幾:星期日為0,星期一~星期六為1~6 int temp = 1 + totalDays % 7; // 從1900年1月1日推算 if (temp == 7) { // 求當(dāng)月第一天 f
28、irstDayOfWeek = 0; } else { firstDayOfWeek = temp; } System.out.println("該月第一天是: " + firstDayOfWeek); 階段5 格式化輸出× ×年× ×月日歷 這一階段也要分成兩部分完成。第一部分,星期的標(biāo)題頭要打印輸出。另外就是要輸出這個(gè)月1號(hào)之前的空格。關(guān)鍵代碼為: /* 輸出日歷 */ System.out.println("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六"); for (int nullNo = 0; nullNo
29、< firstDayOfMonth; nullNo++) { System.out.print("\t"); // 輸出空格 } 第二部分,循環(huán)打印輸出這個(gè)月的每一天,如果是周六,則要換行輸出。關(guān)鍵代碼為: for (int i = 1; i <= days; i++) { System.out.print(i + "\t"); if ((totalDays + i - 1) % 7 == 5) { // 如果當(dāng)天為周六,輸出換行 System.out.println(); } } 完整源程序 怎么樣,我們自己能不能寫出一個(gè)完整
30、的日歷出來?復(fù)雜的問題,要學(xué)會(huì)分析里面的要求,逐步細(xì)化,對(duì)每個(gè)小問題進(jìn)行分析、解決。那么整個(gè)的問題也就迎刃而解啦。完整的源程序如下: import java.util.Scanner; /** * 日歷的完整源程序 * @author dongyc * */ public class PrintCalendar7 { /** * @param args */ public static void main(String[] args) { System.out.println("******************萬 年 歷-日期******
31、************"); Scanner input = new Scanner(System.in); System.out.print("\n請(qǐng)選擇年份: "); int year = input.nextInt(); System.out.print("\n請(qǐng)選擇月份: "); int month = input.nextInt(); System.out.println(); int days = 0; // 存儲(chǔ)當(dāng)月的天數(shù) boolean isRn; /* 判斷是否是閏年 */ if (year % 4 == 0
32、&& !(year % 100 == 0) || year % 400 == 0) { // 判斷是否為閏年 isRn = true; // 閏年 } else { isRn = false;// 平年 } /* * if(isRn){ System.out.println(year + "\t閏年"); }else{ * System.out.println(year + "\t平年"); } */ /* 計(jì)算該月的天數(shù) */ /* switch (month) { case 1: cas
33、e 3: case 5: case 7: case 8: case 10: case 12: days = 31; break; case 2: if (isRn) { days = 29; } else { days = 28; } break; default: days = 30; break; } System.out.println(month + "\t共" + days + "天"); */ /* 計(jì)
34、算輸入的年份之前的天數(shù) */ int totalDays = 0; for (int i = 1900; i < year; i++) { /* 判斷閏年或平年,并進(jìn)行天數(shù)累加 */ if (i % 4 == 0 && !(i % 100 == 0) || i % 400 == 0) { // 判斷是否為閏年 totalDays = totalDays + 366; // 閏年366天 } else { totalDays = totalDays + 365; // 平年365天 } } // System.out.p
35、rintln("輸入年份距離1900年1月1日的天數(shù):" + totalDays); /* 計(jì)算輸入月份之前的天數(shù) */ int beforeDays = 0; for (int i = 1; i <= month; i++) { switch (i) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: days = 31; break; case 2: if (isRn)
36、 { days = 29; } else { days = 28; } break; default: days = 30; break; } if (i < month) { beforeDays = beforeDays + days; } } totalDays = totalDays + beforeDays; // 距離1900年1月1日的天數(shù) // System.out.println("輸入月份距離1900年1月1日的天數(shù):" + totalD
37、ays); // System.out.println("當(dāng)前月份的天數(shù):" + days); /* 計(jì)算星期幾 */ int firstDayOfMonth; // 存儲(chǔ)當(dāng)月第一天是星期幾:星期日為0,星期一~星期六為1~6 int temp = 1 + totalDays % 7; // 從1900年1月1日推算 if (temp == 7) { // 求當(dāng)月第一天 firstDayOfMonth = 0; // 周日 } else { firstDayOfMonth = temp; } // System.out.pri
38、ntln("該月第一天是: " + firstDayOfMonth); /* 輸出日歷 */ System.out.println("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六"); for (int nullNo = 0; nullNo < firstDayOfMonth; nullNo++) { System.out.print("\t"); // 輸出空格 } for (int i = 1; i <= days; i++) { System.out.print(i + "\t"); if ((totalDays + i - 1) % 7 == 5) { // 如果當(dāng)天為周六,輸出換行 System.out.println(); } } } }
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 中西方家庭教育的對(duì)比ppt課件
- 《運(yùn)籌學(xué)教程》第五版運(yùn)籌學(xué)6對(duì)策論矩陣對(duì)策課件
- (部編版)統(tǒng)編版四年級(jí)語文下冊第2課《鄉(xiāng)下人家》ppt課件
- 全等三角形1--公開課一等獎(jiǎng)ppt課件
- 《會(huì)跳舞樹葉娃娃》課件
- 9兒童詩兩首_人教版五年級(jí)的語文下冊課件
- 綠色植物是食物之源(我的課件)0
- 河南專版2022春八年級(jí)語文下冊第四單元16慶祝奧林匹克運(yùn)動(dòng)復(fù)興25周年習(xí)題課件新人教版
- 全國xx杯說課大賽機(jī)械類一等獎(jiǎng)作品:鉗工車模的制作說課ppt課件
- 六年級(jí)下冊數(shù)學(xué)ppt課件-總復(fù)習(xí)(1)數(shù)的認(rèn)識(shí)-整數(shù)∣北師大版
- 牛頓第二定律優(yōu)秀完整公開課ppt課件
- 調(diào)脂與卒中防治課件
- 點(diǎn)到平面的距離課件
- 聚焦新醫(yī)改形勢下的醫(yī)院發(fā)展戰(zhàn)略
- 四肢血管超聲基礎(chǔ)