21天学会Java之(Java SE第二篇):流程控制语句、Java中常用的转义字符、递归结构

流程控制语句

Java中的控制语句与其他语言基本大同小异,主要分为:顺序结构、选择结构和循环结构三类。
个人的理解方法是把控制语句翻译成中文的意思,方便理解其逻辑(仅供参考)

  1. 顺序结构即先执行a后执行b的逻辑
  2. 选择结构即如果…则…的逻辑
  3. 循环结构即如果…则继续…的逻辑

顺序结构就很好理解自上而下,逐条运行;
选择结构则需要有一个判断,如果判断成立则运行判断语句块里的语句,不成立则跳出;
循环结构同样需要一个判断,如果符合这个判断则就循环运行循环体里的语句,不符合就跳出循环。
三种逻辑结构相互支撑,构成了各种奇妙复杂的算法,无论多难的算法究其根本都是以它们来表达,以下主要记录选择结构以及循环结构的基础以及要点。

选择结构

选择结构分为:1.if单选择结构;2.if-else双选择结构;3.if-else if-else多选择结构;4.switch多选择结构

  1. if单选择结构
    语法形式:
if(布尔表达式){
    语句块;
}

if语句中首先对布尔表达式进行判断如果结果为真则执行语句块内容。
例如,用if单选择结构来判断给定的数值是否大于100:

public class IfTest{
	public static void main(String[] args) {
		int a=100;
		if (a>100) {
			System.out.println("a大于100!");
		}
	}
}

首先我们有一个int类型的变量a,给它赋值为100;然后执行布尔表达式a>100,其结果为false,则就不会执行System.out.println("a大于100!");

  1. if-else双选择结构
    语法形式:
if(布尔表达式){
    语句块1;
}else{
    语句块2;
}

if-else语句中首先对布尔表达式进行判断如果结果为真则执行语句块1的内容,否则则执行语句块2内容。
例如,用if-else双选择结构来判断对于给定数值大于100或者不大于100:

public class If_elseTest{
	public static void main(String[] args) {
		int a=100;
		if (a>100) {
			System.out.println("a大于100!");
		}else{
            System.out.println("a不大于100!");
        }
	}
}

对于以上代码我们只需要在单选择结构的基础上加一个语句块,以此来完善逻辑。

  1. if-else if-else多选择结构
    语法形式:
if(布尔表达式1) {
	语句块1;
}else if(布尔表达式2) {
	语句块2;
}……
else if(布尔表达式n){
    语句块n;
}else {
    语句块n+1;
}

if-else if-else语句可以有多个布尔表达式,以及多个语句块。具体运行规则即布尔表达式1为真,结果为真则运行语句块1,否则判断布尔表达式2是否为真,如果为真即运行语句块2,以此类推,如果布尔表达式1~n都为假则运行语句块n+1。
例如,用if-else if-else多选择结构来判断对于给定数值大于、等于或小于100:

public class If_elseif_elseTest{
	public static void main(String[] args) {
		int a=100;
		if (a>100) {
			System.out.println("a大于100!");
		}else if(a<100){
            System.out.println("a小于100!");
        }else{
            System.out.println("a等于100!");
        }
	}
}
  1. switch多选择结构
    语法形式:
switch (表达式) {
case1: 
	语句序列1;
	[break];
case2:
	语句序列2;
	[break];
……
[default:
 	默认语句;]
}

switch语句会根据表达式的值从对应的case处开始执行,一直到执行到break语句break语句不需要每个case里都写,但是这样会继续执行下一句语句,所以一般情况下每个case里都会写上或者执行完switch语句,如果表达式的值与所有的case中的值都不匹配执行default语句(default语句可以不写,这样所有的值都不匹配的话则跳出switch语句)
例如,用switch多选择结构判断给定的日期是星期几:

public class SwitchTest {
	public static void main(String[] args) {
		String week="星期日";
		switch (week) {
		case "星期日":
			System.out.println("今天是星期日");
			break;
		case "星期一":
			System.out.println("今天是星期一");
			break;
		case "星期二":
			System.out.println("今天是星期二");
			break;
		case "星期三":
			System.out.println("今天是星期三");
			break;
		case "星期四":
			System.out.println("今天是星期四");
			break;
		case "星期五":
			System.out.println("今天是星期五");
			break;
		case "星期六":
			System.out.println("今天是星期六");
			break;
		//可以不写
//		default :
//			System.out.println("请输入正确的日期");
		}
	}
}

如以上例子,给定一个日期星期日,与case "星期日":匹配则运行了System.out.println("今天是星期日");,且碰到了break;,则输出结果:今天是星期日。而如果把该语句里所有break都去除掉则运行结果则会出现以下结果:

今天是星期日
今天是星期一
今天是星期二
今天是星期三
今天是星期四
今天是星期五
今天是星期六

所以在实际使用中,我们一般都会根据逻辑在case中加入break语句

循环结构

循环结构分为:1.while循环;2.do-while循环;3.for循环;4.嵌套循环,主要为当型和直到型两种类型。
当型即当布尔表达式为真时,则反复执行循环体,当布尔表达式为假时则结束循环;while循环和for循环即是当型循环结构。
直到型即先执行循环体,然后判断布尔表达式,如果布尔表达式结果为真则继续循环执行语句块,直到布尔表达式结果为假时则停止循环;do-while循环即直到型循环结构。

  1. while循环
    语法形式:
while(布尔表达式){
    循环体;
}

例如,用while语句计算1-100的总和:

