3-逻辑控制及输入输出

一.顺序结构

按照代码书写的顺序一行一行执行

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;
}

上面的代码虽然没有格式错误,但是看起来很不美观

所以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();
}
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不 会敲代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值