Compare commits

...

No commits in common. 'main' and 'master' have entirely different histories.
main ... master

  1. 71
      project1/Main.java
  2. 101
      project1/movie_top100.csv
  3. 45
      project1/pom.xml
  4. BIN
      project1/排名顺序折线图.png
  5. BIN
      project1/柱状图.png
  6. 78
      w1 202403030325 刘子菡/TemperatureConverter.java
  7. 11
      w1 202403030325 刘子菡/W1 刘子菡 202403030325.md
  8. BIN
      w1 202403030325 刘子菡/屏幕截图 W1 刘子菡202403030325.png
  9. 1
      w1 202403030325 刘子菡/心得体会.txt
  10. 36
      w2 202403030325 刘子菡/DataCleaner.java
  11. BIN
      w2 202403030325 刘子菡/运行结果截图.png
  12. 76
      w3/BankAccount.java
  13. 34
      w3/BankAccountTest.java
  14. BIN
      w3/屏幕截图 2026-03-22 103058.png
  15. 12
      w4/Circle.java
  16. 155
      w4/README.md
  17. 14
      w4/Rectangle.java
  18. 3
      w4/Shape.java
  19. 18
      w4/ShapeTest.java
  20. 5
      w4/ShapeUtil.java
  21. 14
      w4/Triangle.java
  22. BIN
      w4/代码运行结果.png
  23. BIN
      w4/类图.jpg
  24. 6
      w5 Shape/Circle.java
  25. 6
      w5 Shape/Rectangle.java
  26. 5
      w5 Shape/Shape.java
  27. 15
      w5 Shape/TestShape.java
  28. 6
      w5 Vehicle/Bike.java
  29. 6
      w5 Vehicle/Car.java
  30. 14
      w5 Vehicle/TestVehicle.java
  31. 6
      w5 Vehicle/Truck.java
  32. 3
      w5 Vehicle/Vehicle.java
  33. BIN
      w5 Vehicle/屏幕截图 2026-04-03 233245.png
  34. 46
      w6/AnimalSystem.java
  35. BIN
      w6/运行截图.png

71
project1/Main.java

@ -1,71 +0,0 @@
package com.example;
import com.example.bean.Movie;
import com.example.crawler.MovieCrawler;
import com.example.chart.DrawChart;
import java.io.FileWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
// 1. 爬取数据
MovieCrawler crawler = new MovieCrawler();
List<Movie> movies = crawler.start();
// 2. 数据清洗
List<Movie> cleanData = new ArrayList<>();
for (Movie movie : movies) {
if (movie.getTitle() != null && !movie.getTitle().isBlank()) {
cleanData.add(movie);
}
}
// ===================== CSV 保存功能 恢复!=====================
try (FileWriter writer = new FileWriter("movie_top100.csv")) {
writer.write("电影名称,评分,导演,上映年份\n");
for (Movie m : cleanData) {
writer.write(m.getTitle() + "," + m.getScore() + "," + m.getDirector() + "," + m.getYear() + "\n");
}
System.out.println("✅ CSV 文件已保存:movie_top100.csv");
} catch (Exception e) {
e.printStackTrace();
}
// ==============================================================
// 3. 评分统计
Map<String, Long> scoreCount = cleanData.stream()
.collect(Collectors.groupingBy(Movie::getScore, Collectors.counting()));
// 4. 控制台打印表格
System.out.println("\n==========================================");
System.out.println(" 电影评分统计表格 ");
System.out.println("==========================================");
System.out.printf("%-10s %-10s %-10s%n", "评分", "数量(部)", "占比(%)");
System.out.println("------------------------------------------");
double total = cleanData.size();
for (Map.Entry<String, Long> entry : scoreCount.entrySet()) {
String score = entry.getKey();
long count = entry.getValue();
double rate = (count * 100.0) / total;
System.out.printf("%-12s %-12d %-10.2f%n", score, count, rate);
}
System.out.println("------------------------------------------");
System.out.printf("总计:%d 部电影%n", (long) total);
System.out.println("==========================================");
// 5. 生成正常折线图:按排名 1→100 顺序连线
List<Double> scoreList = new ArrayList<>();
for (Movie movie : cleanData) {
scoreList.add(Double.parseDouble(movie.getScore()));
}
DrawChart drawing = new DrawChart();
drawing.drawByOrder(scoreList);
}
}

101
project1/movie_top100.csv

