Просмотр исходного кода

feat: 新增20260717课堂笔记、README更新及c260717项目代码(Java方法、排序算法复习、Scanner学生信息采集系统)

WanJL 1 день назад
Родитель
Сommit
aace7406e4

+ 2 - 0
README.md

@@ -26,6 +26,7 @@
 | 2026-07-14 | [Java 运算符与流程控制](./课堂笔记/01-JavaSE基础-笔记/20260714-笔记.md) |
 | 2026-07-15 | [switch分支、循环结构、嵌套循环与数组](./课堂笔记/01-JavaSE基础-笔记/20260715-笔记.md) |
 | 2026-07-16 | [多维数组、forEach、Arrays工具类、三种排序算法(冒泡/选择/插入)与 Scanner 键盘输入](./课堂笔记/01-JavaSE基础-笔记/20260716-笔记.md) |
+| 2026-07-17 | [Java方法、三种排序算法复习、Scanner 学生信息采集系统](./课堂笔记/01-JavaSE基础-笔记/20260717-笔记.md) |
 
 ## 二、授课代码
 
@@ -38,4 +39,5 @@
 | 2026-07-14 | Java 运算符与流程控制 | `c260714` | [默认包](./授课代码/c260714/src/) |
 | 2026-07-15 | switch分支、循环结构与数组 | `c260715` | [默认包](./授课代码/c260715/src/) |
 | 2026-07-16 | 多维数组、forEach、Arrays工具类、三种排序算法(冒泡/选择/插入)与 Scanner 键盘输入 | `c260716` | [默认包](./授课代码/c260716/src/) |
+| 2026-07-17 | Java方法、三种排序算法复习、Scanner 学生信息采集系统(BMI计算) | `c260717` | [默认包](./授课代码/c260717/src/) |
 

+ 30 - 0
授课代码/c260717/.gitignore

@@ -0,0 +1,30 @@
+### IntelliJ IDEA ###
+out/
+!**/src/main/**/out/
+!**/src/test/**/out/
+.kotlin
+
+### Eclipse ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+bin/
+!**/src/main/**/bin/
+!**/src/test/**/bin/
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+
+### VS Code ###
+.vscode/
+
+### Mac OS ###
+.DS_Store

+ 91 - 0
授课代码/c260717/src/Demo01.java

@@ -0,0 +1,91 @@
+import java.util.Scanner;
+
+/**
+ * @author WanJl
+ * @version 1.0
+ * @title Demo01
+ * @description java方法
+ * @create 2026/7/17
+ */
+public class Demo01 {
+    /*
+        方法--在Java中叫方法,在C/C++中叫函数
+        他们在不同的语言中含义不同,但是格式差不多
+        都是给一段代码取名字,以后通过这个名字来调用这段代码。
+        就像我们设计一个计算器工具
+        我们不需要每次都重新制造计算器,而是直接使用就可以
+        方法就是让代码可以复用,分解整个程序的复杂度,方便我们测试和调试
+
+        方法按照 【是否具有返回值】 和 【是否具有参数】 可以分为4种声明的方式
+
+        第1种 : 既没有参数、也没有返回值
+        public static void 方法名(){
+            里面就是封装的代码,
+            我们称为方法体
+        }
+        public static : 修饰符,暂时不用管 后面会详细的讲
+        void : 当一个方法没有设置返回值类型的时候,需要在使用void 占位
+        方法名:调用的时候使用方法名调用
+        ()  : 用来标识这是一个方法,并且()里面可能会定义方法的参数
+
+     */
+
+    /**
+     * 第一个方法,计算用户输入的两个整数,累加后输出
+     */
+    public static void add(){
+        Scanner sc=new Scanner(System.in);
+        System.out.println("请输入第1个数:");
+        int n1=sc.nextInt();
+        System.out.println("请输入第2个数:");
+        int n2=sc.nextInt();
+        int sum=n1+n2;
+        System.out.println("计算结果为:"+sum);
+        //sc.close();
+    }
+    /*
+        第2种 : 有方法参数,但是没有方法返回值
+        如果调用方法的时候,需要传入n个变量值,参与方法内部的代码运算和执行
+        那么就可以通过参数把值传入到方法中
+
+        public static void 方法名(参数1,参数2,....,参数n){
+
+        }
+
+        调用带有参数的方法:
+        方法名(实际参数值1,实际参数值2,....,实际参数值n);
+     */
+    public static void add(int a,int b){
+        int sum=a+b;
+        System.out.println(sum);
+    }
+
+
+    public static void main(String[] args) {
+        //直接通过  方法名()   调用方法
+        //add();      //调用没有参数的方法
+        //调用有参数的方法
+        add(15,7);
+        add(8,25);
+        add(7,76);
+        add(9,23);
+
+    }
+        /*
+            声明一个计算2个整数相减的方法,并调用。定义参数a和b -----没有返回值、有参数的方法
+            声明一个循环输出1~100的整数的方法,并调用---没有返回值、没有参数的方法
+            声明一个获取三个变量中最大值的方法,调用方法,传入3个参数,会输出最大值
+
+
+         */
+
+
+
+
+
+
+
+
+
+
+}

