说明

这是一个完善了但又不完善的笔记,或许以后会更新

可以参考但请务必超越

源文件



Tools


Typora
PicGo

逻辑控制

注意,所有的代码,都是用程序逻辑控制实现的

讲简单点,就是通过顺序循环判断等方式使功能实现。

所以这一篇内容其实可以说是最简单的,但是要在实际中使用,就要看个人的发挥了。

1.顺序结构

就简单的不行,平常写出来的代码就是按顺序走的

public static void main(String[] args) {
    System.out.println("1");
    System.out.println("2");
    System.out.println("3");
    System.out.println("4"); 
    //顺序打印
}

所以所有的代码都是用逻辑控制实现的...因为写出来默认就是顺序

2.分支结构

2.1 if语句

if(布尔表达式){
    //条件满足时执行代码
}
if(布尔表达式){
    //条件满足时执行代码
}else{
    //条件不满足时执行代码
}
if(布尔表达式){
    //条件满足时执行代码
}else if(布尔表达式){
    //条件满足时执行代码
}else{
    //条件不满足时执行代码
}

举个栗子 判断奇偶

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    int n = scanner.nextInt();
    //scanner输入,现在先不用管,可以先用着,以后再讲
    //在idea中会自动在第一行写下import java.util.Scanner;也可以自己选择添不添加
    //类似于C语言的include,Java.util就相当于C语言的库函数
    if (n % 2 == 0) {
        System.out.println("偶数");
    } else {
        System.out.println("奇数");
    }
}

注意这里输入的应该是一个整数,输入其他的都会异常。

输入Scanner

这里提前用到了输入,可以看到Java的输入有点麻烦,其实不但麻烦,这个输入功能还做的很粗糙,他有bug。

不过Java本身就不是用来开发控制台程序的,所以其实用的较少

这里先讲一点点

import java.util.Scanner;
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
//输入整数
String str = scanner.next();
//遇到空格读取结束
String str = scanner.nextLine();
//正常

这里可以直接查Scanner的文档,想要输入什么就使用scanner.next类型就可以了。

注意:

  1. 在OJ等写代码的的时候,因为后台可能会测试多组用例,所以可以使用has来循环输入,例如输入整数就是scanner.hansNextInt()
  2. 如果先使用scanner.nextInt()输入整数,后使用scanner.nextLine()输入字符串,那么打印的时候会发现字符串就会直接跳过去不打印
  3. 简单使用scanner,可以用。项目当中,慎重!
scanner.close();

scanner在Java中属于一种资源,他在这里打开的System.in相当于一个键盘,和C语言的fopenfclose类似。不关其实也没什么事。

举个栗子 判断正负

就很简单

public static void main(String[] args) {
    int num = 10;
    if (num > 0) {
        System.out.println("num 是正数");
    } else if (num < 0) {
        System.out.println("num 是负数");
    } else {
        System.out.println("num 是 0");
    }
}

举个栗子 判断闰年

这个比较经典,也比较简单,注意世纪闰年和普通闰年就好了

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    int year = scanner.nextInt();
    if (year % 100 != 0 && year % 4 == 0 || year % 400 == 0) {
        System.out.println(year+"是闰年!");
    } else {
        System.out.println(year+"不是闰年!");
    }
    scanner.close();
}

注意

最最最关键的代码风格!

代码的可阅读性,极其重要!

你写的代码,别人看不懂,不是说明你很厉害,而是说明你很垃圾,写出来别人都看不懂!

悬垂else

每一个else都会和最近的一个if对应上

该加的括号都加上!

int x = 10;
int y = 10;
if (x == 10)     
    if (y == 10)
        System.out.println("aaa");
else
    System.out.println("bbb");

很好,脑溢血上头了

代码风格问题

// 风格1
int x = 10;
if (x == 10) {
    // 满足条件
} else {
    // 不满足条件
}
// 风格2
int x = 10;
if (x == 10) {
    // 满足条件
}
else
{
    // 不满足条件
}

虽然两种方式都是合法的,但是Java中更推荐使用风格1

分号问题

int x = 20;
if(x == 10);{
    System.out.println("hehe");
}

