判断结构
选择结构
循环结构
2.6.1 判断结构
if语句
三种格式:
1.
if(条件表达式)
{
执行语句;
}
public class IfDemo { public static void main(String[] args) { /* if语句的第一种格式: if(条件表达式) { 执行语句; } */ int x = 1; if (x > 1) { if (x < 2) { System.out.println("yes"); } } System.out.println("over"); } }
2.
if(条件表达式)
{
执行语句;
}
else
{
执行语句;
}
public class IfDemo2 { public static void main(String[] args) { /* if语句的第二种格式: if(条件表达式) { 执行语句; } else//否则 { 执行语句; } */ int x = 1; if (x > 1) { System.out.println("yes"); } else { System.out.println("no"); } System.out.println("Hello World!"); int a = 3, b; /* if(a>1) b = 100; else b = 200; */ b = a > 1 ? 100 : 200;// 三元运算符就是if else 语句简写格式。 // 简写格式什么时候用? // 当ifelse运算后,有一个具体的结果时,可以简化写成三元运算符。 System.out.println("b=" + b); } }
3.
if(条件表达式)
{
执行语句;
}
else if (条件表达式)
{
执行语句;
}
......
else
{
执行语句;
}
public class IfDemo3 { public static void main(String[] args) { /* if语句第三种格式: if(条件表达式) { 执行语句; } else if (条件表达式) { 执行语句; } …… else { 执行语句; } */ int x = 3; if (x > 1) System.out.println("a"); else if (x > 2) System.out.println("b"); else if (x > 3) System.out.println("c"); else System.out.println("d"); int y = 3; if (y > 1) System.out.println("a1"); if (y > 2) System.out.println("b1"); if (y > 3) System.out.println("c1"); else System.out.println("d1"); if (x == 1) if (y == 1) System.out.println("a"); else System.out.println("b"); else if (y == 1) System.out.println("c"); else System.out.println("d"); } }
if语句特点:
a,每一种格式都是单条语句。
b,第二种格式与三元运算符的区别:三元运算符运算完要有值出现。好处是:可以写在其他表达式中。
c,条件表达式无论写成什么样子,只看最终的结构是否是true或者false;
public class IfTest { public static void main(String[] args) { /* 需求:根据用户指定的具体数据,判断该数据对应的星期。 1-星期一Monday 思路: 用户输入无法获取但是那只是具体数据的一种获取手段而已。 而我们要做的功能仅仅是对用户指定的数据进行对应星期的打印而已。 所以具体的数据不确定,完成可以使用变量来表示。 我们只对变量进行操作即可。至于变量的值,可以有用户决定。 因为数据的不确定性,所以要对数据进行判断。 使用if语句。 */ int week = 10; if (week == 1) System.out.println(week + "对应中文是星期一"); else if (week == 2) System.out.println(week + "对应中文是星期二"); else if (week == 3) System.out.println(week + "对应中文是星期三"); else if (week == 4) System.out.println(week + "对应中文是星期四"); else if (week == 5) System.out.println(week + "对应中文是星期五"); else if (week == 6) System.out.println(week + "对应中文是星期六"); else if (week == 7) System.out.println(week + "对应中文是星期日"); else System.out.println(week + "没有对应的星期"); } }
public class IfTest2 { public static void main(String[] args) { /* 一年有四季。 春季:3 4 5 夏季:6 7 8 秋季:9 10 11 冬季:12 1 2 根据用户输入的月份,给出对应的季节。 */ int month = 8; if (month < 1 || month > 12) System.out.println(month + "月没有对应的季节"); else if (month >= 3 && month <= 5) System.out.println(month + "月是春季"); else if (month >= 6 && month <= 8) System.out.println(month + "月是夏季"); else if (month >= 9 && month <= 11) System.out.println(month + "月是秋季"); else System.out.println(month + "月是冬季"); /* if (month == 3 || month == 4 || month == 5) System.out.println(month + "月是春季"); else if (month == 6 || month == 7 || month == 8) System.out.println(month + "月是夏季"); else if (month == 9 || month == 10 || month == 11) System.out.println(month + "月是秋季"); else if (month == 12 || month == 1 || month == 2) System.out.println(month + "月是冬季"); else System.out.println(month + "月没有对应的季节"); */ } }
2.6.2 选择结构
switch语句
格式:
switch(表达式)
{
case 取值1:
执行语句;
break;
case 取值2:
执行语句;
break;
......
default:
执行语句;
break;
}
public class SwitchDemo { public static void main(String[] args) { /* switch(表达式) { case 取值1: 执行语句; break; case 取值2: 执行语句; break; …… default: 执行语句; break; } */ int x = 2; switch (x) {// byte,short,int,char. default: System.out.println("d"); //break; case 4: System.out.println("a"); //break; case 1: System.out.println("b"); break; case 3: System.out.println("c"); break; //case是无序的,执行时会从第一个case开始。 //break用来结束swtich,只有最有一个switch可以省略不写 } int a = 4, b = 2; char opr = '%'; switch (opr) { case '+': System.out.println(a + b); break; case '-': System.out.println(a - b); break; case '*': System.out.println(a * b); break; case '/': System.out.println(a / b); break; default: System.out.println("无法运算,符号不支持"); break; } } }
switch语句特点:
a,switch语句选择的类型只有四种:byte,short,int ,char。
b,case之间与default没有顺序。先执行第一个case,没有匹配的case执行default。
c,结束switch语句的两种情况:遇到break,执行到switch语句结束。
d,如果匹配的case或者default没有对应的break,那么程序会继续向下执行,运行可以执行的语句,直到遇到break或者switch结尾结束。
public class SwitchTest { public static void main(String[] args) { /* 用户输入的数据对应的出星期。 */ int week = 1; switch (week) { default: break; case 1: System.out.println(week + "对应的是星期一"); break; case 2: System.out.println(week + "对应的是星期二"); // break; // ...以此类推。 } /* 季节的示例。 */ int month = 13; switch (month) { case 3: case 4: case 5: System.out.println(month + "月对应的是春季"); break; case 6: case 7: case 8: System.out.println(month + "月对应的是夏季"); break; case 9: case 10: case 11: System.out.println(month + "月对应的是秋季"); break; case 12: case 1: case 2: System.out.println(month + "月对应的是冬季"); break; default: System.out.println(month + "月没有对应的季节"); // break; } // System.out.println("Hello World!"); } }
if和switch的区别:
if:
1,对具体的值进行判断。
2,对区间判断。
3,对运算结果是boolean类型的表达式进行判断。
switch:
1,对具体的值进行判断。
2,值的个数通常是固定的。
对于几个固定的值判断,建议使用switch语句,因为switch语句会将具体的答案都加载进内存。
效率相对高一点。
2.6.3 循环结构
代表语句:while , do while , for
while语句格式:
while(条件表达式)
{
执行语句;
}
public class WhileDemo { public static void main(String[] args) { /* while(条件表达式) { 执行语句; } */ int x = 1; while (x < 3)//多加";",会形成死循环 { System.out.println("x=" + x); x++; } } }
do while语句格式:
do
{
执行语句;
}while(条件表达式);
public class DoWhileDemo { public static void main(String[] args) { /* do { 执行语句; }while(条件表达式); */ int x = 1; do { System.out.println("x=" + x); x++; } while (x < 1); /* do while语句的特点:无论条件是否满足,循环体至少执行一次。 */ int y = 1; while (y < 1) { System.out.println("y=" + y); y++; } } }
do while特点是条件无论是否满足,
循环体至少被执行一次。
public class WhileTest { public static void main(String[] args) { /* 练习: 获取1到10 10个数字的和。 0 + 1 1 + 2 3 + 3 6 + 4 10 + 5 思路: 1,每次参与加法的数值不确定。 2,每次的出现的和数据也不确定。 3,发现参与加法运算的数值有递增规律。 4,每一次都是加法运算在重复,并且都是和再加上下一个数值。 步骤: 1,定义一个变量,记录住参与加法运算的数据。 2,定义一个变量,记录中每一次的出现的和。 3,对于记录参与加法运算的数据进行自增。 4,因为加法运算需要重复,就要想到循环结构。 */ //累加思想。 int x = 1;//记录参与加法的数据。 int sum = 0;//记录住每一次的和。 while(x<=100) { sum = sum + x; x++; } System.out.println("sum="+sum); } }
public class WhileTest { public static void main(String[] args) { /* 练习: 获取1到10 10个数字的和。 0 + 1 1 + 2 3 + 3 6 + 4 10 + 5 思路: 1,每次参与加法的数值不确定。 2,每次的出现的和数据也不确定。 3,发现参与加法运算的数值有递增规律。 4,每一次都是加法运算在重复,并且都是和再加上下一个数值。 步骤: 1,定义一个变量,记录住参与加法运算的数据。 2,定义一个变量,记录中每一次的出现的和。 3,对于记录参与加法运算的数据进行自增。 4,因为加法运算需要重复,就要想到循环结构。 */ //累加思想。 int x = 1;//记录参与加法的数据。 int sum = 0;//记录住每一次的和。 while(x<=100) { sum = sum + x; x++; } System.out.println("sum="+sum); } }
for语句格式:
for(初始化表达式;循环条件表达式;循环后的操作表达式)
{
执行语句;
}
public class ForDemo { public static void main(String[] args) { /* for(初始化表达式;循环条件表达式;循环后的操作表达式) { 执行语句;(循环体) } */ for (int x = 1; x < 3; x++) { System.out.println("x=" + x); } int x = 1; for (System.out.println("a"); x < 3; System.out.println("c")) { System.out.println("d"); x++; } // a d c d c for (int a = 0, b = 0; a < 3 || b < 10; a++, b--) { } } }
注:
a,for里面的连个表达式运行的顺序,初始化表达式只读一次,判断循环条件,为真就执行循环体,然后再执行循环后的操作表达式,接着继续判断循环条件,重复找个过程,直到条件不满足为止。
b,while与for可以互换,区别在于for为了循环而定义的变量在for循环结束就是在内存中释放。而while循环使用的变量在循环结束后还可以继续使用。
c,最简单无限循环格式:while(true),for(;;),无限循环存在的原因是并不知道循环多少次,而是根据某些条件,来控制循环。
public class ForTest { public static void main(String[] args) { /* 用for完成累加。 */ int sum = 0; for (int x = 1; x <= 10; x++) { sum = sum + x; } System.out.println("sum=" + sum); /* for和while的特点: 1,for和while可以互换。 2,格式上的不同,在使用上有点小区别。 如果需要通过变量来对循环进行控制,该变量只作为循环增量存在时,区别就体现出来了。 */ //打印1~10十个数字 int x = 1; while (x < 5) { System.out.println("x=" + x); x++; } System.out.println("x====" + x); for (int y = 1; y < 5; y++) { System.out.println("y=" + y); } // System.out.println("y====="+y); // 无限循环最简单的形式。 // while(true){} // for(;;){} } }
public class ForForDemo { public static void main(String[] args) { //大圈套小圈思想。 for(int x=0; x<3; x++) { for(int y=0; y<4; y++) { System.out.println("ok"); } } /* ***** ***** ***** ***** */ for(int x=0; x<4; x++)//外循环控制的是行数 { for(int y=0; y<5; y++)//内循环控制的是每一行的个数 { System.out.print("*"); } System.out.println(); } } }
public class ForForTest { public static void main(String[] args) { /* * ** *** **** ***** * 直角三角形1,规律: * i=0,j=1, * i=1,j=2, * i=2,j=3, * ...... * 总结j=i+1 */ for (int i = 0; i < 5; i++) { for (int j = 0; j < i + 1; j++) { System.out.print("*"); } System.out.println(); } System.out.println(); /* ***** **** *** ** * * 直角三角形2,规律: * i=0,j=5, * i=1,j=4, * i=2,j=3, * ...... * 总结j=5-i */ for (int i = 0; i < 5; i++) { for (int j = 0; j < 5 - i; j++) { System.out.print("*"); } System.out.println(); } System.out.println(); /* ***** **** *** ** * * 直角三角形3,规律: * 内循环1先用直角三角形1的方式变换空格, * 内循环2用直角三角形2的方式打印* * 备注:左边未对齐 */ for (int i = 0; i < 5; i++) { for (int j = 0; j < i + 1; j++) { System.out.print(" "); } for (int j = 0; j < 5 - i; j++) { System.out.print("*"); } System.out.println(); } System.out.println(); /* ***** **** *** ** * * 直角三角形3对齐版,规律: * 在直角三角形3基础上调整内循环1的次数,减少一次空格循环的机会 * 备注:左边对齐 */ for (int i = 0; i < 5; i++) { for (int j = 0; j < i; j++) { System.out.print(" "); } for (int j = 0; j < 5 - i; j++) { System.out.print("*"); } System.out.println(); } System.out.println(); /* * ** *** **** ***** * 直角三角形4,规律: * 内循环1先用直角三角形2的方式变换空格, * 内循环2用直角三角形的1方式打印* * 备注:左边未对齐 */ for (int i = 0; i < 5; i++) { for (int j = 0; j < 5 - i; j++) { System.out.print(" "); } for (int j = 0; j < i + 1; j++) { System.out.print("*"); } System.out.println(); } System.out.println(); /* * ** *** **** ***** * 直角三角形4对齐版,规律: * 在直角三角形4基础上调整内循环1的次数,减少一次空格循环的机会 * 备注:左边对齐 */ for (int i = 0; i < 5; i++) { for (int j = 0; j < 4 - i; j++) { System.out.print(" "); } for (int j = 0; j < i + 1; j++) { System.out.print("*"); } System.out.println(); } System.out.println(); } }
public class ForForTest2 { public static void main(String[] args) { /* ********* ******* ***** *** * * 等腰三角形1,规律: * 内循环1先用直角三角形1的方式变换空格, * 内循环2用数学归纳法找规律* * 备注:左边未对齐 */ for (int i = 0; i < 5; i++) { for (int j = 0; j < i + 1; j++) { System.out.print(" "); } for (int j = 0; j < 9 - 2 * i; j++) { System.out.print("*"); } System.out.println(); } /* ********* ******* ***** *** * * 等腰三角形1对齐版,规律: * 在等腰三角形1基础上调整内循环1的次数,减少一次空格循环的机会 * 备注:左边对齐 */ for (int i = 0; i < 5; i++) { for (int j = 0; j < i; j++) { System.out.print(" "); } for (int j = 0; j < 9 - 2 * i; j++) { System.out.print("*"); } System.out.println(); } /* * *** ***** ******* ********* * 等腰三角形2,规律: * 内循环1先用直角三角形2的方式变换空格, * 内循环2用数学归纳法找规律* * 备注:左边未对齐 */ for (int i = 0; i < 5; i++) { for (int j = 0; j < 5 - i; j++) { System.out.print(" "); } for (int j = 0; j < 2 * i + 1; j++) { System.out.print("*"); } System.out.println(); } /* * *** ***** ******* ********* * 等腰三角形2对齐版,规律: * 在等腰三角形2基础上调整内循环1的次数,减少一次空格循环的机会 * 备注:左边对齐 */ for (int i = 0; i < 5; i++) { for (int j = 0; j < 4 - i; j++) { System.out.print(" "); } for (int j = 0; j < 2 * i + 1; j++) { System.out.print("*"); } System.out.println(); } /* 菱形 * 一.未对齐 * 1.组合等腰三角形2未对齐+等腰三角形1未对齐 * 2.增加1次等腰三角形未对齐1的循环次数 * 3.增加1次等腰三角形未对齐2的循环次数 */ for (int i = 0; i < 5; i++) { for (int j = 0; j < 6 - i; j++) { System.out.print(" "); } for (int j = 0; j < 2 * i + 1; j++) { System.out.print("*"); } System.out.println(); } for (int i = 0; i < 5; i++) { for (int j = 0; j < i + 1; j++) { System.out.print(" "); } for (int j = 0; j < 11 - 2 * i; j++) { System.out.print("*"); } System.out.println(); } /* * 二. * 1.组合等腰三角形2未对齐+等腰三角形1对齐 * 2.增加1次等腰三角形1对齐的循环次数 */ for (int i = 0; i < 5; i++) { for (int j = 0; j < 5 - i; j++) { System.out.print(" "); } for (int j = 0; j < 2 * i + 1; j++) { System.out.print("*"); } System.out.println(); } for (int i = 0; i < 5; i++) { for (int j = 0; j < i; j++) { System.out.print(" "); } for (int j = 0; j < 11 - 2 * i; j++) { System.out.print("*"); } System.out.println(); } /* * 三. * 1.组合等腰三角形2对齐+等腰三角形1未对齐 * 2.增加1次等腰三角形2对齐的循环次数 */ for (int i = 0; i < 6; i++) { for (int j = 0; j < 5 - i; j++) { System.out.print(" "); } for (int j = 0; j < 2 * i + 1; j++) { System.out.print("*"); } System.out.println(); } for (int i = 0; i < 5; i++) { for (int j = 0; j < i + 1; j++) { System.out.print(" "); } for (int j = 0; j < 9 - 2 * i; j++) { System.out.print("*"); } System.out.println(); } } }
public class ForForTest3 { public static void main(String[] args) { /* 平行四边形1未对齐 ***** ***** ***** ***** ***** *规律:直角三角形1用来填充空格+矩形 */ for (int i = 0; i < 5; i++) { for (int j = 0; j < i + 1; j++) { System.out.print(" "); } for (int j = 0; j < 5; j++) { System.out.print("*"); } System.out.println(); } /* * 平行四边形1对齐,减少一次空格的循环 */ for (int i = 0; i < 5; i++) { for (int j = 0; j < i; j++) { System.out.print(" "); } for (int j = 0; j < 5; j++) { System.out.print("*"); } System.out.println(); } /* 平行四边形2未对齐 ***** ***** ***** ***** ***** *规律:矩形,直角三角形2用来填充空格 */ for (int i = 0; i < 5; i++) { for (int j = 0; j < 5-i; j++) { System.out.print(" "); } for (int j = 0; j < 5; j++) { System.out.print("*"); } System.out.println(); } /* * 平行四边形2对齐,减少一次空格的循环 */ for (int i = 0; i < 5; i++) { for (int j = 0; j < 4-i; j++) { System.out.print(" "); } for (int j = 0; j < 5; j++) { System.out.print("*"); } System.out.println(); } /* * 等腰梯形1,直角三角形1变形 ** **** ****** ******** ********** */ for (int i = 0; i < 5; i++) { for (int j = 0; j < i+1; j++) { System.out.print("**"); } System.out.println(); } System.out.println(); /* * 等腰梯形2:直角三角形2变形 ********** ******** ****** **** ** */ for (int i = 0; i < 5; i++) { for (int j = 0; j < 5-i; j++) { System.out.print("**"); } System.out.println(); } System.out.println(); /* ** *** **** ***** ****** * 等腰梯形3: * 1.直角三角形2填充空格 * 2.数学归纳法找寻规律 */ for (int i = 0; i < 5; i++) { for (int j = 0; j < 5-i; j++) { System.out.print(" "); } for (int j = 0; j < i+2; j++) { System.out.print("*"); } System.out.println(); } System.out.println(); /* ****** ***** **** *** ** * 等腰梯形4: * 1.直角三角形1填充空格 * 2.数学归纳法找寻规律 */ for (int i = 0; i < 5; i++) { for (int j = 0; j < i+1; j++) { System.out.print(" "); } for (int j = 0; j < 6-i; j++) { System.out.print("*"); } System.out.println(); } System.out.println(); } }
public class ForFor99 { public static void main(String[] args) { /* 九九乘法表 1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 */ for (int x = 1; x <= 9; x++) { for (int y = 1; y <= x; y++) { System.out.print(y + "*" + x + "=" + y * x + "\t"); } System.out.println(); } /* \n:回车: \t:制表符。 \b:退格。 \r: 按下回车键。 windows系统中回车符其实是由两个符号组成的 \r\n. linux中回车符是 \n. System.out.println("\\hello world\\"); */ } }
2.6.4 其他流程控制语句
break(跳出), continue(继续)
break语句:应用范围:选择结构和循环结构。
continue语句:应用于循环结构。
注:
a,这两个语句离开应用范围,存在是没有意义的。
b,这个两个语句单独存在下面都不可以有语句,因为执行不到。
c,continue语句是结束本次循环继续下次循环。
d,标号的出现,可以让这两个语句作用于指定的范围。
public class BreakContinueDemo { public static void main(String[] args) { /* break:跳出。 break作用的范围:要么是switch语句,要么是循环语句。 记住:当break语句单独存在时,下面不要定义其他语句,因为执行不到。 break跳出所在的当前循环。 如果出现了循环嵌套,break想要跳出指定的循环,可以通过标号来完成。 */ for (int x = 0; x < 3; x++) { if (x == 1) break; System.out.println("x=" + x); } a: for (int x = 0; x < 3;) { b: for (int y = 0; y < 4;) { System.out.println("x=" + x); break b; //braek; 没有标号默认break跳出本层循环 } break a; } /* continue:继续。 作用的范围:循环结构。 continue:结束本次循环,继续下次循环。 如果continue单独存在时,下面不要有任何语句,因为执行不到。 */ for (int x = 0; x < 11; x++) { if (x % 2 == 0) continue; System.out.println("x=" + x); } xiaoqiang: for (int x = 0; x < 3; x++) { wangcai: for (int y = 0; y < 4; y++) { System.out.println("x=" + x); continue wangcai; //continue; 没有标号默认continue继续本层循环 } continue xiaoqiang; } } }