@ -1,101 +0,0 @@
电影名称,评分,导演,上映年份
肖申克的救赎,9.7,弗兰克·德拉邦特,1994
霸王别姬,9.6,陈凯歌,1993
泰坦尼克号,9.5,詹姆斯·卡梅隆,1997
阿甘正传,9.5,罗伯特·泽米吉斯,1994
千与千寻,9.4,宫崎骏,2001
美丽人生,9.5,罗伯托·贝尼尼,1997
星际穿越,9.4,克里斯托弗·诺兰,2014
这个杀手不太冷,9.4,吕克·贝松,1994
盗梦空间,9.4,克里斯托弗·诺兰,2010
楚门的世界,9.4,彼得·威尔,1998
辛德勒的名单,9.5,史蒂文·斯皮尔伯格,1993
忠犬八公的故事,9.4,莱塞·霍尔斯道姆,2009
海上钢琴师,9.3,朱塞佩·托纳多雷,1998
疯狂动物城,9.3,拜伦·霍华德,2016
三傻大闹宝莱坞,9.2,拉库马·希拉尼,2009
机器人总动员,9.3,安德鲁·斯坦顿,2008
放牛班的春天,9.3,克里斯托夫·巴拉蒂,2004
无间道,9.3,刘伟强,2002
控方证人,9.6,比利·怀尔德,1957
寻梦环游记,9.1,李·昂克里奇,2017
大话西游之大圣娶亲,9.2,刘镇伟,1995
熔炉,9.3,黄东赫,2011
触不可及,9.3,奥利维·那卡什,2011
教父,9.3,弗朗西斯·福特·科波拉,1972
末代皇帝,9.3,贝纳尔多·贝托鲁奇,1987
大话西游之大圣娶亲,9.2,刘镇伟,1995
熔炉,9.3,黄东赫,2011
触不可及,9.3,奥利维·那卡什,2011
教父,9.3,弗朗西斯·福特·科波拉,1972
末代皇帝,9.3,贝纳尔多·贝托鲁奇,1987
哈利·波特与魔法石,9.2,Chris,2001
当幸福来敲门,9.1,加布里尔·穆奇诺,2006
龙猫,9.2,宫崎骏,1988
活着,9.3,张艺谋,1994
怦然心动,9.1,罗伯·莱纳,2010
蝙蝠侠:黑暗骑士,9.2,克里斯托弗·诺兰,2008
指环王3:王者无敌,9.3,彼得·杰克逊,2003
我不是药神,9.0,文牧野,2018
乱世佳人,9.3,维克多·弗莱明,1939
飞屋环游记,9.1,彼特·道格特,2009
让子弹飞,9.0,姜文,2010
哈尔的移动城堡,9.1,宫崎骏,2004
十二怒汉,9.4,西德尼·吕美特,1957
海蒂和爷爷,9.3,阿兰·葛斯彭纳,2015
素媛,9.3,李濬益,2013
猫鼠游戏,9.1,史蒂文·斯皮尔伯格,2002
天空之城,9.2,宫崎骏,1986
鬼子来了,9.3,姜文,2000
摔跤吧!爸爸,9.0,涅提·蒂瓦里,2016
少年派的奇幻漂流,9.1,李安,2012
猫鼠游戏,9.1,史蒂文·斯皮尔伯格,2002
天空之城,9.2,宫崎骏,1986
鬼子来了,9.3,姜文,2000
摔跤吧!爸爸,9.0,涅提·蒂瓦里,2016
少年派的奇幻漂流,9.1,李安,2012
钢琴家,9.3,罗曼·波兰斯基,2002
指环王2:双塔奇兵,9.2,彼得·杰克逊,2002
死亡诗社,9.2,彼得·威尔,1989
大话西游之月光宝盒,9.0,刘镇伟,1995
绿皮书,8.9,彼得·法雷里,2018
何以为家,9.1,娜丁·拉巴基,2018
闻香识女人,9.1,马丁·布莱斯,1992
大闹天宫,9.4,万籁鸣,未知
黑客帝国,9.1,安迪·沃卓斯基,1999
指环王1:护戒使者,9.1,彼得·杰克逊,2001
罗马假日,9.1,威廉·惠勒,1953
教父2,9.3,弗朗西斯·福特·科波拉,1974
狮子王,9.1,Roger,1994
天堂电影院,9.2,朱塞佩·托纳多雷,1988
饮食男女,9.2,李安,1994
辩护人,9.2,杨宇硕,2013
本杰明·巴顿奇事,9.0,大卫·芬奇,2008
搏击俱乐部,9.0,大卫·芬奇,1999
美丽心灵,9.1,朗·霍华德,2001
穿条纹睡衣的男孩,9.2,马克·赫尔曼,2008
辩护人,9.2,杨宇硕,2013
本杰明·巴顿奇事,9.0,大卫·芬奇,2008
搏击俱乐部,9.0,大卫·芬奇,1999
美丽心灵,9.1,朗·霍华德,2001
穿条纹睡衣的男孩,9.2,马克·赫尔曼,2008
情书,8.9,岩井俊二,1995
哈利·波特与死亡圣器(下),9.0,大卫·叶茨,2011
两杆大烟枪,9.1,盖·里奇,1998
窃听风暴,9.2,弗洛里安·亨克尔·冯·多纳斯马尔克,2006
音乐之声,9.1,罗伯特·怀斯,1965
功夫,8.9,周星驰,2004
哈利·波特与阿兹卡班的囚徒,9.0,阿方索·卡隆,2004
西西里的美丽传说,8.9,朱塞佩·托纳多雷,2000
阿凡达,8.8,詹姆斯·卡梅隆,2009
看不见的客人,8.8,奥里奥尔·保罗,2016
拯救大兵瑞恩,9.1,史蒂文·斯皮尔伯格,1998
沉默的羔羊,8.9,乔纳森·戴米,1991
小鞋子,9.2,马基德·马基迪,1997
布达佩斯大饭店,8.9,韦斯·安德森,2014
蝴蝶效应,8.9,埃里克·布雷斯,2004
飞越疯人院,9.1,米洛斯·福尔曼,1975
禁闭岛,8.9,Martin,2010
还有明天,9.3,宝拉·柯特莱西,2023
心灵捕手,9.0,格斯·范·桑特,1997
致命魔术,8.9,克里斯托弗·诺兰,2006
1 电影名称 评分 导演 上映年份
2 肖申克的救赎 9.7 弗兰克·德拉邦特 1994
3 霸王别姬 9.6 陈凯歌 1993
4 泰坦尼克号 9.5 詹姆斯·卡梅隆 1997
5 阿甘正传 9.5 罗伯特·泽米吉斯 1994
6 千与千寻 9.4 宫崎骏 2001
7 美丽人生 9.5 罗伯托·贝尼尼 1997
8 星际穿越 9.4 克里斯托弗·诺兰 2014
9 这个杀手不太冷 9.4 吕克·贝松 1994
10 盗梦空间 9.4 克里斯托弗·诺兰 2010
11 楚门的世界 9.4 彼得·威尔 1998
12 辛德勒的名单 9.5 史蒂文·斯皮尔伯格 1993
13 忠犬八公的故事 9.4 莱塞·霍尔斯道姆 2009
14 海上钢琴师 9.3 朱塞佩·托纳多雷 1998
15 疯狂动物城 9.3 拜伦·霍华德 2016
16 三傻大闹宝莱坞 9.2 拉库马·希拉尼 2009
17 机器人总动员 9.3 安德鲁·斯坦顿 2008
18 放牛班的春天 9.3 克里斯托夫·巴拉蒂 2004
19 无间道 9.3 刘伟强 2002
20 控方证人 9.6 比利·怀尔德 1957
21 寻梦环游记 9.1 李·昂克里奇 2017
22 大话西游之大圣娶亲 9.2 刘镇伟 1995
23 熔炉 9.3 黄东赫 2011
24 触不可及 9.3 奥利维·那卡什 2011
25 教父 9.3 弗朗西斯·福特·科波拉 1972
26 末代皇帝 9.3 贝纳尔多·贝托鲁奇 1987
27 大话西游之大圣娶亲 9.2 刘镇伟 1995
28 熔炉 9.3 黄东赫 2011
29 触不可及 9.3 奥利维·那卡什 2011
30 教父 9.3 弗朗西斯·福特·科波拉 1972
31 末代皇帝 9.3 贝纳尔多·贝托鲁奇 1987
32 哈利·波特与魔法石 9.2 Chris 2001
33 当幸福来敲门 9.1 加布里尔·穆奇诺 2006
34 龙猫 9.2 宫崎骏 1988
35 活着 9.3 张艺谋 1994
36 怦然心动 9.1 罗伯·莱纳 2010
37 蝙蝠侠:黑暗骑士 9.2 克里斯托弗·诺兰 2008
38 指环王3:王者无敌 9.3 彼得·杰克逊 2003
39 我不是药神 9.0 文牧野 2018
40 乱世佳人 9.3 维克多·弗莱明 1939
41 飞屋环游记 9.1 彼特·道格特 2009
42 让子弹飞 9.0 姜文 2010
43 哈尔的移动城堡 9.1 宫崎骏 2004
44 十二怒汉 9.4 西德尼·吕美特 1957
45 海蒂和爷爷 9.3 阿兰·葛斯彭纳 2015
46 素媛 9.3 李濬益 2013
47 猫鼠游戏 9.1 史蒂文·斯皮尔伯格 2002
48 天空之城 9.2 宫崎骏 1986
49 鬼子来了 9.3 姜文 2000
50 摔跤吧!爸爸 9.0 涅提·蒂瓦里 2016
51 少年派的奇幻漂流 9.1 李安 2012
52 猫鼠游戏 9.1 史蒂文·斯皮尔伯格 2002
53 天空之城 9.2 宫崎骏 1986
54 鬼子来了 9.3 姜文 2000
55 摔跤吧!爸爸 9.0 涅提·蒂瓦里 2016
56 少年派的奇幻漂流 9.1 李安 2012
57 钢琴家 9.3 罗曼·波兰斯基 2002
58 指环王2:双塔奇兵 9.2 彼得·杰克逊 2002
59 死亡诗社 9.2 彼得·威尔 1989
60 大话西游之月光宝盒 9.0 刘镇伟 1995
61 绿皮书 8.9 彼得·法雷里 2018
62 何以为家 9.1 娜丁·拉巴基 2018
63 闻香识女人 9.1 马丁·布莱斯 1992
64 大闹天宫 9.4 万籁鸣 未知
65 黑客帝国 9.1 安迪·沃卓斯基 1999
66 指环王1:护戒使者 9.1 彼得·杰克逊 2001
67 罗马假日 9.1 威廉·惠勒 1953
68 教父2 9.3 弗朗西斯·福特·科波拉 1974
69 狮子王 9.1 Roger 1994
70 天堂电影院 9.2 朱塞佩·托纳多雷 1988
71 饮食男女 9.2 李安 1994
72 辩护人 9.2 杨宇硕 2013
73 本杰明·巴顿奇事 9.0 大卫·芬奇 2008
74 搏击俱乐部 9.0 大卫·芬奇 1999
75 美丽心灵 9.1 朗·霍华德 2001
76 穿条纹睡衣的男孩 9.2 马克·赫尔曼 2008
77 辩护人 9.2 杨宇硕 2013
78 本杰明·巴顿奇事 9.0 大卫·芬奇 2008
79 搏击俱乐部 9.0 大卫·芬奇 1999
80 美丽心灵 9.1 朗·霍华德 2001
81 穿条纹睡衣的男孩 9.2 马克·赫尔曼 2008
82 情书 8.9 岩井俊二 1995
83 哈利·波特与死亡圣器(下) 9.0 大卫·叶茨 2011
84 两杆大烟枪 9.1 盖·里奇 1998
85 窃听风暴 9.2 弗洛里安·亨克尔·冯·多纳斯马尔克 2006
86 音乐之声 9.1 罗伯特·怀斯 1965
87 功夫 8.9 周星驰 2004
88 哈利·波特与阿兹卡班的囚徒 9.0 阿方索·卡隆 2004
89 西西里的美丽传说 8.9 朱塞佩·托纳多雷 2000
90 阿凡达 8.8 詹姆斯·卡梅隆 2009
91 看不见的客人 8.8 奥里奥尔·保罗 2016
92 拯救大兵瑞恩 9.1 史蒂文·斯皮尔伯格 1998
93 沉默的羔羊 8.9 乔纳森·戴米 1991
94 小鞋子 9.2 马基德·马基迪 1997
95 布达佩斯大饭店 8.9 韦斯·安德森 2014
96 蝴蝶效应 8.9 埃里克·布雷斯 2004
97 飞越疯人院 9.1 米洛斯·福尔曼 1975
98 禁闭岛 8.9 Martin 2010
99 还有明天 9.3 宝拉·柯特莱西 2023
100 心灵捕手 9.0 格斯·范·桑特 1997
101 致命魔术 8.9 克里斯托弗·诺兰 2006

