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人计数。 

 

posted @ 2017-08-08 19:08  窦光大大存大大凯  阅读(137)  评论(0编辑  收藏  举报