ä¸ã 循环 loop
(三)for 循环(接上篇)
语法:for(循环条件初始化 1 ; 循环条件 2 ; 迭代 3 ){
//循环体 4
}
解释:for 的小括号中由2个分号切分成了3部分。
执行过程:
1:循环条件初始化执行且仅执行一次。
2:判断循环条件是否成立,如果成立,那么执行循环体。然后执行迭代部分,然后再判断循环条件。
3:一旦循环条件不成立,那么立即结束循环。
==》 1,2,4,3,2,4,3,2,4,3,2(不成立)结束。
注意事项:
1:循环条件初始化执行且仅执行一次。
2:小括号中的两个分号是必不可少的。其他的三部分从语法层面上来讲,都可以没有。
3:如果循环条件这部分没有,那就代表循环条件永远成立。
4:如果初始化部分需要初始化多个变量,那么可以使用逗号分割,包括迭代部分亦然。
5:在 for 循环的小括号中定义的变量,只能在for 循环中使用。
例:
//水仙花数:在 100-999 之间有几个这样的数 : 该三位数的每一位的 三次幂 之和 等于该数自身 求这几个数是什么??
public class TestLoop2{
public static void main(String[] args){
int unit = 0;
int decade = 0;
int hundred = 0;
for(int i = 999; i >= 100 ;i--){
unit = i%10;
decade = i/10%10;
hundred = i/100;
if(unit * unit * unit + decade * decade * decade + hundred * hundred * hundred == i){
System.out.println(i);
}
}
}
}
(四)循环语句的选择:
在for循环中,循环控制变量的初始化和修改都放在语句头部分,形式较简洁,且特别适用于循环次数已知的情况。
在while循环中,循环控制变量的初始化一般放在while语句之前,循环控制变量的修改一般放在循环体中,形式上不如for语句简洁,但它比较适用于循环次数不易预知的情况(用某一条件控制循环)。
ï¼äºï¼ break 和 continue
break :意思是打断。在循环结构中,如果想跳出循环体,结束整个循环结构可以使用break语句。
continue语句用在循环语句体中,用于终止某次循环过程,即跳过循环体中尚未执行的语句,接着进行下一次是否执行循环的判定。即只结束本次循环,而不是终止整个循环的执行。
äºã 嵌套循环
嵌套循环的概念:循环体中包含了其他的循环。
特点:外层循环迭代一次,内层循环执行一遍。
例1:
//打印,矩形,平行四边形,等腰三角形
public class TestDoubleLoop{
public static void main(String[] args){
// for(int i=0;i<5;i++){
// for(int j=0;j<5;j++){
// System.out.println("i = "+i + "\tj = "+j);
// }
// }
//打印,矩形,平行四边形,等腰三角形
// ************ i== 0
// ************ i== 1
// ************ i== 2
// ************ i == 3
// 打印的空格的数量 高度 height-i-1
int width = 16;
int height = 10;
//外层循环控制打印多少行,以及每一行的末尾的换行符
for(int i = 0; i < height;i++){
//内层循环控制打印一行的星号
for(int j = 0;j<width;j++){
System.out.print(" *");
}
System.out.print("\n");
}
System.out.print("\n");
//平行四边形
for(int i = 0; i < height;i++){
//用来控制每一行的空格的数量
for(int j = 0;j < height-i-1; j++){
System.out.print(" ");
}
//内层循环控制打印一行的星号
for(int j = 0;j<width;j++){
System.out.print(" *");
}
System.out.print("\n");
}
System.out.print("\n");
//等腰三角形
// * i== 0 1 2*i+1
// *** i== 1 3
// ***** i== 2 5
// ******* i == 3
for(int i = 0; i < height;i++){
//用来控制每一行的空格的数量
for(int j = 0;j < height-i-1; j++){
System.out.print(" ");
}
//内层循环控制打印一行的星号
for(int j = 0;j<(i<<1)+1;j++){
System.out.print("*");
}
System.out.print("\n");
}
}
}
例2:
//求2--100以内的所有的素数:
//素数:只能被1 和 自身整除的数。又称为质数。 合数
public class TestPrime{
public static void main(String[] args){
//遍历2--100之间的所有的数type1
for(int i = 2;i <= 100; i++){
//对每一个i 进行逐个的判断,是否满足 素数的条件,满足 打印即可。
// 对当前的 i 进行取余运算,对[2~ i-1]区间的所有的数进行逐个取余,如果都有余数 那么i 就是素数
int counter1 = 0;//记录内层循环循环了多少次
int counter2 = 0;//记录条件满足了多少次
for(int j = 2; j<= i-1 ;j++){
//内层循环中,遍历一遍,所有的j 必须都满足下面的条件 i 才是素数
if(i % j != 0){
counter2 ++;
}
counter1 ++;
}
//判断 counter1 是否 等于counter2
if(counter1 == counter2){
System.out.println(i);
}
}
//遍历2--100之间的所有的数type2
for(int i = 2;i <= 100; i++){
//对每一个i 进行逐个的判断,是否满足 素数的条件,满足 打印即可。
// 对当前的 i 进行取余运算,对[2~ i-1]区间的所有的数进行逐个取余,如果都有余数 那么i 就是素数
boolean flag = false;
for(int j = 2; j<= i-1 ;j++){
if(i % j == 0){
flag = true;
break;
}
}
//如果flag 还是false 说明i 是素数 没有一个j 被i 除尽
if(false == flag){//容易理解的方案
//if(!flag){//最优的方案。
System.out.println(i);
}
}
}
}
例3:百钱买白鸡
//今有鸡翁一,值钱伍;鸡母一,值钱三;鸡鶵三,值钱一。凡百钱买鸡百只,问鸡翁、母、鶵各几何?
public class TestDoubleLoop3{
public static void main(String[] args){
for(int i = 0;i<=20;i++){//公鸡
for(int j = 0;j<= 33;j++){//母鸡
for(int k = 0;k<=300;k++){//小鸡
if( i+j+k == 100 && i*5 + j * 3 + k/3 == 100 && k%3 == 0){
System.out.println("公鸡数量:"+i+ "\t母鸡数量:"+j+"\t小鸡数量:"+k);
}
}
}
}
for(int i = 0;i<=20;i++){//公鸡
for(int j = 0;j<= 33;j++){//母鸡
int k = 100 -i - j;//小鸡
if(i*5 + j * 3 + k/3 == 100 && k%3 == 0){
System.out.println("公鸡数量:"+i+ "\t母鸡数量:"+j+"\t小鸡数量:"+k);
}
}
}
}
}
例4:
//九九乘法表
public class TestNine{
public static void main(String[] args){
//外层循环控制行数
for(int i = 1;i<=9;i++){
//内层循环控制一行的显式内容
for(int j = 1;j<=i; j++){
int num = j*i;
System.out.print(j+"*"+i+"="+num+"; ");
}
System.out.println();
}
}
}
三、标号:了解
解释:break 和 continue 后都可以跟标号。
可以通过break 后面跟标号,实现跳出标号对应的那一层循环。
可以通过continue 后面跟标号,实现 跳到对应层的循环的迭代处(for),while do-while 循环条件判断处。
例://标号
public class TestLabel{
public static void main(String[] args){
//外层循环控制行数
//定义标号
label1 : for(int i = 1;i<=9;i++){
//内层循环控制一行的显式内容
for(int j = 1;j<=i; j++){
int num = j*i;
System.out.print(j+"*"+i+"="+num+"; ");
if(j == 7)break label1;
}
System.out.println();
}
}
}
四、方法
方法的定义:
必要性:1:通过方法可以实现重复代码的简化,和代码的复用。
2:将某些功能代码封装到一个方法的内部,实现了功能的模块化,方便后期的维护和修改。
语法:[方法的修饰符 public static] 方法的返回类型 方法名(参数列表){
//方法体
}
1:[方法的修饰符 public static]:可选的部分,不是必须的。还有其他修饰符。
2:方法的返回类型:
可以是 void(空)或者java 支持的任意类型(十一种)
代表着方法 执行完毕之后 是否会产生一个结果。
如果一种方法只是实现了一段功能,不需要得到一个结果。那么该方法的返回类型 必须是void。
如果一种方法,执行完毕之后希望得到一个结果数据。这个时候方法的返回类型就不能是void了。必须数据类型要与结果的数据类型兼容。
3:方法名:通过名字来访问该方法的功能。还要通过名字来显示该方法实现了什么样的功能。
方法名也是一类标识符。命名规范和局部变量一致,首字符小写,遵循驼峰命名法。
4:参数列表:又称为形参列表。
表达的意思:在使用方法的时候,需要传递给方法的一些动态的数据,表达了方法在使用的时候的一种需求。
public static void printStarRect(int width) :在使用该方法的时候,需要给方法传递一个 int 类型的值。
参数列表的格式:
1:参数列表可以为空。()
2: 需要传递的数据可以是任意个,类型也是任意类型。(数据类型 变量名1, 数据类型 变量名2, 数据类型 变量名3......)
5:方法体:功能实现的主体部分。
return:如果方法的返回类型是 void。那么可以在方法中使用“return;”
作用:直接结束方法。方法直接返回。
如果方法的返回类型 不是void ,那就是java支持的某种类型。那么该方法必须 使用 return 后面跟着一个想要得到的结果。
public static int max(int a,int b){
int max = a > b ? a : b;
return max;
}
6:把方法的名字 + 参数列表的组合 称之为方法的签名 signature。
在一个类的内部方法的签名必须唯一。
注意问题:
1:方法不能被定义到任意的其他的方法的内部去。
2:所有的方法都必须在某一个类的内部。必须被最外层的大括号包围。
3:如果想使用方法提供的功能。方法的调用。那么该方法必须直接的或者间接的被 main 调用。
4:方法的调用的格式语法:方法名+参数列表(实参列表)。
例:
//打印不同边长的星号正方形。
public class TestMethod1{
public static void main(String[] args){
int width = 7;
//打印边长是7
printStarRect(7);
width = 10;
//打印边长是10
printStarRect(width);
width = 21;
//打印边长是10
printStarRect(width);
int max = max(1,2);
System.out.println(max);
System.out.println(max(1,2,3));
//不允许
//System.out.println(printStarRect(1));
test();
System.out.println(randomNumberByRange(10,12));
}
//自定义方法,实现打印指定宽度的星号正方形
//方法名是一类标识符,和局部变量的命名规范一致,
//将重复的代码抽取出来,形成一个独立的功能模块 方法 method 将抽取的代码的变化的量作为方法的参数列表。
public static void printStarRect(int width){
if(width > 20){
return;
}
for(int i = 0;i < width ;i++){
for(int j=0;j<width; j++){
System.out.print(" *");
}
System.out.println();
}
System.out.println();
}
//自定义方法。功能是得到某一个int区间的随机值。
//涉及到范围,都是前闭后开 包含小的,不包含大的。
public static int randomNumberByRange(int min, int max){
return (int)(Math.random()*(max-min)+min);
}
//定义方法。对于任意的两个int 类型的值,求两个值 中的比较大的值。
//
public static int max(int a,int b){
if(a > b)
return a;
return b;
}
public static int max(int a,int b,int c){
int max = a > b ? a : b;
max = max > c ? max : c;
return max;
}
//对任意的int 类型的值,求该值的绝对值
public static int abs(int a){
return a > 0 ? a : -a;
}
//求指定概率【0.0-1.0】的事件 是否发生
public static boolean isHappened(double percent){
return Math.random() < percent;
}
public static void test(){
int counter = 0;
for(int i=0;i<1000;i++){
boolean bool = isHappened(0.3);
if(bool)counter ++;
}
System.out.println(counter);
}
}