黑马程序员 JAVA初级-编程基础2 流程控制语句 函数 数组

时间:2022-07-08 00:29:50

---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ---------------------

一、程序流程控制


1.判断结构


判断结构是if语句,它有三种结构
1.如果条件为真,则执行{}中的语句,否则不执行。
2.如果条件为真,则执行{}中的语句,否则执行else{}里面的代码。
3.如果条件为真,则执行{}中的语句然后结束这个结构,否则判断是否满足第二个if表达式,如果条件为真,则执行{}中的语句然后结束这个结构,否则、、、以此类推。


格式:
1.

if(条件表达式)
{
执行语句;
}


2.

if(条件表达式)
{
执行语句;
}else
{
执行语句;
}


3.

if(条件表达式)
{
执行语句;
}else if(条件表达式)
{
执行语句;
}
...
else
{
执行语句;
}




2.选择结构


switch特点:
1.表达式不可为布尔型表达式
2.case的取值只能为byte、short、int、char以及字符串、枚举等六种类型,
注:在JDK1.5中还因为出现了枚举,也可以在switch中应用此类型。
3.case与default没有必然的顺序,要先执行case,执行从上向下执行,没有找到匹配的case执行default。
4.结束switch语句的两种情况:遇到break或者执行到switch结尾结束。
5.如果没有break,每个case都会判断一次,如果不符合表达式的值,则继续判断下面的case取值,如果满足表达式的值,执行完当前语句后,会继续判断并执行后面全部的语句,直到switch语句结束。


格式:
switch(表达式)
{
case 取值1:
执行语句;
break;
case 取值2:
执行语句;
break;
......
default:
执行语句;
break;
}


if和switch的选择:


如果判断的具体数值不多,而是符合byte short int char 这湿种类型。
虽然两个语句都可以使用,建议使用switch语句,因为效率稍高。


其他情况:对区间判断,对结果为boolean类型的判断,使用if,if的使用范围更广


示例:
class DemoSwitch  
{
public static void main(String[] args)
{
int x = 5;
switch (x)
{
case 3:
case 4:
case 5:
System.out.println(x+"夏季");
break;
case 6:
case 7:
case 8:
System.out.println(x+"秋季");
break;
case 9:
case 10:
case 11:
System.out.println(x+"冬季");
break;
case 12:
case 1:
case 2:
System.out.println(x+"春季");
break;
default :
System.out.println(x+"错误的月份");
break;
}
}
}




3.循环结构:
当要对某些语句执行很多次时,就使用循环结构。
代表语句:while 、do while 、for
while:先判断条件,只有条件满足才执行循环体。
do while:先执行循环体,在判断条件,条件满足,在继续循环。
简单一句话:do while:无论条件是否满足循环体至少执行一次。
for:变量有自己的作用域对于for来讲;如果将用于控制循环的增量定义在for语句中。那么该变量在for语句内有效。for语句执行完毕,该变量在内存中被释放。


for和while可以进行互换,如果需要定义循环增量,又for更为合适




while语句格式:


while(条件表达式)
{
执行语句;
}



do while语句格式:


do
{
执行语句;
}
while(条件表达式)



for语句格式:


for(初始化表达式;循环条件表达式;循环后的操作表达式)
{
执行语句;
}




无限循环的最简单表现形式。
for(;;){}
while(true){}


二、函数


1.函数的概述:


函数也称为方法,是定义在类中的具有特定功能的一段独立的小程序。函数可以实现某些特定的功能。


定义函数的体现:


在写程序时,发现运算中获取不同数据的运算结果,总是重复使用一些代码,为了提高代码的复用性,就对代码进行了抽取。


将这个抽取的部分定义为一个独立的功能,方便日后重复使用。这就是函数的体现形式。


函数的格式:


修饰符 返回值类型 函数名(参数类型 形式参数1,参数类型 形式参数2,......)  
{
执行语句;
return 返回值;
}



返回值类型:函数运行后的结果的数据类型