public class WhileTest {
    public static void main(String[] args) {
        int sum=0;
        int i=1;
        while(i<=100){
            sum+=i;
            i++;
        }
        System.out.println(num);
    }
}

刚开始给定一个计数的变量sum赋值0,一个计数变量i赋值1,然后执行循环结构的布尔表达式i<=100,结果为true执行循环体sum+=i;i++;的语句,直到i=101时不满足布尔表达式条件后跳出循环,依照顺序结构往下执行System.out.println(num);语句,得到1-100的和结果为5050。

  1. do-while循环
    语法形式:
do{
    循环体;
}while(布尔表达式);

同样使用do-while语句计算1-100的和:

public class Do_whileTest {
    public static void main(String[] args) {
        int sum=0;
        int i=1;
        do {
            sum+=i;
            i++;
        }while (i<=100);
        System.out.println(sum);
    }
}

与while循环不同的是do-while先执行循环体,后执行布尔表达式判断,所以不管布尔值表达式结果如何,循环体都至少会被执行一次!

  1. for循环
    语法形式:
for(初始表达式;布尔表达式;迭代因子){
    循环体;
}

使用for语句计算1-100的和:

public class ForTest {
    public static void main(String[] args) {
        int num=0;
        for (int i=1;i<=100;i++){
            num+=i;
        }
        System.out.println(num);
    }
}

与while和do-while循环一样,给予整数型变量num和i,以上三个例子表明while,do-while和for循环都是可以相互替换的,所以在实际使用中,往往根据需求来选择使用的循环结构。

  1. 嵌套循环

嵌套循环即在一个循环语句内部再嵌套一个或者多个循环,while,do-while和for循环可以任意的嵌套
例如,用嵌套循环打印99乘法表:

public class MultiplicationTable {
    public static void main(String[] args) {
        for (int i = 1; i <=9 ; i++) {  //用第一个for循环打印出9行
            for (int j = 1; j <= i ; j++) {  //用第二个for循环打印出列
                int value=i*j;  //计算i*j的值
                System.out.print(i+"*"+j+"="+value+"\t");  //用字符串连接符,"\t"为制表符的转义字符(跳到下个tab位置)
            }
            System.out.println();  //使用第二个for循环打印完每一行的结果后,换行
        }
    }
}

得出结果:

1*1=1	
2*1=2	2*2=4	
3*1=3	3*2=6	3*3=9	
4*1=4	4*2=8	4*3=12	4*4=16	
5*1=5	5*2=10	5*3=15	5*4=20	5*5=25	
6*1=6	6*2=12	6*3=18	6*4=24	6*5=30	6*6=36	
7*1=7	7*2=14	7*3=21	7*4=28	7*5=35	7*6=42	7*7=49	
8*1=8	8*2=16	8*3=24	8*4=32	8*5=40	8*6=48	8*7=56	8*8=64	
9*1=9	9*2=18	9*3=27	9*4=36	9*5=45	9*6=54	9*7=63	9*8=72	9*9=81	

break语句和continue语句

在任何的循环结构语句的主体部分中都可以使用break和continue语句控制循环的流程。
break用于跳出循环,不执行循环中剩余的语句。
continue用于跳出一次循环,继续执行下次是否循环的判断。

Java中常用的转义字符

转义序列 功能描述
\r 回车符,将光标定位到当前行的开头,不会跳到下一行
\n 换行符,换到下一行的开头
\t 制表符,将光标移到下一个制表符的位置,就像在文档中用Tab键一样
\b 退格符号,就像键盘上的 Backspace键
\f 换页符号,切换到下一页
\’ 单引号字符,如果直接使用‘则会报错,所以使用转义字符解决这一问题
\" 双引号字符,如果直接使用"则会报错,所以使用转义字符解决这一问题
\\ 在java代码中的反斜杠\)是转义字符,因此需要表示字面意义上的\,就需要使用双反斜杠(\\)
\ddd 八进制字符串
\xddd 十六进制字符串
\udddd 十六进制Unicode双字节字符串

递归结构

上面说了所有的复杂算法都是以三种逻辑结构相互支撑来表达的,递归是一种常见的解决问题的方法,即把问题逐渐简单化。递归的基本思想就是“自己调用自己”,一个使用递归技术的方法将会直接或者间接的调用自己。
递归包含了递归头和递归体
递归头定义了什么时候不调用自身方法,如果没有递归头程序就会陷入死循环
递归体定义了什么时候需要调用自身方法
例如,使用递归算法来实现阶乘:

public class Recursion {
    public static void main(String[] args) {
        System.out.println(factorial(10));
    }
    public static long factorial(int num){
        if (num==1){  //递归头
            return 1;
        }else{  //递归体
            //实现num*num-1*...*2*1,到num=1时则会执行return 1;语句不在执行else后的语句
            return num*factorial(num-1);  //num!=num*factorial(num-1)
        }
    }
}

可见,只要初始值大于零,这个函数就能够终止。停止的位置称为基线条件(base case)。基线条件是递归程序的 最底层位置,在此位置时没有必要再进行操作,可以直接返回一个结果。所有递归程序都必须至少拥有一个基线条件,而且必须确保它们最终会达到某个基线条件;否则,程序将永远运行下去,直到程序缺少内存或者栈空间。
利用递归可以用简单的程序来解决一些复杂的问题。比如:斐波那契数列的计算、汉诺塔、快排等问题。

发布了5 篇原创文章 · 获赞 12 · 访问量 557

猜你喜欢

转载自blog.csdn.net/qq172387778/article/details/104997248