控制语句
控制语句:把语句组合成能完成一定功能的小逻辑模块。它分为三类:顺序、选择和循环。
- “顺序结构”代表“先执行a,再执行b”的逻辑
- “条件判断结构”代表“如果…,则…”的逻辑
- “循环结构”代表“如果…,则重复执行”的逻辑
很神奇的是,三种流程控制语句就能表示所有的事情!实际上,任何软件和程序,小到一个练习,大到一个操作系统,本质上都是由“变量、选择语句、循环语句”组成
条件判断结构(选择结构)
条件判断结构:if结构和switch结构。而if结构又可以分为if单分支结构、if-else双分支结构、if-else if-else多分支结构。
单分支结构
流程图
语法结构
下面的语法结构和上面图对应
if(布尔表达式){
语句块
}
备注
- 如果if语句不写{},则只能作用于后面的第一条语句。
- 强烈建议,任何时候都写上{},即使里面只有一句话!
【敲代码】if单分支结构(掷骰子游戏)
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双分支结构
流程图
语法结构
下面的语法结构和上面图对应
if(布尔表达式){
语句块1
}else{
语句块2
}
【敲代码】
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多分支结构
流程图
语法结构
下面的语法结构和上面图对应
if(布尔表达式1){
语句块1;
}else if(布尔表达式2){
语句块2;
}... ...
else if(布尔表达式n){
语句块n;
}else{
语句块
}
【敲代码 1】
/**
* 测试多分支结构
*/
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】
/**
* 测试多分支结构
*/
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多分枝结构(多值情况)
流程图
语法结构
与上图相对应的语法结构:
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不行)、枚举、字符串
【敲代码】
/**
* 测试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("你已经毕业了");
}
}
}
【运行结果】
【敲代码】
/**
* 测试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的地方为止)。
【敲代码】
/**
* 测试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
介绍
循环结构分两大类,一类是当型,一类是直到型
- 当型
当布尔表达式条件为true,反复执行某语句,当布尔表达式的值为false是时才停止循环,比如while与for循环(为主)
- 直到型
先执行某语句,再判断布尔表达式,如果为true,再执行某语句,如此反复,直到布尔表达式条件为false时才停止循环,比如 do -whitle
语法结构
流程图
语法结构
whtile(布尔表达式){
循环体
}
备注
1.在循环刚开始时,会计算一次“布尔表达式”的值,若条件为真,执行循环体。而后来每一次额外的循环,都会在开始前重新计算一次
- 语句中应有使循环趋向于结束的语句,否则会出现无限循环 – “死”循环
【敲代码】
/**
* 测试while循环
*/
public class TestWhile {
public static void main(String[] args) {
int a = 0;
while (a<3){
System.out.println("while循环了"+ a + "次");
a++;
}
}
}
【运行结果】
备注
while循环中布尔表达式中的变量,在循环体中要发生变化,否则就会死循环
【敲代码】
/**
* 测试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是一样的
语法结构
for(初始表达式;布尔表达式;迭代因子){
循环体;
}
备注
- 初始化部分设置:循环变量的初值
- 条件判断部分为:布尔表达式
- 迭代因子:控制循环变量的增减
for循环在执行条件判定后,先执行循环体部分,再执行迭代因子
【敲代码】
/**
* 测试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);
}
}
【运行结果】
【敲代码】
/**
* 测试for循环
*/
public class TestFor02 {
public static void main(String[] args) {
// 输入9-1间的数
for(int i = 9;i>0;i--){
System.out.print(i + "\t");
}
}
}
【运行结果】
【敲代码】
/**
* 测试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整除
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循环(了解即可)
流程图
语法结构
do {
循环体;
}whuile(布尔表达式)
do-while循环结构会先执行循环体,然后再判断布尔表达式的值,也就是说不管条件符不符合至少执行一次
练习
- 计算100之内的累加和、所有奇数和、所有偶数和
【敲代码】
/**
* 计算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循环使用就会报错
【运行结果】
- 循环0-130之间的数字,每行显示5个数字
【敲代码】
方法一: 值能被5整除就换行
/**
* 循环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个就换行
/**
* 循环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
【敲代码】
/**
* 测试嵌套循环
*/
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就用循环做
【敲代码】
/**
* 九九乘法表
*/
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");
}
}
}
【运行结果】
考虑使用嵌套循环,解决重复的过程
/**
* 九九乘法表
*/
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打印”#”
/**
* 使用嵌套循环打印出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如果是偶数就输出”#”
/**
* 使用嵌套循环打印出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语句
流程图
区别
- break用于强制退出整个循环
- continue用于结束本次循环,继续下一次循环