参数类型:是形式参数的数据类型,就是传入的数据的类型


形式参数:是一个变量,用于存储调用函数时传递给函数的实际参数


实际参数:传递给形式参数的具体数值


return:用于结束函数运行的语句,表示函数执行完毕


返回值  :该值将返回给调用者,即函数实现功能需要获得的数据。


说明:当函数运行完,没有具体的返回值,这时的返回值类型可以用一个特殊的关键字来表示,即void,它代表的是函数没有具体的返回值的情况。此时,函数中的return可以省略不写。


何时定义函数:


首先要明确函数的功能,这个功能实现的运算结果是什么.其实就是在明确返回值类型


在定义函数功能的过程中需要明确是否含有位置内容参与运算.其实就是在明确函数的参数列表(参数类型和参数个数)






示例:


/* 
需求:打印a ~ b 中每个数与c的乘积
分析:明确功能的结果:打印运算结果,返回类型无,为void
在实现功能的过程中是否有位置内容:有,int型的a、b和c

*/
public static void Chengji(int a,int b,int c)
{
int j = 1;
for(a=1;a<=b;a++)
{
int m = c*a;
System.out.print(m + "\t");
if(j == a/10)//十个数换一次行
{
j++;
System.out.println(" ");
}
}
}



2.函数的特点:


1:定义函数可以将功能代码进行封装,体现了java的封装性


2:定义函数可以提高代码的复用性,便于使用,可对功能进行复用


3:函数需要被调用才能被执行,否则就是一段代码


4:无返回值类型的函数用void修饰,则可以省略函数中的return


5:函数中不可以定义函数(内部类除外),但函数间可以相互调用。






3.函数的重载:


1:定义:在同一个类中,允许存在一个以上的同名函数,只要他们的参数个数或者参数类型不同即可。


2:特点:与返回值类型无关,只看参数列表。


3:好处:方便与阅读,优化了程序设计。


4:重载解析:编译器对于重载的方法会进行选择,,匹配出相应的方法,如果编译器找不到匹配的参数,或者找出了多个可能的匹配函数,那么就会产生编译错误。


示例:


//定义函数,求两个数的和  
public static int add(int a,int b)
{
return a+b;
}

//定义函数,求三个数的和
public static int addT(int a,int b,int c)
{
return add(a,b)+c;
}




三、数组
1.数组的概括:
概念:同一种类型数据的集合。其实数组就是一个容器。
数组的好处:可以自动给数组中的元素从0开始编号,方便操作这些元素。

数组的内存结构:

黑马程序员 JAVA初级-编程基础2 流程控制语句  函数  数组


格式1:

元素类型[] 数组名 = new 元素类型[元素个数或数组长度];
int[] arr = new int[5];


格式2:

元素类型[] 数组名 = new 元素类型[]{元素,元素,……};
int[] arr = new int[]{3,5,1,7};
int[] arr = {3,5,1,7};




2.数组赋值:


数组的初始化


对于上面两种格式的赋值:


      第一种是隐式初始化,每个元素的值都为相对应的各类型的初始化值,具体看数据类型的总结。


      第二种是显式初始化,每个元素都已经被赋予初值。


还可以定义匿名数组:


      new int[]{3,2,6,7,9,1,4}


数组的间的赋值:


java中,可以将一个数组的变量的引用值赋给另一个数组的变量。如:String[] b = a;






例子:打印数组中的元素。元素间用逗号隔开。


class ArrDame
{
public static void main(String[] args)
{
int[] i = {3,6,7,82,3,5,4};
printArray(i);


}
public static void printArray(int[] arr)
{
for(int x=0; x<arr.length;x++)
{
if(x!=arr.length-1)
System.out.print(arr[x]+",");
else
System.out.println(arr[x]);
}
}
}





4.数组的排序与查找:


