逻辑控制——java

目录

一. 顺序结构

二. 分支结构

2.1 if语句

2.2switch 语句

三. 循环结构

3.1 while 循环

3.1.1 break

3.1.2 continue

3.2 for 循环

3.3 do while 循环

四.  输入输出

4.1 输出到控制台

4.2 从键盘输入

五. 猜数字游戏

六. 练习


一. 顺序结构

顺序结构 比较简单,按照代码书写的顺序一行一行执行。
System . out . println ( "aaa" );
System . out . println ( "bbb" );
System . out . println ( "ccc" );
// 运行结果
aaa
bbb
ccc

如果调整代码的书写顺序, 则执行顺序也发生变化  

System . out . println ( "aaa" );
System . out . println ( "ccc" );
System . out . println ( "bbb" );
// 运行结果
aaa
ccc
bbb

二. 分支结构

2.1 if语句

1. 语法格式 1
if ( 布尔表达式 ){
// 语句
}

如果布尔表达式结果为true,执行if中的语句,否则不执行。

2. 语法格式2

if ( 布尔表达式 ){
// 语句 1
} else {
// 语句 2
}

如果布尔表达式结果为true,则执行if中语句,否则执行else中语句。 

 3. 语法格式3

if ( 布尔表达式 1 ){
// 语句 1
} else if ( 布尔表达式 2 ){
// 语句 2
} else {
// 语句 3
}
表达式 1 成立,执行语句 1 ,否则表达式 2 成立,执行语句 2 ,否则执行语句 3
注:
if后括号里只能是布尔表达式!

 例:判断一个年份是否为闰年

  int i=2000;
            if(i%100==0&&i%400==0||i%4==0){
                    System.out.println(i+"是闰年");
            }else{
                System.out.println(i+"不是闰年");
             }

 【注意事项】

1、代码风格

// 风格 1-----> 推荐
int x = 10 ;
if ( x == 10 ) {
// 语句 1
} else {
// 语句 2
}
// 风格 2

