add AP CSA algs4 demo ipynb

这个提交包含在:
langxm
2026-08-21 17:54:59 +08:00
父节点 0d4a1c3f61
当前提交 63dd6f6bc3
+194
查看文件
@@ -0,0 +1,194 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# AP CSA Demo — 普林斯顿 algs4 库(JAVA)\n",
"\n",
"这是 MVP 示例:教你如何用 **jjava (Java kernel)** 加载普林斯顿 `algs4.jar`,实现 **科学绘图 (StdDraw)** 和 **音频 (StdAudio)**。\n",
"\n",
"> algs4.jar 官方地址:https://algs4.cs.princeton.edu/code/algs4.jar"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 第 1 步:加载 algs4.jar(每个 notebook 首格执行一次)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"%classpath add /opt/tljh/user/share/java/algs4.jar\n",
"\n",
"import edu.princeton.cs.algs4.StdOut;\n",
"import edu.princeton.cs.algs4.StdDraw;\n",
"import edu.princeton.cs.algs4.StdAudio;\n",
"\n",
"StdOut.println(\"algs4 加载成功!\");"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 第 2 步:科学绘图 — StdDraw 画一个函数曲线\n",
"\n",
"服务器无显示器 (headless),所以我们**离屏渲染后保存为 PNG**,再用 Markdown 显示。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"// 离屏绘图:sin 曲线\n",
"int n = 100;\n",
"StdDraw.setCanvasSize(600, 400);\n",
"StdDraw.setXscale(0, n);\n",
"StdDraw.setYscale(-1.5, 1.5);\n",
"StdDraw.setPenColor(StdDraw.BLUE);\n",
"for (int i = 0; i < n; i++) {\n",
" double x0 = i, y0 = Math.sin(i * 0.1);\n",
" double x1 = i + 1, y1 = Math.sin((i + 1) * 0.1);\n",
" StdDraw.line(x0, y0, x1, y1);\n",
"}\n",
"StdDraw.setPenColor(StdDraw.RED);\n",
"StdDraw.text(n / 2.0, 1.2, \"y = sin(x)\");\n",
"\n",
"StdDraw.save(\"sin_plot.png\"); // 保存到当前目录\n",
"StdOut.println(\"已保存 sin_plot.png\");"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 显示绘图结果"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"![sin曲线](sin_plot.png)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 第 3 步:音频 — StdAudio 合成一段旋律(八音盒)\n",
"\n",
"服务器无声卡,所以**合成样本保存为 WAV**,学生用浏览器 `<audio>` 播放。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"// 用 StdAudio 合成 \"小星星\" 的前几个音符 (C D E C)\n",
"int sampleRate = 44100;\n",
"double duration = 0.5; // 每个音 0.5 秒\n",
"int n = (int)(sampleRate * duration);\n",
"\n",
"// 频率映射: C4=261.63, D4=293.66, E4=329.63, G4=392.0\n",
"double[] notes = {261.63, 293.66, 329.63, 261.63};\n",
"\n",
"double[] all = new double[notes.length * n];\n",
"int idx = 0;\n",
"for (double freq : notes) {\n",
" for (int i = 0; i < n; i++) {\n",
" double t = (double)i / sampleRate;\n",
" // 正弦波 + 衰减包络(模拟八音盒)\n",
" all[idx++] = Math.sin(2 * Math.PI * freq * t) * Math.exp(-4 * t);\n",
" }\n",
"}\n",
"\n",
"StdAudio.save(\"twinkle.wav\", all); // 保存合成音频\n",
"StdOut.println(\"已合成并保存 twinkle.wav (\" + all.length + \" samples)\");"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 播放音频"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<audio controls src=\"twinkle.wav\"></audio>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 第 4 步(进阶):JFreeChart 像 matplotlib 那样画柱状图\n",
"\n",
"jjava 支持 `%maven` 拉依赖,这里用 JFreeChart 画成绩柱状图并在 notebook 内显示。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"%maven org.jfree:jfreechart:1.5.4\n",
"import org.jfree.chart.*;\n",
"import org.jfree.chart.plot.PlotOrientation;\n",
"import org.jfree.data.category.DefaultCategoryDataset;\n",
"import java.awt.image.BufferedImage;\n",
"\n",
"DefaultCategoryDataset ds = new DefaultCategoryDataset();\n",
"ds.addValue(95, \"CSA\", \"Tina\");\n",
"ds.addValue(88, \"CSA\", \"Kevin\");\n",
"ds.addValue(92, \"CSA\", \"Gerben\");\n",
"JFreeChart c = ChartFactory.createBarChart(\n",
" \"AP CSA 成绩\", \"学生\", \"分数\", ds, \n",
" PlotOrientation.VERTICAL, true, true, false);\n",
"\n",
"BufferedImage img = c.createBufferedImage(500, 350);\n",
"img // 直接在 notebook 显示 PNG"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n",
"### 作业思路(对标普林斯顿 COS 126)\n",
"\n",
"把这一页扩展成项目作业:\n",
"- **N-Body / 分形绘图**:用 StdDraw 离屏渲染帧序列\n",
"- **排序可视化**:画冒泡/快排过程\n",
"- **音频项目**:合成一段完整旋律 / 音频频谱可视化\n",
"- 每个作业 = 题目背景 + `// TODO` 代码cell + 测试cell + 自检清单"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Java (jjava)",
"language": "java",
"name": "jjava"
},
"language_info": {
"name": "java"
}
},
"nbformat": 4,
"nbformat_minor": 5
}