- 回顾复习
- 逻辑控制
- 一、顺序结构
- 二、分支结构
- 1. if语句
- 【注意事项】:
- 【补充】
- 2. switch语句
- 【注意事项】
- 三、循环结构
- 1. while循环
- 【注意事项】
- 2. break语句
- 3. continue语句
- 4. for循环
- 【注意事项】
- 5. do while 循环(选学)
- 四. 输入输出
- 1. 输出到控制台
- 2. 从键盘输入
- 六、猜数字游戏
- 1. 随机数生成
- 2. 代码
- 七、练习
- THINK
回顾复习
努力学习 一步一步来!
运算符
如:&& || >>>(无符号右移:左边的统统补0)-没有无符号左移
努力终会有收获的!
逻辑控制有三种结构:顺序、选择、循环结构。
一、顺序结构- 顺序结构比较简单,按照代码书写的顺序一行一行执行。
- 如果调整代码的书写顺序, 则执行顺序也发生变化。
- 单分支语句
注意:if的参数一定是布尔表达式!!
if(
布尔表达式
) {
// 语句
}
- 双分支语句
if(布尔表达式) {
// 语句1
} else {
// 语句2
}
- 多分支语句
if(布尔表达式1) {
// 语句1
} else if(布尔表达式2) {
// 语句2
} else {
// 语句3
}
//注意else if 以及ellse等的位置
- 补充:
补充输入语句:
import java.util.Scanner; // 导包,类似于c语言的#
include
Scanner scanner(scanner 是变量名,小驼峰-可自己命名) = new Scanner(System.in); //–代表从键盘获取;
int a = scaner.nextInt(); --读入一个int类型数据
- 补充: next();读入小数 or字符串不含空格
nextLine(); //读入一行,含有空格
补充循环输入–while(scanner.hasNextInt())
ctrl + D --退出循环
- 例题:判断一个年份是否为闰年
- 代码风格:
任何情况下都不要省略{}!!
// 风格1-----> 推荐
int x = 10;
if (x == 10) {
// 语句1
} else {
// 语句2
}
// 风格2
int x = 10;
if (x == 10) {
// 语句1
}else {
// 语句2
}
虽然两种方式都是合法的, 但是 Java 中更推荐使用风格1, { 放在 if / else 同一行. 代码更紧凑。
- 分号问题:分号代表着一条语句
int x = 20;
if (x == 10);
{
System.out.println("hehe");
}
// 运行结果 hehe
此处多写了一个 分号(if后面), 导致分号成为了 if 语句的语句体, 而 { } 中的代码已经成为了和一个 if 无关的代码块
- 悬垂 else 问题
else 是和最接近的 if 匹配
int x = 10;
int y = 10;
if (x == 10)
if (y == 10)
System.out.println("aaa");
else
System.out.println("bbb");
if / else 语句中可以不加 大括号 , 但是也可以写语句(只能写一条语句). 此时 else 是和最接近的 if 匹配.
但是实际开发中我们 不建议 这么写,最好加上大括号.
- 局部变量存放到栈中,栈中的地址是拿不到的
- 调试:
1)打断点 – 调试
(条件断点–右击设置)
2)所有变量都会自动显示至variables
3)功能介绍
- 基本语法:
(case 常量值:–冒号不能丢!!)
switch(表达式){
case 常量值1:{
语句1;
[break;]
}
case 常量值2:{
语句2;
[break;]
}
default:{
内容都不满足时执行语句;
[break;]
}
}
- 遇到break才结束执行!!
- 注意:
break不省略!!!
建议default放到最后! - 面试问题:
不能做switch的参数的类型: long float double boolean
补:字符串以及枚举(1.5之后版本才有)都可以、byte 、char、short、int可以作为参数
- case 后面内容跟switch参数形式保持一致
- 执行流程:
【注意事项】1) 先计算表达式的值
2) 和case依次比较,一旦有响应的匹配就执行该项下的语句,直到遇到break时结束
3)当表达式的值没有与所列项匹配时,执行default
- 多个case后的常量值不可以重复
- switch的括号内只能是以下类型的表达式:
基本类型:byte、char、short、int,注意不能是long类型
引用类型:String常量串、枚举类型 - break 不要遗漏, 否则会失去 “多分支选择” 的效果(即:会一直向下运行,直至遇到break或者程序结束)
- switch 不能表达复杂的条件,if可以表达复杂的条件
// 例如: 如果 num 的值在 10 到 20 之间, 就打印 hehe
// 这样的代码使用 if 很容易表达, 但是使用 switch 就无法表示.
if (num > 10 && num < 20) {
System.out.println("hehe");
}
- switch 虽然支持嵌套, 但是很丑,一般不推荐~
- 综上, switch 的使用局限性是比较大的。
三种循环结构:while、for、do…while
1. while循环- 基本语法:
(注意:条件一定是布尔表达式!!)
while(布尔表达式){
循环语句;
}
- 例题:计算1-100奇数(Eve)和 and 偶数(Odd)和
- 两种方法:偶数加和 or +=2 --注意i重新赋值!!
- 代码:
import org.w3c.dom.ls.LSOutput;
/**
* 计算1-100奇数(Eve)和 and 偶数(Odd)和
*/
public class Sum {
public static void main(String[] args) {
int i = 1;
int eveSum =0;
int oddSum =0;
int sum =0;
while(i <= 100) {
eveSum += i;
i += 2;
}
i = 0; //注意重新赋值
while(i <= 100) {
oddSum += i;
i += 2;
}
i = 0;
while(i <= 100) {
sum += i;
i ++;
}
System.out.println("1-100奇数(Eve)和"+eveSum);
System.out.println("1-100偶数(Odd)和"+oddSum);
System.out.println("1-100和"+sum);
}
}
- 结果:
- 例题:计算 1! + 2! + 3! + … +n!
- 代码:
import java.util.Scanner;
/**
* 计算 1! + 2! + 3! + ... +n!
*/
public class Fib {
public static void main(String[] args) {
System.out.println("请输入n:");
Scanner reader = new Scanner(System.in);
int n = reader.nextInt();
int i = 1;
int sum =0;
int fib = 1;
while(i <= n) {
fib *= i;
sum += fib;
i++;
}
System.out.println(n+"阶乘和:");
System.out.println(sum);
}
}
- 结果:
- 和 if 类似, while 下面的语句可以不写 { } , 但是不写的时候只能支持一条语句. 建议还是加上 { }
- 和 if 类似, while 后面的 { 建议和 while 写在同一行.
- 和 if 类似, while 后面不要多写 分号, 否则可能导致循环不能正确执行.
int num = 1;
while (num <= 10); {
System.out.println(num); num++;
}
// 执行结果 [无任何输出, 程序死循环]
2. break语句此时 ; 为 while 的语句体(这是一个空语句), 实际的 { } 部分和循环无关. 此时循环条件 num <= 10 恒成立, 导致代码死循环了.
功能:提前结束所有循环,即退出当前的整个循环
3. continue语句- 功能:结束本趟循环,即:后面的代码不执行,开
始下一次循环 - 例题:
1-100之间所有既是3的倍数又是5的倍数的所有数据【continue】实现 - 代码:
方法一:
/**
* 1-100之间所有既是3的倍数又是5的倍数的所有数据【continue】实现
*/
public class Find {
public static void main(String[] args) {
int i =0;
System.out.println("1-100之间所有既是3的倍数又是5的倍数的所有数据:");
while(i < 100) {
i++;
if((0 == i % 3) && (0 == i % 5)) {
System.out.print(i + " ");
continue;
}
}
}
}
方法二:(注意 逻辑或)
/**
* 1-100之间所有既是3的倍数又是5的倍数的所有数据【continue】实现
*/
public class Find {
public static void main(String[] args) {
int i =0;
System.out.println("1-100之间所有既是3的倍数又是5的倍数的所有数据:");
while(i < 100) {
i++;
if(( i % 3 != 0) || (i % 5 != 0)) {
continue;
}
System.out.print(i + " ");
}
}
}
- 结果:
- 基本语法:
(表达式2是布尔表达式!)
for(表达式①;布尔表达式②;表达式③){
表达式④; //结构体
}
- 表达式1: 用于初始化循环变量初始值设置,在循环最开始时执行,且只执行一次
- 表达式2:循环条件,满则循环继续,否则循环结束
- 表达式3: 循环变量更新方式
-
执行流程:
-
所有题目都可以用for循环
-
例题:计算 1! + 2! + 3! + … + n!
- 代码:
import java.util.Scanner;
/**
* 计算 1! + 2! + 3! + ... + n!
* for循环实现
*/
public class FibSum {
public static void main(String[] args) {
System.out.println("请输入n:");
Scanner reader = new Scanner(System.in);
int n = reader.nextInt();
int sum =0;
int fib = 1;
for(int i =1; i <= n; i++) {
fib *= i;
sum += fib;
}
System.out.println(n+"阶乘和:");
System.out.println(sum);
}
}
- 结果:
(和while循环类似)
- 和 if 类似, for 下面的语句可以不写 { } , 但是不写的时候只能支持一条语句. 建议还是加上 { }
- 和 if 类似, for 后面的 { 建议和 while 写在同一行.
- 和 if 类似, for 后面不要多写 分号, 否则可能导致循环不能正确执行.
- 和while循环一样,结束单趟循环用continue,结束整个循环用break
- 基本语法:
(注:while后面有;)
do{
循环语句;
}while(循环条件);
- 不管满不满足条件,先执行一次
- 【注意事项】
- do while 循环最后的分号不要忘记
- 一般 do while 很少用到, 更推荐使用 for 和 while.
- 补充:死循环
四. 输入输出 1. 输出到控制台while(true)
for( ; ; ) or for(;true ; )
- 基本语法:
System.out.println(msg); // 输出一个字符串, 带换行 System.out.print(msg); // 输出一个字符串, 不带换行 System.out.printf(format, msg); // 格式化输出
- 注意:
println 输出的内容自带 \n, print 不带 \n
printf 的格式化输出方式和 C 语言的 printf 是基本一致的.
- 格式化字符串
(这个表格没必要记住, 用到的时候根据需要查一下就行了)
使用 Scanner 读取字符串/整数/浮点数
- 示例如下:
import java.util.Scanner; // 需要导入 util 包
Scanner sc = new Scanner(System.in); System.out.println("请输入你的姓名:");
String name = sc.nextLine();
System.out.println("请输入你的年龄:");
int age = sc.nextInt();
System.out.println("请输入你的工资:");
float salary = sc.nextFloat();
System.out.println("你的信息如下:"); System.out.println("姓名: "+name+"\n"+"年龄:"+age+"\n"+"工资:"+salary);
sc.close(); // 注意, 要记得调用关闭方法
- 相关与区分
(Scanner reader = new Scanner(System.in)😉
- String name = reader.nextLine();
//读入一行数据,只能有String接收,默认是字符串(包含空格) - 区分:String name = reader.next();
// 遇到空格就停止读入,读取接收 - hasNext(); // 判断是否有输入
- hasNextInt(); // 判断是否有整型数据输入
-
输入类型不匹配问题
-
如果先输入年龄,会发现姓名不能输入就会被跳过–回车被读到了姓名里
所以:先输入字符串,再输入整数等 -
尽量做到两者对应
-
循环结束问题
当循环输入多个数据的时候, 使用 ctrl + z 来结束输入 (Windows 上使用 ctrl + z, Linux / Mac 上使用 ctrl+ d)
游戏规则:
系统自动生成一个随机整数(1-100), 然后由用户输入一个猜测的数字. 如果输入的数字比该随机数小, 提示 “低 了”, 如果输入的数字比该随机数大, 提示 “高了” , 如果输入的数字和随机数相等, 则提示 “猜对了” .
- Random :左闭右开
所以注意括号内的参数!!
如:Random random = new Random();
int ranNum = random.nextInt(51)+50; //代表[50,101),即50-100
-
该种随机数是根据时间戳来生成的,则可以根据时
间来让随机数保持不变
如:Random random = new Random(20220426);
//会一直生成同一个随机数 -
根据时间戳生成的随机数是伪随机
-
如果int ranNum = random.nextInt(); 没有参数的取值范围?
-不带参数的nextInt()会生成所有有效的整数(包含正数,负数,0)
- double rand = Math.random();
注意返回值类型是double
- 查一下如何生成随机数
-Math.random() 生成的是[0, 1)之间的伪随机数。注意左闭右开
1) 直到猜对为止(无次数限制)
import java.util.Random;
import java.util.Scanner;
public class GuessNum {
// 直到猜对为止
public static void main(String[] args) {
Random random = new Random();
int ranNum = random.nextInt(100) + 1; //[0,100) --> [1,101)
Scanner reader = new Scanner(System.in);
while(true) { //注意布尔表达式条件
System.out.println("请输入您的猜测:");
int input = reader.nextInt();
if(input < ranNum) {
System.out.println("低了");
} else if(input == ranNum) {
System.out.println("猜对了");
break;
} else {
System.out.println("高了");
}
}
}
}
2) 次数限制
import java.util.Random;
import java.util.Scanner;
public class GuessNum {
// 次数限制
public static void main(String[] args) {
int count = 3;
Random random = new Random();
int ranNum = random.nextInt(100) + 1; //[0,100) --> [1,101)
Scanner reader = new Scanner(System.in);
while(count > 0) { //注意布尔表达式条件
System.out.println("请输入您的猜测:");
int input = reader.nextInt();
if(input < ranNum) {
System.out.println("低了");
} else if(input == ranNum) {
System.out.println("猜对了");
break;
} else {
System.out.println("高了");
}
count--;
}
if(count == 0) {
System.out.println("次数限制 退出游戏");
System.out.println("正确答案是:"+ranNum);
}
}
}
七、练习
见下一节博客
THINK逻辑控制符–主要了解三种结构:
- 顺序结构–按照代码顺序执行
- 循环结构–for、while、 do…while
- 条件结构-- 单分支、双分支、多分支 if、switch
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)