Java語言基礎(下)
五、程序流程控制結構
就像日常生活中寫文章時,可以採用順敘、插敘、倒敘的方式描述一件事;在java語言中,程序代碼的執行順序也可以採用不同的“描述”方式,這種“描述”方式就是程序流程控制結構。
程序流程控制結構可以細分爲以下三種方式:
(1)、判斷結構:if語句
if語句有三種格式:
1)、if(條件表達式){執行語句;}
2)、if(條件表達式){執行語句;} else{執行語句;}
3)、if(條件表達式){執行語句;}else if(條件表達式){執行語句;}else{執行語句;}
注意:if語句可以進行多層的嵌套使用,並且條件表達式必須是Boolean類型的,要麼是true,要麼是false。
(2)、選擇結構:switch語句
switch(表達式)
{
case取值1:
執行語句;
break;
case取值2:
執行語句;
break;
…...
default:
執行語句;
break;
}
注意:在switch語句中的選擇的類型只能是這四種類型:byte、short、char、int。
(3)、循環結構:while語句,do while 語句,for語句
while語句格式:while(條件表達式){執行語句;}
do while語句格式:do{執行語句;}while(條件表達式);
for語句格式:for(初始化表達式;循環條件表達式;循環後的操作表達式)
{
執行語句;
}
練習:打印一個九九乘法表:
package itheima.day03;
/*打印一個九九乘法表*/
public class Multiplication {
public static void main(String[] args) {
//運用大圈套小圈的原理
for(int row = 1;row <=9;row++){// 大圈控制行
for(int col = 1;col<=row;col++){//小圈控制列
System.out.print(col+"*"+row+"="+row*col+'\t');
}
System.out.println();
}
}
}
注意:do while特點是條件無論是否滿足,循環體至少被執行一次。,while與for可以互換,區別在於for爲了循環而定義的變量在for循環結束就是在內存中釋放。而while循環使用的變量在循環結束後還可以繼續使用。
(4)、其他流程控制語句:break語句,continue語句
break語句:跳出本層結構,用於選擇結構和循環結構中。
continue語句:結束本次循環繼續下次循環,用於循環結構中。
六、函數
函數的定義:函數就是封裝了特定功能的一段獨立的小程序,在java中,函數也稱爲方法。
函數的格式:
修飾符 返回值類型 函數名(參數類型 形式參數1,參數類型 形式參數2,)
{
執行語句;
return 返回值;
}
定義函數就是爲了將特定的功能進行封裝,降低代碼的耦合性,提高代碼的重用性。函數只有被調用的時候纔會被執行,並把執行後的返回值返回給調用者。當沒有返回值時,返回類型使用關鍵字void表示,return語句可以省略不寫。函數是支持調用其他函數的,但是不支持函數的嵌套定義,也就是函數中定義函數。
注意:一般定義函數時,要明確函數最後的返回結果,也就是要返回的數據;還要明確參與函數運算的數據,也就是形式參數的列表要明確;函數名應該儘量寫成與該函數功能相同,提高閱讀性。
函數的重載(overload):在一個類中,當兩個或者兩個以上的函數名稱相同,並且形式參數的列表不相同時,就稱這些函數重載,重載與返回值類型無關。
例如: int add(int x,int y){returnx+y;}
intadd(int x,int y,int z){return x+y+z;}
doubleadd(double x,double y){return x+y;}
七、數組
數組:數組是一種容器,但數組這種容器中只能存儲相同的數據類型元素。
格式:1、元素類型[] 數組名 = new 元素類型[元素個數或數組長度];
例如:int[] arr = new int[10];
2、元素類型[] 數組名 = new 元素類型[]{元素,元素,……};
例如:int[] arr = new int[]{1,5,8,7};
int[] arr = {1,5,8,7};
內存結構:每一個程序的運行都需要分配內存。在java中,爲了提高運算的效率,因此對內存進行了劃分。可以分爲:棧內存、堆內存、方法區、本地方法區、寄存器。下面只介紹棧區和堆區,其他的內存結構會在以後的使用中再介紹。
棧內存:用於存儲局部變量,當數據使用完,所佔空間會自動釋放,相對來說較小。
堆內存:用於存儲數組和對象,一般用new關鍵字建立的實體都存儲在堆內存中;每一個實體都有內存地址值;每一個實體的變量都有默認初始化值;當實體不再被引用指向時,由垃圾回收器回收。如圖3.1所示:
圖3.1
下面就寫幾個練習熟悉一下函數和數組的操作:
獲取最值:
package itheima.day04;
/*獲取一個數組中的最大值*/
public class ArrayDemo1 {
public static void main(String[] args) {
int[] arr = {5,9,6,3,1,4,2,10};//1:定義一個數組
int max = getMax(arr);//2:調用函數,獲取最大值
System.out.println("數組中最大值是:"+max);//3:打印最大值,10
}
public static int getMax(int[] arr){//把一個獨立的功能封裝成爲一個函數,使代碼結構更加清晰
int max = arr[0];
for(int i=0;i<arr.length;i++){
if(max<arr[i]){
max = arr[i];
}
}
return max;
}
}
排序:
package itheima.day04;
/*給一個數組進行排序*/
public class ArrayDemo2 {
public static void main(String[] args) {
int[] arr ={100,25,63,59,54,61,76};
printArray(arr);//打印數組
//selectSort(arr);//給數組進行選擇排序
bubbleSort(arr);//給數組進行冒泡排序
printArray(arr);//再打印數組
}
public static void selectSort(int[] arr){//把選擇排序的功能封裝成爲一個函數,提高代碼複用性
for(int x = 0;x<arr.length-1;x++){//控制比較次數
for(int y = x+1;y<arr.length;y++){//控制每一次都多少個數進行比較
if(arr[x]>arr[y]){
swap(arr,x,y);//調用函數,交換兩個值
}
}
}
}
public static void bubbleSort(int[] arr){//冒泡排序的函數
for(int x=0;x<arr.length-1;x++){//控制比較的次數
for(int y=0;y<arr.length-x-1;y++){//每一次要比較數的多少
if(arr[y]>arr[y+1]){
swap(arr,y,y+1);//交換兩個數
}
}
}
}
private static void swap(int[] arr,int x,int y){//將重複調用的代碼獨立封裝成爲函數,使代碼更加緊湊
int temp =arr[x];
arr[x] =arr[y];
arr[y] =temp;
}
public static void printArray(int[] arr){//打印函數
System.out.print("[");
for(int x =0;x<arr.length;x++){
if(x!=arr.length-1)
System.out.print(arr[x]+", ");
else
System.out.println(arr[x]+"]");
}
}
}
折半查找(二分查找):
package itheima.day04;
/*演示二分查找*/
public class BinarySearch {
public static void main(String[] args) {
/*二分查找的前提:要查找的數組必須是有序的,否則無法進行*/
int[] arr = {1,3,5,6,8,9,11};
int index = halfSearch(arr,1);//調用函數
System.out.println("index = "+index);
}
public static int halfSearch(int[] arr,int key){//二分查找的函數
int min = 0,max = arr.length-1,mid;
while(min<=max){
mid = (max+min)>>1;
if(key>arr[mid])
min = mid+1;//當要查找的數大於中間數時,在數組右邊查找
else if(key<arr[mid])
max = mid-1;//當要查找的數小於中間數時,在數組左邊查找
else
return mid;//找到直接返回角標
}
return -1;//沒找到時返回-1
}
}
十進制轉換成其他進制:
package itheima.day04;
/*實現進制之間的轉換*/
public class JinZhiConvertion {
public static void main(String[] args) {
int number = 60;
toBinary(number);//轉換成二進制
toOctal(number);//轉換成八進制
toHex(number);//轉換成十六進制
}
public static void translation(int num,int base,int offset){
char[] chs ={'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;
if(num ==0){//檢查數組是否爲零
System.out.println(0);
return ;
}
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]);
}
System.out.println();
}
public static void toBinary(int num){//轉成二進制
translation(num,1,1);
}
public static void toHex(int num){//轉成十六進制
translation(num,15,4);
}
public static void toOctal(int num){//轉成八進制
translation(num,7,3);
}
}
二維數組:數組中存儲的元素還是一個數組,數組中的數組,就稱爲二維數組。
格式1:int[][] arr = new int[3][2];二維數組arr中有3個一維數組,每個一維數組有兩個int類型的元素。
格式2:int[][] arr = new int[3][];二維數組arr中有3個一維數組,這3個一維數組都沒有進行初始化。
格式3:int[][] arr = {{3,8,2},{2,7},{9,0,1,6}};二維數組arr中有3個一維數組,這3個一維數組都已經初始化,並且已經固定。
注意:二維數組中存儲的是每一個一維數組的地址值,並非具體的數組數值!
package itheima.day04;
public class ArrayInArray {
/*演示二維數組中的注意問題*/
public static void main(String[] args) {
int[][] arr = new int[3][];
System.out.println(arr.length);//3,打印二維數組的長度
System.out.println(arr[1]);//null,因爲arr[1]還是一個一維數組,還沒有初始化,所以爲null
arr[0] = new int[]{2,3,6};//給二維數組中的一維數組初始化,就像初始化普通的一維數組一樣
arr[1] = new int[]{5,9,6};
arr[2] = new int[]{7,8,4};
for(int x =0;x<arr.length;x++){//打印二維數組
for(int y=0;y<arr[x].length;y++){
System.out.print(arr[x][y]+" ");
}
System.out.println();
}
}
}