控制语句、方法、递归算法

控制语句

控制语句:把语句组合成能完成一定功能的小逻辑模块。它分为三类:顺序、选择和循环。

  1. “顺序结构”代表“先执行a,再执行b”的逻辑
  2. “条件判断结构”代表“如果...,则...”的逻辑
  3. “循环结构”代表“如果...,则重复执行”的逻辑

很神奇的是,三种流程控制语句就能表示所有的事情!实际上,任何软件和程序,小到一个练习,大到一个操作系统,本质上都是由“变量、选择语句、循环语句”组成

条件判断结构(选择结构)

条件判断结构:if结构和switch结构。而if结构又可以分为if单分支结构、if-else双分支结构、if-else if-else多分支结构。

单分支结构

流程图

语法结构

下面的语法结构和上面图对应

 
 

scss

复制代码

if(布尔表达式){ 语句块 }

备注

  1. 如果if语句不写{},则只能作用于后面的第一条语句。
  2. 强烈建议,任何时候都写上{},即使里面只有一句话!

敲代码】if单分支结构(掷骰子游戏)

 
 

csharp

复制代码

public class Test01 { public static void main(String[] args) { int i = (int) (Math.random() * 6 + 1); int j = (int) (Math.random() * 6 + 1); int k = (int) (Math.random() * 6 + 1); int count = i + j + k; System.out.println("第一个骰子:" + i ); System.out.println("第二个骰子:" + j ); System.out.println("第三个骰子:" + k ); if(count > 15){ System.out.println("今天手气不错!再来一把"); } if(count>=10 && count < 15){ System.out.println("手气一般!再来两把"); } if(count < 10){ System.out.println("手气差点,下次再来吧!"); } System.out.println("今天掷骰子得分:" + count); } }

备注:Math类的使用

  • Java.lang包中的Math类提供了一些用于数学计算的方法。
  • Math.random()该方法用于产生0到1区间的double类型的随机数,但是不包括1。如:int i = (int)(6*random()); 产生[0,5]之间的随机整数(假如是0.9 * 6 取整也是5)

if-else双分支结构

流程图

语法结构

下面的语法结构和上面图对应

 
 

scss

复制代码

if(布尔表达式){ 语句块1 }else{ 语句块2 }

敲代码

 
 

csharp

复制代码

