顺序控制
程序从上到下逐行执行,中间没有任何判断和跳转。
分支控制if-else
1.单分支
//基本语法:
if(条件表达式){
执行代码块;
}
当条件表达式为true时,就会执行{ }代码。反之不执行。如果{ }中只有一条语句可以省略{}号,但是不建议。
2.双分支
//基本语法:
if(条件表达式){
执行代码块1;
}
else{
执行代码块2;
}
当条件表达式为true时,就会执行代码块1。反之执行代码块2。如果{ }中只有一条语句可以省略{}号,但是不建议。
3.多分支
//基本语法:
if(条件表达式){
执行代码块1;
}
else if(条件表达式2){
执行代码块2;
}
.........
else{
执行代码块n;
}
当条件表达式1为true时,就会执行代码块1。反之开始判断条件表达式2是否成立。以此类推,如果所有的表达式都不成立就执行else的代码块,注意,只能有一个执行入口。(多分支可以没有else,如果所有条件表达式都不成立,则一个执行入口都没有。)
4.嵌套分支
在一个分支结构中又完整地嵌套了另一个完整的分支结构。(规范:不要超过三层,可读性不好)
5.switch分支结构
switch标志词开头,细节讨论:
- 表达式数据类型,应该和case后的常量类型一致,或者是可以自动转成可以相互比较的类型
char c = 'a'; switch(c){ case 'a' ://即这里case后跟的要与开头赋值的表达式的类型一致或可以互相转换 System.out.println("ok1"); break; case 'b' : System.out.println("ok2"); break; default : System.out.println("ok3"); }
-
switch(表达式)中表达式的返回值必须是:(byte,short,int,char,enum,String)。实例如下
double c = 1.1 switch(c) {//错误类型 case 1.1 ://错误类型 System.out.println(1); break;
-
case子句中的值必须是常量(或常量表达式)而不能是变量。
-
default子句是可选的,当没有匹配的case时,执行default。
-
break语句用来在执行完一个case分支后使程序跳出switch语句块,切记每个case搭配break使用,否则程序会顺序执行到switch结尾。
- switch和if的比较:
- 如果判断的具体数值不多,而且符合byte、short、int、char、enum[枚举],String这6种类型,更建议使用switch语句。
- 对区间判断,对结果是boolean类型判断,使用if。
for循环控制
for(循环变量初始化;循环条件;循环变量迭代){
循环操作(语句);
}
for循环细节:
- 循环条件是返回一个布尔值的表达式。
- for(;循环条件;)中的初始化和变量迭代可以写到其他地方,但是两边的分号不能省略。
- 循环初始值可以有多条初始化语句,但要求类型一样,并且中间用逗号隔开,循环变量迭代同理。
while循环控制
循环变量初始化;
while(循环条件){
循环体(语句);
循环变量迭代;
}
循环条件是返回一个布尔值的表达式
do...while循环控制
do{
循环体(语句);
循环变量迭代;
}while(循环条件);
先执行,再判断,也就是说一定会执行一次。与while循环的区别就在于while循环是先判断再执行的。
循环条件是返回一个布尔值的表达式。
多重循环控制
把以上的各种循环放在另一个循环体内,形成嵌套循环【建议一般使用两层,最多不要超过三层,否则代码的可读性会比较差】,当内层循环的循环条件为真时才会一直循环。
设外层循环次数为m次,内层为n次,则内层循环体实际上需要执行m*n次。
- 经典的打印金字塔问题
public class Dowhile03 {
public static void main(String[] args) {
for(int i = 1; i <= 5;i++){
for(int k = 1;k <= 5-i; k++){
System.out.print(" ");
}
for(int j = 1;j <= 2 * i - 1 ;j++){
System.out.print("*");
}
System.out.print("\n");
}
}
}
先打印空格后打印星星,注意观察规律
打印空心的金字塔
public class Dowhile03 {
public static void main(String[] args) {
int totallevel = 5;//层数
//打印空格
for(int i = 1; i <= totallevel;i++){
for(int k = 1;k <= 5-i; k++){
System.out.print(" ");
}
for(int j = 1;j <= 2 * i - 1 ;j++){
if(j == 1 || j ==2 * i - 1 || i == totallevel){
System.out.print("*");
}else{
System.out.print(" ");
}
}
System.out.print("\n");
}
}
}
可以随意改变层数,主要是思考规律进行思路分析,一步一步化繁为简。
跳转控制语句break
break语句用于终止某个语句块的执行,一般是用在switch或者循环中。(break只是结束循环并不是终止程序)
{....
break;
....
}
break语句出现在多层嵌套的语句块时,可以通过标签来指明要终止的是哪一层语句块。
label1:{....
label2: {......
.........
break label2;
.........
}
}
登录案例:
import java.util.Scanner;
public class break01 {
public static void main(String[] args) {
Scanner myScanner = new Scanner(System.in);
String name = "";
String passwd = "";
int chance = 3;
for (int i = 1 ; i <= 3;i++){
System.out.println("请输入名字");
name = myScanner.next();
System.out.println("请输入密码");
passwd = myScanner.next();
//使用方法equals来比较输入的字符串和设定的内容是否相同
if("小王".equals(name) && "123".equals(passwd)){
System.out.println("登录成功");
break;
}
chance--;
System.out.println("你还有" + chance + "次机会");
}
}
}
跳转控制语句continue
遇到continue,直接跳转到循环的判断条件处,用法与break类似可以后跟标签。做continue和break语句判断执行顺序时都建议结合流程分析图,分析内存执行情况再做判断。
跳转控制语句return
return使用在方法,表示跳出所在的方法(在讲解方法的时候会详细介绍),return如果写在main方法,表示退出程序。
这个章节需要靠大部分的实战案例练习来巩固,涉及到一些顺序循环的案例特别多,建议多找一些例子利用不同的控制结构以及嵌套组合来解决练习一下
如,求出1-1/2+1/3-1/4....1/100的和。
//这里有一个隐藏的陷阱,要把公式分子1写成1.0才能得到精确的小数
double sum = 0;
for(int i = 1; i<= 100;i++){
if( i % 2 != 0){
sum += 1.0/i;
}else{
sum -= 1.0/i;
}
}
System.out.println(sum);
把1-100之间不能被5整除的数打印出来,每五个一行。
public class zuoye02{
public static void main(String[] args) {
int count = 0;
for(int i = 1; i <= 100 ; i++){
if(i % 5 != 0){
//print与println的区别是,前者输出不换行,后者每输出一次换一次行
System.out.print( i+"\t");
count++;
if(count >= 5){
count -= 5;
System.out.print("\n");
}
}
}
}
}
求1+(1+2)+(1+2+3)+....+(1+2+3+...+100)的结果。
public class zuoye03{
public static void main(String[] args) {
int sum = 0;
for(int i = 1; i <= 100 ; i++){
for(int j = 1; j <= i ; j++)
sum += j;
} System.out.print(sum);
}
}