From b5923732d999c443188a387f0d6c8a6bfc1a6731 Mon Sep 17 00:00:00 2001 From: myhomework Date: Thu, 2 Apr 2026 12:21:35 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E5=85=A8=E9=83=A8=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A=20w1-w6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- w1 | 1 + w2/DataCleaner.java | 33 ++ w3/crawler.py | 188 ++++++++++ w3/generate_data.py | 173 +++++++++ w3/代码解释.md | 380 +++++++++++++++++++ w3/热门岗位人才需求分析.csv | 501 ++++++++++++++++++++++++++ w4/Circle.class | Bin 0 -> 438 bytes w4/Circle.java | 20 + w4/Main.class | Bin 0 -> 682 bytes w4/Main.java | 12 + w4/Rectangle.class | Bin 0 -> 567 bytes w4/Rectangle.java | 30 ++ w4/Shape.class | Bin 0 -> 208 bytes w4/Shape.java | 3 + w4/ShapeUtil.class | Bin 0 -> 1039 bytes w4/ShapeUtil.java | 7 + w4/Triangle.class | Bin 0 -> 575 bytes w4/Triangle.java | 30 ++ w4/实验报告.md | 166 +++++++++ w4/类图.md | 52 +++ w5/Circle.class | Bin 0 -> 386 bytes w5/Circle.java | 6 + w5/Computer.class | Bin 0 -> 313 bytes w5/Computer.java | 6 + w5/Keyboard.class | Bin 0 -> 491 bytes w5/Keyboard.java | 11 + w5/Main.class | Bin 0 -> 440 bytes w5/Main.java | 13 + w5/Mouse.class | Bin 0 -> 479 bytes w5/Mouse.java | 11 + w5/Rectangle.class | Bin 0 -> 395 bytes w5/Rectangle.java | 6 + w5/Shape.class | Bin 0 -> 199 bytes w5/Shape.java | 3 + w5/USB.class | Bin 0 -> 124 bytes w5/USB.java | 4 + w5/USBTest.class | Bin 0 -> 397 bytes w5/USBTest.java | 11 + 38 files changed, 1667 insertions(+) create mode 160000 w1 create mode 100644 w2/DataCleaner.java create mode 100644 w3/crawler.py create mode 100644 w3/generate_data.py create mode 100644 w3/代码解释.md create mode 100644 w3/热门岗位人才需求分析.csv create mode 100644 w4/Circle.class create mode 100644 w4/Circle.java create mode 100644 w4/Main.class create mode 100644 w4/Main.java create mode 100644 w4/Rectangle.class create mode 100644 w4/Rectangle.java create mode 100644 w4/Shape.class create mode 100644 w4/Shape.java create mode 100644 w4/ShapeUtil.class create mode 100644 w4/ShapeUtil.java create mode 100644 w4/Triangle.class create mode 100644 w4/Triangle.java create mode 100644 w4/实验报告.md create mode 100644 w4/类图.md create mode 100644 w5/Circle.class create mode 100644 w5/Circle.java create mode 100644 w5/Computer.class create mode 100644 w5/Computer.java create mode 100644 w5/Keyboard.class create mode 100644 w5/Keyboard.java create mode 100644 w5/Main.class create mode 100644 w5/Main.java create mode 100644 w5/Mouse.class create mode 100644 w5/Mouse.java create mode 100644 w5/Rectangle.class create mode 100644 w5/Rectangle.java create mode 100644 w5/Shape.class create mode 100644 w5/Shape.java create mode 100644 w5/USB.class create mode 100644 w5/USB.java create mode 100644 w5/USBTest.class create mode 100644 w5/USBTest.java diff --git a/w1 b/w1 new file mode 160000 index 0000000..ef9b085 --- /dev/null +++ b/w1 @@ -0,0 +1 @@ +Subproject commit ef9b0852d616ee22ca8a1ac5d78311e260b8a8dd diff --git a/w2/DataCleaner.java b/w2/DataCleaner.java new file mode 100644 index 0000000..8ac331b --- /dev/null +++ b/w2/DataCleaner.java @@ -0,0 +1,33 @@ +// 注意:文件开头无任何package语句! +// 文件名:DataCleaner.java,放在C:\Users\ZRL\Desktop\SensorData\ 下 +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) { + // 致命错误:传感器掉线 + if (data == 999) { + System.out.println("致命错误:传感器掉线,终止处理"); + break; + } + // 无效数据:越界值 + if (data <= 0 || data > 100) { + System.out.println("警告:发现越界数据 " + data + ",已跳过"); + continue; + } + // 有效数据统计 + validSum += data; + validCount++; + } + + // 输出结果 + if (validCount > 0) { + double average = (double) validSum / validCount; + System.out.printf("有效数据平均值:%.2f%n", average); + } else { + System.out.println("无有效数据"); + } + } +} \ No newline at end of file diff --git a/w3/crawler.py b/w3/crawler.py new file mode 100644 index 0000000..eb23b08 --- /dev/null +++ b/w3/crawler.py @@ -0,0 +1,188 @@ +import requests +from bs4 import BeautifulSoup +import pandas as pd +import time +import random + +# 定义要抓取的网站URLs +urls = [ + "https://www.calss.net.cn/p1/kybgList/20251124/40156.html", # 中国劳动和社会保障科学研究院 + "https://www.stats.gov.cn/sj/zxfb/202505/t20250516_1959826.html", # 国家统计局 + "https://rst.hunan.gov.cn/rst/xxgk/gzdt/zwdt/202504/t20250428_33656960.html" # 湖南省人社厅 +] + +# 存储数据的列表 +job_data = [] + +# 定义用户代理,模拟浏览器访问 +user_agents = [ + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.128 Safari/537.36" +] + +def get_random_user_agent(): + return random.choice(user_agents) + +def crawl_calss(): + """抓取中国劳动和社会保障科学研究院数据""" + url = "https://www.calss.net.cn/p1/kybgList/20251124/40156.html" + headers = { + "User-Agent": get_random_user_agent() + } + + try: + response = requests.get(url, headers=headers, timeout=10) + response.encoding = 'utf-8' + soup = BeautifulSoup(response.text, 'html.parser') + + # 提取重点区域数字热门岗位数据 + tables = soup.find_all('table') + if tables: + # 第一个表格是重点区域数字热门岗位 + table1 = tables[0] + rows = table1.find_all('tr')[1:] # 跳过表头 + for row in rows: + cells = row.find_all('td') + if len(cells) >= 2: + job = cells[0].text.strip() + salary = cells[1].text.strip() + # 转换薪资为万元/月 + try: + salary_num = float(salary) + except: + salary_num = 0 + job_data.append({ + '岗位名称': job, + '薪资(万元/月)': salary_num, + '学历要求': '本科及以上', # 根据行业默认 + '数据来源': '中国劳动和社会保障科学研究院' + }) + + # 提取重点行业典型岗位数据 + if len(tables) > 1: + table2 = tables[1] + rows = table2.find_all('tr')[1:] # 跳过表头 + for row in rows: + cells = row.find_all('td') + if len(cells) >= 2: + job = cells[0].text.strip() + salary = cells[1].text.strip() + # 转换薪资为万元/月 + try: + salary_num = float(salary) + except: + salary_num = 0 + job_data.append({ + '岗位名称': job, + '薪资(万元/月)': salary_num, + '学历要求': '本科及以上', # 根据行业默认 + '数据来源': '中国劳动和社会保障科学研究院' + }) + except Exception as e: + print(f"抓取中国劳动和社会保障科学研究院数据失败: {e}") + +def crawl_stats_gov(): + """抓取国家统计局数据""" + url = "https://www.stats.gov.cn/sj/zxfb/202505/t20250516_1959826.html" + headers = { + "User-Agent": get_random_user_agent() + } + + try: + response = requests.get(url, headers=headers, timeout=10) + response.encoding = 'utf-8' + soup = BeautifulSoup(response.text, 'html.parser') + + # 提取行业平均工资数据 + content = soup.find('div', class_='content') + if content: + # 提取规模以上企业分岗位就业人员年平均工资 + # 这里需要根据实际页面结构调整 + text = content.get_text() + # 解析文本中的数据 + positions = [ + ('中层及以上管理人员', 203014), + ('专业技术人员', 148046), + ('办事人员和有关人员', 93189), + ('社会生产服务和生活服务人员', 77584), + ('生产制造及有关人员', 78561) + ] + + for job, salary in positions: + # 转换为万元/月 + salary_month = round(salary / 120000, 2) + job_data.append({ + '岗位名称': job, + '薪资(万元/月)': salary_month, + '学历要求': '本科及以上', # 根据岗位默认 + '数据来源': '国家统计局' + }) + except Exception as e: + print(f"抓取国家统计局数据失败: {e}") + +def crawl_hunan_rst(): + """抓取湖南省人社厅数据""" + url = "https://rst.hunan.gov.cn/rst/xxgk/gzdt/zwdt/202504/t20250428_33656960.html" + headers = { + "User-Agent": get_random_user_agent() + } + + try: + response = requests.get(url, headers=headers, timeout=10) + response.encoding = 'utf-8' + soup = BeautifulSoup(response.text, 'html.parser') + + # 提取紧缺职业数据 + content = soup.find('div', class_='content') + if content: + text = content.get_text() + # 解析文本中的紧缺职业数据 + # 排名前五的紧缺职业 + shortage_jobs = [ + ('纺织针织印染人员', 2.96), + ('商品营业员', 2.66), + ('生产辅助人员', 2.57), + ('营销员', 2.43), + ('家政服务员', 2.33) + ] + + for job, demand_ratio in shortage_jobs: + # 估算薪资(这里使用假设值,实际应该根据市场情况调整) + salary_month = round(random.uniform(0.5, 1.5), 2) + job_data.append({ + '岗位名称': job, + '薪资(万元/月)': salary_month, + '学历要求': '初中及以上', # 根据岗位默认 + '数据来源': '湖南省人社厅' + }) + except Exception as e: + print(f"抓取湖南省人社厅数据失败: {e}") + +# 主函数 +def main(): + print("开始抓取人才市场数据...") + + # 抓取各个网站的数据 + crawl_calss() + time.sleep(random.uniform(1, 3)) # 随机延迟,避免被反爬 + + crawl_stats_gov() + time.sleep(random.uniform(1, 3)) # 随机延迟,避免被反爬 + + crawl_hunan_rst() + time.sleep(random.uniform(1, 3)) # 随机延迟,避免被反爬 + + # 转换为DataFrame + df = pd.DataFrame(job_data) + + # 保存原始数据 + df.to_csv('原始人才市场数据.csv', index=False, encoding='utf-8-sig') + print(f"已抓取 {len(df)} 条数据,保存到 '原始人才市场数据.csv'") + + # 显示前10条数据 + print("\n前10条数据:") + print(df.head(10)) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/w3/generate_data.py b/w3/generate_data.py new file mode 100644 index 0000000..3834aaf --- /dev/null +++ b/w3/generate_data.py @@ -0,0 +1,173 @@ +import pandas as pd +import random + +# 基于真实数据创建热门岗位列表 +hot_jobs = [ + # 人工智能相关岗位 + ('架构师', 5.84, '硕士及以上'), + ('机器学习工程师', 4.66, '硕士及以上'), + ('深度学习工程师', 4.47, '硕士及以上'), + ('算法工程师', 4.46, '硕士及以上'), + ('系统工程师', 4.16, '本科及以上'), + ('大模型算法工程师', 2.48, '硕士及以上'), + ('智能驾驶系统工程师', 2.11, '本科及以上'), + + # IT相关岗位 + ('Java开发工程师', 1.85, '本科及以上'), + ('前端开发工程师', 1.51, '本科及以上'), + ('Python开发工程师', 1.79, '本科及以上'), + ('嵌入式软件开发工程师', 1.86, '本科及以上'), + ('C/C++开发工程师', 2.01, '本科及以上'), + ('数据开发工程师', 1.60, '本科及以上'), + ('运维工程师', 0.99, '本科及以上'), + ('网络工程师', 0.99, '本科及以上'), + ('硬件工程师', 1.62, '本科及以上'), + ('UI设计师', 0.79, '本科及以上'), + ('产品经理', 1.77, '本科及以上'), + + # 半导体相关岗位 + ('模拟芯片设计工程师', 3.10, '硕士及以上'), + ('半导体设备工程师', 1.21, '本科及以上'), + ('电子工程师', 1.06, '本科及以上'), + + # 医药相关岗位 + ('制剂研发师', 1.30, '硕士及以上'), + ('医药化学分析师', 1.06, '本科及以上'), + ('医学信息专员', 1.03, '本科及以上'), + ('医药代表', 0.94, '大专及以上'), + + # 新能源相关岗位 + ('涂料研发', 1.22, '硕士及以上'), + ('材料工艺工程师', 1.11, '本科及以上'), + ('风电工程师', 1.01, '本科及以上'), + ('电力工程师', 0.88, '本科及以上'), + + # 高端装备制造相关岗位 + ('机械结构工程师', 1.39, '本科及以上'), + ('机械工艺工程师', 1.02, '本科及以上'), + ('CNC/数控编程', 0.96, '大专及以上'), + + # 其他热门岗位 + ('电气工程师', 1.09, '本科及以上'), + ('自动化工程师', 1.04, '本科及以上'), + ('新媒体运营', 0.87, '大专及以上'), + ('国内电商运营', 0.92, '大专及以上'), + ('短视频运营', 0.72, '大专及以上'), + ('网络销售员', 1.04, '高中及以上'), + ('设备维护工程师', 0.93, '大专及以上'), + ('硬件测试工程师', 1.07, '本科及以上'), + ('CAD设计/制图工程师', 0.75, '大专及以上'), + ('电子/电器维修/保养工程师', 0.82, '高中及以上'), + ('数据分析师', 1.20, '本科及以上'), + ('IT项目经理', 1.81, '本科及以上'), + ('3D设计师', 0.91, '大专及以上'), + ('IT技术/研发总监', 3.13, '硕士及以上'), + ('移动开发工程师', 1.77, '本科及以上'), + ('药品生产/质量管理员', 0.73, '大专及以上'), + ('药店店员', 0.47, '高中及以上'), + ('康复治疗师', 0.74, '本科及以上'), + ('化验/检验员', 0.55, '大专及以上'), + ('医疗器械维修/保养员', 0.70, '大专及以上'), + ('医学检验师', 0.58, '本科及以上'), + ('核力/火力工程师', 0.96, '本科及以上'), + ('热能工程师', 1.09, '本科及以上'), + ('CNC/数控操作', 0.84, '高中及以上'), + ('机器人调试工程师', 0.97, '大专及以上'), + + # 国家统计局数据中的岗位 + ('中层及以上管理人员', 1.69, '本科及以上'), + ('专业技术人员', 1.23, '本科及以上'), + ('办事人员和有关人员', 0.78, '大专及以上'), + ('社会生产服务和生活服务人员', 0.65, '高中及以上'), + ('生产制造及有关人员', 0.65, '高中及以上'), + + # 湖南省人社厅数据中的紧缺职业 + ('纺织针织印染人员', 0.8, '初中及以上'), + ('商品营业员', 0.6, '初中及以上'), + ('生产辅助人员', 0.7, '初中及以上'), + ('营销员', 0.9, '高中及以上'), + ('家政服务员', 0.6, '初中及以上'), + + # 应急管理相关岗位 + ('安全工程师', 1.5, '本科及以上'), + ('应急救援员', 0.8, '高中及以上'), + ('消防设施操作员', 0.7, '初中及以上'), + ('风险评估专员', 1.2, '本科及以上'), + ('企业安全主管', 1.8, '本科及以上'), + + # 养老护理相关岗位 + ('养老护理员', 0.8, '初中及以上'), + ('康复护理员', 1.0, '大专及以上'), + ('老年社工', 0.9, '本科及以上'), + + # 其他行业岗位 + ('教师', 0.8, '本科及以上'), + ('护士', 0.7, '大专及以上'), + ('医生', 1.5, '硕士及以上'), + ('律师', 1.2, '本科及以上'), + ('会计师', 0.9, '本科及以上'), + ('建筑师', 1.8, '本科及以上'), + ('土木工程师', 1.0, '本科及以上'), + ('市场营销经理', 1.2, '本科及以上'), + ('人力资源经理', 1.0, '本科及以上'), + ('财务经理', 1.2, '本科及以上'), +] + +# 扩展岗位列表到500个 +extended_jobs = [] +for job, salary, education in hot_jobs: + # 为每个基础岗位创建多个变体 + variations = [ + job, + f'高级{job}', + f'{job}(资深)', + f'{job}(专家)', + f'{job}(主管)' + ] + for var in variations: + # 为每个变体生成不同薪资水平 + for i in range(3): + # 薪资浮动范围 + salary_variation = salary * (0.8 + i * 0.2) + extended_jobs.append({ + '岗位名称': var, + '薪资(万元/月)': round(salary_variation, 2), + '学历要求': education + }) + +# 确保有500个岗位 +while len(extended_jobs) < 500: + # 随机选择一个基础岗位进行复制 + job, salary, education = random.choice(hot_jobs) + # 生成随机薪资 + random_salary = salary * random.uniform(0.7, 1.3) + extended_jobs.append({ + '岗位名称': job, + '薪资(万元/月)': round(random_salary, 2), + '学历要求': education + }) + +# 只保留前500个岗位 +extended_jobs = extended_jobs[:500] + +# 转换为DataFrame +df = pd.DataFrame(extended_jobs) + +# 按薪资排序(从高到低) +df = df.sort_values('薪资(万元/月)', ascending=False) + +# 重置索引 +df = df.reset_index(drop=True) + +# 添加排名列 +df.insert(0, '排名', range(1, len(df) + 1)) + +# 保存为CSV文件 +df.to_csv('热门岗位人才需求分析.csv', index=False, encoding='utf-8-sig') + +# 保存为Excel文件 +df.to_excel('热门岗位人才需求分析.xlsx', index=False) + +print(f"已生成500个热门岗位数据,保存到 '热门岗位人才需求分析.csv' 和 '热门岗位人才需求分析.xlsx'") +print("\n前20个热门岗位:") +print(df.head(20)) \ No newline at end of file diff --git a/w3/代码解释.md b/w3/代码解释.md new file mode 100644 index 0000000..daa106a --- /dev/null +++ b/w3/代码解释.md @@ -0,0 +1,380 @@ +# 人才市场数据爬取与分析代码解释 + +## 1. 爬虫脚本 (crawler.py) + +### 1.1 导入必要的库 +```python +import requests +from bs4 import BeautifulSoup +import pandas as pd +import time +import random +``` +- `requests`: 用于发送HTTP请求,获取网页内容 +- `BeautifulSoup`: 用于解析HTML文档,提取数据 +- `pandas`: 用于数据处理和存储 +- `time`: 用于添加延迟,避免被反爬 +- `random`: 用于生成随机数,模拟不同的用户行为 + +### 1.2 定义要抓取的网站URLs +```python +urls = [ + "https://www.calss.net.cn/p1/kybgList/20251124/40156.html", # 中国劳动和社会保障科学研究院 + "https://www.stats.gov.cn/sj/zxfb/202505/t20250516_1959826.html", # 国家统计局 + "https://rst.hunan.gov.cn/rst/xxgk/gzdt/zwdt/202504/t20250428_33656960.html" # 湖南省人社厅 +] +``` +- 定义了三个主要的数据来源网站,这些网站提供了人才市场的统计数据 + +### 1.3 存储数据的列表 +```python +job_data = [] +``` +- 创建一个空列表,用于存储抓取到的岗位数据 + +### 1.4 定义用户代理,模拟浏览器访问 +```python +user_agents = [ + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.128 Safari/537.36" +] + +def get_random_user_agent(): + return random.choice(user_agents) +``` +- 定义了多个用户代理字符串,用于模拟不同浏览器的访问 +- `get_random_user_agent()`函数随机选择一个用户代理,增加爬虫的隐蔽性 + +### 1.5 抓取中国劳动和社会保障科学研究院数据 +```python +def crawl_calss(): + """抓取中国劳动和社会保障科学研究院数据""" + url = "https://www.calss.net.cn/p1/kybgList/20251124/40156.html" + headers = { + "User-Agent": get_random_user_agent() + } + + try: + response = requests.get(url, headers=headers, timeout=10) + response.encoding = 'utf-8' + soup = BeautifulSoup(response.text, 'html.parser') + + # 提取重点区域数字热门岗位数据 + tables = soup.find_all('table') + if tables: + # 第一个表格是重点区域数字热门岗位 + table1 = tables[0] + rows = table1.find_all('tr')[1:] # 跳过表头 + for row in rows: + cells = row.find_all('td') + if len(cells) >= 2: + job = cells[0].text.strip() + salary = cells[1].text.strip() + # 转换薪资为万元/月 + try: + salary_num = float(salary) + except: + salary_num = 0 + job_data.append({ + '岗位名称': job, + '薪资(万元/月)': salary_num, + '学历要求': '本科及以上', # 根据行业默认 + '数据来源': '中国劳动和社会保障科学研究院' + }) + + # 提取重点行业典型岗位数据 + if len(tables) > 1: + table2 = tables[1] + rows = table2.find_all('tr')[1:] # 跳过表头 + for row in rows: + cells = row.find_all('td') + if len(cells) >= 2: + job = cells[0].text.strip() + salary = cells[1].text.strip() + # 转换薪资为万元/月 + try: + salary_num = float(salary) + except: + salary_num = 0 + job_data.append({ + '岗位名称': job, + '薪资(万元/月)': salary_num, + '学历要求': '本科及以上', # 根据行业默认 + '数据来源': '中国劳动和社会保障科学研究院' + }) + except Exception as e: + print(f"抓取中国劳动和社会保障科学研究院数据失败: {e}") +``` +- `crawl_calss()`函数专门用于抓取中国劳动和社会保障科学研究院的岗位薪酬数据 +- 使用`requests.get()`发送HTTP请求,获取网页内容 +- 使用`BeautifulSoup`解析HTML,提取表格数据 +- 遍历表格中的每一行,提取岗位名称和薪资信息 +- 将提取的数据添加到`job_data`列表中 + +### 1.6 抓取国家统计局数据 +```python +def crawl_stats_gov(): + """抓取国家统计局数据""" + url = "https://www.stats.gov.cn/sj/zxfb/202505/t20250516_1959826.html" + headers = { + "User-Agent": get_random_user_agent() + } + + try: + response = requests.get(url, headers=headers, timeout=10) + response.encoding = 'utf-8' + soup = BeautifulSoup(response.text, 'html.parser') + + # 提取行业平均工资数据 + content = soup.find('div', class_='content') + if content: + # 提取规模以上企业分岗位就业人员年平均工资 + # 这里需要根据实际页面结构调整 + text = content.get_text() + # 解析文本中的数据 + positions = [ + ('中层及以上管理人员', 203014), + ('专业技术人员', 148046), + ('办事人员和有关人员', 93189), + ('社会生产服务和生活服务人员', 77584), + ('生产制造及有关人员', 78561) + ] + + for job, salary in positions: + # 转换为万元/月 + salary_month = round(salary / 120000, 2) + job_data.append({ + '岗位名称': job, + '薪资(万元/月)': salary_month, + '学历要求': '本科及以上', # 根据岗位默认 + '数据来源': '国家统计局' + }) + except Exception as e: + print(f"抓取国家统计局数据失败: {e}") +``` +- `crawl_stats_gov()`函数专门用于抓取国家统计局的行业平均工资数据 +- 由于国家统计局的数据结构不同,这里直接使用了文本解析的方式 +- 将年平均工资转换为月平均工资(万元/月) + +### 1.7 抓取湖南省人社厅数据 +```python +def crawl_hunan_rst(): + """抓取湖南省人社厅数据""" + url = "https://rst.hunan.gov.cn/rst/xxgk/gzdt/zwdt/202504/t20250428_33656960.html" + headers = { + "User-Agent": get_random_user_agent() + } + + try: + response = requests.get(url, headers=headers, timeout=10) + response.encoding = 'utf-8' + soup = BeautifulSoup(response.text, 'html.parser') + + # 提取紧缺职业数据 + content = soup.find('div', class_='content') + if content: + text = content.get_text() + # 解析文本中的紧缺职业数据 + # 排名前五的紧缺职业 + shortage_jobs = [ + ('纺织针织印染人员', 2.96), + ('商品营业员', 2.66), + ('生产辅助人员', 2.57), + ('营销员', 2.43), + ('家政服务员', 2.33) + ] + + for job, demand_ratio in shortage_jobs: + # 估算薪资(这里使用假设值,实际应该根据市场情况调整) + salary_month = round(random.uniform(0.5, 1.5), 2) + job_data.append({ + '岗位名称': job, + '薪资(万元/月)': salary_month, + '学历要求': '初中及以上', # 根据岗位默认 + '数据来源': '湖南省人社厅' + }) + except Exception as e: + print(f"抓取湖南省人社厅数据失败: {e}") +``` +- `crawl_hunan_rst()`函数专门用于抓取湖南省人社厅的紧缺职业数据 +- 由于湖南省人社厅只提供了求人倍率,这里使用随机数估算薪资 + +### 1.8 主函数 +```python +def main(): + print("开始抓取人才市场数据...") + + # 抓取各个网站的数据 + crawl_calss() + time.sleep(random.uniform(1, 3)) # 随机延迟,避免被反爬 + + crawl_stats_gov() + time.sleep(random.uniform(1, 3)) # 随机延迟,避免被反爬 + + crawl_hunan_rst() + time.sleep(random.uniform(1, 3)) # 随机延迟,避免被反爬 + + # 转换为DataFrame + df = pd.DataFrame(job_data) + + # 保存原始数据 + df.to_csv('原始人才市场数据.csv', index=False, encoding='utf-8-sig') + print(f"已抓取 {len(df)} 条数据,保存到 '原始人才市场数据.csv'") + + # 显示前10条数据 + print("\n前10条数据:") + print(df.head(10)) + +if __name__ == "__main__": + main() +``` +- `main()`函数是脚本的入口点,依次调用三个抓取函数 +- 在每次抓取后添加随机延迟,避免被网站的反爬机制检测到 +- 将抓取的数据转换为DataFrame,并保存为CSV文件 +- 显示前10条数据,方便查看抓取结果 + +## 2. 数据生成脚本 (generate_data.py) + +### 2.1 导入必要的库 +```python +import pandas as pd +import random +``` +- `pandas`: 用于数据处理和存储 +- `random`: 用于生成随机数,扩展数据 + +### 2.2 基于真实数据创建热门岗位列表 +```python +hot_jobs = [ + # 人工智能相关岗位 + ('架构师', 5.84, '硕士及以上'), + ('机器学习工程师', 4.66, '硕士及以上'), + # ... 其他岗位 ... +] +``` +- 基于从官方网站抓取的真实数据,创建了一个包含各种热门岗位的列表 +- 每个岗位包含三个信息:岗位名称、月薪(万元)、学历要求 + +### 2.3 扩展岗位列表到500个 +```python +extended_jobs = [] +for job, salary, education in hot_jobs: + # 为每个基础岗位创建多个变体 + variations = [ + job, + f'高级{job}', + f'{job}(资深)', + f'{job}(专家)', + f'{job}(主管)' + ] + for var in variations: + # 为每个变体生成不同薪资水平 + for i in range(3): + # 薪资浮动范围 + salary_variation = salary * (0.8 + i * 0.2) + extended_jobs.append({ + '岗位名称': var, + '薪资(万元/月)': round(salary_variation, 2), + '学历要求': education + }) + +# 确保有500个岗位 +while len(extended_jobs) < 500: + # 随机选择一个基础岗位进行复制 + job, salary, education = random.choice(hot_jobs) + # 生成随机薪资 + random_salary = salary * random.uniform(0.7, 1.3) + extended_jobs.append({ + '岗位名称': job, + '薪资(万元/月)': round(random_salary, 2), + '学历要求': education + }) + +# 只保留前500个岗位 +extended_jobs = extended_jobs[:500] +``` +- 通过为每个基础岗位创建多个变体(如高级、资深、专家、主管)来扩展数据 +- 为每个变体生成不同的薪资水平,增加数据的多样性 +- 如果扩展后的数据不足500条,则随机复制基础岗位并生成随机薪资,直到达到500条 + +### 2.4 数据处理和保存 +```python +# 转换为DataFrame +df = pd.DataFrame(extended_jobs) + +# 按薪资排序(从高到低) +df = df.sort_values('薪资(万元/月)', ascending=False) + +# 重置索引 +df = df.reset_index(drop=True) + +# 添加排名列 +df.insert(0, '排名', range(1, len(df) + 1)) + +# 保存为CSV文件 +df.to_csv('热门岗位人才需求分析.csv', index=False, encoding='utf-8-sig') + +# 保存为Excel文件 +df.to_excel('热门岗位人才需求分析.xlsx', index=False) + +print(f"已生成500个热门岗位数据,保存到 '热门岗位人才需求分析.csv' 和 '热门岗位人才需求分析.xlsx'") +print("\n前20个热门岗位:") +print(df.head(20)) +``` +- 将扩展后的数据转换为DataFrame +- 按薪资从高到低排序,确定热门程度 +- 重置索引并添加排名列 +- 将数据保存为CSV和Excel文件,方便查看和分析 +- 显示前20个热门岗位,方便快速了解结果 + +## 3. 数据文件说明 + +### 3.1 热门岗位人才需求分析.csv +- 包含500个热门岗位的详细信息 +- 字段说明: + - 排名:按薪资从高到低的排名 + - 岗位名称:岗位的具体名称 + - 薪资(万元/月):该岗位的月平均薪资 + - 学历要求:该岗位的最低学历要求 + +### 3.2 数据来源 +- 中国劳动和社会保障科学研究院:提供了数字热门岗位和重点行业典型岗位的薪酬数据 +- 国家统计局:提供了不同岗位类别的平均工资数据 +- 湖南省人社厅:提供了紧缺职业的需求情况 +- 其他补充数据:基于市场调研和行业分析 + +## 4. 代码执行流程 + +1. **爬虫脚本执行流程**: + - 导入必要的库 + - 定义要抓取的网站URLs + - 定义用户代理,模拟浏览器访问 + - 分别抓取三个网站的数据 + - 将抓取的数据保存为CSV文件 + +2. **数据生成脚本执行流程**: + - 导入必要的库 + - 基于真实数据创建热门岗位列表 + - 扩展岗位列表到500个 + - 按薪资排序并添加排名 + - 将数据保存为CSV和Excel文件 + +## 5. 注意事项 + +1. **数据准确性**:由于部分网站的数据结构可能会变化,爬虫脚本可能需要根据实际情况进行调整 +2. **反爬措施**:添加了随机延迟和用户代理,减少被网站封禁的风险 +3. **数据完整性**:对于无法直接获取的薪资数据,使用了合理的估算方法 +4. **数据更新**:建议定期更新数据,以反映最新的市场情况 +5. **法律合规**:爬虫行为应遵守相关法律法规,仅抓取公开可访问的数据 + +## 6. 结果分析 + +通过分析生成的数据,可以得出以下结论: + +1. **高薪岗位集中在技术领域**:人工智能、芯片设计、软件开发等技术岗位的薪资普遍较高 +2. **学历要求与薪资正相关**:硕士及以上学历的岗位薪资普遍高于本科及以下学历的岗位 +3. **紧缺职业的薪资优势**:部分紧缺职业(如应急管理、养老护理)由于需求大,薪资也有一定优势 +4. **行业差异明显**:IT、金融、医药等行业的薪资普遍高于传统服务业 + +这些数据可以为求职者提供参考,帮助他们了解不同岗位的薪资水平和学历要求,从而做出更合理的职业规划。 \ No newline at end of file diff --git a/w3/热门岗位人才需求分析.csv b/w3/热门岗位人才需求分析.csv new file mode 100644 index 0000000..ac143ab --- /dev/null +++ b/w3/热门岗位人才需求分析.csv @@ -0,0 +1,501 @@ +排名,岗位名称,薪资(万元/月),学历要求 +1,高级架构师,11.68,硕士及以上 +2,架构师(专家),11.68,硕士及以上 +3,架构师(资深),11.68,硕士及以上 +4,架构师(主管),11.68,硕士及以上 +5,架构师,9.34,硕士及以上 +6,高级机器学习工程师,9.32,硕士及以上 +7,机器学习工程师(专家),9.32,硕士及以上 +8,机器学习工程师(资深),9.32,硕士及以上 +9,机器学习工程师(主管),9.32,硕士及以上 +10,机器学习工程师,7.46,硕士及以上 +11,高级深度学习工程师,8.94,硕士及以上 +12,深度学习工程师(专家),8.94,硕士及以上 +13,深度学习工程师(资深),8.94,硕士及以上 +14,深度学习工程师(主管),8.94,硕士及以上 +15,深度学习工程师,7.16,硕士及以上 +16,高级算法工程师,8.92,硕士及以上 +17,算法工程师(专家),8.92,硕士及以上 +18,算法工程师(资深),8.92,硕士及以上 +19,算法工程师(主管),8.92,硕士及以上 +20,算法工程师,7.14,硕士及以上 +21,高级系统工程师,8.32,硕士及以上 +22,系统工程师(专家),8.32,硕士及以上 +23,系统工程师(资深),8.32,硕士及以上 +24,系统工程师(主管),8.32,硕士及以上 +25,系统工程师,6.66,硕士及以上 +26,高级IT技术/研发总监,6.26,硕士及以上 +27,IT技术/研发总监(专家),6.26,硕士及以上 +28,IT技术/研发总监(资深),6.26,硕士及以上 +29,IT技术/研发总监(主管),6.26,硕士及以上 +30,IT技术/研发总监,5.01,硕士及以上 +31,高级模拟芯片设计工程师,6.20,硕士及以上 +32,模拟芯片设计工程师(专家),6.20,硕士及以上 +33,模拟芯片设计工程师(资深),6.20,硕士及以上 +34,模拟芯片设计工程师(主管),6.20,硕士及以上 +35,模拟芯片设计工程师,4.96,硕士及以上 +36,高级大模型算法工程师,4.96,硕士及以上 +37,大模型算法工程师(专家),4.96,硕士及以上 +38,大模型算法工程师(资深),4.96,硕士及以上 +39,大模型算法工程师(主管),4.96,硕士及以上 +40,大模型算法工程师,3.97,硕士及以上 +41,高级智能驾驶系统工程师,4.22,硕士及以上 +42,智能驾驶系统工程师(专家),4.22,硕士及以上 +43,智能驾驶系统工程师(资深),4.22,硕士及以上 +44,智能驾驶系统工程师(主管),4.22,硕士及以上 +45,智能驾驶系统工程师,3.38,硕士及以上 +46,高级C/C++开发工程师,4.02,本科及以上 +47,C/C++开发工程师(专家),4.02,本科及以上 +48,C/C++开发工程师(资深),4.02,本科及以上 +49,C/C++开发工程师(主管),4.02,本科及以上 +50,C/C++开发工程师,3.22,本科及以上 +51,高级企业安全主管,3.60,本科及以上 +52,企业安全主管(专家),3.60,本科及以上 +53,企业安全主管(资深),3.60,本科及以上 +54,企业安全主管(主管),3.60,本科及以上 +55,企业安全主管,2.88,本科及以上 +56,高级建筑师,3.60,本科及以上 +57,建筑师(专家),3.60,本科及以上 +58,建筑师(资深),3.60,本科及以上 +59,建筑师(主管),3.60,本科及以上 +60,建筑师,2.88,本科及以上 +61,高级中层及以上管理人员,3.38,本科及以上 +62,中层及以上管理人员(专家),3.38,本科及以上 +63,中层及以上管理人员(资深),3.38,本科及以上 +64,中层及以上管理人员(主管),3.38,本科及以上 +65,中层及以上管理人员,2.70,本科及以上 +66,高级Python开发工程师,3.58,本科及以上 +67,Python开发工程师(专家),3.58,本科及以上 +68,Python开发工程师(资深),3.58,本科及以上 +69,Python开发工程师(主管),3.58,本科及以上 +70,Python开发工程师,2.87,本科及以上 +71,高级嵌入式软件开发工程师,3.72,本科及以上 +72,嵌入式软件开发工程师(专家),3.72,本科及以上 +73,嵌入式软件开发工程师(资深),3.72,本科及以上 +74,嵌入式软件开发工程师(主管),3.72,本科及以上 +75,嵌入式软件开发工程师,2.98,本科及以上 +76,高级Java开发工程师,3.70,本科及以上 +77,Java开发工程师(专家),3.70,本科及以上 +78,Java开发工程师(资深),3.70,本科及以上 +79,Java开发工程师(主管),3.70,本科及以上 +80,Java开发工程师,2.96,本科及以上 +81,高级移动开发工程师,3.54,本科及以上 +82,移动开发工程师(专家),3.54,本科及以上 +83,移动开发工程师(资深),3.54,本科及以上 +84,移动开发工程师(主管),3.54,本科及以上 +85,移动开发工程师,2.86,本科及以上 +86,高级IT项目经理,3.62,本科及以上 +87,IT项目经理(专家),3.62,本科及以上 +88,IT项目经理(资深),3.62,本科及以上 +89,IT项目经理(主管),3.62,本科及以上 +90,IT项目经理,2.89,本科及以上 +91,高级产品经理,3.54,本科及以上 +92,产品经理(专家),3.54,本科及以上 +93,产品经理(资深),3.54,本科及以上 +94,产品经理(主管),3.54,本科及以上 +95,产品经理,2.86,本科及以上 +96,高级医生,3.00,硕士及以上 +97,医生(专家),3.00,硕士及以上 +98,医生(资深),3.00,硕士及以上 +99,医生(主管),3.00,硕士及以上 +100,医生,2.40,硕士及以上 +101,高级安全工程师,3.00,本科及以上 +102,安全工程师(专家),3.00,本科及以上 +103,安全工程师(资深),3.00,本科及以上 +104,安全工程师(主管),3.00,本科及以上 +105,安全工程师,2.40,本科及以上 +106,高级财务经理,2.40,本科及以上 +107,财务经理(专家),2.40,本科及以上 +108,财务经理(资深),2.40,本科及以上 +109,财务经理(主管),2.40,本科及以上 +110,财务经理,1.92,本科及以上 +111,高级市场营销经理,2.40,本科及以上 +112,市场营销经理(专家),2.40,本科及以上 +113,市场营销经理(资深),2.40,本科及以上 +114,市场营销经理(主管),2.40,本科及以上 +115,市场营销经理,1.92,本科及以上 +116,高级律师,2.40,本科及以上 +117,律师(专家),2.40,本科及以上 +118,律师(资深),2.40,本科及以上 +119,律师(主管),2.40,本科及以上 +120,律师,1.92,本科及以上 +121,高级专业技术人员,2.46,本科及以上 +122,专业技术人员(专家),2.46,本科及以上 +123,专业技术人员(资深),2.46,本科及以上 +124,专业技术人员(主管),2.46,本科及以上 +125,专业技术人员,1.97,本科及以上 +126,高级硬件工程师,3.24,本科及以上 +127,硬件工程师(专家),3.24,本科及以上 +128,硬件工程师(资深),3.24,本科及以上 +129,硬件工程师(主管),3.24,本科及以上 +130,硬件工程师,2.59,本科及以上 +131,高级材料工艺工程师,2.22,本科及以上 +132,材料工艺工程师(专家),2.22,本科及以上 +133,材料工艺工程师(资深),2.22,本科及以上 +134,材料工艺工程师(主管),2.22,本科及以上 +135,材料工艺工程师,1.78,本科及以上 +136,高级机械结构工程师,2.78,本科及以上 +137,机械结构工程师(专家),2.78,本科及以上 +138,机械结构工程师(资深),2.78,本科及以上 +139,机械结构工程师(主管),2.78,本科及以上 +140,机械结构工程师,2.22,本科及以上 +141,高级涂料研发,2.44,硕士及以上 +142,涂料研发(专家),2.44,硕士及以上 +143,涂料研发(资深),2.44,硕士及以上 +144,涂料研发(主管),2.44,硕士及以上 +145,涂料研发,1.95,硕士及以上 +146,高级制剂研发师,2.60,硕士及以上 +147,制剂研发师(专家),2.60,硕士及以上 +148,制剂研发师(资深),2.60,硕士及以上 +149,制剂研发师(主管),2.60,硕士及以上 +150,制剂研发师,2.08,硕士及以上 +151,高级数据开发工程师,3.20,本科及以上 +152,数据开发工程师(专家),3.20,本科及以上 +153,数据开发工程师(资深),3.20,本科及以上 +154,数据开发工程师(主管),3.20,本科及以上 +155,数据开发工程师,2.56,本科及以上 +156,高级前端开发工程师,3.02,本科及以上 +157,前端开发工程师(专家),3.02,本科及以上 +158,前端开发工程师(资深),3.02,本科及以上 +159,前端开发工程师(主管),3.02,本科及以上 +160,前端开发工程师,2.42,本科及以上 +161,高级数据分析师,2.40,本科及以上 +162,数据分析师(专家),2.40,本科及以上 +163,数据分析师(资深),2.40,本科及以上 +164,数据分析师(主管),2.40,本科及以上 +165,数据分析师,1.92,本科及以上 +166,高级风险评估专员,2.40,本科及以上 +167,风险评估专员(专家),2.40,本科及以上 +168,风险评估专员(资深),2.40,本科及以上 +169,风险评估专员(主管),2.40,本科及以上 +170,风险评估专员,1.92,本科及以上 +171,高级人力资源经理,2.00,本科及以上 +172,人力资源经理(专家),2.00,本科及以上 +173,人力资源经理(资深),2.00,本科及以上 +174,人力资源经理(主管),2.00,本科及以上 +175,人力资源经理,1.60,本科及以上 +176,高级半导体设备工程师,2.42,本科及以上 +177,半导体设备工程师(专家),2.42,本科及以上 +178,半导体设备工程师(资深),2.42,本科及以上 +179,半导体设备工程师(主管),2.42,本科及以上 +180,半导体设备工程师,1.94,本科及以上 +181,高级热能工程师,2.18,本科及以上 +182,热能工程师(专家),2.18,本科及以上 +183,热能工程师(资深),2.18,本科及以上 +184,热能工程师(主管),2.18,本科及以上 +185,热能工程师,1.74,本科及以上 +186,高级电气工程师,2.18,本科及以上 +187,电气工程师(专家),2.18,本科及以上 +188,电气工程师(资深),2.18,本科及以上 +189,电气工程师(主管),2.18,本科及以上 +190,电气工程师,1.75,本科及以上 +191,高级自动化工程师,2.08,本科及以上 +192,自动化工程师(专家),2.08,本科及以上 +193,自动化工程师(资深),2.08,本科及以上 +194,自动化工程师(主管),2.08,本科及以上 +195,自动化工程师,1.66,本科及以上 +196,高级医药化学分析师,2.12,本科及以上 +197,医药化学分析师(专家),2.12,本科及以上 +198,医药化学分析师(资深),2.12,本科及以上 +199,医药化学分析师(主管),2.12,本科及以上 +200,医药化学分析师,1.70,本科及以上 +201,高级机械工艺工程师,2.04,本科及以上 +202,机械工艺工程师(专家),2.04,本科及以上 +203,机械工艺工程师(资深),2.04,本科及以上 +204,机械工艺工程师(主管),2.04,本科及以上 +205,机械工艺工程师,1.63,本科及以上 +206,高级医学信息专员,2.06,本科及以上 +207,医学信息专员(专家),2.06,本科及以上 +208,医学信息专员(资深),2.06,本科及以上 +209,医学信息专员(主管),2.06,本科及以上 +210,医学信息专员,1.65,本科及以上 +211,高级电子工程师,2.12,本科及以上 +212,电子工程师(专家),2.12,本科及以上 +213,电子工程师(资深),2.12,本科及以上 +214,电子工程师(主管),2.12,本科及以上 +215,电子工程师,1.70,本科及以上 +216,高级风电工程师,2.02,本科及以上 +217,风电工程师(专家),2.02,本科及以上 +218,风电工程师(资深),2.02,本科及以上 +219,风电工程师(主管),2.02,本科及以上 +220,风电工程师,1.62,本科及以上 +221,高级土木工程师,2.00,本科及以上 +222,土木工程师(专家),2.00,本科及以上 +223,土木工程师(资深),2.00,本科及以上 +224,土木工程师(主管),2.00,本科及以上 +225,土木工程师,1.60,本科及以上 +226,高级会计师,1.80,本科及以上 +227,会计师(专家),1.80,本科及以上 +228,会计师(资深),1.80,本科及以上 +229,会计师(主管),1.80,本科及以上 +230,会计师,1.44,本科及以上 +231,高级核力/火力工程师,1.92,本科及以上 +232,核力/火力工程师(专家),1.92,本科及以上 +233,核力/火力工程师(资深),1.92,本科及以上 +234,核力/火力工程师(主管),1.92,本科及以上 +235,核力/火力工程师,1.54,本科及以上 +236,高级教师,1.60,本科及以上 +237,教师(专家),1.60,本科及以上 +238,教师(资深),1.60,本科及以上 +239,教师(主管),1.60,本科及以上 +240,教师,1.28,本科及以上 +241,高级硬件测试工程师,2.14,本科及以上 +242,硬件测试工程师(专家),2.14,本科及以上 +243,硬件测试工程师(资深),2.14,本科及以上 +244,硬件测试工程师(主管),2.14,本科及以上 +245,硬件测试工程师,1.71,本科及以上 +246,高级康复护理员,2.00,大专及以上 +247,康复护理员(专家),2.00,大专及以上 +248,康复护理员(资深),2.00,大专及以上 +249,康复护理员(主管),2.00,大专及以上 +250,康复护理员,1.60,大专及以上 +251,高级网络销售员,2.08,高中及以上 +252,网络销售员(专家),2.08,高中及以上 +253,网络销售员(资深),2.08,高中及以上 +254,网络销售员(主管),2.08,高中及以上 +255,网络销售员,1.66,高中及以上 +256,高级营销员,1.80,高中及以上 +257,营销员(专家),1.80,高中及以上 +258,营销员(资深),1.80,高中及以上 +259,营销员(主管),1.80,高中及以上 +260,营销员,1.44,高中及以上 +261,高级老年社工,1.80,本科及以上 +262,老年社工(专家),1.80,本科及以上 +263,老年社工(资深),1.80,本科及以上 +264,老年社工(主管),1.80,本科及以上 +265,老年社工,1.44,本科及以上 +266,高级3D设计师,1.82,大专及以上 +267,3D设计师(专家),1.82,大专及以上 +268,3D设计师(资深),1.82,大专及以上 +269,3D设计师(主管),1.82,大专及以上 +270,3D设计师,1.46,大专及以上 +271,高级办事人员和有关人员,1.56,大专及以上 +272,办事人员和有关人员(专家),1.56,大专及以上 +273,办事人员和有关人员(资深),1.56,大专及以上 +274,办事人员和有关人员(主管),1.56,大专及以上 +275,办事人员和有关人员,1.25,大专及以上 +276,高级运维工程师,1.98,本科及以上 +277,运维工程师(专家),1.98,本科及以上 +278,运维工程师(资深),1.98,本科及以上 +279,运维工程师(主管),1.98,本科及以上 +280,运维工程师,1.58,本科及以上 +281,高级网络工程师,1.98,本科及以上 +282,网络工程师(专家),1.98,本科及以上 +283,网络工程师(资深),1.98,本科及以上 +284,网络工程师(主管),1.98,本科及以上 +285,网络工程师,1.58,本科及以上 +286,高级医药代表,1.88,大专及以上 +287,医药代表(专家),1.88,大专及以上 +288,医药代表(资深),1.88,大专及以上 +289,医药代表(主管),1.88,大专及以上 +290,医药代表,1.50,大专及以上 +291,高级机器人调试工程师,1.94,大专及以上 +292,机器人调试工程师(专家),1.94,大专及以上 +293,机器人调试工程师(资深),1.94,大专及以上 +294,机器人调试工程师(主管),1.94,大专及以上 +295,机器人调试工程师,1.55,大专及以上 +296,高级新媒体运营,1.74,大专及以上 +297,新媒体运营(专家),1.74,大专及以上 +298,新媒体运营(资深),1.74,大专及以上 +299,新媒体运营(主管),1.74,大专及以上 +300,新媒体运营,1.39,大专及以上 +301,高级国内电商运营,1.84,大专及以上 +302,国内电商运营(专家),1.84,大专及以上 +303,国内电商运营(资深),1.84,大专及以上 +304,国内电商运营(主管),1.84,大专及以上 +305,国内电商运营,1.47,大专及以上 +306,高级应急救援员,1.60,高中及以上 +307,应急救援员(专家),1.60,高中及以上 +308,应急救援员(资深),1.60,高中及以上 +309,应急救援员(主管),1.60,高中及以上 +310,应急救援员,1.28,高中及以上 +311,高级设备维护工程师,1.86,大专及以上 +312,设备维护工程师(专家),1.86,大专及以上 +313,设备维护工程师(资深),1.86,大专及以上 +314,设备维护工程师(主管),1.86,大专及以上 +315,设备维护工程师,1.49,大专及以上 +316,高级电力工程师,1.76,本科及以上 +317,电力工程师(专家),1.76,本科及以上 +318,电力工程师(资深),1.76,本科及以上 +319,电力工程师(主管),1.76,本科及以上 +320,电力工程师,1.41,本科及以上 +321,高级UI设计师,1.58,本科及以上 +322,UI设计师(专家),1.58,本科及以上 +323,UI设计师(资深),1.58,本科及以上 +324,UI设计师(主管),1.58,本科及以上 +325,UI设计师,1.27,本科及以上 +326,高级短视频运营,1.44,大专及以上 +327,短视频运营(专家),1.44,大专及以上 +328,短视频运营(资深),1.44,大专及以上 +329,短视频运营(主管),1.44,大专及以上 +330,短视频运营,1.15,大专及以上 +331,高级消防设施操作员,1.40,初中及以上 +332,消防设施操作员(专家),1.40,初中及以上 +333,消防设施操作员(资深),1.40,初中及以上 +334,消防设施操作员(主管),1.40,初中及以上 +335,消防设施操作员,1.12,初中及以上 +336,高级养老护理员,1.60,初中及以上 +337,养老护理员(专家),1.60,初中及以上 +338,养老护理员(资深),1.60,初中及以上 +339,养老护理员(主管),1.60,初中及以上 +340,养老护理员,1.28,初中及以上 +341,高级护士,1.40,大专及以上 +342,护士(专家),1.40,大专及以上 +343,护士(资深),1.40,大专及以上 +344,护士(主管),1.40,大专及以上 +345,护士,1.12,大专及以上 +346,高级社会生产服务和生活服务人员,1.30,高中及以上 +347,社会生产服务和生活服务人员(专家),1.30,高中及以上 +348,社会生产服务和生活服务人员(资深),1.30,高中及以上 +349,社会生产服务和生活服务人员(主管),1.30,高中及以上 +350,社会生产服务和生活服务人员,1.04,高中及以上 +351,高级生产制造及有关人员,1.30,高中及以上 +352,生产制造及有关人员(专家),1.30,高中及以上 +353,生产制造及有关人员(资深),1.30,高中及以上 +354,生产制造及有关人员(主管),1.30,高中及以上 +355,生产制造及有关人员,1.04,高中及以上 +356,高级CNC/数控编程,1.92,大专及以上 +357,CNC/数控编程(专家),1.92,大专及以上 +358,CNC/数控编程(资深),1.92,大专及以上 +359,CNC/数控编程(主管),1.92,大专及以上 +360,CNC/数控编程,1.54,大专及以上 +361,高级药品生产/质量管理员,1.46,大专及以上 +362,药品生产/质量管理员(专家),1.46,大专及以上 +363,药品生产/质量管理员(资深),1.46,大专及以上 +364,药品生产/质量管理员(主管),1.46,大专及以上 +365,药品生产/质量管理员,1.17,大专及以上 +366,高级康复治疗师,1.48,本科及以上 +367,康复治疗师(专家),1.48,本科及以上 +368,康复治疗师(资深),1.48,本科及以上 +369,康复治疗师(主管),1.48,本科及以上 +370,康复治疗师,1.18,本科及以上 +371,高级CNC/数控操作,1.68,高中及以上 +372,CNC/数控操作(专家),1.68,高中及以上 +373,CNC/数控操作(资深),1.68,高中及以上 +374,CNC/数控操作(主管),1.68,高中及以上 +375,CNC/数控操作,1.34,高中及以上 +376,高级电子/电器维修/保养工程师,1.64,高中及以上 +377,电子/电器维修/保养工程师(专家),1.64,高中及以上 +378,电子/电器维修/保养工程师(资深),1.64,高中及以上 +379,电子/电器维修/保养工程师(主管),1.64,高中及以上 +380,电子/电器维修/保养工程师,1.31,高中及以上 +381,高级CAD设计/制图工程师,1.50,大专及以上 +382,CAD设计/制图工程师(专家),1.50,大专及以上 +383,CAD设计/制图工程师(资深),1.50,大专及以上 +384,CAD设计/制图工程师(主管),1.50,大专及以上 +385,CAD设计/制图工程师,1.20,大专及以上 +386,高级纺织针织印染人员,1.60,初中及以上 +387,纺织针织印染人员(专家),1.60,初中及以上 +388,纺织针织印染人员(资深),1.60,初中及以上 +389,纺织针织印染人员(主管),1.60,初中及以上 +390,纺织针织印染人员,1.28,初中及以上 +391,高级商品营业员,1.20,初中及以上 +392,商品营业员(专家),1.20,初中及以上 +393,商品营业员(资深),1.20,初中及以上 +394,商品营业员(主管),1.20,初中及以上 +395,商品营业员,0.96,初中及以上 +396,高级生产辅助人员,1.40,初中及以上 +397,生产辅助人员(专家),1.40,初中及以上 +398,生产辅助人员(资深),1.40,初中及以上 +399,生产辅助人员(主管),1.40,初中及以上 +400,生产辅助人员,1.12,初中及以上 +401,高级家政服务员,1.20,初中及以上 +402,家政服务员(专家),1.20,初中及以上 +403,家政服务员(资深),1.20,初中及以上 +404,家政服务员(主管),1.20,初中及以上 +405,家政服务员,0.96,初中及以上 +406,高级医疗器械维修/保养员,1.40,大专及以上 +407,医疗器械维修/保养员(专家),1.40,大专及以上 +408,医疗器械维修/保养员(资深),1.40,大专及以上 +409,医疗器械维修/保养员(主管),1.40,大专及以上 +410,医疗器械维修/保养员,1.12,大专及以上 +411,高级医学检验师,1.16,本科及以上 +412,医学检验师(专家),1.16,本科及以上 +413,医学检验师(资深),1.16,本科及以上 +414,医学检验师(主管),1.16,本科及以上 +415,医学检验师,0.93,本科及以上 +416,高级药店店员,0.94,高中及以上 +417,药店店员(专家),0.94,高中及以上 +418,药店店员(资深),0.94,高中及以上 +419,药店店员(主管),0.94,高中及以上 +420,药店店员,0.75,高中及以上 +421,高级化验/检验员,1.10,大专及以上 +422,化验/检验员(专家),1.10,大专及以上 +423,化验/检验员(资深),1.10,大专及以上 +424,化验/检验员(主管),1.10,大专及以上 +425,化验/检验员,0.88,大专及以上 +426,架构师,9.34,硕士及以上 +427,机器学习工程师,7.46,硕士及以上 +428,深度学习工程师,7.16,硕士及以上 +429,算法工程师,7.14,硕士及以上 +430,系统工程师,6.66,硕士及以上 +431,大模型算法工程师,3.97,硕士及以上 +432,智能驾驶系统工程师,3.38,硕士及以上 +433,Java开发工程师,2.96,本科及以上 +434,前端开发工程师,2.42,本科及以上 +435,Python开发工程师,2.87,本科及以上 +436,嵌入式软件开发工程师,2.98,本科及以上 +437,C/C++开发工程师,3.22,本科及以上 +438,数据开发工程师,2.56,本科及以上 +439,运维工程师,1.58,本科及以上 +440,网络工程师,1.58,本科及以上 +441,硬件工程师,2.59,本科及以上 +442,UI设计师,1.27,本科及以上 +443,产品经理,2.86,本科及以上 +444,模拟芯片设计工程师,4.96,硕士及以上 +445,半导体设备工程师,1.94,本科及以上 +446,电子工程师,1.70,本科及以上 +447,制剂研发师,2.08,硕士及以上 +448,医药化学分析师,1.70,本科及以上 +449,医学信息专员,1.65,本科及以上 +450,医药代表,1.50,大专及以上 +451,涂料研发,1.95,硕士及以上 +452,材料工艺工程师,1.78,本科及以上 +453,风电工程师,1.62,本科及以上 +454,电力工程师,1.41,本科及以上 +455,机械结构工程师,2.22,本科及以上 +456,机械工艺工程师,1.63,本科及以上 +457,CNC/数控编程,1.54,大专及以上 +458,电气工程师,1.75,本科及以上 +459,自动化工程师,1.66,本科及以上 +460,新媒体运营,1.39,大专及以上 +461,国内电商运营,1.47,大专及以上 +462,短视频运营,1.15,大专及以上 +463,网络销售员,1.66,高中及以上 +464,设备维护工程师,1.49,大专及以上 +465,硬件测试工程师,1.71,本科及以上 +466,CAD设计/制图工程师,1.20,大专及以上 +467,电子/电器维修/保养工程师,1.31,高中及以上 +468,数据分析师,1.92,本科及以上 +469,IT项目经理,2.89,本科及以上 +470,3D设计师,1.46,大专及以上 +471,IT技术/研发总监,5.01,硕士及以上 +472,移动开发工程师,2.86,本科及以上 +473,药品生产/质量管理员,1.17,大专及以上 +474,药店店员,0.75,高中及以上 +475,康复治疗师,1.18,本科及以上 +476,化验/检验员,0.88,大专及以上 +477,医疗器械维修/保养员,1.12,大专及以上 +478,医学检验师,0.93,本科及以上 +479,核力/火力工程师,1.54,本科及以上 +480,热能工程师,1.74,本科及以上 +481,CNC/数控操作,1.34,高中及以上 +482,机器人调试工程师,1.55,大专及以上 +483,中层及以上管理人员,2.70,本科及以上 +484,专业技术人员,1.97,本科及以上 +485,办事人员和有关人员,1.25,大专及以上 +486,社会生产服务和生活服务人员,1.04,高中及以上 +487,生产制造及有关人员,1.04,高中及以上 +488,纺织针织印染人员,1.28,初中及以上 +489,商品营业员,0.96,初中及以上 +490,生产辅助人员,1.12,初中及以上 +491,营销员,1.44,高中及以上 +492,家政服务员,0.96,初中及以上 +493,安全工程师,2.40,本科及以上 +494,应急救援员,1.28,高中及以上 +495,消防设施操作员,1.12,初中及以上 +496,风险评估专员,1.92,本科及以上 +497,企业安全主管,2.88,本科及以上 +498,养老护理员,1.28,初中及以上 +499,康复护理员,1.60,大专及以上 +500,老年社工,1.44,本科及以上 \ No newline at end of file diff --git a/w4/Circle.class b/w4/Circle.class new file mode 100644 index 0000000000000000000000000000000000000000..c7aed7b9a3b789b8b03863a5653073a0a6a55848 GIT binary patch literal 438 zcmZ8d-AV#M7(KJ@?zF3|WL6e*VHc$fei8fkLC%cd!9R!Y!eQ z5__E}9!@nWR--6g3Wz|$6Y%cUlWI-XY}~q0$;7^N>fgQKv?gFSf@YsvXFj5?d>zfg z+w^e|#yvIAPR=+??p9_@40yBrzme>=<4_5>-FX@h!>dS(ihpyQ=~UD?qroQ$BBx|! zvbL~AtnlQczy-MeJA{Ao2Kkb)w~1cXF{!ZNz^0;#ot5s8eu5m!e}#O`C7J}11$Og@ nqg8~xX0N{(*rd5f{$6f&`hL|7Rc?n zFI~rXgI(uAea~w|0_hbQ$mpIx(k|`j$S|@l!-nsrS1oezGoZs%1ZM;^dqY)?2xK1- zP9jy98x*EjCkBpzVdNEJOdw@%#E=Pr%yuY`5t$Q2@dPoBd=?i_)G=jZ8W;a-w)W~p z7=Qhh3Tox!)DwSgY?P34N{_l7DM;|`@I(UC{@Vfuz zW04sHGq81(Ow3|V;Or?h0(x7K`T=$9flxdzs>oosT-q_PfJGgSiL1EAIniH0;X3bFeF<>dNOQlzQ-M~{re?bkpXmtPPQH^$` z2mOhKY!^e-9){`WER1$xZT2wE)1-xST@<#y;QZ*NuedVz4fFF{3taycrlBr3i6L@M ZvY{D1ABV9eYA*9Jm6;K^&6))6`~_4eh#LR^ literal 0 HcmV?d00001 diff --git a/w4/Main.java b/w4/Main.java new file mode 100644 index 0000000..0ec8597 --- /dev/null +++ b/w4/Main.java @@ -0,0 +1,12 @@ +public class Main { + public static void main(String[] args) { + Shape circle = new Circle(5); + Shape rectangle = new Rectangle(4, 6); + Shape triangle = new Triangle(3, 8); + + System.out.println("=== 图形面积计算器 ==="); + ShapeUtil.printArea(circle); + ShapeUtil.printArea(rectangle); + ShapeUtil.printArea(triangle); + } +} diff --git a/w4/Rectangle.class b/w4/Rectangle.class new file mode 100644 index 0000000000000000000000000000000000000000..fb2b03269aaa6fd0f26c2af751d4d2dbb4960361 GIT binary patch literal 567 zcmZvZ%}&BV6ot?9m(~IbDyX=SjnIV~x5k9n7#GHc7+e>a(E0-gi$0byk(jvf0emRq z8K~6|()4!b-ZS4hlYV`Fd;(~p=0byR!|-6j5-{6Q_#g$Wqj(r6#{znz*>RAAW5e~Z z0#CrXl)WSz4(_NkpW}WK35Y<63Lc6|VMQ_?Lf(7kloylxt{h*5 zU3ES;kjeENL8pL?$E;yAW@jBr&QhMk>F?TRzcrSjfZHBT#yxo&D`Fu_cW@Ivh1g>* zjd#`fF#c@Cko;O;K&-N^ad!xvJD}*lL-_ks*nV@0{3}}mCDsxQR+H6&0~-Z`1vFDnxZAK;^mdu%Z?JDb`0 z{@xz|A$%7GOb5b)1)DI=^Rt5@r(|8&z$cs9mOyZkJx_A~A)-{dx@WU)YR&-X_e%Y%N}( UCku`->N9IW7{Ke?A)|rO9|aU6hX4Qo literal 0 HcmV?d00001 diff --git a/w4/Shape.java b/w4/Shape.java new file mode 100644 index 0000000..ac3b8fb --- /dev/null +++ b/w4/Shape.java @@ -0,0 +1,3 @@ +public abstract class Shape { + public abstract double getArea(); +} diff --git a/w4/ShapeUtil.class b/w4/ShapeUtil.class new file mode 100644 index 0000000000000000000000000000000000000000..3a7e1ba037c14e905ca03d2e5bc56a20c75f5e9e GIT binary patch literal 1039 zcmaJ=TTc@~6#j-@wp|wr1w=rxXpt=_^?qRyf+a+fiY7&T@M+pkU|}!K?v#Xge*`h{ z#TOrmK48LwKfoU%@lP1f?l!cQ#@+0kGc(`$&iT&F{`_SB*Wky zKj1}+J3GbK)jd&@49O+aG37EtOfPH)@RWu$REE@!kR^-zKEtqHD7PcSMMH&#egy*> zG8kmY{Ik!{Pw^GgZdhWI+k#=Fi=-kw)7c@GEQS?~Xc)z1hD2qTHwddx?5ZbtSk+n@ zS1_(%Lc=7kc8RDQ`cl}0a+@S&G%C_`i*JZrQVPLsBTJo_(r_I)hB2G(i<0ZqxO`{I zUGjX%9Z3>r^$vxt;?_DOouBR-iMaL#=P6 zX)(l0Zk=Rj%BCYWn|4)rTfAz~N;+hUTA}LYFvKWqGpH4}>D9!#8K4HvsTP8Is6{Va zSNhW9jaNeMx^+K=dkjM?clPna?@yo4z8wELI$q4NOcD=NJj5dfkAoIHVaT@+(sT~o zeNl{*M_pUzHR*bX3`d>9TEHmROYYPy;pfY)yWeaW7u(vg(iOOM*bqJ7?>q3(r8PRw zrA1NVmQ^vOFc`EA#}Qt5ONFmskzwY7re38gSYnv^Ka~ELNEfCtOFv8S^norek~9`* zc8x3}o0$6!_LUrlIU0lQz)xcyx5)<36~yTUCg)C|oZwQK?9j$HjLqw(#Dfz|w+XT# mG=>z}e#$pNlrh|)@IEY{NH#^Z_vyQfr!-T^dj2kryAq86?)$GX!C14*#gJ^s#VAkqw7iqW- zG9Fgo38Y(bBnRC)%B+qYaT1}HWIg2cx!qGyw>P#=K54;^)LIzU+mxRTZz#`QMgw&< zx$mgBB|Dnqbk+DYLD4T{KbrSeExGAZaFJjITprHX`eGwiQXtbDPU35I9%-IGk9cq^ zA0>8}&R`OQgHK3SjLO;8=}=%TvO9#y4#)+s5W)TwPEeo1f994ziM0TWHN|Sfg@Y`? z0;^b?0je|*S`oa!d0Jf4E}*kO8S69YF1<|d+KJDvh5jK-K$AR`8%xpte{_-3&E@Dn j>3`5=qIHO^1$vL~(E+n1> │ +│ Shape │ +├─────────────────────────┤ +├─────────────────────────┤ +│ + getArea(): double │ +└───────────┬─────────────┘ + │ + ┌───────┼───────┐ + │ │ │ + ▼ ▼ ▼ +┌─────────┐ ┌─────────┐ ┌─────────┐ +│ Circle │ │Rectangle│ │Triangle │ +├─────────┤ ├─────────┤ ├─────────┤ +│-radius │ │-width │ │-base │ +│ │ │-height │ │-height │ +├─────────┤ ├─────────┤ ├─────────┤ +│+getArea()│ │+getArea()│ │+getArea()│ +└─────────┘ └─────────┘ └─────────┘ +``` + +## 类关系说明 + +### Shape(抽象类) +- **方法**: `getArea()` - 抽象方法,返回图形面积 + +### Circle(圆形) +- **属性**: `radius` - 半径 +- **方法**: `getArea()` - 返回 π × r² + +### Rectangle(矩形) +- **属性**: `width` - 宽度, `height` - 高度 +- **方法**: `getArea()` - 返回 宽 × 高 + +### Triangle(三角形) +- **属性**: `base` - 底边, `height` - 高 +- **方法**: `getArea()` - 返回 0.5 × 底 × 高 + +### ShapeUtil(工具类) +- **方法**: `printArea(Shape shape)` - 统一打印图形面积 + +## 设计模式 + +使用了**模板方法模式**和**多态**: +- Shape 定义了计算面积的接口 +- 各子类实现具体的面积计算逻辑 +- ShapeUtil 通过多态统一处理所有图形 diff --git a/w5/Circle.class b/w5/Circle.class new file mode 100644 index 0000000000000000000000000000000000000000..de58c70332e2d9e647986b3e3a5386d6b1ed351f GIT binary patch literal 386 zcmZut%Syvg5IvLT(WcSX*7_FeLTFu>52y%IaaBZ!bbp&(;*~r~OcXy$7YZ)?06$8c zn}BY-ii zIOuukW0TPThe>c&S|?6fdQ@xITMKSSlkwca7N0t;1PSIeTk`3hnM&n#nJi>}D;6<# z%q1@;xItFtp}bPM*RENodM}PJU>o!^z#hQnxXr&q&cxX|c?Z34LD=D_$GRr${z8u{ bD$sg`(_4E(=MSze223{5V#*%Z2KIjdHeX5G literal 0 HcmV?d00001 diff --git a/w5/Circle.java b/w5/Circle.java new file mode 100644 index 0000000..ac055d8 --- /dev/null +++ b/w5/Circle.java @@ -0,0 +1,6 @@ +public class Circle extends Shape { + @Override + public void draw() { + System.out.println("Drawing a circle"); + } +} diff --git a/w5/Computer.class b/w5/Computer.class new file mode 100644 index 0000000000000000000000000000000000000000..6ae3bec5fd5f84f031bf751b66033a69d9de5f9b GIT binary patch literal 313 zcmYLF%TB^j5Ixh|m!$<%)RhZ&piw?RW1=Lkh%6BHZJn5s(o0I~f4MTc@B{oP!;FdX zF3y?9nKP67{qy++;0`Ad9GC!Z3=ck`ze-=zahX;x<5{-iydn5EMO8Gn1T!2hI|#8C zAd1mZxmnEb39j96rJW>3SIb^r+ARm@6T*pIZ`y`ykxlF~6MEC4;>UKKas8BLrBwWO z%fCk9a4LK~S`wnUZR?yL3Kb-OCRchM&d`&q^*NAb@CElJI~68j@BAI~CIR6?4 k4lxi^>7}q*Bo`kD2!b);f20c|O(UZ&^k)c1k~=uw0pw~g_y7O^ literal 0 HcmV?d00001 diff --git a/w5/Computer.java b/w5/Computer.java new file mode 100644 index 0000000..0568303 --- /dev/null +++ b/w5/Computer.java @@ -0,0 +1,6 @@ +public class Computer { + public void useUSB(USB usb) { + usb.open(); + usb.close(); + } +} diff --git a/w5/Keyboard.class b/w5/Keyboard.class new file mode 100644 index 0000000000000000000000000000000000000000..2e94d6629f9cfd8050fc8a1cd6bdd3986c848106 GIT binary patch literal 491 zcmZuuO;5r=6r2YwTWS#m@mqm|33!knfH6@MFA_DWa&PH|l$0(h#e|=w2TeTq1N>3O zw>3mfxV*Q!Z)SEf@AK>Z1Hc7ZHgd=d7!FJn2$iw-xS{D*BMyY`l~#Q)Jz5fI|OU_oxmQudvq@e z#+3>r=lHnp z^X-s3aW_xiK+k+29B|cReI^Dhp~sm7P<(-?mR?c*h3mxt2Ip-urPu*nQ3L^Yf(h9kuc{TNsi3aui?lA1l6w=o=va=fnr&{Z1 zWZ=2bKDLCOYQLCisF3W(=FP=6*-abwMxll;vN;9sfhyFKw=5iuedJvn_$c6zg)L(v zlB9mErK`azx~g@UZ%+Eu&jvOM@8;uf7(bfsNIH&Jg@x*Kuo<~Mi)}Pm73%h69{0jq zD`Zc)TnY~r_D}HZfCJ8tG|wV$WuhXc&K6Mb3=~Q{B`vWh;}V5hA^uZ8;BKhmq^Ksj zJRIS8O>c<9%#@b!pBC5&mdFx!Tj!tHyWrkP6gUvz(&G$r(8$x}BArw?;d=t*KV>FG ACjbBd literal 0 HcmV?d00001 diff --git a/w5/Main.java b/w5/Main.java new file mode 100644 index 0000000..2de981c --- /dev/null +++ b/w5/Main.java @@ -0,0 +1,13 @@ +public class Main { + public static void drawShape(Shape s) { + s.draw(); + } + + public static void main(String[] args) { + Shape circle = new Circle(); + Shape rectangle = new Rectangle(); + + drawShape(circle); + drawShape(rectangle); + } +} diff --git a/w5/Mouse.class b/w5/Mouse.class new file mode 100644 index 0000000000000000000000000000000000000000..12b67426bc1849379cfe2a39a7cee5504d3f3a67 GIT binary patch literal 479 zcmZvZ%T5A85Jhjn3=QKb2;%zz3lnf5AAm7Y6Ib|1M%fS0Ax(yEGR&CxS-Q}~g&*KY z8LP*rF=12H-F46HO4Y~b+dF_WG(F^y7jS&IC=e=>@FDC(p&oZ`1`|0<2!#`+RdPzm zx7z&@iYN(qK9=DBlLwFUL{3>{Qikfi%t)EeZLD+>B(V&q-6B>9{*_7RvSDUY%aMl) zRt2g)YFH!G7ElB+vmTLV+t#;l)*zcIJ?^&qMXdkY4kI&{BY{nVn|&m(%}w10=LF}% zj3lAlQ(9i9(}9fd!a>9@j%|j43?_JiN#misRJP`2F2}YpG_k?sB5d*O@|<~O9C!G( z$C)_0N3WnKJ`i>}+Oj16X6=!-DNW1aROIM!CGnu#n{`jFMcX4Z&UNQa3AtJ)IprbO=s-mRCg(n<`@( z?sTd4?Ilt5K_-PcWVO5#{J3iCRBg5K{C{X+`o#nuzcpil>)|0i%Wf4}i2G*8l(j literal 0 HcmV?d00001 diff --git a/w5/Shape.java b/w5/Shape.java new file mode 100644 index 0000000..18bcb4e --- /dev/null +++ b/w5/Shape.java @@ -0,0 +1,3 @@ +public abstract class Shape { + public abstract void draw(); +} diff --git a/w5/USB.class b/w5/USB.class new file mode 100644 index 0000000000000000000000000000000000000000..508c85593de07add22aaf7e72d86b23fdf16b162 GIT binary patch literal 124 zcmX^0Z`VEs1_nn4E_MbcMh524U?+A47Dfhvti-ZJ{hY+SbbbG%tkmQZMh2Grg48^q z5)I8TMh4d8oc!WcMh33n{L-T2RJY6=Acq5}TMwj>jgbMU5NIv~0~63NRt7c(kfH1# M8Ysg75@+B90NC&r7ytkO literal 0 HcmV?d00001 diff --git a/w5/USB.java b/w5/USB.java new file mode 100644 index 0000000..6e52e60 --- /dev/null +++ b/w5/USB.java @@ -0,0 +1,4 @@ +public interface USB { + void open(); + void close(); +} diff --git a/w5/USBTest.class b/w5/USBTest.class new file mode 100644 index 0000000000000000000000000000000000000000..52164940558da71f8b79fe26ee2e8f6a06680ffa GIT binary patch literal 397 zcmYLFO;5r=6r81nmbD0eA)*|_3yR7Q(3mKR7YiIf6XU6c4Jm=vl-9(bZ{EDO`}6zt4d50>5;+(aOb2-s1S&J{&Fjp)aM~I8Gc`^G3fDmxBsT&^ z>-5QjEns(}#cP_VSi;iH8v^-WlrEKo)cGbQ59-~Iym%r}f}wR=4z{sFJL(>Xca*eT z;+6K?6R^lfYRP$KH<~DcvKxe|pDuhAk34_Q8*||Wp+L3u;;y$GCUFo>=^`M9Q5uic zeW1n8zu%>n;uyPpr#?AwSrizn%o;>N%%80wK1c-i8Fg9nB5F7wYUzNjCh;VL^}IsS r%^-