java学习日记第四天
hello 大家好
跳转语句:三个:
break;跳出当前循环体
continue;跳过本次循环,continue;下代码不执行直接进行下一次循环
ruturn;结束当前方法;
public static void main(String[] args) { Test1 .xunHuanDemo(); //.array1(); //.array2(); //.suanfa1(); } public static void xunHuanDemo() { int i=0; for(i=0;i<5;i++) { if(i==3) { continue; } } while(i<5) { i++; if(3==i) { System.out.println("此时i的值 : "+i); //continue; break; //return; } System.out.println("第"+i+"个数是: "+i); } } }
我们把while循环体里边的if(3==i)里的三个语句挨个注释执行,我们就会发现这三个语句的特点。
2.java中数组的问题
数组的定义
public static void main(String[] args) { Test1 //.xunHuanDemo(); .array1(); //.array2(); //.suanfa1(); } public static void array1() { int arr1[]=new int[10]; arr1[4]=1; int a,c=0; a=arr1[4]; System.out.println("a的值"+a+"arr1[4]的值是"+arr1[4]); int arr2[]={1,2,3,4,5,6,7,8,9,10}; for(int b:arr2) { c++; System.out.println("arr2["+c+"]的值为 : "+b); } for(c=0;c<arr1.lengch;c++) { System.out.println("arr1["+c+"]的值为 : "+arr1[c]); } }
在这个代码中:我们用了两种方式定义数组
第一种:数据类型 数组名称[]=new 数据类型[n] ;代码中我们就定义了一个长度为10的int类型的数组arr1,初始值全部为0(默认)。然后我们给arr[4]赋值1,并可以把arr[4]的值赋值给a,我们用for-each语句循环打印数组arr,发现除了我们赋值为1的arr[4]外其余都为0,也就证明了我们的java数组全部默认为0的事实。
第二种:数据类型 数组名称[]={初始值1,初始值2}。代码中我们顶一个了个数组arr2,直接赋给初始值1-10,java会自己计算出数组的长度。我们用arr2.length的语法获取他的长度。我们用for循环语句打印发现我们的长度是正确的。
for-each循环语句。对顺序数组的遍历非常好用。比for循环语句性能更高。数组遍历从头开始。
在java中也有二维 三维 多维数组的概念:
public static void array2() { int arr3[][]=new int[3][4]; System.out.println(arr3.lengch); int a1[]={1,2,3,4}; int a2[]={5,6,7,8}; int a3[]={9,10,11,12}; int arr4[][]={a1,a2,a3}; for(int i=0;i<arr4.lengch;i++) { for(int j=0;j<arr4[i].lengch;j++) { System.out.print("arr4["+i+"]["+j+"]的值为"+arr4[i][j]+" \t"); } System.out.println(); } for(int i=0;i<3;i++) { for(int j=0;j<4;j++) { System.out.print("arr3["+i+"]["+j+"]的值为"+arr3[i][j]+"\t"); } System.out.println(); } }
我们这个方法中就实现了两种二维数组的定义:
第一种:数据类型 数组名称[][]=new 数据类型[][];在代码中我们定义了一个三行四列的int类型的数组arr3。同样我们用for循环打印发现初始值为0.。相信大家对arr3.length的值有疑问。为啥3*4=12个值,他的长度只有三。因为length计算的都是第一个表示数组的长度。比如arr3[3][4]中arr3[3]就可以表示数组,所以就是他的长度3.而我们二层for循环中arr3[i].length的意思就是arr3[i]这已经表示一个数啦,意思是第几行。再点length就是这一行的长度4.
第二种:就是为了让我们理解点length的长度问题。arr4中初始化了三个长度为4的数组a1,a2,a3。
我们来做几道关于数组的题目:
第一题:比赛计分问题
某比赛,有N位评委为选手打分,分数在1到100之间.选手最后得分为去掉一个最高分,去掉一个最低分之后的平均分.请应用程序实现。
public static void dafen(double fen[]) { double max=fen[0]; double min=fen[0]; double sum=0; for(double a:fen) { if(max<a) { max=a; } if(min>a) { min=a; } sum+=a; } double avg=(sum-max-min)/(fen.lengch-2); System.out.println("平均分是 :"+avg); }
问题分析,N个分数。去除最大最小。剩下加起来,求平均值。这就要求我们全部分数得遍历一遍,正好在遍历的时候求出最大和最小值,然后把所有值加起来。然后总分数去除最大最小,除以剩下的打分人数就可以得到平均值啦。这里我们把方法写成带参数,这样我们就可以随便往里边传N个参数。不需要去方法里改变代码。体现了封装的稳定性。
第二个问题: 农夫与白菜
农夫沿着自家院子种植了一圈大白菜,到了秋天,农夫收获白菜的时候,他计划这样收割:从第一颗开始,数到三就砍掉当前的这颗白菜.请您打印出被砍掉白菜的序号;
public static void baicai() { //白菜的围成一圈的顺序编号 int baic[]={1,2,3,4,5,6,7,8,9,10,11,12}; //定义一个计数器记录砍掉的白菜数。 int sum=0; //定义计数每喊三声砍一颗; int j=0; //砍掉的白菜数小于总的白菜数就一直循环砍 while(sum<baic.lengch) { for(int i=0;i<baic.lengch;i++) { //查看标记,该白菜是否被砍。 if(baic[i]!=0) { j++; if(j==3) { //把砍掉的白菜打印输出 System.out.print(baic[i]+","); //给砍掉的坐上标记,不再循环这个白菜 baic[i]=0; //从新喊数 j=0; //砍得数量加一 sum++; } } } } }
问题分析,白菜围满一圈院子,没喊三声砍一颗白菜,砍完便少一颗,把每一次砍得打印出来。并且再砍之前看一下标识是否已经被砍。
该代码注释十分清晰。但数组是写死的,大家可以改成传参方法更好。
问题三:约瑟夫问题
这是17世纪的法国数学家加斯帕在《数目的游戏问题》中讲的一个故事: 15个教徒和15 个非教徒在深海上遇险,必须将一半的人投入海中,其余的人才能幸免于难,于是想了一个办法:30个人围成一圆圈,从第一个人开始依次报数,每数到第九个人就将他扔入大海,如此循环进行直到仅余15个人为止。问怎样排法,才能使每次投入大海的都是非教徒。
public static void suanfa1() { int arr1[]=new int[30]; arr1[0]=1; int count=0; for(int i=0,j=1;i<30;i++,j++) { if(arr1[i] == 1) { j--; continue; } if(9==j) { arr1[i]=1; j=0; count++; if(15==count) { break; } } if(29==i) { i=-1; } } int count1=0; String msg=""; for(int a:arr1) { count1++; msg=(a==0)?"信徒":"非信徒"; System.out.println("第"+count1+"个人是 : "+msg); } }
这个和那个砍白菜差不多,但是这个排列就存在一点问题,那就是第一个站的是信徒还是非信徒两种情况。我们同样根据每9人下海一个人。一轮回设置一个计数器来存取当前数到第几个。定义一个下海总数,到15就退出循环。某人下海后就标记下海,再次循环到该人不做9人计数。