int x = 10 ;
if ( x == 10 )
{
// 语句 1
}
else
{
// 语句 2
}
虽然两种方式都是合法的 , 但是 Java 中更推荐使用风格 1, { 放在 if / else 同一行. 代码跟紧凑

2、分号问题
int x = 20 ;
if ( x == 10 ); //此处多写了一个 分号, 导致分号成为了 if 语句的语句体, 而 { } 中的代码已经成为了和一个 if 无关的代码块.
{
System . out . println ( "hehe" );
}
// 运行结果
hehe
3、悬垂 else 问题
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 匹配.
但是实际开发中我们 不建议 这么写 . 最好加上大括号 .

2.2switch 语句

基本语法 

switch ( 表达式 ){
case 常量值 1 :{
       语句 1 ;
      [ break ;]
}
case 常量值 2 :{
       语句 2 ;
       [ break ;]
}
...
default :{
       内容都不满足时执行语句 ;
       [ break ;]
}
}
执行流程:
1. 先计算表达式的值
2. case 依次比较,一旦有响应的匹配就执行该项下的语句,直到遇到 break 时结束
3. 当表达式的值没有与所列项匹配时,执行 default
注意事项
1、多个 case 后的常量值不可以重复
2、switch 的括号内只能是以下类型的表达式:
基本类型: byte、char、short、int,注意不能是long、float、double、boolean类型
引用类型: String常量串、枚举类型
3、 break 不要遗漏 , 否则会失去 " 多分支选择 " 的效果
int day = 1 ;
switch ( day ) {
case 1 :
System . out . println ( " 星期一 " );
case 2 :
System . out . println ( " 星期二 " );
break ;
}
// 运行结果
星期一
星期二
4、 switch 不能表达复杂的条件
5、switch 虽然支持嵌套 , 但是很丑,一般不推荐 ~

三. 循环结构

3.1 while 循环

基本语法格式 :
while ( 循环条件/布尔表达式 ){
循环语句 ;
}

 循环条件为 true, 则执行循环语句; 否则结束循环.

代码示例 : 计算 5 的阶乘
int n = 1;
int result = 1;
while (n <= 5) {
result *= n;
n++;
}
System.out.println(num);
// 执行结果
120
代码示例 : 计算 1! + 2! + 3! + 4! + 5!
int num = 1;
int sum = 0;
// 外层循环负责求阶乘的和
while (num <= 5) {
int factorResult = 1;
int tmp = 1;
// 里层循环负责完成求阶乘的细节.
while (tmp <= num) {
factorResult *= tmp;
tmp++;
}
sum += factorResult;
num++;
}
System.out.println("sum = " + sum);
注意事项
1. if 类似 , while 下面的语句可以不写 { } , 但是不写的时候只能支持一条语句 . 建议还是加上 { }
2. if 类似 , while 后面的 { 建议和 while 写在同一行 .
3. if 类似 , while 后面不要多写 分号 , 否则可能导致循环不能正确执行
4.在写while循环时,一定要检查 循环体里有没有循环变量的改变相关代码 ,没有则构成死循环。

3.1.1 break

break 的功能是让循环提前结束.

代码示例 : 找到 100 - 200 中第一个 3 的倍数
int num = 100 ;
while ( num <= 200 ) {
if ( num % 3 == 0 ) {
System . out . println ( " 找到了 3 的倍数 , :" + num );
break ;
}
num ++ ;
}
// 执行结果
找到了 3 的倍数 , : 102

执行到 break 就会让循环结束.

3.1.2 continue

continue 的功能是跳过这次循环 , 立即进入下次循环 .
代码示例 : 找到 100 - 200 中所有 3 的倍数
int num = 100 ;
while ( num <= 200 ) {
if ( num % 3 == 0 ) {
System . out . println ( " 找到了 3 的倍数 , :" + num );
break ;
}
num ++ ;
}
// 执行结果
找到了 3 的倍数 , : 102

 执行到 continue 语句的时候, 就会立刻进入下次循环(判定循环条件), 从而不会执行到下方的打印语句.

3.2 for 循环

基本语法
for ( 表达式① ; 布尔表达式② ; 表达式③ ){
表达式④ ;
}
表达式 1: 用于初始化循环变量初始值设置,在循环最开始时执行,且只执行一次
表达式 2: 循环条件,满则循环继续,否则循环结束
表达式 3: 循环变量更新方式
代码示例
3. 计算 5 的阶乘
int result = 1;
for (int i = 1; i <= 5; i++) {
result *= i;
}
System.out.println("result = " + result);
4. 计算 1! + 2! + 3! + 4! + 5!
int sum = 0;
for (int i = 1; i <= 5; i++) {
int tmp = 1;
for (int j = 1; j <= i; j++) {
tmp *= j;
}
sum += tmp;
}
System.out.println("sum = " + sum);
注意事项 ( while 循环类似 )
1. if 类似 , for 下面的语句可以不写 { } , 但是不写的时候只能支持一条语句 . 建议还是加上 { }
2. if 类似 , for 后面的 { 建议和 while 写在同一行 .
3. if 类似 , for 后面不要多写 分号 , 否则可能导致循环不能正确执行 .
4. while 循环一样,结束单趟循环用 continue ,结束整个循环用 break

3.3 do while 循环

基本语法
do {
循环语句 ;
} while ( 循环条件 );
先执行循环语句 , 再判定循环条件,循环条件成立则继续执行,否则循环结束。
例如:打印 1 - 10
int num = 1 ;
do {
System . out . println ( num );
num ++ ;
} while ( num <= 10 );
【注意事项】
1. do while 循环最后的分号不要忘记
2. 一般 do while 很少用到 , 更推荐使用 for while.

四.  输入输出

4.1 输出到控制台

基本语法
System . out . println ( msg ); // 输出一个字符串 , 带换行
System . out . print ( msg ); // 输出一个字符串 , 不带换行
System . out . printf ( format , msg ); // 格式化输出
println 输出的内容自带 \n, print 不带 \n
printf 的格式化输出方式和 C 语言的 printf 是基本一致的 .
代码示例
System . out . println ( "hello world" );
int x = 10 ;
System . out . printf ( "x = %d\n" , x )
格式化字符串
这个表格没必要记住 , 用到的时候根据需要查一下就行了 .

4.2 从键盘输入

使用 Scanner 读取字符串 / 整数 / 浮点数
固定写法:
import java . util . Scanner ;//放在第一行,类似头文件
Scanner sc = new Scanner ( System . in );//固定写法
String name = sc.nextLine();//读取一行字符
String name = sc.next();//遇到空格会结束读取
int age = sc.nextInt() ;//读取整型
float salary = sc.nextFloat() ; //读取浮点型
......

例:

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 (); // 注意 , 要记得调用关闭方法
// 执行结果
请输入你的姓名:
张三
请输入你的年龄:
18
请输入你的工资:
1000
你的信息如下:
姓名 : 张三
年龄: 18
工资: 1000 . 0

多组输入 

Scanner sc = new Scanner(System.in);

while (sc.hasNextInt()){

     int a = scanner.nextInt();

.....

}

例:使用 Scanner 循环读取 N 个数字,并求取其平均值

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();
// 执行结果
10
40.0
50.5
^D
sum = 150.5
avg = 30.1
注意事项 : 当循环输入多个数据的时候 ,  cmd  上使用 ctrl + z, idea  上使用 ctrl + d

五. 猜数字游戏

游戏规则 :
系统自动生成一个随机整数 (1-100), 然后由用户输入一个猜测的数字 . 如果输入的数字比该随机数小 , 提示 " 低了", 如果输入的数字比该随机数大 , 提示 " 高了 " , 如果输入的数字和随机数相等 , 则提示 " 猜对了 " .
补充:
产生随机数的方法:
import java . util . Random ; //放在第一行,类似C语言中的头文件
Random random = new Random (); //默认随机种子是系统时间
int toGuess = random . nextInt ( 100 ); //产生[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);
// System.out.println("toGuess: " + toGuess);
while (true) {
System.out.println("请输入要输入的数字: (1-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种方法,如果一个数字是素数,那么就只能整除1和自己本身。
    public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            int n = scanner.nextInt();
            int i;
            for (i = 2;i < n;i++) {
                if(n%i == 0) {
                    System.out.println("n不是素数:"+n);
                    break;
                }
            }
            if(i >= n) {
                System.out.println(n + "是素数");
            }
    }
  • 第2种方式:任何一个数字n,都可以写成 n = a*b的形式。那么必然会有一个数字是小于等于根号n的。
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int i;
        for (i = 2;i <= Math.sqrt(n);i++) {
            if(n%i == 0) {
                //System.out.println("n不是素数:"+n);
                break;
            }
        }
        if(i > Math.sqrt(n)) {
            System.out.println(n + "是素数");
        }
    }

    2. 打印 100 - 200 之间所有的素数

    public static void main(String[] args) {
        for (int j = 100; j<=200 ;j++) {
            int i;
            for (i = 2;i <= Math.sqrt(n);i++) {
                if(n%i == 0) {
                    break;
                }
        	}
            if(i > Math.sqrt(n)) {
                System.out.println(n + "是素数");
            }
        }
    }

  3. 求两个正整数的最大公约数

辗转相除法:两个数字做除法,若余数不为零,则除数作为被除数,余数作为除数,得余数,若余数不为零,则重复上述步骤,直到余数为零,此时的除数为两个数的最大公约数.

 public static void main14(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int a = scanner.nextInt();
        int b = scanner.nextInt();
        int c = a % b;
        while (c != 0) {
            a = b;
            b = c;
            c = a % b;
        }
        System.out.println(b);
    }

4. 求出0999999之间的所有水仙花数并输出。(“水仙花数是指一个三位数,其各位数字的立方和确好等于该数本身,如: 1531^35^33^3 ,则153是一个水仙花数。)

点播: tmp/10 表示舍弃个位数; tmp%10 表示拿到个位数

 public static void main15(String[] args) {
        for (int i = 1; i < 999999; i++) {
            int count = 0;
            int tmp = i;
            //求出i为几位数,赋给count
            while (tmp != 0) {
                count++;
                tmp /= 10;
            }
          //此时tmp为0,将i重新赋给tmp
            tmp = i; 
            int sum = 0;
          //求每一位数的count次方和
            while (tmp != 0) {
                sum += Math.pow(tmp % 10,count);//拿到个位数做次方运算
                tmp /= 10;//舍弃个位数
            }
            //若相等,则为水仙花数
            if(i == sum) {
                System.out.println(i);
            }
        }
    }

5. 写一个函数返回参数二进制中 1 的个数 比如: 15    0000 1111     4 1

方法:用这个数字n按位与上n-1,结果不为0,则继续计算,直到结果为0,求出共计算了几次,则n二进制中有几个1.

  public static void main(String[] args) {     
        int n = 7;
        int count = 0;//用count标记共计算了几次
        while (n != 0) {
            count++;
            n = n & (n-1);
        }
        System.out.println(count);//几次即二进制有几个1

今天的分享就到这里,谢谢大家的点赞支持!!!!!

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值