黑馬程式員_循環語句、函數和數組
------Java教育訓練、Android教育訓練、iOS教育訓練、.Net教育訓練、期待與您交流! -------
循環語句部分
一,循環語句 while ,do while ,for
1、while語句的格式 while(條件表達式){ 執行語句; }
2、do while 語句的格式 do{ 執行語句 ;}while(條件表達式);
相比較if語句來說,while和do while 語句是一個循環語句,在運作時候,如果條件表達式滿足條件,她就會一直執行執行語句的部分;而if語句,當滿足條件表達式的時候,隻會執行一次。
注意:在dos見面運作無限循環時候,用ctrl+c 進行強制程式停止。
while 和do while 語句的相同處和不同處,看下列語句
//while 方式的循環語句
int x =1;
while (x<0)
{
System.out.println("Hello World!");
x++;
}
//do while 方式的循環語句
int y = 1;
do
{
System.out.println("do:x="+y);
y++;
}
while(y<0) ;
相同處:while 和do while語句其實都是循環語句,隻要滿足條件表達式就會執行裡面的執行語句。
不同處:while是先判斷條件表達式是否成立,成立即執行循環程式,不成立就會立即跳出。
do while是先執行一遍循環程式裡的執行語句,然後在判斷條件表達式是否成立,成立就會繼續執 行,不成立就會跳出。
是以上述語句中,do while 會執行一次 y ,while 一次都不會執行
注意while()後面緊跟一個分号 即 :while(條件表達式); 此時語句是成立的,隻是會變成無限循環。
3、for 循環語句 格式為:for(初始化表達式;循環條件表達式;循環後操作表達式){ 執行語句 ;}
初始化表達式是第一步,隻會執行一次,其後就會執行後面的語句,而且裡面的變量在for循環結束的時候裡面的變量就消失了。具體程式如下:
class ForDemo
{
public static void main(String[] args)
{
for(int x=0;x<3;x++)
{
System.out.println("x="+x);
}
System.out.println("x===="+x); 此時,結果為空,就是說沒有變量x
int y = 0;
while (y<3)
{
System.out.println("y="+y);
}
System.out.println("y===="+y); 此時,結果又y
}
}
相對于while語句,它的初始化語句在while循環語句外面,當while語句循環結束的時候,變量還在。
這樣就會出現一個編寫程式選擇:1)如果增量變量隻用于循環語句,定義在for語句中,隻在for語句中有效,佛for語句完成後就會釋放記憶體用for循環語句。
2) 如果增變變量循環語句後可用,定義在while語句之外,就可用while語句
3)for和while語句可以進行互換,如果需要定義循環變量,for更為合适
for循環裡面條件表達式,注意是條件表達式,必須有真假。其他兩個表達式可以是其他類型的表達式,當其中含有多個表達式的時候,用逗号隔開即可。例如:for(int x=1,y=9;x<3,y<12;x++,y++)。
for語句中的初始化表達式和循環後表達式也可以不寫。
小細節:無線循環最簡單表達式。
(1) for(;;){ } 條件表達式為空,即系統會預設為true
(2) while(true){ }
循環語句一定要注意,哪些語句要參與循環,哪些不需要參與循環,确定需要幾個未知參數,确定類型以及各自循環的姿态。涉及的思想:累加思想和計數器。就是就是通過一個變量來記錄住資料的變化。
循環嵌套語句的聯系:class ForForDemo
{
public static void main(String[] args)
{
for(int x =0;x<3;x++)
{
for(int y=0;y<4;y++)
{
System.out.println("ok");
}
System.out.println();//隻有一個功能就是換行
}
}
}
打出的結果是一個有 * 好組成的長方形,内外循環相對于此處來說,就是外循環控制行數,内循環控制列數。當列數改變時,可以改變for循環内循環語句裡的初始化值或者條件表達式,使之随着外循環的變化而變化,做出相應的改變。
小技巧:在用循環語句尤其是嵌套循環語句來制作像表格一類的東西的時候,為了對齊 ,可以再輸出語句裡加入 " \t " 即制表符來進行制表。
二,break和continue
不同點:
1)應用範圍的不同:
break語句應用範圍: 選擇語句(switch語句)和循環語句
continue語句以應用範圍: 循環語句
2)作用不同:
break是跳出目前循環語句,注意此處跳的是它所在的循環,比如内循環
continue是結束本次循環開始下次循環
相同點:這兩個語句離開應用範圍都是沒有意義的,在作用範圍外會編譯出錯
這兩個語句單獨存在下面都不是不可以有語句的因為執行不到,是以兩個語句後面不跟任何語句。
是以我們當寫到無線循環的程式時,可以通過break語句來判斷使用者或者其他的資料滿足條件語句,來跳出無限循環語句。
小細節:可以在循環語句前加上 名稱 :循環語句 就是對循環語句做标号,相當于起名字。如w:for(;;),此處w就是循環語句做的标号。通過此小标号,可以這樣運用,如:在内循環中加入break w ;就可以把外循環關閉。
函數
一、函數
函數就是定義在類中的具有特定功能的一段獨立的小程式。
實際上就是一個可以實作固定功能的方法,隻是把這種發法裝到一個可以用于調用的程式裡,這樣我們以後需要這個特定功能,隻要調用這個函數就可以實作。函數就是方法,方法就是函數。
對于函數調用,就是提高了程式的複用性,也友善日後的程式的使用。
函數其實就是講一段特定功能的代碼進行封裝,隻有被調用的時候才會被執行。
函數之間可以互相調用。
函數的格式: 修飾符 傳回值類型 函數名 (參數類型 形式參數1,參數類型 形式參數2,.....)
{
執行語句;
return 傳回值;
}
在主函數中調用格式為 函數名(參數)
注意,1)如果函數中沒有具體的傳回值情況,傳回值類型用關鍵字void表示,那沒該函數中的return如果再最後一行可以省略不寫。像是現在基礎用到的列印。
2)函數中隻能調用函數,不可以在函數内部定義函數。
在主函數中調用格式為 函數名(參數)
3)傳回值類型為void時,不能用列印語句輸出
二、重要思想: 如何定義一個函數呢
1、既然函數是一個獨立的功能,那麼該功能的運算結果是什麼先明确
就是說有一個需求,一般是這個需求要一個結果或者其他什麼東西,那麼我這個功能就得達到這個結果或者目标,那麼我就知道該功能運算結果是什麼,是以要先明确。運算結果明确就是在明确傳回值類型。
2、在明确都在定義該功能的過程中是否需要未知的内容參與運算
這個功能達成一個結果,裡面有未知的或者是外面輸入的,即是未知的參數,這個參數需要參與運算,那麼就定義它。未知參數明确,就是在明确參數清單和參數個數。
函數調用舉例:
class FunctionTest
{
public static void main(String[] args)
{
juXing(5,6);
kouJue();
System.out.println("Hello World!");
}
//列印矩形的一個調用函數
public static void juXing(int a,int b)
{
for(int x=0;x<a;x++)
{
for (int y=0;y<b ;y++ )
{
System.out.print("*");
}
System.out.println();
}
}
//定義一個功能,列印九九乘法口訣表
public static void kouJue()
{
for (int x=1;x<=9 ;x++ )
{
for (int y=1;y<=x ;y++ )
{
System.out.print(x+"*"+y+"="+x*y+"\t");
}
System.out.println();
}
}
}
兩個函數都是沒有傳回值類型,在矩形條用函數中,行列數是有使用者輸入的,是以定義在參數清單中。九九乘法表中,是要直接列印一個九九乘法表,是以并沒有需要輸入的未知參數,是以直接用for循環完成它。
注意,調用,直接調用函數,并不需要再寫列印語句,這就是因為調用的函數裡傳回類型是void型的,是以,不能再主函數裡再次寫列印語句列印結果。
三、函數的重載
在同一個類中,允許存在一個以上的同名函數,隻要他們的參數個數或者參數類型不同即可。
就是說重載隻看參數清單,與其他的無關。注意,隻和參數清單有關系。
如:
取和的運算 public static int add(int x ,int y)
public static int add(int x, int y, int z )
public static double add(double x,double)
以上三個函數重載了,1)和2)函數的名稱一樣,傳回值類型一樣,但是參數清單不一樣,個數不一樣
2)和3)函數名稱一樣,參數清單的參數類型不一樣,即是重載
有上可知,當定義功能相同,但參與運算的未知内容不同,那麼此時就定義一個函數名稱以表示其功能,友善閱讀,而通過參數清單的不同來區分多個函數。
數組部分
一、數組
同一種類型資料的集合,數組就是一個容器。
數組可以自動給數組中的元素開始編号,友善操作這些元素。
格式1:元素類型[ ] 數組名 = new 元素類型[元素個數或者數組長度];
格式2:元素類型[ ] 數組名 = new 元素類型[ ]{元素,元素,... };
new會在容器中産生一個可以存儲資料的實體。數組類型資料引用資料類型。
表示數組中每個元素的具體位置格式為:數組名[位置數 ] 位置數是從零開始的
數組建立在記憶體中的流程:
int [ ] x = new int[ ];
int [ ] x 先會在棧記憶體中建立一個x,使用數組的時候,次值存在,數組使用完成後就是釋放棧記憶體,就是說棧記憶體是一個臨時性的記憶體空間。
小知識:所有局部變量,都定義在棧記憶體中
new 就是建立一個實體,實體包括數組和對象。隻要運作new 就會在堆記憶體中配置設定空間。并且在其中每個元素都建立對應的角标,是從0開始的,一定要注意是從0開始的。
每個記憶體都有一個位址值,是二進制的,此時就把數組在記憶體中的位址值賦給x ,此時是一個指派動作。
當數組建立的是,就會在記憶體中給預設初始化值,整型類0 ,布爾型為false。
null 空 ,隻有引用類資料類型可以用這個關鍵字。如 x = null 就是把數組的位址值變為空,如果這樣在程式裡,就是得原數組沒有位址值指向,是以,此時為垃圾,無效資料。
堆記憶體中的特點:1)位址值 2)預設初始化值 3)垃圾回收機制
其中垃圾回收機制,就是java裡,本身會定期清理垃圾資料。
一個數組固定長度,比如3,當程式列印角标為3的時候,就會出錯,但是程式編譯的時候不會出錯,文法上也沒有錯誤。但程式一旦運作,就會顯示角标出錯。說明在編譯程式的時候,數組并沒有建立,程式開始運作的是數組才會建立起來。這個要注意。
二、數組的操作
一般的數組操作都會用到周遊。數組中有一個屬性可以直接擷取到數組元素的個數,length,使用方法為 數組名.length 。
1、常見操作以:周遊
一下為一個周遊數組的函數:
public static void printarr(int[] arr) 這是要擷取一個元素為int型的數組
{
for (int x=0;x<arr.length ;x++ ) arr.length 為數組元素個數,牢記,數組部分常用
{
if(x!=arr.length-1)
System.out.print(arr[x]+",");
else
System.out.print(arr[x]);
}
}
2、常見操作二:擷取數組元素最大值
思路:1)擷取最值需要進行比較,每一次比較都會有一個比較大的值,因為該值不确定,通過一個變量進行臨時存儲。
2)讓數組中每一進制素都與這個變量中的值進行比較,如果大于變量中的值,就用該變量記錄較大的值。
3)當所有元素比較完,那麼該變量中的存儲的就是數組中的最大值了
public static int arr(int[] arr) 傳回值類型是int型
{
int max=arr[0];
for (int x=1;x<arr.length ;x++ ) 周遊數組
{
if (arr[x]>max) 相比較,記錄最大值
{
max=arr[x];
}
}
return max; 傳回最大值,這個一定要注意,出去void型不需要傳回值,其他都需
} 要
這個隻是int類型的數組,對其他類型的數組,擷取最值的方法是一樣的,隻是數組元素資料類型不一樣,是以可以建立重載函數。
3、選擇排序
思路:
1、以角标為0的元素開始,與角标為1的數組進行比較,如果1的較小,則兩者互換,再以角标為的0的元素與2角标的比較,如果小,則兩者互換,依次類推。
2、進行比較,要周遊數組
public static void paiXuArr(int[] arr)
{
for (int x=0;x<arr.length-1 ;x++ ) 從0角标開始,到倒數第二個元素即可,最後一個自己不需要
{ 比較
for (int y =x+1;y<arr.length ;y++ ) 從x+1角标開始到最後一個角标元素,每個角标與x角标比較
{
if (arr[y]<arr[x])
{
int temp =arr[x]; 如果小,兩者換位置(此處用第三方變量換位)
arr[x]=arr[y];
arr[y]=temp;
}
}
}
printarr(arr); 調用列印數組的函數
}
4、冒泡排序
思路:相鄰兩個元素進行比較 ,具體來說,就是角标0與角标1的相比,小的排在前、大的排在後,然後角标1的和角标2的比較,也是小的排在前,大的排在後,依次排序。到數組的最後一定是最大的在最後面。當第二次比較開始時,最後的元素不參與比較,照上比較後,第二大的元素就會排出來,以此類推。程式為
public static void maoPaoArr(int[] arr)
{
for (int x=0;x<arr.length-1 ;x++ ) ............................. 周遊數組元素,隻需比較arr.length-1次
{
for (int y =0;y<arr.length-x-1 ;y++ ) ............................此處應注意y<arr.length-x-1 每次比較後比較的
{ 次數就會減少一次,就是減少x,是以-x是讓每一次元素比較減
if (arr[y]<arr[y+1]) 少。如果元素個數為5,當y取到arr.length-1,即5-1=4時,y+
{ 1就是5,超出最大角标數4了,是以y最大隻能取到3,是以
int temp =arr[y]; y<arr.length-x-1。
arr[y]=arr[y+1];
arr[y+1]=temp;
}
}
}
printarr(arr);
}
排序最快的為,希爾排序。
在以上程式中,要注意到共性的部分,比如位置置換,相對應的可以把這個功能單獨寫成一個函數,以待調用。
5、數組查找 折半查找
折半查找就是從中劈開,然後比較大小。是以,數組必須是有序的數組,注意是有序的數組。這種方法可以調高效率。具體程式例子:
public static int halfSearch(int[] arr,int key)
{
int min,max,mid;
min=0;
max=arr.length-1;
mid=(min+max)/2;
while(arr[mid]==key)
{
if (key>arr[mid])
min=mid+1;
else
max=mid-1;
if(min>max)
return -1;
mid=(min+max)/2;
}
return mid;
}
這個程式也可以用于把一個數插入到這個有序的數組,還保證數組有序,擷取的位置就是傳回最小角标min為數值。
6、二維數組
格式 int[ ][ ] arr = new int [3 ] [2 ]; 此處定義了一個名為arr的二維數組,二維數組中有有3個一維數組,每個一維數組裡有兩個元素。兩個一維數組角标為0和1,每個一維數組裡的元素角标按一維數組來排。是以,要是想指派給第二個二維數組中最後一個元素,寫成: arr[1][1] = 90
要是想初始化一個一維數組,寫成 arr[1]=new int[1];
注意:在二維數組中
System.out.println(arr); 此時列印的是二維數組的位址值
System.out.println(arr[0]); 此時列印的是二維數組中第一個一維數組的位址值
int[ ][ ] arr = new int [3 ] [ ]; 此處第二個括号裡不寫值 此時在System.out.println(arr[0]); 結果是:null 。
因為每個數組是引用資料類型,是以預設初始化值為null。在這之後如果初始化一維數組,那麼就在記憶體中開辟空間存放一維數組,并把這個一維數組的位址值付給相對應arr[0]、arr[1]、arr[2],實質指向一維數組七、進制轉換的聯系
class ArrayTest7
{
public static void main(String[] args)
{
toBin(-6);
System.out.println();
toBin(6);
System.out.println();
toHex(-60);
System.out.println();
toHex(60);
System.out.println();
}
public static void toBin(int num) ............//二進制轉換
{
trans(num,1,1);
}
public static void toHex(int num)...............//十六進制轉換
{
trans(num ,15,4);
}
public static void trans(int num,int base,int offset)..........................轉換進制的基本調用函數
{
//建表
char[] chs = new char[]{'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};..........制表
char[] arr= new char[32];..............................................建立一個容器
int pos = arr.length;.....................................................建立一個指針,為倒着記錄進容器,先取最大值
while(num!=0)
{
int temp = num & base;
arr[--pos]=chs[temp]; 進行與運算和位移,把對應表裡的字元記錄到容器裡
num = num>>>offset;
}
for(int x=pos;x<arr.length;x++)..........................................列印容器裡的元素
{
System.out.print(arr[x]);
}
}
}