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人计数。
浙公网安备 33010602011771号