+ 34 - 0
授课代码/c260717/src/HomeWork01.java

@@ -0,0 +1,34 @@
+/**
+ * @author WanJl
+ * @version 1.0
+ * @title HomeWork01
+ * @description 7月16日作业-冒泡排序
+ * @create 2026/7/17
+ */
+public class HomeWork01 {
+    public static void main(String[] args) {
+        /*
+            冒泡排序
+                比较相邻元素的大小,比较大的交换位置
+                1、一共可能会比较几轮 最多 长度-1轮
+                2、每轮比较几次 逐次减少,最多 长度-1次
+         */
+        int[]arr={29, 10, 14, 37, 13, 33, 48, 22};
+        // arr.length -1 为什么? 是比较的轮数
+        for (int i = 0; i < arr.length-1; i++) {
+            boolean b=false;    //作为标记  目的就是是记录是否出现提前排完序的情况
+            for (int j = 0; j < arr.length-1-i; j++) {
+                if (arr[j]>arr[j+1]){
+                    arr[j]= arr[j]+arr[j+1];
+                    arr[j+1]=arr[j]-arr[j+1];
+                    arr[j]= arr[j]-arr[j+1];
+                    b=true;     //b=true说明就没排完序
+                }
+            }
+            //判断 b是否等于false b=false,说明已经排序了,就没有必要再继续循环了。
+            if (!b){
+                break;  //所以就跳出外层循环,结束了
+            }
+        }
+    }
+}

+ 34 - 0
授课代码/c260717/src/HomeWork02.java

@@ -0,0 +1,34 @@
+/**
+ * @author WanJl
+ * @version 1.0
+ * @title HomeWork02
+ * @description  7月16日作业-选择排序(降序)-选最大的
+ * @create 2026/7/17
+ */
+public class HomeWork02 {
+    public static void main(String[] args) {
+        /*
+            选出来最小的元素,和第1个元素进行交换
+            每一轮外层循环,只交换1次。
+         */
+        int[] arr={56, 23, 89, 12, 45, 67, 34, 78};
+        
+        //外层循环,i既是已排序区间的末尾边界,也是当前要确定的位置
+        for (int i = 0; i < arr.length-1; i++) {
+            //假设当前没有排序的区间的第1个元素是最大的。
+            int maxIndex=i; //现在 maxIndex==i
+            for (int j = i+1; j <arr.length; j++) { //通过一轮循环,选出来最大的元素的索引值
+                if (arr[j]>arr[maxIndex]){
+                    maxIndex=j;
+                }
+            }
+            //如果最大值不在i的位置,就就说明maxIndex!=i 说明上面的if语句里的代码起作用了
+            //说明 数组中有比当前maxIndex对应的元素还大的元素。所以就要交换位置
+            if (maxIndex!=i){
+                arr[maxIndex]= arr[maxIndex]+arr[i];
+                arr[i]=arr[maxIndex]-arr[i];
+                arr[maxIndex]= arr[maxIndex]-arr[i];
+            }
+        }
+    }
+}

+ 31 - 0
授课代码/c260717/src/HomeWork03.java

@@ -0,0 +1,31 @@
+/**
+ * @author WanJl
+ * @version 1.0
+ * @title HomeWork03
+ * @description  7月16日作业-插入排序-升序
+ * @create 2026/7/17
+ */
+public class HomeWork03 {
+    public static void main(String[] args) {
+        /*
+            把一个数组分为两部分,studentScores[0](已排序部分)   和 studentScores[1]~studentScores[studentScores.length-1](未排序部分)
+            然后,从未排序部分取出第1个元素,跟已排序部分从最后一个元素开始比较,知道找到比这个元素小的元素,放到它后面
+         */
+        int[] studentScores={88, 72, 93, 65, 81, 97, 78, 85};
+        //从第2个元素studentScores[1]开始,因为假设 studentScores[0]第1个元素是已排序部分
+        for (int i = 1; i <studentScores.length; i++) {
+            //设定当前要插入的元素就是本轮的i对应的元素
+            int current=studentScores[i];
+            //设定已排序部分的最后一个元素
+            int j=i-1;
+            //从后往前扫描已排序部分,寻找到插入的位置
+            //如果已排序部分的元素大于current,就往后移动一位
+            while (j>=0&studentScores[j]>current){
+                studentScores[j+1]=studentScores[j];    //studentScores[j]往后移动1位
+                j--;    
+            }
+            //这个时候,j+1 就是current应该插入的位置
+            studentScores[j+1]=current;
+        }
+    }
+}

+ 76 - 0
授课代码/c260717/src/HomeWork04.java

@@ -0,0 +1,76 @@
+import java.util.Scanner;
+
+/**
+ * @author WanJl
+ * @version 1.0
+ * @title HomeWork04
+ * @description 7月16日作业-Scanner 学生信息采集系统
+ * @create 2026/7/17
+ */
+public class HomeWork04 {
+    /*
+    | 信息项                 | 数据类型 | 提示语                             |
+    | ---------------------- | -------- | ---------------------------------- |
+    | 姓名                   | String   | `请输入您的姓名:`                 |
+    | 学号                   | String   | `请输入您的学号:`                 |
+    | 年龄                   | int      | `请输入您的年龄:`                 |
+    | 性别                   | String   | `请输入您的性别(男/女):`        |
+    | 身高(米)             | double   | `请输入您的身高(米):`           |
+    | 体重(公斤)           | double   | `请输入您的体重(公斤):`         |
+    | 是否在校(true/false) | boolean  | `请输入您是否在校(true/false):` |
+        开发中常用的类型:
+            大部分形式的整数都用 int
+            其余所有字符、数字、符号基本都用String
+            所有小数都使用double
+            可能会出现2个值的,可以使用boolean 一般都是用作判断
+     */
+    public static void main(String[] args) {
+        //1、创建Scanner对象
+        Scanner sc=new Scanner(System.in);
+        System.out.println("请输入您的姓名:");
+        String name=sc.next();
+        System.out.println("请输入您的学号:");
+        String id=sc.next();
+        System.out.println("请输入您的年龄:");
+        int age=sc.nextInt();
+        System.out.println("请输入您的性别(男/女):");
+        String gender=sc.next();
+        System.out.println("请输入您的身高(米):");
+        double height=sc.nextDouble();
+        System.out.println("请输入您的体重(公斤):");
+        double weight=sc.nextDouble();
+        System.out.println("请输入您是否在校(true/false):");
+        boolean isStudent=sc.nextBoolean();
+        System.out.println("======== 学生信息卡 ========");
+        System.out.println("姓名:"+name);
+        System.out.println("学号:"+id);
+        System.out.println("年龄:"+age);
+        System.out.println("性别:"+gender);
+        System.out.println("身高:"+height);
+        System.out.println("体重:"+weight);
+        System.out.println("在校学生:"+isStudent);
+        //BMI = 体重 ÷ (身高 × 身高)
+        double bmi=(weight/(height*height));
+        System.out.printf("BMI:%.2f", bmi);
+        System.out.println();
+
+        int b;
+        if (bmi<18.5){
+            b=1;
+        }else if (bmi>=18.5&&bmi<24){
+            b=2;
+        }else if (bmi>=24&&bmi<28){
+            b=3;
+        }else {
+            b=4;
+        }
+        System.out.print("体型判定:");
+        switch (b){
+            case 1-> System.out.println("偏瘦");
+            case 2-> System.out.println("正常");
+            case 3-> System.out.println("偏胖");
+            default-> System.out.println("肥胖");
+        }
+        System.out.println("============================");
+    }
+}

+ 326 - 0
课堂笔记/01-JavaSE基础-笔记/20260717-笔记.md

@@ -0,0 +1,326 @@
+# JavaSE 基础 — Day05 笔记
+
+> **日期**:2026-07-17  
+> **项目**:`c260717`  
+> **作者**:WanJL
+
+---
+
+## 一、Java 方法(Method)
+
+### 1. 方法概述
+
+**方法(Method)** 在 Java 中称为方法,在 C/C++ 中称为函数。它们是给一段代码取名字,以后通过这个名字来调用这段代码。
+
+> **作用**:让代码可以复用,分解整个程序的复杂度,方便测试和调试。
+
+### 2. 方法的四种声明方式
+
+方法按照 **是否具有返回值** 和 **是否具有参数** 可以分为 4 种声明方式:
+
+#### 第 1 种:既没有参数、也没有返回值
+
+```java
+public static void 方法名() {
+    // 方法体:封装的代码
+}
+```
+
+- `public static`:修饰符(后续详细讲解)
+- `void`:当方法没有设置返回值类型时,需要使用 `void` 占位
+- `方法名`:调用时使用方法名调用
+- `()`:标识这是一个方法,并且可以定义参数
+
+**示例**:计算用户输入的两个整数,累加后输出
+
+```java
+public static void add() {
+    Scanner sc = new Scanner(System.in);
+    System.out.println("请输入第1个数:");
+    int n1 = sc.nextInt();
+    System.out.println("请输入第2个数:");
+    int n2 = sc.nextInt();
+    int sum = n1 + n2;
+    System.out.println("计算结果为:" + sum);
+}
+```
+
+调用方式:`add();`
+
+#### 第 2 种:有方法参数,但是没有方法返回值
+
+```java
+public static void 方法名(参数类型1 参数名1, 参数类型2 参数名2, ..., 参数类型n 参数名n) {
+    // 方法体
+}
+```
+
+**示例**:计算两个整数相加并输出
+
+```java
+public static void add(int a, int b) {
+    int sum = a + b;
+    System.out.println(sum);
+}
+```
+
+调用方式:`add(15, 7);` — 传入实际参数值
+
+#### 第 3 种 & 第 4 种(预告)
+
+后续课程将补充有返回值的方法声明方式。
+
+### 3. main 方法调用示例
+
+```java
+public static void main(String[] args) {
+    // 调用有参数的方法
+    add(15, 7);
+    add(8, 25);
+    add(7, 76);
+    add(9, 23);
+}
+```
+
+### 4. 方法练习
+
+> 以下为课堂练习,可使用上述方法知识实现:
+
+1. 声明一个计算 2 个整数相减的方法,定义参数 a 和 b —— 没有返回值、有参数的方法
+2. 声明一个循环输出 1~100 的整数的方法并调用 —— 没有返回值、没有参数的方法
+3. 声明一个获取三个变量中最大值的方法,调用方法传入 3 个参数,会输出最大值
+
+---
+
+## 二、课后作业 —— 三种排序算法复习
+
+> 本日作业巩固了 7 月 16 日学习的三种排序算法。
+
+### 作业 1:冒泡排序(HomeWork01)
+
+```java
+// 冒泡排序 — 优化版本(带提前结束标记)
+int[] arr = {29, 10, 14, 37, 13, 33, 48, 22};
+
+// arr.length - 1 是比较的轮数
+for (int i = 0; i < arr.length - 1; i++) {
+    boolean b = false;  // 标记是否出现提前排完序的情况
+    
+    for (int j = 0; j < arr.length - 1 - i; j++) {
+        if (arr[j] > arr[j + 1]) {
+            // 通过加减法交换两数(不使用临时变量)
+            arr[j] = arr[j] + arr[j + 1];
+            arr[j + 1] = arr[j] - arr[j + 1];
+            arr[j] = arr[j] - arr[j + 1];
+            b = true;  // 标记本轮有交换,说明还没排完序
+        }
+    }
+    
+    // 如果 b == false,说明已经排序完成,提前跳出循环
+    if (!b) {
+        break;
+    }
+}
+```
+
+#### 冒泡排序核心思想
+
+| 项目 | 说明 |
+|------|------|
+| 排序方式 | 比较相邻元素的大小,较大的交换位置 |
+| 最多轮数 | 长度 - 1 轮 |
+| 每轮比较次数 | 逐次减少,最长 - 1 次 |
+| 优化手段 | 通过 `boolean` 标记判断是否提前完成排序 |
+| 交换技巧 | 使用加减法交换两数,无需临时变量 |
+
+### 作业 2:选择排序 — 降序(HomeWork02)
+
+> 选择排序:选出来最小的元素,和第 1 个元素进行交换。每一轮外层循环只交换 1 次。
+
+```java
+// 选择排序(降序)— 选最大的
+int[] arr = {56, 23, 89, 12, 45, 67, 34, 78};
+
+// 外层循环,i 既是已排序区间的末尾边界,也是当前要确定的位置
+for (int i = 0; i < arr.length - 1; i++) {
+    // 假设当前未排序区间的第 1 个元素是最大的
+    int maxIndex = i;
+    
+    // 通过一轮循环,选出最大元素的索引值
+    for (int j = i + 1; j < arr.length; j++) {
+        if (arr[j] > arr[maxIndex]) {
+            maxIndex = j;
+        }
+    }
+    
+    // 如果最大值不在 i 的位置,则交换
+    if (maxIndex != i) {
+        arr[maxIndex] = arr[maxIndex] + arr[i];
+        arr[i] = arr[maxIndex] - arr[i];
+        arr[maxIndex] = arr[maxIndex] - arr[i];
+    }
+}
+```
+
+#### 选择排序核心思想
+
+| 项目 | 说明 |
+|------|------|
+| 排序方式 | 每轮选出最大(或最小)元素,与当前位置交换 |
+| 交换次数 | 每轮最多交换 1 次 |
+| 降序实现 | 每轮选出最大值放到前面 |
+| 交换条件 | 仅当 `maxIndex != i` 时才交换 |
+
+### 作业 3:插入排序 — 升序(HomeWork03)
+
+> 把一个数组分为两部分:已排序部分和未排序部分。从未排序部分取出第 1 个元素,与已排序部分从最后一个元素开始比较,直到找到比这个元素小的元素,放到它后面。
+
+```java
+// 插入排序(升序)
+int[] studentScores = {88, 72, 93, 65, 81, 97, 78, 85};
+
+// 从第 2 个元素开始(假设第 1 个元素是已排序部分)
+for (int i = 1; i < studentScores.length; i++) {
+    // 当前要插入的元素
+    int current = studentScores[i];
+    // 已排序部分的最后一个元素的索引
+    int j = i - 1;
+    
+    // 从后往前扫描已排序部分,寻找插入位置
+    while (j >= 0 && studentScores[j] > current) {
+        studentScores[j + 1] = studentScores[j];  // 往后移动一位
+        j--;
+    }
+    
+    // j + 1 就是 current 应该插入的位置
+    studentScores[j + 1] = current;
+}
+```
+
+#### 插入排序核心思想
+
+| 项目 | 说明 |
+|------|------|
+| 排序方式 | 将数组分为已排序和未排序两部分 |
+| 起始状态 | `studentScores[0]` 为已排序部分 |
+| 插入方式 | 从后往前扫描已排序部分,找到合适位置插入 |
+| 移动方式 | 比当前元素大的元素均向后移动一位 |
+
+---
+
+## 三、课后作业 —— Scanner 学生信息采集系统(HomeWork04)
+
+> 使用 `Scanner` 键盘输入,采集学生信息并计算 BMI 指数。
+
+### 信息采集表
+
+| 信息项 | 数据类型 | 提示语 |
+|--------|----------|--------|
+| 姓名 | `String` | `请输入您的姓名:` |
+| 学号 | `String` | `请输入您的学号:` |
+| 年龄 | `int` | `请输入您的年龄:` |
+| 性别 | `String` | `请输入您的性别(男/女):` |
+| 身高(米) | `double` | `请输入您的身高(米):` |
+| 体重(公斤) | `double` | `请输入您的体重(公斤):` |
+| 是否在校 | `boolean` | `请输入您是否在校(true/false):` |
+
+### 开发中常用的类型选择
+
+| 场景 | 推荐类型 | 说明 |
+|------|----------|------|
+| 整数 | `int` | 大部分整数使用 int |
+| 字符、数字、符号 | `String` | 其余所有情况基本都用 String |
+| 小数 | `double` | 所有小数都使用 double |
+| 二值选择 | `boolean` | 可能出现 2 个值的,一般用于判断 |
+
+### 完整代码示例
+
+```java
+public static void main(String[] args) {
+    // 1、创建 Scanner 对象
+    Scanner sc = new Scanner(System.in);
+    
+    System.out.println("请输入您的姓名:");
+    String name = sc.next();
+    System.out.println("请输入您的学号:");
+    String id = sc.next();
+    System.out.println("请输入您的年龄:");
+    int age = sc.nextInt();
+    System.out.println("请输入您的性别(男/女):");
+    String gender = sc.next();
+    System.out.println("请输入您的身高(米):");
+    double height = sc.nextDouble();
+    System.out.println("请输入您的体重(公斤):");
+    double weight = sc.nextDouble();
+    System.out.println("请输入您是否在校(true/false):");
+    boolean isStudent = sc.nextBoolean();
+    
+    System.out.println("======== 学生信息卡 ========");
+    System.out.println("姓名:" + name);
+    System.out.println("学号:" + id);
+    System.out.println("年龄:" + age);
+    System.out.println("性别:" + gender);
+    System.out.println("身高:" + height);
+    System.out.println("体重:" + weight);
+    System.out.println("在校学生:" + isStudent);
+    
+    // BMI = 体重 ÷ (身高 × 身高)
+    double bmi = weight / (height * height);
+    System.out.printf("BMI:%.2f", bmi);
+    System.out.println();
+    
+    // 体型判定
+    int b;
+    if (bmi < 18.5) {
+        b = 1;
+    } else if (bmi >= 18.5 && bmi < 24) {
+        b = 2;
+    } else if (bmi >= 24 && bmi < 28) {
+        b = 3;
+    } else {
+        b = 4;
+    }
+    
+    System.out.print("体型判定:");
+    switch (b) {
+        case 1 -> System.out.println("偏瘦");
+        case 2 -> System.out.println("正常");
+        case 3 -> System.out.println("偏胖");
+        default -> System.out.println("肥胖");
+    }
+    System.out.println("============================");
+}
+```
+
+### BMI 判定标准
+
+| BMI 范围 | 体型判定 |
+|----------|----------|
+| BMI < 18.5 | 偏瘦 |
+| 18.5 ≤ BMI < 24 | 正常 |
+| 24 ≤ BMI < 28 | 偏胖 |
+| BMI ≥ 28 | 肥胖 |
+
+### 知识点回顾
+
+- **Scanner 基础方法**:
+  - `sc.next()` — 读取字符串
+  - `sc.nextInt()` — 读取整数
+  - `sc.nextDouble()` — 读取小数
+  - `sc.nextBoolean()` — 读取布尔值
+- **printf 格式化输出**:`System.out.printf("BMI:%.2f", bmi);` — 保留两位小数
+- **switch 箭头语法**:`case 1 -> System.out.println("偏瘦");` — Java 14+ 新特性
+
+---
+
+## 四、本日总结
+
+| 知识点 | 主要内容 |
+|--------|----------|
+| **Java 方法** | 方法的定义、4 种声明方式、参数传递、方法调用 |
+| **冒泡排序** | 相邻比较、交换、提前结束优化 |
+| **选择排序** | 每轮选最大值、降序排列 |
+| **插入排序** | 已排序/未排序分区、从后往前插入 |
+| **Scanner 综合应用** | 学生信息采集、BMI 计算与体型判定 |
+| **switch 箭头语法** | `case ->` 新式写法 |
+| **printf 格式化** | `%.2f` 保留两位小数 |