一、方法的定義 為什么要有方法
方法(又叫函數(shù))就是代碼功能的一段特定功能的代碼塊,。方法提高程序的復(fù)用性和可讀性,。
比如有了方法,我們可以把重復(fù)使用的一段代碼提煉出來,,然后在每個需要執(zhí)行這段代碼的地方去調(diào)用即可,。 在一個打飛機的游戲中,飛機需要發(fā)射子彈,,那么我們可以把發(fā)射子彈的這段代碼寫成方法,,這樣就可以避免每次重寫相同的代碼。
方法的格式: 語法: 訪問權(quán)限修飾符[?其它的修飾符如static]返回值類型 方法名(參數(shù)類型1?形參1,、參數(shù)類型2 形參2....){//形參列表? ?//方法體 return返回值,;
} getMenu(); //調(diào)用方法,此時方法才能被運行 //public 訪問權(quán)限修飾符 //static 靜態(tài)修飾符,,描述的方法可以直接調(diào)用 //void 返回值(無返回值) // // getMwn 方法名 定義一個方法,,在沒有調(diào)用時是不會執(zhí)行的 public static void getMenu(){ System.out.println(); }
方法的格式說明:
修飾符:目前就用public stati
返回值類型:就是功能結(jié)果的數(shù)據(jù)類型
方法名:見名知意,首字母小寫,,遵守駝峰命名法,。方便調(diào)用。 二,、方法的形參與實參
參數(shù):
實際參數(shù):就是實際參與運算的
形式參數(shù):就是方法定義上的,,用于接收實際參數(shù)的
參數(shù)類型:就是參數(shù)的數(shù)據(jù)類型
參數(shù)名:就是變量名
方法體語句:就是完成功能的代碼 注意: 1,、若當前方法中不要使用形參,那么形參列表中可以為空
2,、實參和形參的類型要相i互兼容,,且:實參的取值范圍要小于或者等于形參類型的取值范圍。 在調(diào)用方法中,、如果我們定義的方法有參數(shù),,就必須在調(diào)用方法的同時傳入這個值,即給當前方法中的參數(shù)值賦值,,而這傳入的值我們稱為實際參數(shù),,也就是實參。 實參:傳入的參數(shù)值
形參:接收實參傳過來的值
注意:實參名與形參名可以相同,,也可以不同 小結(jié):形參就是一個變量,,實參就是一個值,傳參就是把一個值給一個形參賦值
3,、方法的返回值
return:結(jié)束方法的
返回值:就是功能的結(jié)果,,由return帶給調(diào)用者 注意: 1、若當前方法沒有返回值類型,,即返回值類型是void,,那么當前的方法中可以不寫return
2、return即表示結(jié)束一個方法,,也可以將返回值返回給調(diào)用當前方法的調(diào)用者 3,、return返回值時一次只能返回一個值,不可以返回多個值 4,、一個方法中可以有多個return,但被執(zhí)行的只能有一個,,所以需要判斷 練習(xí):
1、判斷任意給定年份是否是閏年
//調(diào)用方法 //杯子=榨汁機(香蕉,,紅蘋果,,雞蛋) isRunNian(2020);//調(diào)用者 if(bool){ ???System.out.println("閏年"); ??}else{ ??System.out.println("平年"); ??} ??} public static boolean isRunNian(int year){ ?????if?(year?%4==0?&&?year%100!=0) || (year %400==0){ ?????return?true; ?????}?else{ ?????return false; ?????} ?????}
四、方法的重載
方法(函數(shù))
方法重載:overloading method(在同一個類中,,方法名相同,,參數(shù)列表不同,返回值不能作為重載的條件)
在類中可以創(chuàng)建多個方法,,他們具有相同的名字,,但具有不同的參數(shù)和不同的定義:(返回值不能作為重載的條件)
public?void?method(int?a){....}
public?void?method(char c){....}
五、數(shù)組的定義
數(shù)組:一組能夠處理相同數(shù)據(jù)類型值的變量集合,,當我們有一組相同類型的數(shù)據(jù)需要儲存,,如果此時使用單個變量來儲存,我們將要定義若干個變量名,這樣將會非常繁瑣,,并不利于維護,。
六、數(shù)組的賦值方式
1,、使用默認的初始值來初始化數(shù)組中的每一個元素 ? ? ? 語法:數(shù)組元素類型[ ]scores=new int[3];
2,、先聲明,然后再賦值默認的初始值
? ? ? 語法:數(shù)組元素類型[ ]數(shù)組名,;
數(shù)組名=new數(shù)組元素類型[數(shù)組中元素的個數(shù)(數(shù)組的長度)],;
如:int [ ]scores;
scores=new int[3]; 3、先聲明,,然后再使用指定的值進行初始化
語法:數(shù)組元素類型[ ]數(shù)組名=new 數(shù)組元素類型?[ ]{元素1,、元素2...}; 如:int[ ]scores=new int[ ]{56,、78,、98};
4,、將第三種寫法可以簡化(使用數(shù)組常量值給數(shù)組進行賦值) 語法:數(shù)組元素類型[ ]數(shù)組名={元素1,,元素2....}; 如:int [ ]scores={56,78,98};
七,、數(shù)組的遍歷
求數(shù)組的長度:
x.length
通過下標來訪問數(shù)組中的元素,。
下標:從零開始,到數(shù)組長度-1 如:int[ ]scores={89,90}; 訪問最后一個元素值:int lastElement=scores[scores.length-1];
遍歷:依次取出數(shù)組中的每一個元素
//數(shù)組的遍歷 int?[]?scores?={23,25,63}; System.out.println("數(shù)組長度"+scores.length); //遍歷 ???int?len?=?scores.length; ???for(int?i=0;i<len;i++){ ???int?scores[i]; ???System.out.println(scores); ???} ???System.out.println(scores); } }
遍歷方式一:普通的for循環(huán)
語法:for(int i=0;i<數(shù)組長度,;i++){
//i:循環(huán)變量,同樣:也是數(shù)組的下標(取值范圍[?0,數(shù)組長度)]
數(shù)組元素中的類型 變量=數(shù)組名[i];
} 八,、增強for循環(huán)與可變參數(shù) 1.5?以后Java新增forcach循環(huán)可變參數(shù) 遍歷方式二:使用增強for循環(huán)【forcach循環(huán)】
語法:for(數(shù)組中元素的類型 變量:數(shù)組名){ 數(shù)組中元素的類型 臨時變量=變量,;
; 結(jié)合方法的定義,,可以用可變參數(shù)來代替數(shù)組作為參數(shù)
public?static void?print(int...變量名{
//可變參數(shù)再使用時作為數(shù)組使用 } 使用數(shù)組時要注意的問題; 空指針異常(NullPointerException)
public static void print3(int [] x){ //java.lang.NullPointerException //當一個變量為null(沒有賦值)時,,我們?nèi)フ{(diào)用了該變量的屬性和方法 System.out.println("數(shù)組長度為":x.length}; //測試數(shù)組的異常,數(shù)組下標越界 //java.lang.ArrayIndexOutOfBoundsException public?static?void?print4(int[]?x){ for(int?i=0;i<=x.length;i++){ System.out.println(x[i]); } } }
數(shù)組越界異常(ArraylndexOutOfBoundsException)
數(shù)組內(nèi)存結(jié)構(gòu)分析:數(shù)組是引用類型,,會存放在堆內(nèi)存
names(棧內(nèi)存) 運行速度高因為固定 大小固定,、用于存儲局部、臨時變量(基本數(shù)據(jù)類型和引用變量)
"? "(名字)(堆內(nèi)存)運行速度慢,,因為靈活需要計算 大小不不固定:對象
九,、數(shù)組示例 1、猜數(shù)游戲:從鍵盤中任意輸入一個數(shù)據(jù),,判斷數(shù)列中是否包含此數(shù) ? ?import ?java.util.Random;//生成偽隨機數(shù) ????????int?[]?nums?=?int?[]5; ????????int?len = nums length; ????????Random?r=new?random();//創(chuàng)建可以生成隨機數(shù)的工具 ????????for(int i=0;i<leni++){ ????????nums[i]=r.nextInt(50); ????????} ??????Scanner??input?new?Scanner?(Stytem.in); ?? System.out.println("請輸入你要猜的數(shù):(60以內(nèi)"),; ???int?userNum = input.nextInt(); ???boolean flag = false; ???for?(int?x:nums?){ ???if(userNun==x){ ???flag = true; ?? ?break; ?? ?} ?? ?} ?? ?if(flag){ ?????System.out.println("恭喜你,猜對了"); ?????}else { ?????System.out.println("不好意思,你猜錯了"); ?????} ?????}
? ? 2,、打印一個多正三角型 ?char[]?cs?=?{'a','b','c','d','f','G'}; ?int??len=cs length; ? for(int?i=1;i<=len;i++){ for(int?j=i;j<len;j++); System.out.println("?"); } for(int?j=i;j<len;j++); System.out.println(" "); } for?(int?j=1;?j<=i*2-1;j++){ System.out.println(cs[i-1]); } System.out.println();
多維數(shù)組示例:Java中沒有真正的多維數(shù)組多維數(shù)組的表示方式是數(shù)組中的元素還是數(shù)組,。 1、一起來參加屌絲程序員大賽,,有3個班級各3名學(xué)員參賽,,記錄每一個學(xué)員的成績,并計算每個班級平均分,。 ?int?[]?[]?={{78,98,88},{86,78,85},{87,96,85},{67,78,89}}; ?int classLen = scores.length; ?for(int?i=0;i<classLen;i++}{ ?int nun=0; ?int?count?=?scores[i].length; ?for(int?j=0;j<count;j++){ ?num+scores[i][j]; ?} ?int avg = sum/count; ?System.out.println("第"+(i+1)+班級的平均分是:"+avg); ?} ?} ?}
求最大值和最小值:
int?[]?num?{12,3,54,66,79}; int max = max(num); System.out.println("數(shù)列中最大的值是:"+max); int?min = min(num); System.out.println("數(shù)列中最小的值是:"+min); } //求數(shù)列中最大的值 public?static?int?max?(int?[]?num){ ?int?max?=?num[0]; ?int?len?=?num?.length; ?for?(int?i=1;i<len;i++){ ???if(num?[i]>max){ ???num[i]=num[i]+max; ???max=num[i]-max; ???num[i]=mun[i]-max; ???} ???} ???return min;} ???} ???}
十,、冒泡排序 冒泡排序算法
冒泡排序的算法如下:(從后往前) 比較相鄰的元素,如果第一個比第二個大,,就交換它們兩個,。
對比一對相鄰的元素作同樣的工作,從開始一對到結(jié)尾最后一隊,。在這一點,,最后的元素應(yīng)該會是最大的數(shù)。
針對所有的元素重復(fù)以上的步驟,,除了最后一個 持續(xù)每次對越來越少的元素重復(fù)上面的步驟,,直到?jīng)]有任何一對數(shù)字需要比較。 相同元素的前后順序并沒有變化,,所以冒泡排序是一種穩(wěn)定的排序算法
int?[]?nums?=?{12,15,56,36,45};//待排序的數(shù)列 //外循環(huán)控制輪 for(int?i=0;i<nums.length-1;i++){//比較輪數(shù)等于列數(shù)的長度-1 for (int j=0;j<nums.length-1;j++){ if(nums[j]=nums[j]+nums[j+1]{ nums[i]=nums[j]+nums[j+1]; nums?[j+1]=nums[j]-nums[j+1]; nums[j]nums[j]-nums[j+1]; } } } //輸出結(jié)果 for(int?n?:?mans){ System.out.println(n); } }
十一,、選擇排序算法 每一趟從待排序的元素中選出最小(或最大)的一個元素,,順序放在已經(jīng)排好序的數(shù)列最后,,直到全部待排序的數(shù)據(jù)元素排完,選擇排序是不穩(wěn)定的排序方法,。
int [] nums = {12,15,56,36,45};//待排序的數(shù)列 int?minIndex?=?0;//用于記錄每次比較的最小值下標 //控制輪數(shù) for?(int?i?=?0;i<nums.length-1;i++): minIndex?=?i;//每輪假設(shè)一個最小值下標 for?(int?j=i+1;j<nums.length;j++){ if(nums[minIndex]>nums[j]){ minIndex=j; } } //判斷需要交換的值下標是否為自己 ?if(minIndex!=i){ ? nums?[minIndex?]=nums[minIdex]+nums[i]; ? nums [i]=nums [minIndex]-nums[i]; ????nums?[minIndex]=nums[minIndex]-nums[i]; ????} ? } ? //輸出結(jié)果 ????for?(int?n:?nums){ ???? System.out.println(n); } }
十二,、選擇排序算法
每一趟從待排序的數(shù)據(jù)元素選出最小(最大)的一個元素,,順序放在已排好序的列數(shù)的最后,,直到全部待排序的元素排完,選擇排序是不穩(wěn)定的排序方法,。 int?[]?nums?=?{12,15,56,36,45,99};//待排序的數(shù)列 int minIndex = 0;//用于記錄每次比較最小值的下標 //控制輪數(shù) for (int i=0;i<nums.length-1;i++){ ?minIndex?=?i;//每輪假設(shè)一個最小值下標 ?for(int?j=i+1;j<nums.length;j++){ ?if?(muns?[minIndex]>mans[j]{ ??minIndex?=?j; ??} ??} ??//判斷需要交換的數(shù)下標是否為自己 ??if(minIndex!=i){ ??muns [minIndex] = nums[mins[minIndex]+nuns[i]; ??numx?[i]?=muns?[minIndex]-munx[i]; ??munx[minIndex]?= numx[minIndex]-muns[i]; ??} ??} ??//輸出結(jié)果 ??for(int m:muns){ ??System.out.prinyln(n); ??} ??}
十三,、直接插入排序法 (從后向前找到合適的位置插入)
基本思想:每步將一個待排序的記錄,按其順序碼大小插入到前面已經(jīng)排序的子序列的合適位置(從后向前找到合適位置后)直到全部插入排序完為止
int [] nums = {12,15,56,36,45,99};//待排序的數(shù)列 //控制比較的輪數(shù) ?for(int?i=1;i<nums.length;i++){ ?int temp =nums[i];//記錄操作數(shù) ?int j=0; ?for(j=i-1;j>=0;j--){ ?if(nums [j]>temp){ ??nums?[j+1] = muns[j]; ??}else{ ??break; ??} ??} ??if(nums?[j+1]!=temp){ ? nums=[j+1]=temp; ? } ? } ???//輸出結(jié)果 ???for(int n: nums){ ?? Systeem.out.printl(n),; ???}
}
? ?十四,、二分查找算法 二分查找算法(折半查找):前提是在已經(jīng)排好序的數(shù)組中,通過將待查找的元素與中間索引值對應(yīng)的元素進行比較,,若大于中間索引值對應(yīng)的元素,,去右邊部分查找,,否則,去左邊部分查找,,依次類推,。直到找到為止,找不到返回一個負數(shù),。 //必須保證是數(shù)列有序 int num = {10,20,50.65,88,90}; int inddex = binarySearch(num,88); ?System.out.println(index); ? } ? //二分查找算法 ??public?static?int?binarySearch(int [] num,int key){ ??int?start=0;//開始下標 ??int?end?=?num.length-1;//結(jié)束下標 ??while?(start<=end){ ??int?middle=(start+end)/2//>>>>1 ??if(num[middle]>key){ ?????end?=?middle-1; ??}else?if(num[middle]<ley){ ??start=?middle?+1; ??}else{ ??return middle; ??} ??} ??return -1; ?} ?}
?十五,、Arrays類 Arrays工具類:用來操作數(shù)組(比如排序和搜索)的各種方法
常用方法:
使用二分法查找 ? ? Arrays.binarySearch(int?[?] arrat,int value);
數(shù)組內(nèi)容轉(zhuǎn)成字符串的形成輸出
? ?Arrays.toString(int[ ] arry);
?數(shù)組排序
??Arrays.sort(int [ ] array);
復(fù)制指定的數(shù)組
? Arrays.copyOf(int [ ] array.int length); Arrays.copyOf(int [ ] array.int?from,int to);?? ? ? ? ? ? ? ??System.arraycopy(Object?src,int?srcPos,Object,int?destPos,int length); 判斷兩個數(shù)組是否相等
Arrays.equels(); 使用指定元素填充數(shù)組
Arrays.fill(); import java.util.Arrays; int?[]?num?= {45,65,76,87,98,901,} //二分查找 ?int?index = Arrays.binarySearch(num,98); ?System.out.println("找到的下標是:"+index); ?//輸出數(shù)組 ?for(int n:num){ ?System.out,println(n); ?} ?//在測試輸出數(shù)據(jù)時,可以使用,,更加方便 ?System.out.println(Arrays.toString (num)); ??//排序 ??int?num2={10,32,11,44,543,22,12}; ??Array.sort(num2);//快速排序 ??System.out.println(Arrays.toString(num2)); ??//數(shù)組的復(fù)制 ??int [] num2={10,32,11,44,543,22,12}; ??Arrays.sort(num2);//快速排序 ??System.out.println(Arrays.toString(num2)); ??//數(shù)組復(fù)制 ??int?[]?num3?=?Arrays?copyOf(num2,10); ??System.out,println(Arrays.toString(num3)); ??int [] newNun = new int[num2.length]; ??System.arraycopy(num2,0,newNun,o,num2.length); ??System.out.println(Arrays.toString(newNum)); ??//小結(jié):數(shù)組復(fù)制 ??//效率從高到低排序是:System.arraycopy -> Arrays.copyOf->for ??//判斷兩個數(shù)組的值是否相等 ??System.out.println(Arrays.equals(num2,nuwNun)); ??//填充數(shù)組 ??Arrays?fill(newNum,0); ??System.out.println(Arrays.toString(newNum)); ??} ??}
? 十六,、雙色球模擬綜合案例 1、雙色球彩票玩法 玩法說明: 雙色球投注區(qū)分為紅球號碼區(qū)和藍球號碼區(qū),,紅球號碼范圍為01~33,,藍球號碼區(qū)為01~16。雙色球從每期從33個紅球中開出六個號碼,,從16個藍球中開出一個號碼作為中將號碼,,雙色球玩法既是競猜開獎號碼中的6個紅球號碼和1個藍球號碼,順序不限,。 (1)案例分析: 1,、如何產(chǎn)生藍球和紅球 2、如何接收用戶選號 3,、如何驗證是否中獎 4,、公布本期中獎號碼 (2)實現(xiàn)步驟: 1、整體實現(xiàn)思路 2,、隨機取值不重復(fù)算法(系統(tǒng)和用戶) 3,、判斷是否中獎的邏輯 4、結(jié)果輸出 import.java.util.Sanner; ?import.?java.util.arrays; ?import.java.util.Random; //定義相關(guān)變量 int?[]?userRedBall?=?new?int[6];?//用戶選擇的紅球號碼 int?[] sysRedBall = new int [6];//系統(tǒng)生成的紅球號碼 int?[]?userBlueBall?=?0;//用戶選擇的藍球 int?[]?sysBlueBall?=?0;//系統(tǒng)生成的籃球 int?[]?redCount?=?0;//記錄用戶選擇記錄的紅球數(shù) int [] blueCount = 0;//記錄用戶選擇的正確藍球數(shù) int [] redBall = new int[33]; ??//需要隨機生成六個在1~33之間不重復(fù)的數(shù)(算法) ??for?(int?i=0;i<redBall.length;i++){ ??redBall[i]=i+1; ??} ??//游戲開始,,系統(tǒng)提示 ??System.out.println("雙色球游戲開始,,good luck!"); ??System.out.println("請問您是要機選還是手選號碼(1:機選 2:手選"); ?? ????Scanner?input?=?new?Scanner(System.in); ????Random?r=new?Random();//生成隨機數(shù)工具 ????boolean?flag?=?true;//用于判斷是否重新輸入機選或者是手選(意思就是除了1和2之外數(shù)必須是重輸 ????while?(flag){ ????int isAuto = input.nextInt(); ????switch(isAuto){ ????case 1: ????//機選 ????compterSelection(redBall,userRedBall);//機選紅球 ????????userRedBall?=?r.nextInt(16)+1;//機選藍球 ????????flag?=?false; ????????break; ????case 2; ?????//手選?? ???????System.out.println("請選擇6個紅球號碼(1~33):); ??????? for?(int?i=0;?i<userRedBall.length;i++){ ??????? userRedBall[i] = input.nextInt(); ??????? } ??????????System.out.println("請選擇一個藍球號碼(1~16):"); ?????????????useblueBall?=?input.nextInt(); ?????????????flag = false; ??????? ??break; ???????????????default: ??????????????? System.out.println("請問您是要機選還是手選(1機選 2手選); ???? break; ????} ????} ????//系統(tǒng)隨機生成的號碼 ????//紅球 ??? ?computerSlection(redBall,sysRedBall); ??? ?//藍球 ?????????????sysBlueBall?=?r.nextInt(16)+1; ?????????????//統(tǒng)計結(jié)果 ?????????????//統(tǒng)計紅球 ????????????? for (int i=0; i<userRedBall.length;i++){ ??????????????for?(int?j=0;?i<sysRedBall.length-redCount;j++){ ??????????????if(userRedBall[i]==sysRedBall[j]; ??????????????sysRedBall[j]=sysRedBall[sysRedBall.length-1-redCount]; ??????????????????userRedBall[sysRedBall.length-1-redCount]=temp;?????????????????? ??????????????????redCount++; ??????????????????break; ??????????????????} ??????????????????} ??????????????????} ???????????????? ??????????????????//統(tǒng)計藍球數(shù) ?????????????????? if(userRedBall==sysRedBall){ ???????????????????blueCount = 1; ???????????????????//驗證是否中獎(中獎成功率排在前面) ???????????????????if(blueCount?==0?&&?redCount<==3){ ????????????????????System.out.println("革命尚未成功同志還要努力"); ????????????????????}else??if(blueCount?==1?&&?redCount<==3){ ????????????????????System.out.println("中了六等獎5塊錢"); ??????????????????????}else??if((blueCount?==1?&&?redCount<==3)??||?blueCount==0 && redCount==4)){ ????????????????????System.out.println("中了五等獎10塊錢"); ??????????????????????}else??if((blueCount?==1?&&?redCount<==4)??||?blueCount==0?&&?redCount==5)){ ????????????????????System.out.println("中了四等獎200塊錢"); ????????????????????}else??if(blueCount?=1?&&?redCount<==5){ ????????????????????System.out.println("中了三等獎3000塊錢"); ????????????????????}else??if(blueCount?==0?&&?redCount<==6){ ????????????????????System.out.println("中了二等獎150W"); ????????????????????}else??if(blueCount?==1?&&?redCount<==){ ????????????????????System.out.println("中了一等獎500W"); ????????????????????}else{ ????????????????????System.out.println("系統(tǒng)有誤中獎無效"); ????????????????????} ????????????????????//公布系統(tǒng)號碼 ??????????????????????System.out.println("本期中獎紅號碼為:"); ??????????????????????sort(sysRedBall); ???????????????????????System.out.println(Aaaays.toStrings(ysRedBall)); ???????????????????????????????System.out.println("本期中獎號碼為:"+ysRedBall); ???????????????????????????????//公布用戶號碼 ????????????????????????????????System.out.println("您選擇的紅號碼為:"); ??????????????????????sort(userRedBall); ???????????????????????System.out.println(Aaaays.toStrings(userRedBall)); ???????????????????????????????System.out.println("本期中獎號碼為:"+userRedBall); ??????????????????????????????????System.out.println("買雙色球造福你我,!謝謝!??!") ??????????????????????????????????//冒泡排序 ????????????????????????public?static?void?sort(int[]?ball){ ?????????????????????????for?(int?i=0;?i<ball.length;i++){ ??????????????????????????for?(int?j=0;?i<ball.length-1-i;j++){? ??????????????????????????if(ball?[j]>ball?[j+1]?{ ??????????????????????????ball[j]?=ball[j]+ball[j+i]; ???????????????????????????ball[j]?=ball[j+1]-ball[j+i]; ????????????????????????????ball[j]?=ball[j]-ball[j+i]; ????????????????????????????} ????????????????????????????} ????????????????????????????} ????????????????????????????} ?//用于在指定數(shù)列中,隨機生成多個不重復(fù)的數(shù)算法 ?????public?static?void?computerSelection(int[]?redBall,int [] userRedBall ){ ?????Random r = new Random(); ?????int index = -1; ??????for?(int?i=0;?i<userRedBall.length;i++){ ??????index?=?r.nextInt(redBall.length-i;); ??????userRedBall[i]?=?redBall[index]; ??????int?temp?=?redBall[index]; ??????redBall[index]?=?redBall.length-1-i]; ??????redBall[redBall.length-1-i] = temp; ??????} ??????} ??????}
?
|