1.顺序结构
定义:顺序结构描述的是Java语句之间,从上到下(或从左到右)依次执行的执行顺序。
执行流程:顺序结构是程序中最简单最基本的流程控制,没有特定的语法,就是按照代码书写的顺序执行。对于顺序结构而言,写在前面的代码先执行,写在后面的代码后执行。
2.选择结构
Java中,选择结构有2种实现形式,if语句 和switch语句。
if语句格式:
if (关系表达式1) {
语句体1;
} else if (关系表达式2) {
语句体2;
}
…
else {
语句体n+1;
}
switch语句格式:
switch(表达式) {
case 值1:
语句体1;
break;
case 值2:
语句体2;
break;
…
default:
语句体n+1;
break;
}
switch格式解释:
switch关键字:表示这是一个switch语句
switch后的表达式:表示选择条件
case语句:每个case 语句表示一个分支
beak语句:表示结束switch语句
default语句:表示当所有其他的case的分支,都不能匹配switch后表达式的值的时候,此时就会执行default分支。
注意事项:
①switch语句后,表达式结果的取值范围?
switch后的表达式的结果类型:byte、short、int、char
JDK7以后可以是:String字符串
②case 后的常量取值?
不同case后面的值不能相等,且必须和表达式值类型相同
③break可以省略吗?
可以。但是省略之后会发生case穿越现象
④default可以省略吗?
可以。但无法处理非法情况。
问题:选择结构有两种实现方式,这两种实现方式,各自适用于什么样的使用场景呢?
if的使用场景:
针对结果是boolean类型的判断 ;
分支对应多个表达式的多个取值;
switch的使用场景:
针对结果是固定类型的判断 ;
表达式的取值范围只是固定的离散值集合,分支对应表达式的某一种取值;
3.循环结构
循环结构,从语法上来讲,有3种实现形式:
for语句;
while语句;
do while语句;
但是,不管哪种实现形式,都由4部分组成:
初始化语句
条件判断语句
循环体语句
循环控制语句
①for 循环语句格式:
for(初始化语句;判断条件语句;控制条件语句) {
循环体语句;
}
补充:
==for(int i : index)==的意思就是知说,遍历index数组,每次遍历的对象道用内i 这个对象去接收容。
相当于:
int i=0; //用于接收index数组中的某一个对象
for(int j = 0;j<index.length;j++){
i = index[j];
}
注:
1.在for循环中定义的变量i,其作用域仅仅只在for循环中 ;
2.判断条件语句的结果的数据类型只能是boolean型。
②while循环语句格式:
初始化语句;
while (条件判断语句) {
循环体语句;
}
执行流程:
和for循环一模一样
for循环和while循环的联系:
for循环和while循环几乎可以在任何场景下,作等价替换.
for循环和while循环的区别:
直观来说,for循环适合针对一个范围判断进行操作(循环次
数比较明确),while循环适合判断次数不明确操作。
例:我国最高山峰是珠穆朗玛峰:8848m,我现在有一张足够大的纸张,厚度为:0.01m。请问,我折叠多少次,就可以保证厚度不低于珠穆朗玛峰的高度?
double height = 0.01;
int count = 0;
while (height < 8848) {
height *= 2;
count++;
}
③do …while循环语句格式:
初始化语句;
do {
循环体语句;
} while (条件判断)
执行流程:
1执行初始化语句;
2不管是否满足循环条件,都首先执行一次循环体中的代码 ;
3之后的流程和while循环相同.
3种循环结构的综合比较:
3中循环中,for循环和while循环等价 ;
do …while循环与其他两种循环结构相比,略有不同,因为do…while结构可保证循环体至少执行一次.
注意事项:
实际使用时,只要达到预期的效果,用哪个都可以;
如非特殊情况,要注意不要规避死循环问题,如:
for(; ;)或 while(true).
4.跳转控制语句
定义:在循环执行过程中,控制(终止)循环的执行。
为了实现对循环结构更加细粒度的控制,我们得通过跳转控制语句:
break 中断
continue 继续
return 返回
①break的使用场景:
在选择结构的switch语句中
在循环语句中
break的作用:
1.跳出单层循环(如果有多层循环,只跳出内层)
2.结束switch语句
3. 带标签的跳出(多重循环)
格式:标签名: 循环语句
标签名要符合Java的命名规则
②continue的使用场景:
在循环语句中
continue的作用(必须和if配合使用):
结束本次循环,开始下一次循环
也可以使用标签:
outer:
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if( j == 1) {
continue outer;//此时continue结束的是outer表示的外层循环,此效果和break效果相同
}
System.out.println("i = " + i + " -- " + "j = " + j);
}
}
③return的使用场景:
1.return关键字不是为了跳转出循环体 不管有多少层嵌套都全部终止 ;
2.更常用的功能是结束一个方法(函数),也就是退出一个方法;
3.跳转到上层调用的方法。
5.补充
1.根据键盘录入的数值1,2,3,…7输出对应的星期一,星期二,星期三…星期日。
package com.day04;
import java.util.Scanner;
public class demo1 {
public static void main(String[] args) {
int day=0;//1~7
System.out.println("输入数字1~7:");
Scanner input=new Scanner(System.in);
day=input.nextInt();
switch (day){
case 1:
System.out.println("周一");
break;
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;
default:
System.out.println("输入错误!");
break;
}
}
}
2.判断一个5位数是否是回文数(比如12321)
个位等于万位
十位等于千位
package com.day04;
import java.util.Scanner;
public class demo2 {
public static void main(String[] args) {
int n=0;//存储输入数
boolean flag=false;//判断是否是回文数
int length=0;//字符数组长度
System.out.println("输入一个五位数:");
Scanner input=new Scanner(System.in);
n=input.nextInt();
String s= Integer.toString(n);//整型转String类型
char ch[]=s.toCharArray();//字符串存入字符数组
length=ch.length;
for(int i=0;i<length/2;i++)
{
if(ch[i]==ch[length-i-1])
{
flag=true;
}
}
if(flag==true)
{
System.out.println(n+"是回文数");
}else{
System.out.println(n+"不是回文数:");
}
}
}
3.利用switch语句,实现对学生分数评级的功能。
程序的输入是一个int类型的变量score,代表学生的分数取值范围[0,100]
当分数范围为 0=< score <60 输出 不及格
当分数范围为 60=< score <70 输出 及格
当分数范围为 70=< score <80 输出 中
当分数范围为 80=< score <90 输出 良
当分数范围为 90=< score <=100 输出 优
提示:可合理利用case穿越
package com.day04;
import java.util.Scanner;
public class demo3 {
public static void main(String[] args) {
int score=0;//分数
System.out.println("输入成绩:");
Scanner input=new Scanner(System.in);
score=input.nextInt();
switch (score/10) {
case 0:
case 1:
case 2:
case 3:
case 4:
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;
default:
if (score == 100) {
System.out.println("优");
}else {
System.out.println("输入错误");
}
}
}
}
4.在给定的字符数(只包含ascii码表中包含的128个字符)组中找到,第一个只出现一次的字符(假设所给字符数组中一定存在只出现一次的字符)。
package com.day04;
/*
* 双层for循环依次比较每个元素,时间复杂度O(n2)
* */
public class demo4 {
public static void main(String[] args) {
int length=0;//字符数组长度
String str="absdfbaszufbiud";//待检测字符串
boolean flag=false;//若找到置为true
char ch[]=str.toCharArray();//字符串转字符数组
length=ch.length;
for (int i=0;i<length;i++) {
char temp = ch[i];
if(flag==true)
{
break;
}
for (int j = 0; j < length; j++) {
if (ch[j] == temp && j!=i) {
break;
}
if(j==(length-1)) {
System.out.println("第一个只出现一次的字符是:" + ch[i]);
flag=true;
}
}
}
}
}
5.在一个整形数组里,除了两个数字之外,其他数字都出现了2次。请写程序找到这两个只出现了一次的数字。
package com.day04;
/*
* 双层循环暴力求解,时间复杂度O(n2).
*
* */
public class demo5 {
public static void main(String[] args) {
int arr[]={2,6,5,8,2,8,9,9,6,7};
for(int i=0;i<arr.length;i++)
{
int temp=arr[i];
for(int j=0;j<arr.length;j++)
{
if(temp==arr[j] && i!=j)
{
break;
}
if(j==arr.length-1)
{
System.out.println(arr[i]);
}
}
}
}
}