流程控制语句
控制台输入
控制台输入是实现用户与程序之间进行相互交互的工具类。
类:java.util.Scanner 类
导包:import 包名.类名; import 包名.*;
步骤:
- 导包 import java.util.Scanner; import java.util.*;
- 创建控制台输入工具对象 Scanner 对象名 = new Scanner(System.in);
- 调用工具对象的方法来获取数据
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-12jxbtwQ-1689657756562)(D:.java\typora-user-images\image-20230706115542075.png)]
import java.util.Scanner;
public class Test10 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// byte
System.out.println("请输入一个byte的数据");
byte b = scanner.nextByte();
System.out.println("接收后的数据:"+b);
// short
System.out.println("请输入一个short类型的数据");
short s = scanner.nextShort();
System.out.println("接收的数据:"+ s);
// int
System.out.println("请输入一个int类型的数据");
int in = scanner.nextInt();
System.out.println("接收的数据:"+ in);
// long
System.out.println("请输入一个long类型的数据");
long lo = scanner.nextLong();
System.out.println("接收的数据:"+ lo);
// float
System.out.println("请输入一个float类型的数据");
float f = scanner.nextFloat();
System.out.println("接收的数据:"+ f);
// double
System.out.println("请输入一个double类型的数据");
double d = scanner.nextDouble();
System.out.println("接收的数据:"+ d);
// boolean
System.out.println("请输入一个boolean的数据");
boolean bo = scanner.nextBoolean();
System.out.println("接收后:"+ bo);
// String
System.out.println("请输入一个String的数据");
String str = scanner.next(); // nextLine();
System.out.println("接收后的数据:"+ str);
// char 想要获取,则先以字符串来接收单个的字符,然后从字符串中获取第0个位置的数据即可
System.out.println("请输入一个字符"); // a
String st = scanner.next(); // "a"
char ch = st.charAt(0); // ’a‘
System.out.println("接收后的字符:"+ ch);
}
}
程序执行结构
程序执行结构,其实就是程序在运行中执行的顺序。
分类:
- 顺序结构
- 选择结构
- 循环结构
顺序结构
顺序结构是程序的默认执行结构,从上到下的,从左到右的执行。
package day3.test;
public class Test1 {
// debug调试(断点调试) 1.在行号旁边加入断点 2.以debug模式启动 3.点击下一步执行即可(F8)
public static void main(String[] args) {
System.out.println("_____程序的开始________");
int a = 45;
a++;
System.out.println(a);
a=56;
a--;
System.out.println(a);
System.out.println("------程序结束--------");
}
}
debug调试(断点调试)步骤:
- 在行号旁边加入断点
- 以debug模式启动
- 点击下一步执行即可(F8)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cGEvbuxT-1689657756562)(D:.java\typora-user-images\image-20230706114059536.png)]
选择结构
选择结构是程序执行的结构之一,该选择结构就是在整个程序执行中的由选择性的执行要执行的代码。
单分支的if语句
单分支的if语句会对if中的条件进行判断,如果为true,则执行;如果为false,则不执行;
分支语句if…else
控制语句if…else…
语法
可以直接看例子更容易理解,注意if后面的表达式的运算结果一定是boolean类型
第一种结构:
if(boolean表达式){
java语句;
}
解释:如果if后面的boolean表达式是true就执行大括号里面的java语句
如果是false就不执行大括号中的java语句
第二种结构:
if(boolean表达式){
java语句;
}else{
java语句;
}
解释:如果if后面的boolean表达式是true,就执行if大括号中的java语句,
不执行else大括号中的java语句。
如果if后面的boolean表达式是false,就不执行if大括号中的java语句,
会执行else大括号中的java语句。
第三种结构:
if(boolean表达式){
java语句;
}else if(boolean表达式){
java语句;
}else if(boolean表达式){
java语句;
}else if(boolean表达式){
java语句;
}else{
java语句;
}
解释:当if后面的boolean表达式是true时,才会执行当前if大括号中的java语句,
如果if后面的boolean表达式都不是true的话,会执行else中的语句。
注意:如果有两个以上(包括两个)的if后面boolean表达式是true时,会按照从上到下的顺序只执行最上面if大括号中的语句,最多只会执行一个大括号中的语句。
第一种结构:
import java.util.Scanner;
public class If01 {
public static void main(String[] args) {
//年龄改成由用户手动输入
Scanner sc = new Scanner(System.in);
System.out.println("请输入您的年龄");
int age = sc.nextInt();
//判断年龄是否小于18
if (age < 18){
System.out.println("编程从未成年人抓起");
}
}
}
第二种结构:
import java.util.Scanner;
public class If02 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("今天是否下雨");
boolean flag = sc.nextBoolean();
//判断是否下雨来决定带不带伞
if (flag){
System.out.println("带伞");
}else {
System.out.println("不带伞");
}
}
}
模拟登录:
import java.util.Scanner;
/*
根据用户输入的用户名和密码来判断是否登录成功
用户名和密码是整数类型
用户名:1001
密码:123
*/
public class If03 {
public static void main(String[] args) {
//使用快捷键alt + enter 补全等号左边的内容
Scanner sc = new Scanner(System.in);
System.out.println("请输入用户名:");
int name = sc.nextInt();
System.out.println("请输入密码:");
int password = sc.nextInt();
//判断是否输入了正确的用户名和密码
if (1001 == name && 123 == password) {
System.out.println("登录成功");
}else{
System.out.println("登录失败");
}
}
}
第三种结构:
import java.util.Scanner;
public class If04 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
if (num == 0) {
System.out.println("我喜欢打篮球");
} else if (num == 1) {
System.out.println("我喜欢踢足球");
} else if (num == 2) {
System.out.println("我喜欢打排球");
}else{
System.out.println("我都喜欢");
}
}
}
**注意:**分支语句中,如果只有一条java语句,大括号可以省略,但是不推荐这样使用,建议加上大括号。
/*
注意:分支语句中,如果只有一条java语句,大括号可以省略。
但是不推荐这样使用,建议加上大括号。
*/
public class If06 {
public static void main(String[] args) {
/* if (5 < 3)
System.out.println("大于");
System.out.println("好啊");*/
/*
变量的作用域,出了大括号就不认识了
*/
/* if (5 > 3)
int age = 15;
System.out.println(age);*/
if (5 > 3)
System.out.println("大于");
else
System.out.println("小于");
}
}
小练习
通过成绩,判断并输出成绩的等级:
如果成绩在90-100之间,程序输出:A
如果成绩在80-89之间,程序输出:B
如果成绩在60-79之间,程序输出:C
如果成绩在0-59之间,程序输出:D
答案
//导入Scanner包
import java.util.Scanner;
public class ScoreGrade {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个成绩");
//获取输入的成绩
int x = sc.nextInt();
if (x >= 90 && x <= 100) {
System.out.println("A");
}else if (x >= 80 && x <= 89 ) {
System.out.println("B");
}else if (x >= 60 && x <= 79 ) {
System.out.println("C");
}else if (x >= 0 && x <= 59 ) {
System.out.println("D");
}else {
System.out.println("成绩格式错误!");
}
}
}
控制语句switch
控制语句switch
语法
switch(表达式){
case 值1:
java语句;
break;
case 值2:
java语句;
break;
case 值3:
java语句;
break;
default:
java语句;
}
例:
int week = 1;
switch(week) {
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("数字错误");
}
执行流程
* 先计算表达式的值
* 然后和case后面的匹配,如果有就执行对应的语句,否则执行default控制的语句
注意:
– 程序遇到break语句结束了,可以不写break,如果不写,则会发生case穿透现象
– defalut语句也可以没有。
– switch后面的括号中可以填写byte、short、char、int类型,即能够自动转换为int类型的都可以,在jdk7版本之后可以填写String类型。
– case后面只能是常量,不能是变量,而且,多个case后面的值不能出现相同的
例:
String actor = "吴京";
switch(actor) {
case "成龙":
System.out.println("代表作《警察故事》");
case "李连杰":
System.out.println("代表作《黄飞鸿》");
case "吴京":
System.out.println("代表作《战狼》");
default:
System.out.println("我是一个演员");
}
打印季节:
int month = 3;
switch (month) {
case 3:
case 4:
case 5:
System.out.println(month + "月是春季");
break;
case 6:
case 7:
case 8:
System.out.println(month + "月是夏季");
break;
case 9:
case 10:
case 11:
System.out.println(month + "月是秋季");
break;
case 12:
case 1:
case 2:
System.out.println(month + "月是冬季");
break;
default:
System.out.println("对不起没有对应的季节");
break;
}
变量的作用域
变量的作用域:就是变量可以生效的范围和活动空间,是变量定义的开始到变量所属的花括号结束之
间,及其子空间(子花括号中)中。
注意: 在同一个范围中,变量名必须唯一
public class Test6 {
public static void main(String[] args) {
// 变量的作用域:变量一旦定义,其作用于变量定义的位置之后及其中的子空间中(子花括号)
// 注意:在用一个作用域中,变量唯一
//System.out.println(a); // 之前的范围不可以
int a = 78;
System.out.println(a);
if(a>20){
System.out.println(a);
int b = 44;
// 子空间
{
System.out.println(a);
System.out.println(b);
}
System.out.println(b);
}
int b = 45; // 不同的作用域中的另一个b
//System.out.println(b);
System.out.println(a);
}
}
for循环语句
for循环语句
问题
请在控制台里面打印10次HelloWorld。
这时可能你会这么写:
System.out.println("helloworld");
System.out.println("helloworld");
System.out.println("helloworld");
System.out.println("helloworld");
System.out.println("helloworld");
System.out.println("helloworld");
System.out.println("helloworld");
System.out.println("helloworld");
System.out.println("helloworld");
System.out.println("helloworld");
好吧,如果要打印10000次呢?累不死你才怪。
这时就需要使用for循环语句来帮我们解决了。
for循环的语法
for(初始化表达式;条件表达式;循环后的操作表达式) {
循环体;
}
执行流程
1.执行初始化语句,并且在整个循环过程里面只执行一次
2.执行判断条件语句,看其返回值是true还是false
* 如果是true,就继续执行
* 如果是false,就结束循环,整个流程结束
3.执行循环体语句
4.执行循环后的操作表达式
5.程序回到步骤2继续。
例:
//初始化i的值为0,只要i<10则循环一次执行打印语句,每循环一次,i自增1
for(int i=0;i<10;i++){
System.out.println("HelloWorld");
}
下面代码中是将k的声明放到了for循环的上面,这样在for循环的下面也能访问k变量了,一般情况下在使用for的时候还是会将变量的声明放到k中。
下面示例中的循环体后表达式是k+=2,这里的k值每次会执行加2操作,即循环体后表达式的写法是多变的,要根据需求灵活使用。
int k;
for(k=0;k<10;k+=2){
System.out.println("k=" + k); //0 2 4 6 8
}
System.out.println(k);
下面代码中的循环体后表达式是做的自减操作,另外需要注意的是m的初始值是10,条件表达式是m>0
for(int m=10;m>0;m--){
System.out.println("m=" + m); //10..2 1
}
for循环中的变量
在for循环中定义的变量只能在循环内部访问和使用,循环外是无法访问和使用的,这是java中变量的作用域规定的。
for(int i=0;i<10;i++){
System.out.println("Hello");
}
//报错,在循环外无法访问和使用i
System.out.println(i);
下面代码中虽然在两个for循环中都定义了同名的变量i,但是分别是在不同的for循环中定义的,所以是可以正常执行的:
for(int i=0;i<10;i++){
System.out.println("Hello");
}
for(int i=0;i<10;i++){
System.out.println("World");
}
请问下面代码是否可以正常编译并运行?编译报错,因为变量a是在for循环内部创建的,所以在循环外部无法访问和使用。
for(int i=0;i<10;i++){
int a = 10;
System.out.println("Hello");
}
System.out.println(a);
倘若for循环里面的循环体只有一行代码,则大括号可以省略,但是不建议省略,最好写上。
for(int i=0;i<10;i++)
System.out.println(i);
死循环
如果for循环编写不当,可能会造成死循环,循环会一直执行,在编写程序时一定要避免,下面就是一个死循环,会一直打印Test
for(;;){
System.out.println("Test");
}
嵌套for循环
for循环语句还可以嵌套使用,也就是说在一个for循环的内部,可以再定义一个for循环,在阅读这种嵌套for循环代码的时候,可以将内部的for循环看做是一个普通的语句,这样会好理解一些
for(int i=5;i>0;i--){
//因为该for循环是在上面for循环的内部,所以是可以访问变量i的
for(int j=0;j<i;j++){
System.out.print(j+" ");
}
//换行
System.out.println();
}
利用嵌套for循环打印5行10列的*
for(int m = 0; m < 5;m++){
for(int n = 0; n < 10; n++){
System.out.print("*");
}
System.out.println();
}
练习
1.计算1-100所有的奇数求和
2.在屏幕中打印九九乘法表
答案
1.在for循环里面加上if语句来判断当前循环的数字是否为奇数,思路是先找到1~100之间的数字,然后判断数字是否是奇数,如果是的话再进行求和运算。
int sum = 0;
for(int i=1;i<=100;i++){
if(i%2 != 0){
//奇数
//追加
sum += i;
}
}
System.out.println(sum);
2.九九乘法表一共要输出9行,首先写一个for循环来控制行数:
for (int i = 1; i <= 9; i++) {
System.out.println(i);
}
接下来比如我要输出九九乘法表的第一行,即1 * 1 = 1,写一个for循环:
for(int j=1; j<=1; j++){
System.out.print(1 + "*" + j + "=" +1*j + " ");
}
九九乘法表的第二行,即2*1=2, 2 * 2=4
for(int j=1; j<=2; j++){
System.out.print(2 + "*" + j + "=" +2*j + " ");
}
后面依次类推,可以发现需要修改的地方都是固定的,可以将上面的for循环修改为下面:
int i = 9;
for(int j=1; j<=i; j++){
System.out.print(i + "*" + j + "=" +i*j + " ");
}
只需要将i修改为要输出的行数就可以,而这个变量i其实可以从第一个for循环中获取,将两个循环进行嵌套:
//外层for循环控制换行,变量i是行号
for (int i = 1; i <= 9; i++) {
//System.out.println(i);
// 输出规律:
// 第1行,输出1个
// 第2行,输出2个
// 第3行,输出3个
// ...
// 第9行,输出9个
// 第i行,输出i个
for (int j = 1; j <= i; j++) {
// 这里不要换行
System.out.print(i + "*" + j + "=" + i * j + " ");
}
// 注意:上面的for循环结束之后表示一行输出结束了,换行
System.out.println();
}
while循环语句
while循环语句
while循环的作用跟for一样。语法
初始化语句;
while(boolean表达式) {
循环体语句;
控制条件语句;
}
执行过程:
只要boolean表达式里面的结果是true,就会执行while大括号里面的语句,直到boolean表达式的结果变为false,循环结束。while循环的次数是:0-N次
示例1:
int i = 0;
while(i<10){
i++;
System.out.println(i); //1 ... 9 10
}
//一定要在while循环体中添加修改boolean表达式状态的代码,保证某次循环后的boolean表达式是false,否则会出现死循环。
示例2:
int i = 0;
while(i<10){
System.out.println(i); //0... 9
i++;//将i++放在下面
}
在编写while循环时需要注意不要出现死循环的情况
while(true){
System.out.println("死循环");
}
while和for的比较
for循环适合确定循环次数的场景
while适合循环次数不确定的场景
当然,在大部分场景下,使用for和while都可以实现需求
练习:
在控制台输入若干正整数,当输入-1的时候表示结束,将这些输入的最大的数打印。
Scanner sc = new Scanner(System.in);
boolean flag = true;
//定义最大值
int max = 0;
while (flag) {
System.out.println("请输入一个正整数:");
//获取用户输入的数
int num = sc.nextInt();
if (num == -1) {
//结束循环
flag = false;
} else if (max < num) {
max = num;
}
}
System.out.println("最大值是:" + max);
循环语句_do_while
循环语句_do…while
语法
初始化语句;
do {
循环体语句;
控制条件语句;
}while(boolean表达式);
执行过程:
首先会执行do循环体中的语句,然后运算while中的boolean表达式,如果是true则继续执行do循环体中的语句,如果是false,则循环执行结束。
do里面的语句至少会执行一次,执行之后根据while里面的条件判断语句来判定是否继续循环执行do里面的语句。
注意:while后面的;不要忘记,否则会报错。
例:
int i = 11;
do {
System.out.println("i = " + i);
i++;
}
while (i <= 10);
三种循环语句的区别:
- do…while循环至少执行一次循环体。
- 而for,while循环必须先判断条件是否成立,然后决定是否执行循环体语句。
练习
模拟用户登录功能,用户名是1001,密码是123
如果输入正确则登录成功
否则登录失败,如果失败次数超过3次,则不允许用户登录
答案
Scanner sc = new Scanner(System.in);
boolean flag = true;
int count = 0;//计数器
while (flag) {
System.out.println("请输入用户名:");
int name = sc.nextInt();
System.out.println("请输入密码:");
int password = sc.nextInt();
//判断是否输入正确
if (1001 == name && 123 == password) {
System.out.println("登录成功");
flag = false;//结束循环
}else {
count++;
//判断count的值是否等于3
if (count == 3) {
flag = false;
}
System.out.println("登录失败");
}
}
控制语句_break和continue
By 小猴子1024 |
break
break是java语言中的关键字,中文是打断,终止的意思
- 可以用在switch语句中,结束分支语句,防止case穿透现象的发生.
- 可以出现在循环当中,作用是结束整个循环的执行,默认情况下结束离它最近的一个循环.
for(int i=0;i<10;i++){
System.out.println(i);
if(i==5){
break; //只是结束离它最近的一个循环.
//return; //返回,结束的是方法.
}
}
System.out.println("Hello World!");
关于return关键在后面方法部分会介绍,return的作用是返回,它的作用不是结束循环的,而是结束方法的,例如main方法。
默认情况下break;语句跳出的是离它最近的循环。
for( int j = 0 ; j < 2 ; j ++ ){
System.out.println( "--> " + j );
for( int i = 0 ; i < 10 ; i ++ ){
if(i == 5){
//终止的是最近的这个循环。
break; //默认情况下break;语句跳出的是离它最近的循环。
}
System.out.println("i = " + i);
}
}
break还可以控制结束嵌套循环,下面给循环进行了命名,这样可以break掉指定循环
outerFor:for(int i=5;i>0;i--){
innerFor:for(int j=0;j<i;j++){
if(j==2){
break outerFor;
}
System.out.print(j);
}
System.out.println();
}
continue
continue中文是继续的意思,程序执行到continue语句时,直接结束本次循环,进入下一次循环。
for(int i=0;i<10;i++){
if(i==5){
continue;
}
System.out.println(i);
}
continue也可以像break那样加上循环的名字:
outerFor:for(int i=5;i>0;i--){
innerFor:for(int j=0;j<i;j++){
if(j==2){
continue outerFor;
}
System.out.print(j);
}
System.out.println();
}
break和continue的区别?
假设有10个人参加面试,现在进行到第三个人了,突然,面试官有事了,需要走,那么今天剩下这些人就没有办法继续面试了,显然面试整个结束了。(break)
break还可以控制结束嵌套循环,下面给循环进行了命名,这样可以break掉指定循环
outerFor:for(int i=5;i>0;i--){
innerFor:for(int j=0;j<i;j++){
if(j==2){
break outerFor;
}
System.out.print(j);
}
System.out.println();
}
continue
continue中文是继续的意思,程序执行到continue语句时,直接结束本次循环,进入下一次循环。
for(int i=0;i<10;i++){
if(i==5){
continue;
}
System.out.println(i);
}
continue也可以像break那样加上循环的名字:
outerFor:for(int i=5;i>0;i--){
innerFor:for(int j=0;j<i;j++){
if(j==2){
continue outerFor;
}
System.out.print(j);
}
System.out.println();
}
break和continue的区别?
假设有10个人参加面试,现在进行到第三个人了,突然,面试官有事了,需要走,那么今天剩下这些人就没有办法继续面试了,显然面试整个结束了。(break)
假设有10个人参加面试,现在进行到第三个人了,面试官想要招聘一位女生做秘书,但是这第三个人是一位男士,面试官说:今天咱们就聊到这里吧,下一位。(continue)