//加了分号相当于结束了语句,那if(x == 10)就没用了,爱是啥是啥,都一定会打印hehe

2.2 switch语句

switch(整数|枚举|字符|字符串){
    case 内容1:{
        //内容满足时执行语句;
        [break;]
    }
    case 内容2:{
        //内容满足时执行语句;
        [break;]
    }
    default:{
        //内容都不满足时执行语句;
        [break;]
    }   
}

break不能遗漏!break的功能是让循环提前结束。不然就一直走下去成顺序结构了。

Java当中switch的参数数据类型是有限的,当然也不能表达复杂的条件

所以注意:

  1. 基本数据类型中long、float、double、boolean都不可以。
  2. JDK1.5开始引入了枚举,枚举也可以作为switch的参数

讲到switch就得说一下,工作中尽量不要使用switch,当然也不是绝对不使用。

关于嵌套

switch在实际使用的时候都很少,那嵌套看起来会更加的...难看

3.循环结构

循环的使用,其实一般都应该使用for循环和while循环的多。不过也应该视情况而定。

循环其实也没多少内容,不过用的很多

调试

讲到循环肯定就和调试有关了,想看一看程序是怎么执行的循环,就可以通过调试来看

这里环境为idea,idea也非常方便

鼠标点击行号右边代码左边可以打断点

右键选择Debug或者快捷键shift+F9进入调试,F7逐条可以进入函数,F8逐语句不进入函数

可以看图认识,如果想看内存或者其他信息可以右键变量页面栏添加其他窗口页面。

3.1 while循环

while(循环条件){
    循环语句;
}

注意循环条件是布尔表达式!

举个栗子

就很简单

public static void main(String[] args) {
    int i = 0;
    int sum = 0;
    while (i <= 5) {
        sum = sum + i;    
        i++;
    }
    System.out.println("sum = " + sum);
    //1+2+3+4+5=15
}

死循环

在C语言中1为真,所以条件是1就可以。Java中需要使用true

while(true){
    //一直循环的内容
}

计算5的阶乘

public static void main(String[] args) {
    int x = 5;
    int y = 1;
    int ret = 1;
    while (y <= x) {
        ret = ret * y;
        y++;
    }
    System.out.println(ret);
}

再麻烦的1!+2!+3!+4!+5!阶乘相加

就不写了,后面可以使用for循环更简单

注意