/*给定一个数组{5,1,6,4,2,8,9}。

获取数组中的最大值,以及最小值。*

/

例子:获取数组最大值

 
class ArrayTest {/*获取数组中的最大值。思路:1,获取最值需要进行比较。每一次比较都会有一个较大的值。因为该值不确定。通过一个变量进行临储。2,让数组中的每一个元素都和这个变量中的值进行比较。如果大于了变量中的值,就用该该变量记录较大值。3,当所有的元素都比较完成,那么该变量中存储的就是数组中的最大值了。步骤:1,定义变量。初始化为数组中任意一个元素即可。2,通过循环语句对数组进行遍历。3,在变量过程中定义判断条件,如果遍历到的元素比变量中的元素大,就赋值给该变量;需要定义一个功能来完成。以便提高复用性。1,明确结果,数组中的最大元素 int。、2,未知内容:一个数组。int[]*/public static int getMax(int[] arr){int max = arr[0];//遍历数组for(int x=1; x<arr.length; x++){//比较两个元素if(arr[x]>max)max = arr[x];}return max;}/*获取最大值的另一种方式。可不可以将临时变量初始化为0呢?可以。这种方式,其实是在初始化为数组中任意一个角标。*/public static int getMax_2(int[] arr){int max = 0;for(int x=1; x<arr.length; x++){//比较两个元素if(arr[x]>arr[max])max = x;}return arr[max];}/*获取最小值。*/public static int getMin(int[] arr){int min = 0;for(int x=1; x<arr.length; x++){//比较两个元素if(arr[x]<arr[min])min = x;}return arr[min];}//获取double类型数组的最大值。因为功能一致,所以定义相同函数名称。以重载形式存在。public static double getMax(double[] arr){int max = 0;for(int x=1; x<arr.length; x++){//比较两个元素if(arr[x]>arr[max])max = x;}return arr[max];}public static void main(String[] args){int[] arr ={5,1,6,4,2,8,9};int max = getMax_2(arr);int min = getMin(arr);System.out.println("max="+max);System.out.println("min="+min);double[] arr2 ={5.4,1.3,6.3,5.2,2,8,9.12};double max2 = getMax(arr2);System.out.println("max="+max2);}}





数组的排序:
例子:
class ArrayText  
{
//选择排序
public static void selectSort(int[] arr)
{
for (int i=0;i<arr.length;i++)
{
//i=j,每比较一轮就减少一个数,比较后,再用第二个数获得后面的最小值
for (int x=i+1;x<arr.length;x++)
{
//换值
if (arr[i]>arr[x])
{
int temp = 0;
temp = arr[i];
arr[i] = arr[x];
arr[x] = temp;
}
}
}
}

//冒泡排序
public static void bubbleSort(int[] arr)
{
for (int i=0;i<arr.length-1;i++)
{
for (int x=0;x<arr.length-i-1;x++)//-i:让每一次比较的元素减少。-1:避免角标越界
{
if (arr[x]>arr[x+1])//若改成<是从大到小排序
{
int temp = arr[x];
arr[x] = arr[x+1];
arr[x+1] = 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]+"]");
}
}
public static void main(String [] args)
{
int[] arr0 = {5,2,4,8,6,1,9};
int[] arr1 = {5,2,5,8,6,1,9};
//选择排序前
printArray(arr0)
selectSort(arr0);
//选择排序后
printArray(arr0)
//冒泡排序前
printArray(arr1)
bubbleSort(arr1);
//冒泡排序后
printArray(arr1)
}
}



数组的查找操作:
class ArrayTest4  
{
public static void main(String [] args)
{
int[] arr = {1,6,11,2,8,5,3,13};
int index = getIndex(arr,3);
System.out.println("index=" + index);
int[] arr1 = {2,3,4,6,7,9};
index = halfSearch(arr1,3);
System.out.println("index=" + index);


}
//方法一:遍历每一个元素查找
public static int getIndex(int[] arr,int key)
{
for(int i=0;i<arr.length;i++)
{
if(arr[i] == key)
{
return i;
}
}
return -1;
}


/*方法二:折半,前提是数组是按大小顺序排列好的,
用查找的值和中间值比较,大则和下一半中间值比依次,小则和上一半中间值比,找到则返回。
小值的编号在左移或大值的编号在右移。要判断是否大小值的编号相遇,仍若未找到,则不再循环,返回-1
*/
public static int halfSearch(int[] arr,int key)
{
int min,max,mid;
min = 0;
max = arr.length-1;
mid = (min + max)/2;

//循环,查找中间值与要查找的值比较
while(key != arr[mid])
{
if (key > arr[mid])
min = mid +1;
else
max = mid - 1;
if (min > max)
return -1;
mid = (min + max)/2;
}
return mid;
}


//方法三:折半第二种
//while的条件改变
public static int halfSearch_2(int[] arr,int key)
{
int min = 0,max = arr.length-1,mid;

//循环,查找中间值与要查找的值比较
while(min <= max)
{
mid = (min + max)>>1;
if (key > arr[mid])
min = mid +1;
else if(key<arr[mid])
max = mid - 1;
else
return mid;
}
return -1;
}




}


例子:进制转换
class ArrayTest5 
{
public static void main(String [] args)
{
toBin(34);
toHex(34);
toHex_2(60);
toBin_2(60);
}
//十进制-->二进制
public static void toBin(int num)
{
StringBuffer sb = new StringBuffer();


while(num>0)
{
sb.append(num%2);
num = num/2;
}
System.out.println(sb.reverse());
}
//十进制-->十六进制
public static void toHex(int num)
{
StringBuffer sb = new StringBuffer();


for(int x = 0; x<8;x++)
{
int temp = num & 15;
if(temp>9)
sb.append((char)(temp-10+'A'));
else
sb.append(temp);
num = num>>>4;
}
System.out.println(sb.reverse());
}
//十进制-->十六进制 查表法
public static void toHex_2(int num)
{


char[] chs = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
//定义一个临时容器
char[] arr = new char[8];
int pos = arr.length;

while(num!=0)
{
int temp = num & 15;

arr[--pos] = chs[temp];

num = num>>>4;
}

for(int x = pos ; x<arr.length;x++)
{
System.out.print(arr[x]);
}
System.out.println();

}
//十进制转二进制 查表法
public static void toBin_2(int num)
{
//定义二进制的表
char[] chs = {'0','1'};


//定义一个临时存储的容器
char[] arr = new char[32];


//定义一个操作数组的指针
int pos = arr.length;


while(num!=0)
{
int temp = num & 1;


arr[--pos] = chs [temp];


num = num >>> 1;
}


for(int x=pos;x<arr.length;x++)
{
System.out.print(arr[x]);
}
System.out.println();
}


}




//进制转换优化
class ArrayTest6
{
public static void main(String[] args)
{
toBin(60);
toOctal(60);
toHex(60);
}
//十进制-->二进制
public static void toBin(int num)
{
trans(num,1,1);
}
//十进制-->八进制
public static void toOctal(int num)
{
trans(num,7,3);
}
//十进制-->十六进制
public static void toHex(int num)
{
trans(num,15,4);
}
public static void trans(int num,int base,int offset)
{
if(num==0)
{
System.out.println(0);
return;
}
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;


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();
}
}



多维数组:也称数组中的数组


这里主要总结一下二维数组:


格式:


格式一:int[][] arr = new int[2][3];


定义了一个名为arr的数组,数组中有2个一维数组,每个一维数组中含有3个元素。


可以对其赋值:arr[0][0] = 3;即对第一个一位数组的第一个元素赋值。




格式二:int[][] arr = new int[3][];


此二维数组中含有3个一维数组,每个一维数组的默认初始化值都为null,每个一维数组中的元素值都为0;可对每个元素赋值,如:


       arr[0] = new int[3];


       arr[1] = new int[2];


       arr[2] = new int[1];


格式三:


显式初始化二维数组:int[][] arr = {{1,5,7},{4,8},{3,9,20,12}}




二维数组中的第一维数组的长度:arr[0].length//为3


----------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------详细请查看:www.itheima.com