第六章 控制语句
1、怎么接受用户键盘输入?
java.util.Scanner s = new java.util.Scanner(System.in);
// 接收整数
int i = s.nextInt();
// 接收字符串
String str = s.next();
2、控制语句
2.1、控制语句的出现可以让我们的程序具有逻辑性/条理性,可以使用控制语句来实现一个“业务”了
2.2、控制语句包括几类?
3类:
选择语句:if、switch
循环语句:for、while、do…while…
转向语句:break、continue、return
2.3、选择语句也可以叫做分支语句
if语句
switch语句
2.4、循环语句:主要循环反复的去执行某段特定的代码块
for循环
while循环
do... while....循环
2.5、转向语句
break
conitune
return(这个目前先不需要学习,后面讲方法的时候会使用)
3、选择语句/分支语句if
if语句的语法结构和运行原理?
if语句是分支语句,也可以叫做条件语句。
if语句的语法格式:
①第一种写法:
if(布尔表达式){
java语句;
java语句;
}
这里的一个大括号{}叫做一个分支。
if这个单词翻译为如果,所以又叫做条件语句。
该语法的执行原理是:
如果布尔表达式的结果是true,则执行大括号中的程序,否则大括号中代码不执行。
②第二种写法:
if(布尔表达式){ // 分支1
java语句;
}else{ //分支2
java语句;
}
执行原理:如果布尔表达式的结果是true,则执行分支1,分支2不执行。如果布尔表达式的结果是false,分支1不执行,执行分支2
以上的这个语句可以保证一定会有一个分支执行。
③第三种写法
if(布尔表达式1){ //分支1
java语句1;
}else if(布尔表达式2){ //分支2
java语句2;
}else if(布尔表达式3){
java语句3;
}else if(布尔表达式4){
java语句4;
}.....
以上if语句的执行原理?
先判断“布尔表达式1”,如果“布尔表达式1”为true,则执行分支1,然后if语句结束了。
当“布尔表达式1”的结果为false,那么会继续判断布尔表达式2的结果,如果布尔表达式2的结果为true,则执行分支2,然后整个if就结束了。以此类推.......
从上往下依次判断,主要看第一个true发生在哪个分支上。第一个true对应的分支执行,只要一个分支执行,整个if结束
④第四种写法
if(布尔表达式1){ //分支1
java语句1;
}else if(布尔表达式2){ //分支2
java语句2;
}else if(布尔表达式3){
java语句3;
}else if(布尔表达式4){
java语句4;
}else{
java语句; //以上条件没一个成立的,这个else就执行了
}
这个和第三种的区别是,如果else if的所有结果全为false,则执行else后面的语句
嵌套
if(){
if(){
}else{
}
}else{
}
原理:套娃
注意:
1、对于if语句来说,在任何情况下只能有一个分支执行,不可能存在2个或者更多个分支执行。if语句中只要有一个分支执行了,整个if语句就结束了。(对于一个完整的if语句来说的。)
2、以上四种语法机制中,凡是带有else分支的(不是else if),一定可以保证会有一个分支执行。以上4种当中,第一种和第三种没有else分支,这样的语句可能会导致最后一个分支都不执行。第二种和第四种肯定会有一个分支执行
3、当分支当中“java语句;”只有一条,那么大括号{}可以省略,但为了可读性,还是加上好。(有的程序员故意省略,你要看懂)
4、控制语句和控制语句之间是可以嵌套的,但是嵌套的时候大家最好一个语句一个语句分析,不要冗杂在一起分析(就是要一个一个看,别手忙脚乱的。)窍门:分析外面if时,里面的for循环当做普通java代码来看。
————————业务————————
当sex为true时表示男,为false时表示女
①正常打
if (sex){
System.out.println("男");
}else {
System.out.println("女");
}
②进一步改良(三目运算符)
sex = true;
System.out.println(sex ? "男" : "女");
代码可以这样写吗
if (sex = true){
System.out.println("男");
else {
System.out.println("女");
}
}
可以,小括号当中最终取的是sex变量的值(等号右面先赋值给左面),而sex是布尔类型,所以这个可以通过。
但有一个问题:即使在程序前面给sex赋值成false也没用,因为到括号里sex又被重新赋值成true了,永远都会执行第一个语句。(else后面的语句没用了属于是)
——————————业务——————————
要求:
1、从键盘上上接受一个人的年龄。
java.util.Scannner s = new java.util.Scanner(System.in)
int num = s.nextInt()
2、年龄要求为【0-150】,其他值表示非法,需要提示非法信息。
3、根据人的年龄来动态的判断这个人属于生命的哪个阶段?
【0-5】婴幼儿
【6-10】少儿
【11-18】少年
【19-35】青年
【36-55】中年
【56-150】老年
4、请使用if语句完成以上的业务逻辑。
————————业务2———————————
1、系统接收一个学生的考试成绩,根据考试成绩输出成绩的等级
2、等级:
优:【90-100】
良:【80-89】
中:【70-79】
及格:【60-69】
不及格:【0-60】
3、要求是成绩是一个合法的数字,成绩必须在【0-100】之间,成绩可能带有小数。
————————业务3————————
从键盘上接收天气的信息:
1表示雨天 0表示晴天
同时从键盘上接受性别信息
1表示男 0表示女
业务要求:
①当天气是雨天的时候:
男的打一把大黑伞
女的打一把小花伞
②当天气是晴天的时候
男的出去玩耍
女的擦点防晒霜出去玩耍
需要使用if语句以及嵌套的方式展现这个业务
可以在程序的开始,接收两个数据,一个数据是天气,一个数据是性别。然后将这两个数据保存到变量中。
————————————————————————————————————————————————————
switch语句:
1、switch语句也是选择语句,也可以叫做分支语句
2、switch语句的语法格式
switch(值){
case值1: // switch要和case对齐 这是规矩。
java语句;
java语句;....
break;
case值2:
java语句;
java语句;....
break;
case值3:
java语句;
java语句;....
break;
default:
java语句;
}
以上是一个完整的switch语句
其中,break语句不是必须的。default分支也不是必须的。
switch语句支持的值有哪些?
支持int类型以及String类型。
但一定要注意JDK的版本,JDK8之前不支持String类型,只支持int。JDK8之后,switch语句开始支持字符串String类型。
switch语句本质上是只支持int和String,但是byte,short,char也可以使用在switch语句当中,因为byte
short char可以进行自动类型转换。
switch语句中“值”与“值1”、“值2”比较的时候会使用“==”进行比较
3、switch语句的执行原理
拿“值”与“值1”进行比较,如果相同,则执行该分支当中的java语句,然后遇到“break”语句,switch语句就结束了。
如果“值”与“值1”不相等,会继续拿“值”与“值2”进行比较,如果相同,则执行该分支当中的java语句,然后遇到break语句,switch结束
注意:如果分支执行了,但是分支最后没有“break”,此时会发生case穿透现象。(也就是在没有break的情况下,匹配之后不会立即结束,而是接这往下执行,直到程序末端或者遇到break)
—————————业务———————————
写一个完整的switch语句:接收键盘输入,根据输入的数字判断星期几 0:星期日 1:星期一.......
关于default语句,当所有的case都没有匹配上的时候,执行default语句。
关于case合并的问题:
switch(num){
case 1: case 2: case 3:
System.out.println("星期一");
break;
case 4:
System.out.println("星期二");
break;
}
// 输入 1,2 或者3 都会显示“星期一”
day09课堂笔记
1、控制语句
for循环
while循环
do..while ...循环
什么是循环语句,为什么要使用循环语句?
因为在现实世界中,有很多事情需要重复或者反复的去做。对应到程序当中,如果有一行代码需要重复执行,此时为了减少代码量,我们使用循环语句。
循环语句的出现就是解决代码的复用问题。
1、for循环的语法机制以及运行原理?
语法机制:
for(初始化表达式;条件表达式;更新表达式){
循环体:// 循环体由java语句构成
java语句;
java语句;
java语句;
java语句;
java语句;
......
}
注意:
第一:初始化表达式最先执行,并且在整个循环中只执行一次。
第二:条件表达式结果必须是一个布尔类型,也就是:true或者false
执行原理:
先执行初始化表达式,并且初始化表达式只执行一次。
然后判断条件表达式的结果,如果条件表达式结果为true,则执行循环体。
循环体结束之后,执行更新表达式。
更新完之后,再判断表达式的结果,如果还是true,继续执行循环体
直到更新表达式执行结束之后,在此判断条件时,条件为false,for循环终止
更新表达式的作用是:控制循环的次数,换句话说,更新表达式会更新某个变量的值,这样条件表达式的结果才有可能从true变成false,从而终止for循环的执行,如果确实更新表达式,很有可能会导致死循环。
for(int i = 0; i < 10; i++){
System.out.println("i = " + i);
}
// 0 1 2 3.. 9
强调下,对于以上的这个for循环,其中int i = 0;
最先执行,并且只执行一次,而且i变量属于for循环的局部变量,for循环结束之后i的内存就释放了。这个i变量只能在for循环当中使用,属于for循环域,在main方法中没办法直接使用
for(int i = 0; i < 10; ){
System.out.println("i = " + i);
i++;
}
这样也可以,因为顺序是相同的,都是在输出完之后再进行自加
for(int i = 0; i < 10; ){
i++;
System.out.println("i = " + i);
}
这样,输出的东西会改变 从2到11。
for的其他形式
for(int i = 0; i < 20; i += 2){
System.out.println("value1 =" + i);
}
// 10 9 8 7 6 5 4 3 2 1
for (int i = 0 ; i < 10; i += 2){
System.out.println("value2 = " + i);
}
// 0 2 4 6 8
for (int i = 100; i > 0; i %= 3){
System.out.println("value2 = " + i );
}
// 100 1 1.... 1(死循环)
题目:
使用for循环,实现1-100所有奇数求和
至少给出两种解决方案。
第一种方案:
思路:先找出1-100所有奇数,然后再考虑求和的事。
第一步:先从1取到100,一个数字一个数字取出来。
第二步:既然可以得到每一个数字,那么我们进一步判断这个数字是否为奇数(方法是:奇数除以2余1)
int sum = 0;
for(int i = 1; i <= 100; i++){
if (i % 2 == 1){
sum += i;
}
}
System.out.println("1~100所有奇数求和结果是:" + sum);
// for循环中嵌套了if语句
// 声明sum的位置要注意,不能在循环体当中声明,这样会导致“计算器归0”
第二种方案:
sum = 0;
for(int i = 1; i < 100; i += 2){
sum += i;
}
System.out.println(sum);
优点:循环次数少,效率高
循环嵌套
1所有的合法的“控制语句”都可以嵌套使用。
2、for循环嵌套一个for循环执行原理是什么?(提示一下,不要因为for循环中嵌套了一个for循环,就感觉这个程序比较特殊,实际上可以这样看待:在分析外层for循环的时候,把里面的for当做一段普通的java语句/代码)
①单层for循环
for(int k = 0; k < 2; k ++){
System.out.println("k = " + k);
}
②循环两次
for(int k = 0; k < 2; k ++){
System.out.println("k = " + k);
}
for(int i = 0; i < 2; i ++){
System.out.println(i);
}
③嵌套
for(int k = 0; k < 2; k ++){
for(int i = 0; i < 10; i ++){
System.out.println(i);
}
}
③和②是一样的
③外面的for控制里面的for
④把i变量的定义放在外面会怎么样?
int i = 0;
for(int k = 0; k < 2 ; k ++){
for(; i < 10; i ++){
System.out.println(i);
}
}
⑤这种情况又会怎么样?
int i = 0;
for(int k = 0; k < 2; k++){
for(; i < 10; i ++){
System.out.println("k=" + k);
System.out.println("i=" + i);
}
}
// 这个跟上面不一样,只会输出一次0-9
为什么呢?
一、int i = 0在括号里的时候,循环体正常走完第一个循环,之后k为1,仍然小于2,循环体再来一次。
二、int i = 0在括号外的时候,循环体正常走完第一个循环,之后k仍为1,仍然小于2,但是此时由于没有重新给 i 归零,i仍为10,布尔表达式为false,所以i就不输出了,也就只有一次0-9
窍门: 在分析外层for循环的时候,把里面的for就当做一段普通的java语句/代码
————————业务——————————
写出九九乘法表
1 * 1=1
1 * 2=2 2 * 2=4
1 * 3=3 2 * 3=6
....... ......
先找下九九乘法表的特点
①:共九行
②:第一行一个,第二行两个,第三行三个。
public class Nine {
public static void main(String[] args){
for(int i = 1; i <= 9; i ++){
for(int j = 1; j <= i; j ++){
System.out.print(i * j);// 注意:这里不换行,所以不用ln
}
System.out.println();
}
}
}
// i是行号,即纵向循环
最重要的是:不要慌,把思路捋出来再写代码。最怕的是没找到特点/思路
while循环
1.while循环的语法机制以及执行原理
语法机制:
while(布尔表达式){
循环体;
}
执行原理:
判断布尔表达式的结果,如果为true就执行循环体,循环体结束之后,再次判断布尔表达式的结果,如果还是true,继续执行循环体,知道布尔表达式结果为false,while循环结束。
2、while循环有没有可能循环次数是0次?
可能。while循环的次数是:0~无穷次
//for while do..while.... 这些都是循环语句,可以相互嵌套。
for和while完全可以互换,只不过就是语法格式不一样。
for(in ti = 0; i < 10;){
i ++;
System.out.println(i);
}
int i = 0;
while(i < 10){
i ++;
System.out.println(i);
}
以上各两个程序输出的内容完全相同,只不过就是语法格式不一样。
目前要掌握的:
①:必须要将语法结构背会
②:必须要彻底的理解他们的执行原理
去实现案例,去实现功能。
先从简单的案例开始,慢慢的经过一个过程你才能解决复杂的问题。
do...while...循环语句
do...while....循环语句的执行原理以及语法机制
语法机制:
do{
循环体;
}while(布尔表达式);
// 注意:分号一定要加!!!!,别漏了!!!!
执行原理:
先执行循环体中的代码,执行一次循环体之后,判断布尔表达式的结果,如果为true,则继续执行循环体,如果为false循环结束。(先斩后奏)
对于do..while循环来说,循环体至少执行1次。循环体的执行次数是:1~无穷次
而对于while循环来说,循环体执行次数是:0~n次。
转向语句
关于转向语句:
break
conitune
return(后面会讲)
break语句
1、break语句比较特殊,特殊在:break语句是一个单词成为一个完整的java语句。另外:continue也是这样,他俩都是一个单词成为一条语句。
2、break翻译为“折断”、“弄断”
3、break语句用在哪里呢
用在两个地方,其他位置不行
第一个位置:switch语句当中,用来终止switch语句的执行。用在switch语句当中,防止case穿透现象,用来终止switch
第二个位置:循环语句当中,用来终止循环语句的执行
用在for当中
用在while当中
用在do...while...当中
4、以下的程序让大家更好的了解break语句
5、break;语句的执行并不会让整个方法结束,break;语句主要是用来终止离它最近的那个循环语句。
for(int i = 0; i < 10; i ++){
System.out.println("i = " + i);
}
// 以上只是一个普通的循环语句
for(int i = 0; i < 10; i ++){
if(i == 5){
// break语句会让离它最近的循环停止播放
break; // break; 终止的不是if(也不是针对if的),而是离它最近的循环
}
System.out.println("i =" + i); // 0 1 2 3 4
}
System.out.println("Hello World")
// 这里的代码照常执行,break;的循环并不会影响这里
continue; 语句:
1、continue翻译为:继续
2、continue语句和break语句要对比着学习
3、continue语句的作用是:
终止当前“本次”循环,直接进入下一次循环继续执行。
for(){
if(){ // 当这个条件成立时,执行continue语句
continue; // 当这个continue语句执行时,continue下面的代码不执行,直接跳过
}
// 以上的continue一旦执行,一下代码不执行,直接执行更新表达式。
code1;
code2;
code3;
code4;
}
4、continue语句后面可以指定循环吗?
可以的。
这里就不再讲了,自己测试下



