文件
class-demo/APCSA_algs4_demo.ipynb
2026-08-21 17:54:59 +08:00

5.4 KiB

AP CSA Demo — 普林斯顿 algs4 库(JAVA)

这是 MVP 示例:教你如何用 jjava (Java kernel) 加载普林斯顿 algs4.jar,实现 科学绘图 (StdDraw) 和 音频 (StdAudio)。

algs4.jar 官方地址:https://algs4.cs.princeton.edu/code/algs4.jar

第 1 步:加载 algs4.jar(每个 notebook 首格执行一次)

In [ ]:
%classpath add /opt/tljh/user/share/java/algs4.jar

import edu.princeton.cs.algs4.StdOut;
import edu.princeton.cs.algs4.StdDraw;
import edu.princeton.cs.algs4.StdAudio;

StdOut.println("algs4 加载成功!");

第 2 步:科学绘图 — StdDraw 画一个函数曲线

服务器无显示器 (headless),所以我们离屏渲染后保存为 PNG,再用 Markdown 显示。

In [ ]:
// 离屏绘图:sin 曲线
int n = 100;
StdDraw.setCanvasSize(600, 400);
StdDraw.setXscale(0, n);
StdDraw.setYscale(-1.5, 1.5);
StdDraw.setPenColor(StdDraw.BLUE);
for (int i = 0; i < n; i++) {
    double x0 = i, y0 = Math.sin(i * 0.1);
    double x1 = i + 1, y1 = Math.sin((i + 1) * 0.1);
    StdDraw.line(x0, y0, x1, y1);
}
StdDraw.setPenColor(StdDraw.RED);
StdDraw.text(n / 2.0, 1.2, "y = sin(x)");

StdDraw.save("sin_plot.png");   // 保存到当前目录
StdOut.println("已保存 sin_plot.png");

显示绘图结果

sin曲线

第 3 步:音频 — StdAudio 合成一段旋律(八音盒)

服务器无声卡,所以合成样本保存为 WAV,学生用浏览器 <audio> 播放。

In [ ]:
// 用 StdAudio 合成 "小星星" 的前几个音符 (C D E C)
int sampleRate = 44100;
double duration = 0.5;   // 每个音 0.5 秒
int n = (int)(sampleRate * duration);

// 频率映射: C4=261.63, D4=293.66, E4=329.63, G4=392.0
double[] notes = {261.63, 293.66, 329.63, 261.63};

double[] all = new double[notes.length * n];
int idx = 0;
for (double freq : notes) {
    for (int i = 0; i < n; i++) {
        double t = (double)i / sampleRate;
        // 正弦波 + 衰减包络(模拟八音盒)
        all[idx++] = Math.sin(2 * Math.PI * freq * t) * Math.exp(-4 * t);
    }
}

StdAudio.save("twinkle.wav", all);   // 保存合成音频
StdOut.println("已合成并保存 twinkle.wav (" + all.length + " samples)");

播放音频

第 4 步(进阶):JFreeChart 像 matplotlib 那样画柱状图

jjava 支持 %maven 拉依赖,这里用 JFreeChart 画成绩柱状图并在 notebook 内显示。

In [ ]:
%maven org.jfree:jfreechart:1.5.4
import org.jfree.chart.*;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.DefaultCategoryDataset;
import java.awt.image.BufferedImage;

DefaultCategoryDataset ds = new DefaultCategoryDataset();
ds.addValue(95, "CSA", "Tina");
ds.addValue(88, "CSA", "Kevin");
ds.addValue(92, "CSA", "Gerben");
JFreeChart c = ChartFactory.createBarChart(
    "AP CSA 成绩", "学生", "分数", ds, 
    PlotOrientation.VERTICAL, true, true, false);

BufferedImage img = c.createBufferedImage(500, 350);
img   // 直接在 notebook 显示 PNG

作业思路(对标普林斯顿 COS 126)

把这一页扩展成项目作业:

  • N-Body / 分形绘图:用 StdDraw 离屏渲染帧序列
  • 排序可视化:画冒泡/快排过程
  • 音频项目:合成一段完整旋律 / 音频频谱可视化
  • 每个作业 = 题目背景 + // TODO 代码cell + 测试cell + 自检清单