45
project1/pom.xml

@ -1,45 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.crawler</groupId>
<artifactId>movie-crawler</artifactId>
<version>1.0</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<!-- Jsoup:网页爬虫+HTML解析 -->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.15.4</version>
</dependency>
<!-- XChart:生成图表(简单易用) -->
<dependency>
<groupId>org.knowm.xchart</groupId>
<artifactId>xchart</artifactId>
<version>3.8.4</version>
</dependency>
<!-- OpenCSV:读写CSV文件 -->
<dependency>
<groupId>com.opencsv</groupId>
<artifactId>opencsv</artifactId>
<version>5.6</version>
</dependency>
<!-- MySQL驱动(可选,存数据库) -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
</dependencies>
</project>

BIN
project1/排名顺序折线图.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 84 KiB

BIN
project1/柱状图.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

78
w1 202403030325 刘子菡/TemperatureConverter.java

@ -1,78 +0,0 @@
package java01;
import java.util.Scanner;
/**
* 温度转换器示例程序Java
* 支持摄氏度(C)与华氏度(F)之间互转
* 与你提供的 Python 程序功能逻辑完全一致
*/
public class TemperatureConverter {
/**
* 将摄氏度转换为华氏度
* @param c 摄氏温度
* @return 对应的华氏温度
*/
public static double celsiusToFahrenheit(double c) {
return c * 9.0 / 5.0 + 32.0;
}
/**
* 将华氏度转换为摄氏度
* @param f 华氏温度
* @return 对应的摄氏温度
*/
public static double fahrenheitToCelsius(double f) {
return (f - 32.0) * 5.0 / 9.0;
}
/**
* 主逻辑读取输入解析判断单位转换并输出
*/
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 提示用户输入,格式示例:"36.6 C" 或 "97 F"
System.out.print("请输入要转换的温度与单位(例如 36.6 C 或 97 F):");
String s = scanner.nextLine().trim();
// 输入为空
if (s.isEmpty()) {
System.out.println("输入为空,程序退出。");
scanner.close();
return;
}
// 按空格拆分
String[] parts = s.split("\\s+");
double value;
String unit;
try {
// 解析数值与单位
value = Double.parseDouble(parts[0]);
if (parts.length > 1) {
unit = parts[1].toUpperCase();
} else {
unit = "C"; // 默认单位 C
}
} catch (Exception e) {
System.out.println("输入解析失败,请按示例输入数值与单位,例如:36.6 C");
scanner.close();
return;
}
// 根据单位转换
if (unit.startsWith("C")) {
double f = celsiusToFahrenheit(value);
System.out.printf("%.2f °C = %.2f °F%n", value, f);
} else if (unit.startsWith("F")) {
double c = fahrenheitToCelsius(value);
System.out.printf("%.2f °F = %.2f °C%n", value, c);
} else {
System.out.println("未知单位,请使用 C 或 F。");
}
scanner.close();
}
}

11
w1 202403030325 刘子菡/W1 刘子菡 202403030325.md

@ -1,11 +0,0 @@
# 温度转换程序作业提交
## 作业基础信息
- **项目名称**:TemperatureConverter
- **开发环境**:Eclipse IDE + Java JDK 17
- **核心功能**:实现摄氏度(C)与华氏度(F)双向转换,完全等效于原Python程序逻辑
## 编译与运行说明
### Eclipse 运行
1. 右键点击 `src/java01/TemperatureConverter.java` 文件;
2. 选择 `Run As``Java Application`
3. 在底部 Console 面板输入格式:`数值 单位`(例:36.6 C),按回车查看结果。

BIN
w1 202403030325 刘子菡/屏幕截图 W1 刘子菡202403030325.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 360 KiB

1
w1 202403030325 刘子菡/心得体会.txt

@ -1 +0,0 @@
本次作业我将 Python 温度转换程序移植为等效 Java 程序。我首先向 AI 提供了完整的 Python 源码,要求生成功能、逻辑完全一致的 Java 代码,并保留注释与交互逻辑。在实现过程中,AI 帮助我解决了包名不匹配、方法名拼写错误、语法分号缺失等问题,并指导我在 Eclipse 中进行调试和运行。最终,程序成功实现了摄氏与华氏的互转,并通过了测试用例,顺利完成作业。

36
w2 202403030325 刘子菡/DataCleaner.java

@ -1,36 +0,0 @@
package java01;
public class DataCleaner {
public static void main(String[] args) {
int[] sensorData = {85, -5, 92, 0, 105, 999, 88, 76};
int validSum = 0; // 有效数据总和
int validCount = 0; // 有效数据个数
// 遍历数组
for (int data : sensorData) {
// 规则3:遇到999,致命错误,终止循环
if (data == 999) {
System.out.println("致命错误:传感器掉线,终止处理");
break;
}
// 规则1:数据在1~100之间,计入有效数据
if (data >= 1 && data <= 100) {
validSum += data;
validCount++;
}
// 规则2:无效数据,跳过并打印警告
else if (data <= 0 || data > 100) {
System.out.println("警告:发现越界数据[" + data + "],已跳过");
continue;
}
}
// 规则4:最终输出平均值或无有效数据
if (validCount > 0) {
// 注意:用(double)强制转换避免整数除法陷阱
double average = (double) validSum / validCount;
System.out.println("有效数据平均值:" + average);
} else {
System.out.println("无有效数据");
}
}
}

BIN
w2 202403030325 刘子菡/运行结果截图.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 360 KiB

76
w3/BankAccount.java

@ -1,76 +0,0 @@
package java01;
public class BankAccount {
// 1. 私有成员变量(封装核心)
private String accountNumber; // 账号(不可修改)
private String ownerName; // 户主姓名(可修改)
private double balance; // 余额(只能通过存取款修改)
// 2. 构造方法:创建账户时必须传入账号和户主姓名,余额初始为0
public BankAccount(String accountNumber, String ownerName) {
this.accountNumber = accountNumber;
this.ownerName = ownerName;
this.balance = 0.0;
}
// 3. Getter方法(对外提供查询)
// 账号只有getter,没有setter,保证不可修改
public String getAccountNumber() {
return accountNumber;
}
public String getOwnerName() {
return ownerName;
}
public double getBalance() {
return balance;
}
// 4. Setter方法:只有户主姓名可以修改
public void setOwnerName(String ownerName) {
this.ownerName = ownerName;
}
// 5. 存款方法 deposit
public void deposit(double amount) {
if (amount > 0) {
balance += amount;
System.out.println("存款成功!当前余额:" + balance);
} else {
System.out.println("存款失败!存款金额必须大于0。");
}
}
// 6. 取款方法 withdraw
public void withdraw(double amount) {
if (amount > 0 && amount <= balance) {
balance -= amount;
System.out.println("取款成功!当前余额:" + balance);
} else if (amount <= 0) {
System.out.println("取款失败!取款金额必须大于0。");
} else {
System.out.println("取款失败!余额不足。");
}
}
// 测试主方法(可选,用来验证功能)
public static void main(String[] args) {
// 创建一个账户
BankAccount account = new BankAccount("622202123456789", "张三");
// 测试查询
System.out.println("账号:" + account.getAccountNumber());
System.out.println("户主:" + account.getOwnerName());
System.out.println("初始余额:" + account.getBalance());
// 测试存款
account.deposit(500);
account.deposit(-100); // 测试错误存款
// 测试取款
account.withdraw(200);
account.withdraw(400); // 测试余额不足
account.withdraw(-50); // 测试错误取款
}
}

34
w3/BankAccountTest.java

@ -1,34 +0,0 @@
package java01;
public class BankAccountTest {
public static void main(String[] args) {
System.out.println("========== 1. 测试账户创建 ==========");
BankAccount account = new BankAccount("622202123456789", "张三");
System.out.println("账号:" + account.getAccountNumber());
System.out.println("户主:" + account.getOwnerName());
System.out.println("初始余额:" + account.getBalance());
System.out.println();
System.out.println("========== 2. 测试修改户主姓名 ==========");
account.setOwnerName("张三丰");
System.out.println("修改后户主:" + account.getOwnerName());
System.out.println();
System.out.println("========== 3. 测试存款操作 ==========");
account.deposit(1000);
account.deposit(0);
account.deposit(-500);
System.out.println();
System.out.println("========== 4. 测试取款操作 ==========");
account.withdraw(300);
account.withdraw(800);
account.withdraw(0);
account.withdraw(-200);
System.out.println();
System.out.println("========== 5. 最终状态验证 ==========");
System.out.println("最终户主:" + account.getOwnerName());
System.out.println("最终余额:" + account.getBalance());
}
}

BIN
w3/屏幕截图 2026-03-22 103058.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 85 KiB

12
w4/Circle.java

@ -1,12 +0,0 @@
public class Circle extends Shape {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
@Override
public double getArea() {
return Math.PI * radius * radius;
}
}

155
w4/README.md