import java.util.Arrays; /** * 测试if-else 双分支结构 */ public class Test02 { public static void main(String[] args) { double r = 4 * Math.random(); double area = 3.14 * r * r; double circle = 2 * Math.PI * r; System.out.println("半径:" + r); System.out.println("周长:" + circle); System.out.println("面积:" + area); if (area >= circle) { System.out.println("面积的数值大于等于周长"); } else { System.out.println("面积的数值小于周长"); } // 条件运算符 int a = 3,b = 4; int c = a<b?b:a; System.out.println("较大数是:" + c); // 把a和b中大的数返回 // 把a和b中,较大的数返回 if(a<b){ c = b; }else{ c = a; } System.out.println("较大数是:" + c); } }

if-else if -else多分支结构

流程图

语法结构

下面的语法结构和上面图对应

 
 

scss

复制代码

if(布尔表达式1){ 语句块1; }else if(布尔表达式2){ 语句块2; }... ... else if(布尔表达式n){ 语句块n; }else{ 语句块 }

敲代码 1

 
 

csharp

复制代码

/** * 测试多分支结构 */ public class Test03 { public static void main(String[] args) { int i = (int) (Math.random() * 6 + 1); int j = (int) (Math.random() * 6 + 1); int k = (int) (Math.random() * 6 + 1); int count = i + j + k; System.out.println("第一个骰子:" + i); System.out.println("第二个骰子:" + j); System.out.println("第三个骰子:" + k); if (count > 15) { System.out.println("今天手气不错!再来一把"); } else if (count >= 10) { System.out.println("手气一般!再来两把"); } else { System.out.println("手气不行,明天再来吧"); } System.out.println("今天掷骰子得分:" + count); } }

运行结果

备注

为什么标注的地方不写count>=10 && count < 15,因为如果大于15就会走第一个if,只要不大于15,就会后面的else if ,因此就相当于count>=10 && count < 15

敲代码 2

 
 

csharp

复制代码

/** * 测试多分支结构 */ public class Test03 { public static void main(String[] args) { int age = (int)(120*Math.random()); System.out.println("年龄是:"+ age); // 15以下(不含15):儿童,15-24青年,25-44中年,45-64中老年,65-84老年,85-99老寿星,100-109百岁老人,110以上,打破年龄最长记录 if(age<15){ System.out.println("儿童,好好玩"); }else if(age<25){ System.out.println("青年,好好读书"); }else if(age<45){ System.out.println("中年,好好工作,养家糊口"); }else if(age<65){ System.out.println("中老年,遛遛狗,下下棋,泡泡茶,吹吹牛"); }else if(age<85){ System.out.println("老年,今天跳广场舞了吗?"); }else if(age<100){ System.out.println("老寿星,家有一老,如有一宝"); }else if(age<110){ System.out.println("百岁老人,跨世纪的见证者"); }else{ System.out.println("110岁以上,已经打破世界记录了"); } }

运行结果

switch多分枝结构(多值情况)

流程图

语法结构

与上图相对应的语法结构:

 
 

ini

复制代码

switch(表达式){ case 值1: 语句块1; [break]; case 值2: 语句块2; [break]; } ... ... ... ... [default: 默认语句块:] }

备注

  • 语法结构中使用“[]”标注的都是可选的,如break 是可选的,如果没有break,就会向下执行后面的语句,直到碰到break为止
  • switch会根据表达式的值从相匹配的case标签处开始执行,一直执行break处或者switch的末尾。如果表达式的值与任一case值不匹配,则进入default语句
  • switch中表达式中的值,是int(byte、short、char也可,long不行)、枚举、字符串

敲代码

 
 

csharp

复制代码

/** * 测试switch语句的用法 */ public class TestSwitch01 { public static void main(String[] args) { int grade = (int)(Math.random()*4)+1; System.out.println("你的年级是:"+grade); switch (grade){ case 1: System.out.println("大一,输出博客,坚持运动"); break; case 2: System.out.println("多参加学校的党组织部门和活动,锻炼融入社会的能力"); break; case 3: System.out.println("准备考研或者为校招做准备"); case 4: System.out.println("做好简历,海量投和面试,积累经验"); default: System.out.println("你已经毕业了"); } } }

运行结果

敲代码

 
 

csharp

复制代码

/** * 测试switch语法 */ public class TestSwitch02 { public static void main(String[] args) { int month = (int)(Math.random()*12)+1; switch (month){ case 1: case 2: case 3: case 4: case 5: case 6: System.out.println(month + "月,属于上半年"); break; default: System.out.println(month + "月,属于下半年"); break; } } }

运行结果

备注

充分利用了switch中break的特点,如果没有break,那么程序就按顺序执行下一行,并且下一行中不再判断case中的条件是否满足,直接执行语句(一直执行到有break的地方为止)。

敲代码

 
 

csharp

复制代码

/** * 测试switch */ public class TestSwitch03 { public static void main(String[] args) { String str = "a"; switch (str){ case "a": System.out.println("a"); case "A": System.out.println("A"); break; default: System.out.println("*"); } } }

运行结果

循环while

介绍

循环结构分两大类,一类是当型,一类是直到型

  1. 当型

当布尔表达式条件为true,反复执行某语句,当布尔表达式的值为false是时才停止循环,比如while与for循环(为主)

  1. 直到型

先执行某语句,再判断布尔表达式,如果为true,再执行某语句,如此反复,直到布尔表达式条件为false时才停止循环,比如 do -whitle

语法结构

流程图

语法结构

 
 

javascript

复制代码

whtile(布尔表达式){ 循环体 }

备注

1.在循环刚开始时,会计算一次“布尔表达式”的值,若条件为真,执行循环体。而后来每一次额外的循环,都会在开始前重新计算一次

  1. 语句中应有使循环趋向于结束的语句,否则会出现无限循环 - “死”循环

敲代码

 
 

arduino

复制代码

/** * 测试while循环 */ public class TestWhile { public static void main(String[] args) { int a = 0; while (a<3){ System.out.println("while循环了"+ a + "次"); a++; } } }

运行结果

备注

while循环中布尔表达式中的变量,在循环体中要发生变化,否则就会死循环

敲代码

 
 

arduino

复制代码

/** * 测试while循环 */ public class TestWhile { public static void main(String[] args) { // 累加: 0+ 1 + 2 + 3 + 4 + ... + 100 int i = 0; int sum = 0; while (i<=100){ sum = sum + i; i++; } System.out.println("1累加到100的和为:" + sum); } }

运行结果

循环结构for

流程图

本质上和while是一样的

语法结构

 
 

ini

复制代码

for(初始表达式;布尔表达式;迭代因子){ 循环体; }

备注

  • 初始化部分设置:循环变量的初值
  • 条件判断部分为:布尔表达式
  • 迭代因子:控制循环变量的增减

for循环在执行条件判定后,先执行循环体部分,再执行迭代因子

敲代码

 
 

ini

复制代码

/** * 测试for循环 */ public class TestFor { public static void main(String[] args) { /* int a = 0; // 初始化部分 while (a<3){ // 布尔表达式 System.out.println("while循环了"+ a + "次"); // 循环体 a++; // 迭代因子 } */ // 使用for循环对while其改在 for (int a = 0; a < 3; a++) { System.out.println("进入for循环" + a + "次"); } System.out.println(); /* // 累加: 0+ 1 + 2 + 3 + 4 + ... + 100 int i = 0; int sum = 0; while (i<=100){ sum = sum + i; i++; } System.out.println("1累加到100的和为:" + sum); */ // 使用for循环对while其改在 int sum = 0; for (int i = 0; i <= 100; i++) { sum = sum + i; } System.out.println("1累加到100的和为:" + sum); } }

运行结果

敲代码

 
 

arduino

复制代码

/** * 测试for循环 */ public class TestFor02 { public static void main(String[] args) { // 输入9-1间的数 for(int i = 9;i>0;i--){ System.out.print(i + "\t"); } } }

运行结果

敲代码

 
 

arduino

复制代码

/** * 测试for循环 */ public class TestFor03 { public static void main(String[] args) { // 测试90-1之间能被3整除的数 for(int i=90;i>0;i--){ if(i%3==0){ System.out.println("90-1之间能被3整除的数:"+ i); } } } }

或者我们发现90是能被3整除的,它后面的隔3个数的数也能被3整除

 
 

arduino

复制代码

public class TestFor03 { public static void main(String[] args) { // 测试90-1之间能被3整除的数 for(int i=90;i>0;i-=3){ System.out.println("90-1之间能被3整除的数:"+ i); } } }

运行结果】 

do while循环(了解即可)

流程图

语法结构

 
 

scss

复制代码

do { 循环体; }whuile(布尔表达式)

do-while循环结构会先执行循环体,然后再判断布尔表达式的值,也就是说不管条件符不符合至少执行一次

练习

  1. 计算100之内的累加和、所有奇数和、所有偶数和

敲代码

 
 

ini

复制代码

/** * 计算100之内的累加和、所有奇数和、所有偶数和 */ public class Exe1Sum100 { public static void main(String[] args) { int sum = 0; // 总和 int oddSum = 0; // 奇数和 int evenSum = 0; // 偶数和 for(int i=0;i<=100;i++){ sum = sum + i; } // 使用while循环写 int a = 0; while (a<=100){ a++; if(a%2==0){ evenSum += a; }else{ oddSum += a; } } // 使用for循环写: for(int a=0;a<=100;a++){ if(a%2==0){ evenSum += a; }else{ oddSum += a; } } System.out.println("100之内偶数和"+ evenSum); System.out.println("100之内奇数和"+ oddSum); System.out.println("100之内的累加和"+ sum); } }

备注

for循环中的变量i仅限于for循环中使用,出了for循环使用就会报错

运行结果

  1. 循环0-130之间的数字,每行显示5个数字

敲代码

方法一: 值能被5整除就换行

 
 

csharp

复制代码

/** * 循环0-130之间的数字,每行显示5个数字 */ public class ExePring0_130Bye5 { public static void main(String[] args) { for(int i=1;i<=130;i++){ System.out.print(i + "\t"); if(i%5==0){ System.out.println(); } } } }

方法二: 添加计数器,每行计5个就换行

 
 

ini

复制代码

/** * 循环0-130之间的数字,每行显示5个数字 */ public class ExePring0_130Bye5 { public static void main(String[] args) { int count = 0; // 每行打印了几个数 for(int i=1;i<=130;i++){ System.out.print(i + "\t"); count++; if(count == 5){ System.out.println(); count = 0; } } } }

运行结果

嵌套循环

循环语句内部,再写一个或多个循环,称为嵌套循环。一般常见的就两层

练习1】:第一行输出5个1,第二行输出5个2,第三行输出5个3... ... 直到第五行输出5 个5

敲代码

 
 

csharp

复制代码

/** * 测试嵌套循环 */ public class TestNestedLoop { public static void main(String[] args) { for(int m=1;m<=5;m++){ for(int i=0;i<5;i++){ System.out.print(m + "\t"); } System.out.println(); } } }

运行结果

练习2】:使用嵌套for循环打印9*9乘法口诀表

备注

我们要学会将复杂的问题拆分成简单的问题,然后再逐渐加大难度

9行我们做不出来,但是我们可以先做一行,比如先做第三行这一行,这一行3是固定的,1、2、3就用循环做

敲代码

 
 

csharp

复制代码

/** * 九九乘法表 */ public class MultiplicationTable { public static void main(String[] args) { // 1*3 2*3 3*3 for(int i=1;i<=3;i++){ System.out.print(i+"*3"+"="+(i*3)+"\t"); } System.out.println(); // 1*4 2*4 3*4 4*4 for(int i=1;i<=4;i++){ System.out.print(i+"*4"+"="+(i*4)+"\t"); } } }

运行结果

考虑使用嵌套循环,解决重复的过程

 
 

csharp

复制代码

/** * 九九乘法表 */ public class MultiplicationTable { public static void main(String[] args) { for(int m=1;m<=9;m++){ // 思考下为什么不是i<=9? for(int i=1;i<=m;i++){ System.out.print(i+"*"+m+"="+(i*m)+"\t"); } System.out.println(); } } }

运行结果

练习3】:使用嵌套循环打印出 5*5的方阵,格式如下

方法一: 使用计数器count,count=1打印"*",count=2打印"#"

 
 

ini

复制代码

/** * 使用嵌套循环打印出5x5方阵 */ public class PhalanxBy5X5 { public static void main(String[] args) { int count = 0; for(int m=1;m<=5;m++){ for(int n=1;n<=5;n++){ count++; if(count==2){ System.out.print("#"+ "\t"); count = 0; }else{ System.out.print("*"+ "\t"); } } System.out.println(); } } }

方法二:m+n如果是奇数就输出"*",m+n如果是偶数就输出"#"

 
 

csharp

复制代码

/** * 使用嵌套循环打印出5x5方阵 */ public class PhalanxBy5X5 { public static void main(String[] args) { // 方法二:m+n如果是奇数就输出"*",m+n如果是偶数就输出"#" for(int m=1;m<=5;m++){ for(int n=1;n<=5;n++){ if((m+n)%2 == 0){ System.out.print("*"+ "\t"); }else{ System.out.print("#"+ "\t"); } } System.out.println(); } } }

运行结果

break语句和continue语句

流程图

区别

  1. break用于强制退出整个循环
  2. continue用于结束本次循环,继续下一次循环

猜你喜欢

转载自blog.csdn.net/BASK2312/article/details/131110393