1 do...while循环
格式
初始化语句; do { 循环体语句; 控制条件语句; }while(判断条件语句); 流程: 先执行初始化语句 再执行循环体语句 再执行条件控制语句 再做条件的判断: true, 继续执行循环体和条件控制 false 循环结束 特点: 循环体语句至少执行一次
案例
1. 使用do...while 求1-100内的奇数和以及偶数和
package com._51doit.javase.day04.loop; public class DoWhile { public static void main(String[] args) { int i=1; int sum1 = 0; int sum2 = 0; do { //System.out.println("我是你爹"); if(i%2==0) { sum1 += i; }else { sum2 += i; } i++; }while (i<=100); System.out.println("偶数个数为:"+sum1); System.out.println("奇数个数为:"+sum2); } }
1.1 循环综合案例
贪吃蛇:
需求: 在键盘上输入一个数,如果是1,代表蛇吃食物,得分加10,并继续输入,如果输入的是一个非1的数字,停止程序,输出得分
package com._51doit.javase.day04.loop; import java.util.Scanner; public class Snake { public static void main(String[] args) { System.out.println("欢迎来到贪吃蛇"); System.out.println("请输入一个数字:"); int score = 0; Scanner sc = new Scanner(System.in); int num = sc.nextInt(); while(num == 1) { score += 10; num = sc.nextInt(); //对num重新赋值 } System.out.println("您的得分是:"+score); } }
1.2 循环登录练习
需求:1 控制台提示用户输入密码;2用户输入密码;3如果用户输入的密码不等于1234,回到步骤1;4如果用户输入的密码等于1234,提示登录成功
分析:
需要用到Scanner
循环: 执行多少次: 不确定: while
循环的条件: 用户输入的密码不等于1234
循环体: 提示用户输入密码,用户输入密码
package com._51doit.javase.day04.loop; import java.util.Scanner; public class LoginDemo { public static void main(String[] args) { System.out.println("请输入您的密码"); Scanner sc = new Scanner(System.in); int password = sc.nextInt(); while(password != 1234) { System.out.println("密码不正确,请重新输入密码"); password = sc.nextInt(); } System.out.println("登录成功"); } }
将此案例用do...while形式来做
1 package com._51doit.javase.day04.loop; 2 3 import java.util.Scanner; 4 5 public class LoginDemo { 6 public static void main(String[] args) { 7 Scanner sc = new Scanner(System.in); 8 do { 9 System.out.println("请输入您的密码:"); 10 int password = sc.nextInt(); 11 }while(password != 1234); 12 } 13 }
注意,上面代码第十一行会出问题,第10行中的password作用域为do{}中,所以第11行的while就相当于没定义,无法使用,解决方法是将变量进行声明,代码如下
1 package com._51doit.javase.day04.loop; 2 3 import java.util.Scanner; 4 5 public class LoginDemo { 6 public static void main(String[] args) { 7 Scanner sc = new Scanner(System.in); 8 int password; //变量的声明,局部变量不赋初值不能使用 9 do { 10 System.out.println("请输入您的密码:"); 11 password = sc.nextInt(); 12 }while(password != 1234); 13 System.out.println("登录成功"); 14 } 15 }
1.3 上诉代码将密码改写成字符串
字符串在比较内容的时候是不能使用 “==”,“!=”的
字符串在比较内容的时候,用的是equals
用法: 字符串a.equals(字符串b);如果内容相同则返回true,否则返回false,当在前面加个"!"表示不相等
1 package com._51doit.javase.day04.loop; 2 3 import java.util.Scanner; 4 5 public class LoginDemo { 6 public static void main(String[] args) { 7 Scanner sc = new Scanner(System.in); 8 String password; 9 do { 10 System.out.println("请输入您的密码:"); 11 password = sc.nextLine(); 12 }while(!"1234".equals(password)); //这里将“1234”放前面 13 System.out.println("登录成功"); 14 } 15 }
1.4 do you love me
需求:
问老婆一个问题: 你爱我么?如果回答的不是爱,继续问, 如果回答的是爱, 循环结束
package com._51doit.javase.day04.loop; import java.util.Scanner; public class DoYouLoveMe { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String answer; do { System.out.println("老婆,你爱我吗"); answer = sc.nextLine(); }while(!"爱".equals(answer)); System.out.println("哈哈"); } }
1.5 循环嵌套
在循环中继续使用循环
案例:
1.请输出一个4行5列的星星(*)图案
/** * 循环的嵌套: * 循环中还有循环 两层嵌套 * 外层循环控制行 * 内层循环控制列 * 列不换行 * 内层循环结束后,再换行 */ package com._51doit.javase.day04.loop; public class CircleDemo { public static void main(String[] args) { for(int i=1; i<=4;i++) { for(int j=1;j<=5;j++) { System.out.print("*"); } System.out.println(); } } }
2.99乘法表的打印
package com._51doit.javase.day04.loop; public class MultiTable { public static void main(String[] args) { for(int i=1; i<=9; i++) { for(int j=1; j<=i; j++) { System.out.print(i+"X"+j+"="+i*j+" "); } System.out.println(); } } }
知识点:
tab:
换行:
回车:
1.6 跳转控制语句
break: 结束单层循环(其所在的那层循环结束),在循环语句和switch语句中使用
continue:结束本次循环,在循环语句中使用
return:结束整个方法,返回结果给其调用者
2. 方法:
2.1 方法的定义:
目的:解决代码重复编写问题:
格式:
修饰符 返回值类型 方法名(参数类型参数名1,参数类型参数名2…) {
函数体;
return 返回值;
}
方法格式的解释说明:
修饰符:比较多,后面会详细介绍。目前就用public static
返回值类型: 用于限制返回值的数据类型
方法名: 一个名称,为了方便我们调用参数
参数类型:限定调用方法时传入参数的数据类型
参数名:是一个变量,接收调用方法时传入的参数
函数体: 完成功能的代码
return:结束方法以及返回方法指定类型的值
返回值: 程序被return带回来的结果,返回给调用者。
2.2 方法的调用
方法名(符合参数类型和个数的具体值)
练习:
package com._51doit.javase.day04.loop; public class MethodTest { public static void main(String[] args) { printCha(12.5,34); printAreaAndZHOfCircle(12); printStar(8,10); } public static void printCha(double a,double b) { System.out.println(a-b); } public static void printAreaAndZHOfCircle(double r) { System.out.println("圆的周长为:"+2*3.14*r); System.out.println("圆的面积为:"+3.14*r*r); } public static void printStar(int x,int y) { for(int i=1;i<=x;i++) { for(int j=1;j<=y;j++) { System.out.print("*"); } System.out.println(); } } }
2.3 方法的返回值
无返回值的方法:
返回值类型:void
有返回值的方法:
返回值类型: 数据类型
必须return
return 后面的值要和返回值类型相一致
案例
package com._51doit.javase.day04.loop; public class MethodTest { public static void main(String[] args) { boolean re = isDouble(13); System.out.println(re); System.out.println(getCha(12.3,34));//只有有返回值的方法可以直接打印 System.out.println(getMax(12.4f,12,34)); } public static boolean isDouble(int a) { return a%2==0; } public static double getCha(double x,double y) { return x-y; } public static float getMax(float a,float b,float c) { if(a>b&a>c) { return a; }else if(b>c) { return b; }else { return c; } } }
2.4 方法的重载
概念:一个类中可以存在多个名字相同的方法,但是必须保证参数的个数或类型不同,其与返回值无关
TODO:在代码里充当书签,便于定位
案例
1 package com._51doit.javase.day04.loop; 2 3 public class ReloadMethod { 4 public static void main(String[] args) { 5 System.out.println(getSum(1,2)); 6 7 } 8 public static long getSum(long a, long b) { 9 System.out.println("long......"); 10 return a+b; 11 } 12 public static long getSum(int a, int b) { 13 System.out.println("int......"); 14 return a+b; 15 } 16 }
打印结果为
int。。。。。。
3
可见一个函数存在相同的方法时,其会根据参数的类型去匹配应该调用哪一个函数
变化1:若将12行代码中的两个int改为short,运行结果会是什么呢?
public static long getSum(short a, short b){
得到的结果 long......
3
这说明函数调用时,若发现参数类型不完全匹配时,就会找一个能接受给定参数的函数调用,如本例中给定的参数时int类型,但两个getSum()方法中参数都不为int,但long可以接受int类型参数,short不可以接收int类型参数,所以调用参数类型为long的getSum()方法。
变化2:
若将第8行和11行代码分别改写成如下形式,运行结果会怎样
1 public static long getSum(int a, long b) { //第8行 2 3 4 public static long getSum(long a, int b) { 第12行
这样会报错,main()方法将不知道要调用哪一个getSum方法,报错信息如下: