![](https://img-blog.csdnimg.cn/img_convert/f3a1dd02641e34b199255a678d003121.png)
一.顺序结构
按照代码书写的顺序一行一行执行
System.out.println("欢迎阅读本篇文章");
System.out.println("有用的话请点个赞再走哦");
System.out.println("Thank you!");
//输出结果
欢迎阅读本篇文章
有用的话请点个赞再走哦
Thank you!
如果对上面代码的顺序稍加调整,输出的语句顺序也会不同
二.分支结构
2.1 if语句
语法格式1
if(布尔表达式){
语句块
}
//如果表达式的值为true则执行if里面的语句块,否则不执行
比如,小阳如果考了95分以上,就能考到清华
int score=97;
if(score>95){
System.out.println("可以上清华啦");
}
语法格式2
if(布尔表达式){
// 语句1
}else{
// 语句2
}
//如果布尔表达式返回的值是true,会执行语句1,否则执行语句2
比如,小阳如果考了95分以上,就能考到清华,否则只能考到北大(本处只是举例,绝对没有对两所大学表示任何偏见)
int score=97;
if(score>95){
System.out.println("可以上清华啦");
}else{
System.out.println("去北大上吧");
}
语法格式3
if(布尔表达式1){
// 语句1
}else if(布尔表达式2){
// 语句2
}else{
// 语句3
}
//如果布尔表达式1返回的值为true,执行语句1
//如果布尔表达式1返回的值是false且布尔表达式2返回的值是true,执行语句2
//如果两个布尔表达式返回的值都是false,执行语句3
比如,小阳如果考到95以上,就可以考上清华,如果考到85以上,就能考上北大,否则只能烤上红薯
int score=97;
if(score>95){
System.out.println("可以上清华啦");
}else if(score>85){
System.out.println("去北大上吧");
}else{
System.out.println("卖红薯去吧")
}
}
来做一个小小的练习
判断某个年份是否为闰年
int year=2023;
if(year%4==0){
if(year%100!=0)
System.out.println("普通闰年");
else if(year%400==0)
System.out.println("世纪闰年");
}else{
System.out.println("平年");
}
2.2 switch语句
语法格式如下
switch(表达式){
case 常量值1:{
语句1;
[break;]
}
case 常量值2:{
语句2;
[break;]
}
default:{
内容都不满足时执行语句;
[break;]
}
}
执行流程:
1. 先计算表达式的值
2. 和case依次比较,一旦有响应的匹配就执行该项下的语句,直到遇到break时结束
3. 当表达式的值没有与所列项匹配时,执行default
例如,根据day的值输出是星期几
int day = 5;
switch(day) {
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("输入有误");
break;
}
注意:
多个case后的常量值不可以重复
switch的括号内不可以是long,float,double,boolean类型的表达式
可以是引用类型中的String,enum,除long以外的其他整型也可以作表达式
double num=1.0;
switch(num) {
case 1.0:
System.out.println("hehe");
break;
case 2.0:
System.out.println("haha");
break;
}
// 编译出错,从double转换到int类型会有数据丢失,不安全
break不要遗漏,否则会发生意想不到的结果
int score=95;
switch(score){
case 95:
System.out.println("考清华");
case 90:
System.out.println("烤地瓜");
}
//输出结果
考清华
烤地瓜
switch不能表达很复杂的条件
比如,如果考试分数在90到95之间,就可以去北大上学
if(score>90&&score<95){
System.out.println("上北大")
}
用switch语句来完成显然是不合理的
switch虽然支持嵌套,但是最好别用
int x = 1;
int y = 1;
switch(x) {
case 1:
switch(y) {
case 1:
System.out.println("hehe");
break;
}
break;
case 2:
System.out.println("haha");
break;
}
上面的代码虽然没有格式错误,但是看起来很不美观
![](https://img-blog.csdnimg.cn/img_convert/6090f34880cf101f298eaeeadfafb4cb.png)
所以switch的局限性是很大的
三.循环结构
循环的三大条件:
初始值+判断条件+步进
2.1 while语句
语法格式
while(循环条件){
循环语句;
}
//当循环条件为true时执行循环语句,否则终止循环
代码实例
计算5的阶乘
int i=1;
int ret=1;
while(i<=5){
ret*=i;
i++;
}
System.out.println(ret);
来个更复杂一点的,计算从1到5的阶乘
int j=1;
int sum=0;
while(j<=5){
int i=1;
int ret=1;
while(i<=j) {
ret *= i;
i++;
}
j++;
sum+=ret;
}
System.out.println(sum);
while 后面不要多写 分号, 否则可能导致循环不能正确执行
int num = 1;
while (num <= 10); {
System.out.println(num);
num++;
}
//程序无任何输出,并且会一直执行
2.2 break
break 的功能是让循环提前结束
代码示例: 找到 100 - 200 中第一个 3 的倍数
int num = 100;
while (num <= 200) {
if (num % 3 == 0) {
System.out.println("找到了 3 的倍数, 为:" + num);
break;
}
num++;
}
//输出102,结束循环
2.3 continue
continue 的功能是跳过这次循环, 立即进入下次循环
代码示例: 找到 100 - 200 中所有 3 的倍数
int num = 100;
while (num <= 200) {
if (num % 3 != 0) {
num++; // 这里的 ++ 不要忘记!否则会一直输出100
continue;
}
System.out.println("找到了 3 的倍数, 为:" + num);
num++;
}
//执行到 continue 语句的时候,
//就会立刻进入下次循环(判定循环条件)
//而不会执行到再执行下面的语句
2.4 for语句
基本格式
for(表达式1;布尔表达式2;表达式3){
表达式4;
}
//表达式1设定初始值,表达式2作为判断条件
//当表达式2的结果为true时,执行表达式4,然后执行表达式3,再判断表达式2的结果,再执行表达式4...直到表达式2返回false
//如果表达式2的值为false,跳过for语句
比如
计算5的阶乘
int ret=1;
for(int i=1;i<=5;i++){
ret*=i;
}
System.out.println(ret);
计算从1到5的阶乘
int sum=0;
for(int j=1;j<=5;j++){
int ret=1;
for(int i=1;i<=j;i++){
ret*=i;
}
sum+=ret;
}
System.out.println(sum);
2.5 do while语句
基本格式
do{
循环语句;
}while(循环条件);
//先执行循环语句, 再判定循环条件,循环条件成立则继续执行,否则循环结束
do while和while的不同是,不管是否满足循环条件,循环语句至少会执行一次
例如:打印 1 - 10
int num = 1;
do {
System.out.println(num);
num++;
} while (num <= 10);
四.输入输出
4.1 输出到控制台
基本语法
System.out.println(msg); // 输出一个字符串, 换行
System.out.print(msg); // 输出一个字符串, 不换行
System.out.printf(format, msg); // 格式化输出,相当于C语言中的printf
示例
System.out.println("hello world");
System.out.print("hello new friend");
System.out.print(' ');
double x=10.1;
System.out.printf("%.2f",x);
//执行结果为
hello world
hello new friend 10.10
下面是一些System.out.printf常用的格式
转换符 | 类型 | 举例 | |
d | 十进制整数 | ("%d",100) | 100 |
x | 十六进制整数 | ("%x",100) | 64 |
o | 八进制整数 | ("%o",100) | 144 |
f | 定点浮点数 | ("%f",100f) | 100.000000
|
e | 指数浮点数 | ("%e",100f) | 1.000000e+02 |
s | 字符串 | ("%s",100) | 100 |
c | 字符 | ("%c",'1') | 1 |
4.2 从键盘输入
使用 Scanner 读取字符串/整数/浮点数
举例如下
import java.util.Scanner;//Scanner是一个类,使用是需要导入包
public class test {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);//定义一个Scanner类型的变量sc,并从键盘读入数据
System.out.println("请输入你的姓名:");
String name = sc.nextLine();//读入一行数据,遇到换行符结束
System.out.println("请输入你的年龄:");
int age = sc.nextInt();//读入一个int值
System.out.println("请输入你的工资:");
float salary = sc.nextFloat();//读入一个float值
System.out.println("你的信息如下:");
System.out.println("姓名: " + name + "\n" + "年龄:" + age + "\n" + "工资:" + salary);
sc.close(); // 注意, 要记得调用关闭方法
// 执行结果
请输入你的姓名:
王五
请输入你的年龄:
18
请输入你的工资:
1000
你的信息如下:
姓名:
张三
年龄:18
工资:1000.0
}
}
在oj题当中,常常会遇到遇到IO类型的算法题,需要循环输入
例如
使用 Scanner 循环读取 N 个数字,并求取其平均值
import java.util.Scanner
Scanner sc = new Scanner(System.in);
int sum = 0;
int num = 0;
while (sc.hasNextInt()) {
int tmp = sc.nextInt();
sum += tmp;
num++;
}
System.out.println("sum = " + sum);
System.out.println("avg = " + sum / num);
sc.close();
那么该如何终止上面这个循环输入呢,Windows上使用ctrl+z来终止,Linux/Mac使用ctrl+d来终止
五.练习
猜数字游戏
游戏规则:
系统自动生成一个随机整数[0,100), 然后由用户输入一个猜测的数字. 如果输入的数字比该随机数小, 提示 "低了", 如果输入的数字比该随机数大, 提示 "高了" , 如果输入的数字和随机数相等, 则提示 "猜对了"
import java.util.Random;
import java.util.Scanner;
class Test {
public static void main(String[] args) {
Random random = new Random(); // 默认随机种子是系统时间
Scanner sc = new Scanner(System.in);
int toGuess = random.nextInt(100);//随机生成[0,100)的数字
while (true) {
System.out.println("请输入要输入的数字: [0,100)");
int num = sc.nextInt();
if (num < toGuess) {
System.out.println("低了");
} else if (num > toGuess) {
System.out.println("高了");
} else {
System.out.println("猜对了");
break;
}
}
sc.close();
}
}
![](https://img-blog.csdnimg.cn/img_convert/2d436e9b0a95ef9d9f6d8c0f0eb5b00f.png)