Java流程控制(课程笔记)
由于笔者本人有着c语言的学习基础,故Java等等学习笔记有很多省略之处,多用以自己复习巩固。
反编译
java文件(源文件)编译后生成class文件(字节码文件),可使用IDEA进行反编译,将class文件拷贝入项目中的文件夹中,用IDEA双击打开,即可反编译,便于查看代码执行详情
01 用户交互Scanner
Java提供了一个工具类,可以获取用户的输入。
java.util.Scanner是Java5的新特征,我们可以通过Scanner类来获取用户的输入。
- 基本语法
Scanner s = new Scanenr(System.in);
- 通过Scanner类的 next() 与 nextLine() 方法获取输入的字符串
- 在读取前我们一般需要使用 hasNext() 与 hasNextLine() 判断是否还有输入的数据
实例一
package com.xuexi.scanner;
import java.util.Scanner;
public class Demo1 {
public static void main(String[] args) {
//创建一个扫描器对象,用于接收键盘数据
Scanner scanner = new Scanner(System.in);
System.out.println("使用next方式接收:");
//判断用户有没有输入字符串
//有输入则返回true
if(scanner.hasNext()){//等于if(scanner.hasNext() == ture)
//接收用户输入的字符串
String str = scanner.next();
System.out.println("输入的内容是:" + str);
}
//凡是属于IO流的类如果不关闭会一直占用资源,要养成好习惯用完就关闭
scanner.close();
}
}
运行如下
- 注意:输入以 空格\回车 为结束
实例二
package com.xuexi.scanner;
import java.util.Scanner;
public class Demo2 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("使用nextLine方式接收:");
if(scanner.hasNextLine()){
String s = scanner.nextLine();
System.out.println("输入的内容是:" + s);
}
scanner.close();
}
}
运行结果
- 注意:此时空格不是结尾
实例三
package com.xuexi.scanner;
import java.util.Scanner;
public class Demo3 {
public static void main(String[] args) {
//从键盘接收数据
Scanner scanner = new Scanner(System.in);
System.out.println("请输入数据:");
String s = scanner.nextLine();
System.out.println("输出内容为:" + s);
scanner.close();
}
}
运行结果
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()){
i = scanner.nextInt();
System.out.println("整数数据:" + i);
}else{
System.out.println("输入的不是整数数据");
}
System.out.println("请输入小数:");
if(scanner.hasNextFloat()){
f = scanner.nextFloat();
System.out.println("小数数据:" + f);
}else{
System.out.println("输入的不是小数");
}
scanner.close();
}
}
运行结果
实例拓展二
import java.util.Scanner;
public class Demo5 {
public static void main(String[] args) {
//我们可以输入多个数据,并求其总和和平均数,每输入一个数字用回车确认,通过输入非法数字来结束输入并输出执行结果
Scanner scanner = new Scanner(System.in);
//和
double sum = 0;
//记录输入了多少个数
int m = 0;
//通过循环判断是否还有输入,并在里面面对每一次进行求和和统计
while(scanner.hasNextDouble()){
double x = scanner.nextDouble();
m++;
sum += x;
}
System.out.println(m + "个数的和为" + sum);
System.out.println(m + "个数的平均值为" + (sum/m));
scanner.close();
}
}
运行结果
02 顺序结构
- Java的基本结构就是顺序结构,除非特别指明,否则按照顺序一句一句执行
- 顺序结构是最简单的算法结构
- 语句与语句之间,框与框之间是按从上到下的顺序进行的,它是若干个依次执行的处理步骤组成的,它是任何一个算法都离不开的一种基本算法结构
03 选择结构
if单选泽结构
语法
if(布尔表达式){
//如果布尔表达式为ture将执行的语句
}
实例一
import java.util.Scanner;
public class IfDemo1 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("Please input something : ");
String s = scanner.nextLine();
//equals:判断字符串是否相等
if(s.equals("Hello")){
System.out.println(s);
}
System.out.println("End");
scanner.close();
}
}
运行结果
if双选泽结构
语法
if(布尔表达式){
//如果布尔表达式的值为ture,则执行此处语句
}else{
//如果布尔表达式的值为false,则执行此处语句
}
实例二
import java.util.Scanner;
public class IfDemo2 {
public static void main(String[] args) {
//考试分数大于等于60是及格,否则不及格
Scanner scanner = new Scanner(System.in);
System.out.println("请输入成绩:");
int score = scanner.nextInt();
if(score >= 60){
System.out.println("及格");
}else{
System.out.println("不及格");
}
scanner.close();
}
}
运行结果
if多选泽结构
语法
if(布尔表达式1){
//如果布尔表达式1的值为ture,则执行此处语句
}else if(布尔表达式2){
//如果布尔表达式2的值为ture,则执行此处语句
}else if(布尔表达式3){
//如果布尔表达式1的值为ture,则执行此处语句
}else{
//如果以上布尔表达式的值都为false,则执行此处语句
}
实例三
import java.util.Scanner;
public class IfDemo3 {
public static void main(String[] args) {
//考试分数大于等于60是及格,否则不及格
Scanner scanner = new Scanner(System.in);
System.out.println("请输入成绩:");
int score = scanner.nextInt();
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{
System.out.println("成绩不合法");
}
scanner.close();
}
}
运行结果
嵌套的if结构
语法
if(布尔表达式1){
//如果布尔表达式1的值为true则执行代码
if(布尔表达式2){
//如果布尔表达式2的值为true则执行代码
}
}
switch多选择结构
- switch case语句判断一个变量与一个系列值中某个值是否相等,每个值成为一个分支
switch 语句中的变量类型可以是:
- byte、short、int或者char
- 从Java SE 7开始,switch支持字符串String类型了,同时case标签必须为字符串常量和字面量
实例四
import java.util.Scanner;
public class SwitchDemo1 {
public static void main(String[] args) {
//
char grade = 'C';
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;
case 'E':
System.out.println("挂科");
break;
default:
System.out.println("未知等级");
break;
}
}
}
运行结果
- 如果没有执行到break,就会将下方的多个case执行直至执行到break跳出switch语句
实例五
public class SwitchDemo2 {
public static void main(String[] args) {
String name = "Schlings";
//JDK7的新特性,表达式结果可以是字符串!!!!
//字符的本质还是数字
//反编译 Java---class(字节码文件)---反编译(IDEA)
switch(name){
case "Tom":
System.out.println("Tom");
break;
case "Tommy":
System.out.println("Tommy");
break;
case "Sam":
System.out.println("Sam");
break;
case "Jenny":
System.out.println("Jenny");
break;
case "Schlings":
System.out.println("Schlings");
break;
default:
System.out.println("Nothing!");
}
}
}
执行结果
04 循环结构
while循环
- 只要布尔表达式为true,循环会一直执行下去
- 我么大多数情况是会让循环停下来的,我们需要一个让表达式失效的方式来结束循环
- 少部分情况需要循环一直执行,比如服务区的请求响应监听等
- 循环条件一直未true就会造成无限循环(死循环),我们正常的业务编程中应该尽量避免死循环。这会影响程序性能或者造成程序卡死奔溃!
实例一
public class WhileDemo1 {
public static void main(String[] args) {
//输出1~100
int i = 0;
while(i++ < 100){
System.out.println(i);
}
}
}
运行结果
死循环
实例二
//计算1+2+3+……+100 = ?
public class WhileDemo2 {
public static void main(String[] args) {
int i = 0;
int sum = 0;
while(i <= 100){
sum += i;
i++;
}
System.out.println(sum);
}
}
执行结果
do…while循环
do{
//代码语句
}while(布尔表达式);
- while 和 do-while 的区别
- while先判断后执行,do while是先执行后判断
- do while总是保证循环体会被至少执行一次!这是他们的主要差别
实例三
public class DoWhileDemo1 {
public static void main(String[] args) {
int i = 0;
int sum = 0;
do{
sum += i;
i++;
}while(i <= 100);
System.out.println(sum);
}
}
执行结果
for循环
注意:
- 最先执行初始化步骤。可以声明一种类型,但可初始化一个或多个循环控制变量,也可以是空语句;
- 然后,检测布尔表达式的值,如果是true,循环体被执行,如果是false,循环终止,开始执行循环体后面的语句。
- 执行一次循环后,更新循环控制变量(迭代因子控制循环变量的增减)
- 再次检测布尔表达式,循环执行上面的过程
练习1:计算0到100之间的奇数和偶数的和
public class ForDemo1 {
public static void main(String[] args) {
//分别用sum1和sum2记录偶数和与奇数和
int sum1 = 0;
int sum2 = 0;
for(int i = 0; i <= 100; i += 2){
sum1 += i;
}
for(int i = 1; i <= 99; i += 2){
sum2 += i;
}
System.out.println("偶数和:" + sum1);
System.out.println("奇数和:" + sum2);
}
}
执行结果
练习2:用while或for循环输出1-1000之间能被5整除的数,并且每行输出3个
用for循环
public class ForDemo2 {
public static void main(String[] args) {
for (int i = 1; i <= 1000; i++) {
if(i%5 == 0){
System.out.print(i + "\t");
}
if(i%(5*3) == 0){
System.out.print("\n");
}
}
}
}
运行结果
用while循环
public class ForDemo3 {
public static void main(String[] args) {
int i = 1;
int flag = 0;
while(i++ <= 1000){
if(i % 5 == 0){
System.out.printf(i + "\t");
flag++;
}
if(flag == 3){
System.out.printf("\n");
flag = 0;
}
}
}
}
运行结果
练习3:打印九九乘法表
public class ForDemo4 {
public static void main(String[] args) {
for (int i = 1; i <= 9; i++) {
for(int j = 1; j <= i; j++){
System.out.printf(j + " * " + i + " = " + (i*j) + "\t");
}
System.out.printf("\n");
}
}
}
运行结果
增强for循环
- 这与MATLAB中用for循环遍历行向量的原理基本一致,一维数组可视为一个行向量
实例演示
public class ForDemo5 {
public static void main(String[] args) {
//建立一个数组
int[] numbers = {10,20,30,40,50};
//遍历数组元素
for(int x:numbers){
System.out.println(x);
}
}
}
运行结果
05 break & continue
- break在任何循环语句的主体部分,均可用break控制循环的流程。break用于强行退出循环,不执行循环中剩余的语句。(break语句也在switch语句中使用)
- continue语句用在循环语句体中,用于终止某次循环过程,即跳过循环体中尚未执行的语句,接着进行下一次是否执行循环的判定
了解
public class LabelDemo {
public static void main(String[] args) {
//打印101-150之间的质数
//不建议使用,了解即可
outer:for(int i = 101; i <= 150; i++){
for(int j = 2; j <= i/2; j++){
if(i%j == 0){
continue outer;
}
}
System.out.println(i);
}
}
}
06 打印三角形及Debug
实例
public class TestDemo1 {
public static void main(String[] args) {
//打印三角形 5行
for (int i = 1; i <= 5; i++) {
for (int j = 5; j >= i; j--){
System.out.printf(" ");
}
for (int j = 1; j <= i; j++){
System.out.printf("*");
}
for(int j = 2; j <= i; j++){
System.out.printf("*");
}
System.out.println();
}
}
}
执行结果
Debug
- 可用于逐步观察代码运行情况