流程控制分类
程序执行过程中的执行路径称之为流程控制。
所有编程语言中都对于程序的执行路径做了统一的规划,统一分为三个部分:
顺序流程、分支流程、循环流程。
顺序流程
自上而下执行。 所有的程序都是顺序流程的。
main方法中的代码都是自上而下 逐行执行。它也是程序的主干流程。
分支流程
程序在执行的过程中,开辟多条其他的执行路径。
if 、 switch
循环流程
程序在执行的过程中,可能针对于某些代码要重复 往复执行。
while 、do-while、 for
if分支结构
if单分支
// 测试if单分支结构
public class IfTest01{
public static void main(String[] args) {
//1: 需求-> 声明一个用户名 一个密码 仿照登录
//1: 声明两个变量存储 注册的数据信息
int regUname = 123;
int regPwd = 123;
//2: 模拟登录
int loginUname = 123;
int loginPwd = 123456;
//3: 声明一个变量存储是否登录成功
boolean flag = regUname==loginUname && regPwd==loginPwd;
//4:判定
if(flag){
System.out.println("恭喜你 登录成功");
}
System.out.println("测试结束");
}
}
语法结构
if(expression){ // 表达式 表达式的结果是一个boolean值
statement;
。。。。。
}
执行顺序
判定表达式的值
如果表达式的值是true 执行对应的执行语句 如果后续存在代码继续向下执行
如果表达式的值是false 跳过当前的单分支 ,如果后续存在代码继续向下执行
注意事项
if中是可以编写赋值语句的,if单分支的分支结构比较单一,用途是最广泛的。
flag = true;
if(flag=false){ // ==不能写赋值 D D D C C
System.out.println("我进来了。。。");
}
System.out.println("我结束了。。");
if双分支
// 测试if双分支结构
// 产生一个随机数N[0,10086] 用户输入一个数字M 判定当前用户输入的数字和产生的数字关系 打印输出大了 小了
public class IfTest02{
public static void main(String[] args) {
// 产生一个随机数[12,77] 判定该数字的奇偶性
int random = (int)(Math.random()*(77-12+1)+12);
System.out.println("产生的随机数是:"+random);
// 判定
boolean flag = random%2==0;
if (flag) {
System.out.println("这是一个偶数");
}else{
System.out.println("这是一个奇数");
}
System.out.println("执行结束。。。。。");
}
}
语法结构
if(expression){ // boolean值
statement1;
......}else{
statement2;
......}
执行顺序
判定表达式的值
如果表达式的值是true 执行对应的if中的执行语句 如果后续存在代码继续向下执行
如果表达式的值是false 执行else中对应的执行语句 ,如果后续存在代码继续向下执行
注意事项
条件互斥。
if多分支
import java.util.Scanner;
// 测试if多分支结构
// 产生一个随机数N[23,36] 用户输入一个数字M 判定当前用户输入的数字和产生的数字关系 打印输出大了 小了 等于
public class IfTest03{
public static void main(String[] args) {
// 产生一个随机数[23,36] 判定该数字的奇偶性
int random = (int)(Math.random()*(36-23+1)+23);
System.out.println("产生的随机数是:"+random);
// 获取用户输入的值
Scanner input = new Scanner(System.in); // int a = 10;
int inputNum = input.nextInt(); // 阻塞方法
System.out.println("您输入的数字是>>>>>>"+inputNum);
if (random==inputNum) {
System.out.println("恭喜您 猜对了 你真的是天选之子!!!");
}else if(random>inputNum){
System.out.println("不好意思 你的格局小了。。。。");
}else if(random<inputNum){
System.out.println("不好意思 你的格局大了。。。。");
}/*else{
System.out.println("不好意思 输入有误。。。");
}*/
System.out.println("GAME OVER");
}
}
语法结构
if(expression1){ // boolean值
statement1;
......
}else if(expression2){
statement2;
......
}........{
..........
}[else{
}]
执行顺序
判定表达式1的值 ,如果表达式1的值是true,则执行对应的执行语句1 结束整个多分支 执行后续代码
如果表达式1的值是false,则判定表达式2的值,如果表达式2为true,则执行对应的执行语句2,结束整个多分支 。。。。。。。
如果所有的表达式都是false,并且整个多分支还包含else,则执行else对应的执行语句, 结束整个多分支 执行后续代码
注意事项
分支不要太多。修剪分支的方式(算法规避、大话设计模式)
switch分支结构
public class SwitchTest01{
public static void main(String[] args) {
// 随机产生一个1-12的数字 代表月份 输出当前月份所属的季节
int month = (int)(Math.random()*16+1);
System.out.println("当前所属的月份是:"+month);
// String month = "12月";
// 使用switch进行判定
switch(month){
case 2:
/*System.out.println("春天在哪里呀,春天在哪里");break;*/
case 3:
/*System.out.println("春天在哪里呀,春天在哪里");break;*/
case 4:
System.out.println("春天在哪里呀,春天在哪里");break;
case 5:
/*System.out.println("夏天夏天 悄悄过去,留下小秘密");break;*/
case 6:
/*System.out.println("夏天夏天 悄悄过去,留下小秘密");break;*/
case 7:
System.out.println("夏天夏天 悄悄过去,留下小秘密");break;
case 8:
/*System.out.println("就让秋风带走我的思念 带走我的泪");break;*/
case 9:
/*System.out.println("就让秋风带走我的思念 带走我的泪");break;*/
case 10:
System.out.println("就让秋风带走我的思念 带走我的泪");break;
case 11:
/*System.out.println("你就像那冬天里的一把火 熊熊火焰燃烧了我。。。");break; */
case 12:
/*System.out.println("你就像那冬天里的一把火 熊熊火焰燃烧了我。。。"); break;*/
case 1:
System.out.println("你就像那冬天里的一把火 熊熊火焰燃烧了我。。。");break;
default:
System.out.println("不好意思 输入有误"); break;
}
System.out.println("执行结束。。。。");
}
}
语法结构
switch(expression){ // 获取到一个值
case value1:
statement1;
case value2:
statement2;
case valueN:
statementN;
。。。。。。。
}
执行顺序
计算表达式的值 ,然后依次匹配对应的case,如果【匹配上了执行对应的执行语句;结束整个switch
如果没有匹配上,继续判定后续的case
直到所有都没有匹配,执行default内容
注意事项
break 防止穿透
表达式的值一定是基本数据(byte、short、int、char),JDK1.5之后支持放枚举(enum) JDK1.7之后支持放String。
for循环结构
public class Class002_Practice {
public static void main(String[] args) {
//求1-100的和,求1-100的偶数和,求1-100的奇数和
//重复求和 [1,100]
int sum = 0; //整数和
int sum1 = 0; //奇数和
int sum2 = 0; //偶数和
for(int i=1;i<=100;i++){
sum+=i; //所有整数和
if(i%2!=0){
sum1+=i;
}else{
sum2+=i;
}
}
System.out.println(sum);
System.out.println(sum1);
System.out.println(sum2);
//偶数
sum2=0;
for(int i=0;i<=100;i+=2){
sum2+=i;
}
System.out.println(sum2);
//1-50当中能被4整除的数的和
sum=0;
for(int i=1;i<=50;i++){
if(i%4==0){
sum+=i;
}
}
System.out.println(sum);
//求出 1-100当中既能被3整除又能被5整除还能被2整除的和,
sum=0;
for(int i=1;i<=100;i++){
if(i%2==0 && i%3==0 && i%5==0){
sum+=i;
}
}
System.out.println(sum);
//求出 1-100当中能被3整除或者能被5整除或者能被2整除的和
sum=0;
for(int i=1;i<=100;i++){
if(i%2==0 || i%3==0 || i%5==0){
sum+=i;
}
}
System.out.println(sum);
//求5的阶乘 5! 5*4*3*2*1
int result = 1;
for(int i=5;i>=1;i--){
result*=i;
}
System.out.println(result);
//请找出[100,300]之间能被5整除的所有数,每行输出8个数
sum=0;
int count=0;
for(int i=100;i<=300;i++){
if(i%5==0){
count++;
System.out.print(count<8?i+",":i);
}
if(count%8==0){
System.out.println("");
count=0;
}
}
/*
请找出[100,300]之间能被5整除的所有数,每行输出8个数,每两个数之间用逗号隔开
例如 :
100,105,110,115,120,125,130,135
....
*/
}
}
语法结构
for(条件初始化;条件判断;条件变化){
重复执行的代码段;
}
执行顺序
执行条件初始化
条件判断 : 值为boolean类型的表达式
值为false : 循环结构结束
值为true : 继续执行本次循环体语句{}
条件变化 i++ i+=10; i*=3; 重复执行第2,3步骤
注意事项
在重复执行多次代码的时候,如果能够确定循环次数|确定变量变化的区间与规律--->for
如果循环体语句只有一句,前后的{}可以省略