add AP CSA algs4 demo ipynb
这个提交包含在:
@@ -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": [
|
||||||
|
""
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"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
|
||||||
|
}
|
||||||
在新工单中引用
屏蔽一个用户