Java 流程控制
用户交互Scanner
Scanner对象
next();
next();
- 一定要读取到有效字符后才可以结束输出
- 对输入有效字符之前遇到的空白,next() 方法会自动将其去掉
- 只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符
- !!next() 不能得到带有空格的字符串!!
package Java流程控制.scanner;
import java.util.Scanner;
public class Demo1 {
public static void main(String[] args) {
//创建一个扫描仪对象,用于接收键盘数据
Scanner sc = new Scanner(System.in);
System.out.println("使用next方法接收:");
//判断用户有没有输入字符串
if(sc.hasNext()) {
//使用next方式接收
String str = sc.next();
System.out.println("输入的内容是:"+str);
}
//凡是属于IO流的类如果不关闭会一直占用资源,要养成好的习惯用完就关掉
sc.close();
}
}
结果:
nextLine();
nextLine();
- 以Enter为结束符,也就是说 nextLine() 方法返回的是输入回车之前的所有字符
- 可以获得空白
package Java流程控制.scanner;
import java.util.Scanner;
public class Demo2 {
public static void main(String[] args) {
// 从键盘接收数据
Scanner sc = new Scanner(System.in);
System.out.println("使用nextLine方式接收:");
// 判断是否还有输入
if(sc.hasNextLine()) {
//使用nextLine方式接收
String str = sc.nextLine();
System.out.println("输入的内容是:"+str);
}
//关闭Scanner
sc.close();
}
}
结果:
判断输入数据的数据类型
package Java流程控制.scanner;
import java.util.Scanner;
public class Demo4 {
public static void main(String[] args) {
//调用扫描仪,接收键盘数据
Scanner scanner = new Scanner(System.in);
int i = 0;
float f=0.0f;
System.out.println("请输入:");
//判断输入的是否为整数
if (scanner.hasNextInt()){
//把输入的 int 值赋值给 i
i = scanner.nextInt();
//如果 i 为整数则输出下面语句
System.out.println("输入的整数是:"+i);
}else {
//如果 i 不为整数则输出下面语句
System.out.println("输入的不是整数,请重新输入");
}
//Scanner没有结束,继续往下走
System.out.println("请输入小数:");
//判断输入的是否为小数
if(scanner.hasNextFloat()){
//把输入的 float 值赋值给 f
f = scanner.nextFloat();
//如果 f 为小数则输出下面语句
System.out.println("输入的小数为:"+f);
}else{
//如果 f 不为小数则输出下面语句
System.out.println("输入的不是小数");
}
//关闭Scanner
scanner.close();
}
}
计算多个数据的总和与平均值
package Java流程控制.scanner;
import java.util.Scanner;
public class Demo5 {
public static void main(String[] args) {
System.out.println("请输入:");
//我们可以输入多个数字,并求其总和与平均数,每输入一个数字用回车确认,通过输入非数字来结束输入并输出执行结果
Scanner scanner = new Scanner(System.in);
//总和
double sum = 0;
//计算输入了几个数字
int i = 0;
//通过循环判断是否还有输入,并在里面对每一次进行求和和统计
while (scanner.hasNextDouble()){
double d = scanner.nextDouble();
i++;
sum = sum + d;
System.out.println("你输入的第"+i+"个数,当前的结果为"+sum);
}
System.out.println(i+"个数的和为:"+sum);
System.out.println(i+"个数的平均数为:"+(sum/i));
scanner.close();
}
}
顺序结构
package Java流程控制.struct;
public class ShunXuDemo {
//顺序结构,从上往下执行
public static void main(String[] args) {
System.out.println(1);
System.out.println(2);
System.out.println(3);
System.out.println(4);
System.out.println(5);
}
}
结果:
选择结构
选择结构包括:
- if单选择结构
- if双选择结构
- if多选择结构
- 嵌套的if结构
- switch多选择结构
if单选择结构
package Java流程控制.struct.选择结构;
import java.util.Scanner;
public class If {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
System.out.println("请输入:");
String str = scanner.nextLine();
//equals:判断字符串是否相等
if(str.equals("hello")){
System.out.println(str);
}
System.out.println("End");
scanner.close();
}
}
if多选择结构
package Java流程控制.struct.选择结构;
import java.util.Scanner;
public class If_Else {
public static void main(String[] args) {
//考试分数大于60分就是及格,小于60分就是不及格
Scanner sc = new Scanner(System.in);
System.out.println("请输入成绩:");
int score = sc.nextInt();
//判断分数是否大于或等于60
if(score>=60){
System.out.println("及格");
}else{
System.out.println("不及格");
}
//关闭scanner
sc.close();
}
}
if多选择结构
package Java流程控制.struct.选择结构;
import java.util.Scanner;
public class If_ElseIf_Else {
public static void main(String[] args) {
//给成绩分为等级制,分别为:满分,A级,B级,C级,D级,不及格 和 格式错误
Scanner scanner = new Scanner(System.in);
System.out.println("请输入成绩:");
int score = scanner.nextInt();
/*
if多选择结构最多且只能有 1 个 else 语句结尾, else 语句在所有的 else if 语句之后
if多选择结构可以有若干个 else if 语句,它们必须在 else 语句之前
一旦其中一个 if 或 else if 语句被检测为true,其他的else if 以及 else 语句都将跳过执行
*/
if (score==100){
System.out.println("恭喜满分");
}else if(score<100 && score>=90){
System.out.println("A级");
}else if(score<90 && score>=80){
System.out.println("B级");
}else if(score<80 && score>=70){
System.out.println("C级");
}else if(score<70 && score>=60){
System.out.println("D级");
}else if (score<60 && score>=0){
System.out.println("不及格");
}else{
//为防止用户输入100~0以外的数字或字符等
System.out.println("分数为100分制,格式错误!");
}
//关闭scanner
scanner.close();
}
}
嵌套的 if 结构
package Java流程控制.struct.选择结构;
import java.util.Scanner;
public class If_If {
public static void main(String[] args) {
//嵌套的if结构
Scanner scanner = new Scanner(System.in);
System.out.println("请输入成绩:");
int score = scanner.nextInt();
//判断
if (score>=60){
//条件成立输出下面语句
System.out.println("合格");
//嵌套判断
if (score==100){
//上级 if 语句成立,则判断此 if 语句
//条件成立则输出上面语句与下面语句,条件不成立则只输出上面语句
System.out.println("合格且满分");
}
}
//关闭scanner
scanner.close();
}
}
switch多选择结构
package Java流程控制.struct.选择结构;
public class SwitchDemo1 {
public static void main(String[] args) {
char grade = 'B';
//case穿透
//switch 匹配一个具体的值
switch (grade){
case 'A':
System.out.println("优秀");
break;//可选
case 'B':
System.out.println("良好");
break;//可选
case 'C':
System.out.println("及格");
break;//可选
case 'D':
System.out.println("挂科");
break;//可选
default://可选
System.out.println("格式错误");
}
}
}
输出结果为:良好
JDK7的新特性,表达式结果可以是字符串
package Java流程控制.struct.选择结构;
public class SwitchDemo2 {
public static void main(String[] args) {
String name = "小红";
//JDK7的新特性,表达式结果可以是字符串!!!
//字符的本质还是数字
/*
正常编译 java --- class
进行反编译
!!只能在磁盘文件夹里面进行拷贝!!
out文件夹里面的class文件(字节码文件)从磁盘文件夹复制到 src文件夹里的java文件夹里面 ---
---> 在IDEA里面打开class文件 反编译(IDEA)
*/
switch (name){
case "小红":
System.out.println("小红到");
break;
case "小花":
System.out.println("小花到");
break;
case "小周":
System.out.println("小周到");
break;
default:
System.out.println("找不到这个人");
}
}
}
输出结果为:小红到
循环结构
while 循环
package Java流程控制.struct.循环结构;
public class WhileDemo2 {
public static void main(String[] args) {
//计算1+2+3...+100=?
int i = 0;
int sum = 0;
// while 先判断后执行
while (i<=100){
sum = sum + i;
i++;
}
System.out.println(sum);//5050
}
}
do while 循环
package Java流程控制.struct.循环结构;
public class DoWhileDemo1 {
public static void main(String[] args) {
int i = 0;
int sum = 0;
//do while 是先执行后判断! do while 总是保证循环体会被至少执行一次!这是和 while 的主要差别
do {
sum = sum + i;
i++;
}while (i<=100);
System.out.println(sum);//5050
}
}
对比while 和 do while 区别
package Java流程控制.struct.循环结构;
public class DoWhileDemo2 {
public static void main(String[] args) {
int i = 1;
//while 循环 先判断后执行
while (i>5){
System.out.println(i);
i++;
}
System.out.println("===========================");
//do while 循环 先执行后判断! do while 总是保证循环体会被至少执行一次!这是和 while 的主要差别
do {
System.out.println(i);
i++;
}while (i>5);
}
}
For循环
for 循环的结构
package Java流程控制.struct.循环结构;
public class ForDemo1 {
public static void main(String[] args) {
// 初始化 // 条件判断 //迭代
for (int i = 1; i <= 100; i++) {
System.out.println(i);
}
System.out.println("for循环结束");
/*
关于 for 循环有以下几点说明:
最先执行初始化步骤。可以声明一种类型,但可初始化一个或多个循环控制变量,也可以是空语句。
然后,检测布尔表达式的值。如果为 true,循环体被执行。如果为 false,循环终止,开始执行循环体后面的语句。
执行一次循环后,更新循环控制变量(迭代因子控制循环变量的增减)。
再次检测布尔表达式。循环执行重复的过程,知道布尔表达式为 false。
*/
//死循环
for ( ; ; ){
}
}
}
练习
for 循环练习一:计算 0~100 之间的 奇数和 , 偶数和
package Java流程控制.struct.循环结构;
public class ForDemo2 {
public static void main(String[] args) {
//计算 0~100 之间的 奇数和 , 偶数和
int oddSum = 0;
int evenSum = 0;
//初始化 //条件判断 //迭代
for (int i = 0; i <= 100; i++) {
if (i%2 != 0){//奇数
oddSum += i;
}else{//偶数
evenSum += i;
}
}
System.out.println("奇数的和为:"+oddSum);//2500
System.out.println("偶数的和为:"+evenSum);//2550
}
}
for 循环练习二:用 while 或 for 循环输出 1~1000 之间能被5整除的数,并每行输出3个数
package Java流程控制.struct.循环结构;
public class ForDemo3 {
public static void main(String[] args) {
//用 while 或 for 循环输出 1~1000 之间能被5整除的数,并每行输出3个数
//for循环
// 初始化 // 条件判断 // 迭代
for (int i = 1; i <= 1000; i++) {
//判断能被 5 整除的数,将它输出
if (i%5 == 0){
System.out.print(i+"\t");//不换行输出
}
//判断每行的第三个数
if (i%(3*5) == 0){
System.out.println();//换行输出
//System.out.print("\n");
}
}
// //while循环
// int i = 1;
// while (i<=1000){
// if (i%5 == 0){
// System.out.print(i+"\t");
// if (i%(3*5) == 0){
// System.out.print("\n");
// //System.out.println();
// }
// }
// i++;
// }
}
}
for 循环练习三:打印九九乘法表
package Java流程控制.struct.循环结构;
public class ForDemo4 {
public static void main(String[] args) {
//打印九九乘法表
//1x1=1
//1x2=2 2x2=4
//1x3=3 2x3=6 3x3=9
//1x4=4 2x4=8 3x4=12 4x4=16
//1x5=5 2x5=10 3x5=15 4x5=20 5x5=25
//1x6=6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36
//1x7=7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49
//1x8=8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64
//1x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81
//嵌套 for循环
//因为九九乘法表需要 2个变量,所以需要使用 嵌套 for循环
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
System.out.print(j+"x"+i+"="+(i*j)+"\t");//不换行输出
}
System.out.println();//换行输出,结果如上
//System.out.print("\n");//加入换行符,也可以实现换行
}
// //倒过来的九九乘法表
// for (int i = 9; i >= 1; i--) {
// for (int j = 1; j <= i; j++) {
// System.out.print(j+"x"+i+"="+(i*j)+"\t");
// }
// System.out.println();
// }
}
}
增强 for 循环
package Java流程控制.struct.循环结构;
public class ForDemo5 {
public static void main(String[] args) {
int[] numbers = {10,20,30,40,50};//定义一个数组
for (int i = 0; i < 5; i++) {
System.out.print(numbers[i]+"\t");
}
System.out.println("\n==================");
//遍历数组的元素
for (int x:numbers) {
System.out.print(x+"\t");
}
}
}
结果:
break & continue
break
package Java流程控制.break_AND_continue;
public class breakDemo {
public static void main(String[] args) {
//for 循环输出100个数
for (int i = 1; i <= 100; i++) {
//如果 i = 20 的时候循环强制退出,不执行循环剩余语句
if (i == 20){
break;//强制退出循环
}
System.out.println(i);
}
}
}
continue
package Java流程控制.break_AND_continue;
public class continueDemo {
public static void main(String[] args) {
//for 循环输出100个数
for (int i = 1; i <= 100; i++) {
//如果 i 是偶数则不执行跳过这次循环,然后接着进行剩余循环
if (i%2 == 0){
continue;//跳过此次循环
}
System.out.println(i+"\t");
}
/*
break在任何循环语句的主体部分,均可用break控制循环的流程
break用于强制退出循环,不执行循环中剩余的语句。(break 语句也在 switch语句中使用)
*/
/*
continue 语句用在循环语句体中,用于终止某次循环过程,即跳过循环体中尚未执行的语句,接着进行下一次是否执行循环的判断。
*/
}
}
goto
类似goto的用法
package Java流程控制.break_AND_continue;
public class LableDemo {
public static void main(String[] args) {
//打印 101~150之间的质数
//质数是指在大于 1的自然数中,除了 1和它本身以外不再有其他因数的自然数
//outer可以理解成一个标签
outer:for (int i = 101; i < 150; i++) {
for (int j = 2; j < i/2; j++) {
if (i % j == 0){
continue outer;//跳出,返回到 outer标签
}
}
System.out.print(i+" ");
}
}
}
Exercise
Test
打印一个5行的三角形
*
***
*****
*******
*********
package Java流程控制.z_exercise;
public class Test1 {
public static void main(String[] args) {
//打印三角形 5行的正三角形
// *
// ***
// *****
// *******
//*********
for (int i = 1; i <= 5; i++) {
/* 思路:
1.左侧应该输出一个空白的倒直角三角形,使‘结果三角形’形成形状
2.把‘结果三角形’拆分为2个三角形来输出,那‘结果三角形’就需要使用2个子循环
*/
//左侧输出一个空串的倒直角三角,使结果的三角形左侧形成斜的形状
for (int j = 5; j > i; j--) {
System.out.print(" ");
}
//输出左侧的三角形
for (int j = 1; j <= i; j++) {
System.out.print("*");
}
//输出右侧的三角形,第一个‘*’不用输出了,所以是 j<i
for (int j = 1; j < i; j++) {
System.out.print("*");
}
//每行输出完就会换一行
System.out.println();
}
}
}