Day04笔记
课程内容
1、键盘录入
2、分支结构
3、循环结构
键盘录入
概述
1、键盘录入:在程序运行过程中,可以通过键盘录入的数据,修改程序中的变量,决定程序运行的走向。
2、步骤:
1、导包
在class类声明的上面,写一个导包语句
import java.util.Scanner;
2、创建键盘录入对象
Scanner sc = new Scanner(System.in);
3、调用键盘录入对象sc的nextInt方法,从键盘获取一个int类型的数据
int x = sc.nextInt();
代码示例
//在class类声明的上方,导包
import java.util.Scanner;
class Demo02_键盘录入 {
public static void main(String[] args) {
//创建键盘录入对象
Scanner sc = new Scanner(System.in);
System.out.println("请录入一个整数");
//声明变量,接收键盘的录入数据,调用键盘录入对象的nextInt方法
int x = sc.nextInt();
System.out.println("录入的数据是:" + x + ", 这个数字的平方是:" + x*x);
}
}
练习1
键盘录入两个整数,计算两个数字的和
代码示例
import java.util.Scanner;
class Demo03_键盘录入练习1_求和 {
//键盘录入两个整数,计算两个数字的和
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请录入第一个整数");
int x = sc.nextInt();
System.out.println("请录入第二个整数");
int y = sc.nextInt();
int sum = x + y;
System.out.println("两者之和:" + sum);
}
}
代码示例
import java.util.Scanner;
class Demo03_键盘录入练习1_求和 {
//键盘录入两个整数,计算两个数字的和
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请录入第一个整数");
int x = sc.nextInt();
System.out.println("请录入第二个整数");
int y = sc.nextInt();
int sum = x + y;
System.out.println("两者之和:" + sum);
}
}
练习2
键盘录入三个整数,获取三个整数的最小值
代码示例
import java.util.Scanner;
class Demo04_键盘录入练习2_求最值 {
//键盘录入三个整数,获取三个整数的最小值
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请录入第一个整数");
int x = sc.nextInt();
System.out.println("请录入第二个整数");
int y = sc.nextInt();
System.out.println("请录入第三个整数");
int z = sc.nextInt();
int min = x < y ? (x < z ? x : z) : (y < z ? y : z);
System.out.println("三者的最小值为:" + min);
}
}
练习3
键盘录入一个整数,判断这个整数的奇偶
代码示例
import java.util.Scanner;
class Demo05_键盘录入练习3_奇偶 {
//键盘录入一个整数,判断这个整数的奇偶
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请录入要判断奇偶的整数");
int x = sc.nextInt();
System.out.println("这个数字是" + (x % 2 == 0 ? "偶" : "奇") + "数");
}
}
分支结构
流程控制
1、在一个程序中,有很多代码,代码执行的顺序的控制,就叫流程控制
2、流程结构:
1、顺序结构:从上到下、从左到右依次执行。你写多少代码,就执行多少代码
2、分支结构:到达某个程序运行点,根据程序运行情况的不同,可能会有两个运行的逻辑,但是程序的某一次运行只能走其中的一个逻辑。提前需要把各个逻辑都准备好。你写的代码多,jvm运行的代码少
3、循环结构:某段相同或者相似,具有某些规律的代码,需要反复执行。通过某种格式来控制让代码反复执行。写的代码少,系统运行的代码多。
分支结构概述
1、准备多种情况的代码,只运行其中一种
2、分支结构的语句:
1、if语句【常用】
2、switch语句
if语句的第一种格式
1、格式:
if (表达式) {
语句体;
}
2、说明:
1、表达式:必须是boolean类型的表达式
2、语句体:可以是任意语句,可以是一句、也可以是多句
3、执行流程:
1、计算表达式的值,要么为true、要么为false
2、如果表达式计算结果为true,就执行语句体
3、如果表达式计算结果为false,就不执行语句体
代码示例
import java.util.Scanner;
class Demo06_if语句的第一种格式 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请录入您的年龄");
int age = sc.nextInt();
//判断这个年龄是否成年
if (age >= 18) {
System.out.println("可以观看此影片");
}
System.out.println("完了");
}
}
if语句的注意事项
1、表达式必须是boolean类型的计算结果;表达式只要计算结果为boolean类型,就算合法
2、左大括号之前,不要加分号,否则if的判断就会提前结束。一般情况,有分号,就没有左大括号,如果有左大括号,就没有分号
3、语句体可以是一句,也可以是多句,如果是一句的时候,可以将大括号省略掉。建议不要省略大括号。
代码示例
class Demo07_if语句的注意事项 {
public static void main(String[] args) {
boolean flag = false;
//只要计算结果为boolean类型,就是合法
if (flag = true) {
System.out.println(flag);
}
int age = 2;
if (age > 18);{//如果前面加上了分号,就无法控制语句体是否执行
System.out.println(age);
}
int a = -10;
if (a > 0)
System.out.println(a);
System.out.println(666);//不加大括号,if只能控制一句话
int b = 10;
if (b > 0)
//int c = b + 20;编译报错,尽量不要省略大括号
}
}
if语句的第二种格式
1、格式:
if (表达式) {
语句体1;
} else {
语句体2;
}
2、说明:
1、if单词的含义是:如果
2、else单词含义:其他的,不满足如果的条件
3、执行流程:
1、计算表达式的值,要么为true、要么为false
2、如果表达式的值为true,就执行语句体1
3、如果表达式的值为false,就执行语句体2
4、说明:
1、是否有可能语句体1和语句体2都执行?不可能,只要碰到了右大括号,if语句就结束了
2、是否有可能语句体1和语句体2都不执行?不可能,else中包含了所有不满足表达式的情况,语句体1和语句体2一定会有一句执行
3、三元表达式是从两个数据中二选一;if语句的第二种格式,从两组语句中二选一
代码示例
import java.util.Scanner;
class Demo08_if语句的第二种格式 {
public static void main(String[] args) {
System.out.println("万岁爷,时辰不早了,该歇息了");
Scanner sc = new Scanner(System.in);
int x = sc.nextInt();
if (x == 1) {
System.out.println("王皇后准备");
} else {
System.out.println("萧淑妃准备");
}
}
}
if语句的第三种格式
1、格式:
if (布尔表达式1) {
语句体1;
} else if (布尔表达式2) {
语句体2;
} else if (布尔表达式3) {
语句体3;
}
.....
} else if (布尔表达式n) {
语句体n;
} else {
语句体n+1;
}
2、执行流程:
1、计算布尔表达式1的值,要么为true、要么为false
2、布尔表达式1如果为true,执行语句体1,if语句就结束了
3、布尔表达式1如果为false,就计算布尔表达式2
4、以此类推
5、如果布尔表达式1~布尔表达式n全都计算为false,就执行语句体n+1
3、说明:
1、最后一个else,可以有,也可以没有,如果有就一定会有一个执行的内容,如果没有就可能没有任何执行内容。
2、如果没有else:是否有可能一个语句体都不执行?可能,因为可能所有的判断条件都为假。是否可能执行多个语句体?任意一个布尔表达式判断为true,就执行对应的语句体,一旦执行完,就碰到了右大括号,整个if就结束了
3、如果有else:是否有可能一个语句体都不执行?不可能,因为else就包含了所有布尔表达式判断为假的情况,所以一定会执行其中一句。是否可能执行多个语句体?不可能
代码示例1
import java.util.Scanner;
class Demo09_if语句的第三种格式 {
public static void main(String[] args) {
System.out.println("万岁爷,时辰不早了,该歇息了");
Scanner sc = new Scanner(System.in);
int x = sc.nextInt();
if (x == 1) {
System.out.println("王皇后准备");
} else if (x == 2) {
System.out.println("萧淑妃准备");
} else if (x == 3) {
System.out.println("武昭仪准备");
} else {
System.out.println("太少了,该选秀了。。");
}
}
}
代码示例2
import java.util.Scanner;
class Demo10_if语句第三种格式没有else的情况 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int x = sc.nextInt();
int y;
if (x > 0) {
y = 1;
} else if (x == 0) {
y = 0;
} else if (x <0) {
y = -1;
}
//上面的if语句没有else,所以可能三个语句体都不执行
//可能y就没有被赋值,因此会编译报错,可能尚未初始化变量y
//System.out.println("x=" + x + ", y=" + y);
int m = sc.nextInt();
int n;
if (m > 0) {
n = 1;
} else if (m == 0) {
n = 0;
} else {
n = -1;
}
System.out.println("m=" + m + ", n=" + n);
}
}
switch语句
1、格式:
switch (表达式) {
case 常量1:
语句体1;
break;
case 常量2:
语句体2;
break;
....
case 常量n:
语句体n;
break;
default:
语句体n+1;
}
2、执行流程:
1、计算表达式的值
2、分别和各个常量匹配,如果和常量1相等,就执行语句体1,执行break,整个switch语句就结束了
3、如果和常量1不相等,那么就判断是否和常量2相等,如果相等就执行语句体2,执行break,整个switch语句结束
4、以此类推,如果常量1~常量n都和表达式的值不相等,就执行default中的语句体n+1,switch结束
3、解释:
1、switch:开关
2、case:情况
3、break:破坏,结束
4、default:默认的,缺省的
代码示例
import java.util.Scanner;
class Demo11_switch语句 {
public static void main(String[] args) {
System.out.println("请录入一个星期几的数字1-7");
Scanner sc = new Scanner(System.in);
int week = sc.nextInt();
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("请回到火星上");
}
}
}
switch语句的注意事项
1、表达式:
1、一般是一个变量(如果是常量,编译不会报错,但是没有意义)
2、表达式的数据类型:
byte、short、char、int、枚举类型(jdk1.5)、String(jdk7)
2、case:
1、case后面必须跟着的是常量,不能是变量
2、case后面跟着的常量的数据类型,必须和表达式的数据类型一致
3、break:
1、作用是跳出switch语句
2、break语句如果没写,那么会发生case穿透现象,这个case中的内容执行完,不会结束switch语句,也不会判断下一个case是否匹配,而是直接执行下一个case中的语句体
3、switch语句结束的条件:1、碰到了break语句;2、碰到了右大括号
4、default:
1、作用:描述默认、缺省的情况,相当于if语句中的最后一个else
2、default语句可以不写,没有了默认缺省的情况,相当于if语句不写最后一个else,建议写上
3、default语句位置可以写在switch语句的任意位置,但是无论写在什么位置,都是最后匹配。建议写在最后
代码示例
class Demo12_switch语句的注意事项 {
public static void main(String[] args) {
int x = 10;
/*long g = 100;
String str = "a";
switch (str) {
case 666:
}
switch (x) {
case 10:
System.out.println("匹配到了10");
case 11:
System.out.println("匹配到了11");
case 12:
System.out.println("匹配到了12");
break;
}*/
switch (x) {
default:
System.out.println("匹配到了default");
break;
case 11:
System.out.println("匹配到了11");
}
}
}
练习
键盘录入一个月份,输出这个月份所在的季节
代码示例
import java.util.Scanner;
class Demo13_switch语句练习 {
//键盘录入一个月份,输出这个月份所在的季节
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请录入一个月份");
int month = sc.nextInt();
switch (month) {
case 3:
case 4:
case 5:
System.out.println("春季");
break;
case 6:
case 7:
case 8:
System.out.println("夏季");
break;
case 9:
case 10:
case 11:
System.out.println("秋季");
break;
case 12:
case 1:
case 2:
System.out.println("冬季");
break;
default:
System.out.println("录入非法,请重来");
}
}
}
switch语句和if语句的比较
1、switch语句和if语句都是用于实现分支结构的流程设计
2、if语句相对比较灵活,功能相对强大;switch语句相对固定,功能也收到一定限制
3、if语句更适合判断一些条件、判断一些范围、判断一些连续性的条件;switch语句更适合判断一些离散性的数据和条件。
4、if语句每次在判断的时候,都需要获取一次表达式的值,所以效率较低;switch语句只计算一次表达式的值,所以效率较高。
代码示例
class Demo14_if和switch的区别 {
public static void main(String[] args) {
int x = 4;
/*if (x * x > 100) {
System.out.println("大数字");
} else if (x * x < 10) {
System.out.println("小数字");
} else {
System.out.println("普通数字");
}*/
switch (x * x) {
case 100:
System.out.println("是一个大数字");
break;
case 16:
System.out.println("是一个普通数字");
break;
}
}
}
循环结构
概述
1、对于某些需要重复执行的代码,不希望频繁的复制粘贴,jdk提供了一些格式,简化代码的书写。
2、实现的语句:
for语句【常用】
while语句【常用】
do...while语句
for语句
1、格式:
for ( 初始化语句; 循环条件表达式 ; 初始化变量的自增) {
循环体语句;
}
2、执行流程:
1、初始化语句
2、计算循环条件表达式,要么为true、要么为false
3、如果计算条件表达式的结果为false,for循环就结束了
4、如果计算条件表达式的结果为true,执行循环体语句
5、执行初始化变量的自增,回到第2步
3、注意事项:
1、初始化语句:
一般是声明一个用于控制循环次数的计数器
初始化语句只执行一次
2、循环条件表达式:
必须是一个boolean类型的表达式
3、循环体语句:
在初始化变量自增之前,执行
4、左大括号前面,不要加分号
5、如果循环体语句只有一句,那么大括号可以省略掉,但是建议任何情况加上大括号
代码示例
class Demo15_for语句 {
public static void main(String[] args) {
for (int i = 1; i <= 5; i++) {
System.out.println("Hello World!");
}
}
}
练习1
输出数字1-5
class Demo16_输出1到5 {
public static void main(String[] args) {
//循环的次数,是i,正好和我要打印的数字大小一致
for (int i =1; i <= 5; i++) {
System.out.println(i);
}
}
}
练习2
输出数字5-1
class Demo17_输出5到1 {
public static void main(String[] args) {
//循环5次,根据要输出的内容和i的关系,来完成
for (int i = 1; i <= 5; i++) {
//i = 1 5
//i = 2 4
System.out.println(6 - i);
}
for (int i = 5; i >= 1; i--) {
System.out.println(i);
}
}
}
练习3
计算1+2+3+...+99+100的和
class Demo18_计算1到100和 {
/*
求和思想:和在计算的过程中,是一个变量,需要声明一个变量记录求和过程中的值
sum : 0
sum = sum + 1 1
sum = sum + 2 3
sum = sum + 3 6
sum = sum + 4 10
*/
public static void main(String[] args) {
//将脑中的和变量,表现在程序中,表现在内存中,就是一个变量
int sum = 0;
//循环获取100个数字,加到sum上去
for (int i = 1; i <= 100; i++) {
sum += i;
}
//输出sum的值
System.out.println(sum);
}
}
练习4
计算1-100的偶数和
class Demo19_计算1到100偶数和 {
public static void main(String[] args) {
//第一种方式,获取1-100的所有数字,判断是否是偶数,如果是偶数,就加到和变量上去
int sum1 = 0;
for (int i = 1; i <= 100; i++) {
//判断i是否是偶数
if (i % 2 == 0) {
sum1 += i;
}
}
System.out.println(sum1);
//第二种方式,获取所有的偶数
int sum2 = 0;
for (int i = 2; i <= 100; i += 2) {
sum2 += i;
}
System.out.println(sum2);
//第三种方式:等差数列求和
int sum3 = (2 + 100) * 50 / 2;
System.out.println(sum3);
}
}
练习5
列举所有的水仙花数
水仙花数:是一个三位数,各个位上的数字的立方和,等于该数字本身
例如,153 = 1*1*1 + 5*5*5 + 3*3*3 = 153,则153是一个水仙花数
class Demo20_列举水仙花数 {
/*
列举所有的水仙花数
水仙花数:是一个三位数,各个位上的数字的立方和,等于该数字本身
例如,153 = 1*1*1 + 5*5*5 + 3*3*3 = 153,则153是一个水仙花数
思路:
1、获取到所有的三位数
2、获取每个三位数的各个位上的数字
3、计算各个位上的数字的立方和
4、判断这个立方和是否和当前数字相等,如果相等,就输出
*/
public static void main(String[] args) {
//获取所有的三位数
for (int i = 100; i <= 999; i++) {
//获取每个三位数的各个位上的数字
int ge = i % 10;
int shi = i / 10 % 10;
int bai = i / 100;
//计算各个位的立方和
int sum = ge*ge*ge + shi*shi*shi + bai*bai*bai;
if (sum == i) {//判断是否和当前数字相等
System.out.println(i);
}
}
}
}
练习6
统计水仙花数的个数
class Demo21_统计水仙花数个数 {
public static void main(String[] args) {
int count = 0;//声明一个计数器,专门用于统计水仙花数的个数
for (int i = 100; i <= 999; i++) {
int ge = i % 10;
int shi = i / 10 % 10;
int bai = i / 100;
int sum = ge*ge*ge + shi*shi*shi + bai*bai*bai;
if (sum == i) {
count++;//如果碰到了水仙花数,那么就让计数器自增
}
}
System.out.println(count);
}
}