@ -1,155 +0,0 @@
# 图形面积计算器重构 实验报告
## 一、实验目的
1. 掌握 Java 抽象类与抽象方法的使用。
2. 理解面向对象的继承、多态特性。
3. 实现不同图形类的统一处理,提高代码扩展性。
## 二、实验任务
1. 设计抽象类 `Shape`,包含抽象方法 `getArea()`
2. 让 `Circle`、`Rectangle`、`Triangle` 继承 `Shape` 并实现面积计算。
3. 编写工具类 `ShapeUtil`,提供统一打印面积的方法。
4. 绘制 UML 类图。
5. 完成代码测试与实验报告。
## 三、实验环境
- 开发工具:Eclipse
- 编程语言:Java
- 版本控制:Git
## 四、项目结构
```
src/
├── Shape.java // 抽象类
├── Circle.java // 圆形类
├── Rectangle.java // 矩形类
├── Triangle.java // 三角形类
├── ShapeUtil.java // 工具类
└── ShapeTest.java // 测试主类
```
## 五、核心代码实现
### 1. 抽象类 Shape
```java
public abstract class Shape {
// 抽象方法:计算面积,子类必须实现
public abstract double getArea();
}
```
### 2. 圆形类 Circle
```java
public class Circle extends Shape {
// 私有属性:半径
private double radius;
// 构造方法:初始化半径
public Circle(double radius) {
this.radius = radius;
}
// 重写父类抽象方法:计算圆面积 πr²
@Override
public double getArea() {
return Math.PI * radius * radius;
}
}
```
### 3. 矩形类 Rectangle
```java
public class Rectangle extends Shape {
// 私有属性:宽、高
private double width;
private double height;
// 构造方法:初始化宽和高
public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}
// 重写父类抽象方法:计算矩形面积 宽×高
@Override
public double getArea() {
return width * height;
}
}
```
### 4. 三角形类 Triangle
```java
public class Triangle extends Shape {
// 私有属性:底、高
private double base;
private double height;
// 构造方法:初始化底和高
public Triangle(double base, double height) {
this.base = base;
this.height = height;
}
// 重写父类抽象方法:计算三角形面积 底×高/2
@Override
public double getArea() {
return base * height / 2;
}
}
```
### 5. 工具类 ShapeUtil
```java
public class ShapeUtil {
// 统一打印任意图形的面积(多态实现)
public static void printArea(Shape shape) {
System.out.println("图形面积:" + shape.getArea());
}
}
```
### 6. 测试主类 ShapeTest
```java
public class ShapeTest {
public static void main(String[] args) {
// 1. 创建不同图形对象(向上转型为Shape父类)
Shape circle = new Circle(5);
Shape rectangle = new Rectangle(4, 6);
Shape triangle = new Triangle(3, 4);
// 2. 统一调用工具类打印面积(多态自动调用子类方法)
System.out.print("圆形:");
ShapeUtil.printArea(circle);
System.out.print("矩形:");
ShapeUtil.printArea(rectangle);
System.out.print("三角形:");
ShapeUtil.printArea(triangle);
}
}
```
## 六、UML 类图
见提交作业
## 七、运行结果
```
圆形:图形面积:78.53981633974483
矩形:图形面积:24.0
三角形:图形面积:6.0
```
## 八、实验总结
1. **抽象类的作用**:`Shape` 作为抽象父类,定义了所有图形的统一行为规范,强制子类必须实现 `getArea()` 方法,保证了代码的一致性。
2. **多态的优势**:通过父类引用指向子类对象,`ShapeUtil` 可以统一处理所有图形,无需为每个图形单独写打印方法,大幅提升了代码的扩展性。
3. **面向对象思想**:本次实验完整实践了封装(私有属性+构造方法)、继承(子类继承父类)、多态(方法重写+父类引用)三大面向对象核心特性。
4. **代码扩展性**:后续新增图形(如正方形、梯形),只需继承 `Shape` 并实现 `getArea()`,无需修改 `ShapeUtil` 等已有代码,符合开闭原则。
## 九、AI 使用情况
1. 使用 AI 辅助理解抽象类、多态的核心概念,梳理代码结构。
2. AI 提供了代码规范优化、类图绘制、实验报告撰写的指导。
3. 自主完成代码编写、调试、测试,以及实验报告的最终整理。
```

14
w4/Rectangle.java

@ -1,14 +0,0 @@
public class Rectangle extends Shape {
private double width;
private double height;
public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}
@Override
public double getArea() {
return width * height;
}
}

3
w4/Shape.java

@ -1,3 +0,0 @@
public abstract class Shape {
public abstract double getArea();
}

18
w4/ShapeTest.java

@ -1,18 +0,0 @@
public class ShapeTest {
public static void main(String[] args) {
// 创建各个图形对象
Shape c = new Circle(5);
Shape r = new Rectangle(4,6);
Shape t = new Triangle(3,4);
//统一调用工具打印面积
System.out.print("圆形:");
ShapeUtil.printArea(c);
System.out.print("矩形:");
ShapeUtil.printArea(r);
System.out.print("三角形:");
ShapeUtil.printArea(t);
}
}

5
w4/ShapeUtil.java

@ -1,5 +0,0 @@
public class ShapeUtil {
public static void printArea(Shape shape){
System.out.println("图形面积:" + shape.getArea());
}
}

14
w4/Triangle.java

@ -1,14 +0,0 @@
public class Triangle extends Shape {
private double base;
private double height;
public Triangle(double base, double height) {
this.base = base;
this.height = height;
}
@Override
public double getArea() {
return base * height / 2;
}
}

BIN
w4/代码运行结果.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

BIN
w4/类图.jpg

Binary file not shown.

Before

Width:  |  Height:  |  Size: 238 KiB

6
w5 Shape/Circle.java

@ -1,6 +0,0 @@
public class Circle extends Shape {
@Override
public void draw() {
System.out.println("绘制一个圆形");
}
}

6
w5 Shape/Rectangle.java

@ -1,6 +0,0 @@
public class Rectangle extends Shape {
@Override
public void draw() {
System.out.println("绘制一个矩形");
}
}

5
w5 Shape/Shape.java

@ -1,5 +0,0 @@
public class Shape {
public void draw() {
System.out.println("绘制一个形状");
}
}

15
w5 Shape/TestShape.java

@ -1,15 +0,0 @@
public class TestShape {
public static void drawShape(Shape s) {
s.draw();
}
public static void main(String[] args) {
Shape shape = new Shape();
Circle circle = new Circle();
Rectangle rectangle = new Rectangle();
drawShape(shape);
drawShape(circle);
drawShape(rectangle);
}
}

6
w5 Vehicle/Bike.java

@ -1,6 +0,0 @@
public class Bike extends Vehicle {
@Override
public void run() {
System.out.println("自行车在慢慢骑行");
}
}

6
w5 Vehicle/Car.java

@ -1,6 +0,0 @@
public class Car extends Vehicle {
@Override
public void run() {
System.out.println("小汽车在公路上行驶");
}
}

14
w5 Vehicle/TestVehicle.java

@ -1,14 +0,0 @@
public class TestVehicle {
public static void main(String[] args) {
// 创建Vehicle数组,存放不同车辆
Vehicle[] vehicles = new Vehicle[3];
vehicles[0] = new Car();
vehicles[1] = new Bike();
vehicles[2] = new Truck();
// 遍历数组,调用run()
for (Vehicle v : vehicles) {
v.run();
}
}
}

6
w5 Vehicle/Truck.java

@ -1,6 +0,0 @@
public class Truck extends Vehicle {
@Override
public void run() {
System.out.println("大卡车在载货行驶");
}
}

3
w5 Vehicle/Vehicle.java

@ -1,3 +0,0 @@
public abstract class Vehicle {
public abstract void run();
}

BIN
w5 Vehicle/屏幕截图 2026-04-03 233245.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

46
w6/AnimalSystem.java

@ -1,46 +0,0 @@
package java01;
abstract class Animal {
public abstract void makeSound();
}
interface Swimmable {
void swim();
}
class Dog extends Animal implements Swimmable {
@Override
public void makeSound() {
System.out.println("狗:汪汪汪");
}
@Override
public void swim() {
System.out.println("狗会游泳");
}
}
class Cat extends Animal {
@Override
public void makeSound() {
System.out.println("猫:喵喵喵");
}
}
public class AnimalSystem {
public static void main(String[] args) {
Animal animal1 = new Dog();
Animal animal2 = new Cat();
animal1.makeSound();
animal2.makeSound();
System.out.println("----------");
if (animal1 instanceof Swimmable) {
Swimmable swimmer = (Swimmable) animal1;
swimmer.swim();
}
if (animal2 instanceof Swimmable) {
Swimmable swimmer = (Swimmable) animal2;
swimmer.swim();
} else {
System.out.println("猫不会游泳");
}
}
}

BIN
w6/运行截图.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

Loading…
Cancel
Save