因为和if的格式类似,所以也有一些要规范注意的点

  1. while 下面的语句可以不写 { } ,但是不写的时候只能支持一条语句。建议还是加上 { }
  2. while 后面的 { 建议和 while 写在同一行。
  3. while 后面不要多写 分号,否则可能导致循环不能正确执行。

3.2 break

break的功能是让循环提前结束。当然必须在循环当中!

这个很容易理解,当然在switch里可以使用break。

举个栗子

举个很简单的例子就可以

找1-10之间第一个3的倍数,找到就提前结束了嘛

public static void main(String[] args) {
    int i = 1;
    while (i <= 10) {
        if (i % 3 == 0) {        
            System.out.println(i);
            break;
        }
        i++;
    }
}

3.3 continue

继续,就更简单了,也必须在循环当中。switch也可以使用。

直接用上面break的例子,找到3的倍数继续走

public static void main(String[] args) {
    int i = 1;
    while (i <= 10) {
        if (i % 3 == 0) {        
            i++;
            continue;
        }
        System.out.println(i);
        i++;
    }
}

关于break和continue的注意

首先他们必须在循环中,然后

既然在循环中,那么他们起作用的时候,只能在当前循环起作用

例如

for (int i = 0; i < 10; i++) {
    for (int j = 0; j < 10; j++) {
        if(j == 2){
            break;
            //只结束了j的循环
        }
    }
}

也就是说作用于最近的循环

goto

Java里面没有goto

但是goto目前是保留字,随时有一天可能启用。

注意,就算你知道goto,也不要用。

公司大多数也会直接禁用goto

goto:想去哪就去哪

3.4 for循环

for(表达式1;表达式2;表达式3;){
    //循环体
}

在Java中要注意的是表达式2必须是布尔表达式!

  • 表达式1用于初始化循环变量
  • 表达式2是循环条件
  • 表达式3是更新循环变量

他的一个运行顺序是这样的,可能初学者不是很懂会很懵,不知道表达式3和循环体那个先运行

表达式1 -> 表达式2 -> 循环体 -> 表达式3

idea的快捷输入

之前有说过idea有psvm快速写main函数和sout快速打印

for循环idea也提供了fori的快捷输入方式

他的方便之处就在于修改表达式1初始化的变量名表达式2和3就都会修改,而且会直接写好格式。

这里还有一个foreach,他是增强for循环,以后可以在数组和实现了iterable接口的集合类中再说。

死循环

for循环的死循环,表达式2为true或者压根就没条件即可

for(;;){
    //死循环内容
}

注意

布尔类型boolean的默认初始值为false,是对实例成员变量说的。这里表达式2不写,默认是true并不是false。

计算5的阶乘

还有计算1的阶乘加到5的阶乘,1!+2!+3!+4!+5!

这里使用for写,应该要比上面的while好

public static void main(String[] args) {
    //for循环计算5的阶乘
    int sum = 0;
    for (int j = 1; j <= 5; j++) {
        //1!+2!+3!+4!+5!
        int ret = 1;
        for (int i = 1; i <= j; i++) {
            //5的阶乘
            ret *= i;
        }
        sum += ret;
    }
    System.out.println(sum);
}

嵌套

for循环的嵌套,最好不要超过3层

时间复杂度和代码观赏性,也就是可阅读性,会裂开

3.5 do while循环

do{
    //循环语句;
}while(循环条件);

先执行循环语句,在判断循环条件。

就是说,一定会先执行一次!先斩后奏,上车补票。所以一般用的也很少。

你不想让他进入循环,他还是会进入一次,然后发现,我草,原来不让进...

4.输入输出

4.1 输出到控制台

System.out.println(msg); // 输出一个字符串, 带换行
System.out.print(msg); // 输出一个字符串, 不带换行
System.out.printf(format, msg); // 格式化输出
  • println 输出的内容自带 \n, print 不带 \n
  • printf 的格式化输出方式和 C 语言的 printf 是基本一致的
    那些打印方式用的时候可以再查,例如%d什么的
System.out.println("hello");
System.out.print("world");
int i = 0;
System.out.printf("i = %d\n", i);

4.2 从键盘输入

这一块我们前面讲了scanner,实际上也推荐使用scanner

还有另外一种不推荐使用的System.in.read,需要搭配异常处理(以后会重点讲),这里只简单演示一下,反正也不用

import java.io.IOException;
//需要导入IOException包

public class test {
    public static void main(String[] args) throws IOException {
        //这里main函数后面加上了throws IOException
        System.out.print("Enter a Char:");
        char i = (char) System.in.read();
        System.out.println("your char is :"+i);
    }
}

如果不加异常处理,就会出错

可以看到,也非常的麻烦

5.猜数字游戏

系统生成1-100内随机整数,然后猜

这里就简单写一下,当然没有使用方法,也就是没有使用函数来实现

import java.util.Random;
import java.util.Scanner;

public class test {
    public static void main(String[] args) {
        //首先随机生成数字
        Random random = new Random();
        int rand = random.nextInt(100);
        //用户输入
        Scanner scanner = new Scanner(System.in);
        //开始判断
        while (true) {
            System.out.print("请输入你要猜的数字:");
            int n = scanner.nextInt();
            if (n < rand) {
                System.out.println("猜小了");
            } else if (n == rand) {
                System.out.println("猜对了");
                break;
            } else {
                System.out.println("猜大了");
            }
        }
    }
}

Random:随机数的固定写法,如果给他一个参数,也就是随机种子,他就会变成伪随机,随机数就会变成固定数

random.nextInt(100):这里默认是0-100如果想生成50-100需要一点小小的数学计算

实际演示

小头图版权:《絵里ちゃん》by 沙マコ/shamakho 2021年10月20日晚上11点25分 pid:93577807

广告位招租
最后修改:2021 年 10 月 24 日 11 : 17 AM
如果觉得我的文章对你有用,请喂饱我!(理直气壮)