首页 > 解决方案 > 有目的的编程 Coursera 课程的编程作业帮助

问题描述

我正在 Coursera 上进行有目的的编程,这是一门由普林斯顿大学提供的“Java 入门”类型的课程,到目前为止已经进入第 8 周(共 10 周)。

我被困在他们的“内核过滤器”任务和这个特定课程的论坛上,它完全死了。我不会写出作业提示,因为它需要大量文本,我将提供指向问题描述页面的链接 (同样,这是内核过滤器作业)。

此外,它们还在此处的常见问题解答页面上提供提示。

我编写了似乎可以解决过滤器内核的代码,如下所示:

public static Picture sharpen(Picture picture) {
    int width = picture.width();
    int height = picture.height();
    Picture target = new Picture(width, height);

    for (int col = 0; col < width; col++)
        for (int row = 0; row < height; row++) {
            Color color = picture.get(col, row);
            Color color1;
            Color color2;
            Color color3;
            Color color4;

            if (row == 0) color1 = picture.get(col, height - 1);
            else color1 = picture.get(col, row - 1);
            if (col == 0) color2 = picture.get(width - 1, row);
            else color2 = picture.get(col - 1, row);
            if (col == width - 1) color3 = picture.get(0, row);
            else color3 = picture.get(col + 1, row);
            if (row == height - 1) color4 = picture.get(col, 0);
            else color4 = picture.get(col, row + 1);
            int filterRed = -color1.getRed() - color2.getRed() + 5 * color.getRed() -
                    color3.getRed() - color4.getRed();
            int filterGreen = -color1.getGreen() - color2.getGreen() + 5 * color.getGreen() -
                    color3.getGreen() - color4.getGreen();
            int filterBlue = -color1.getBlue() - color2.getBlue() + 5 * color.getBlue() -
                    color3.getBlue() - color4.getBlue();
            if (filterRed > 255) filterRed = 255;
            else if (filterRed < 0) filterRed = 0;
            if (filterGreen > 255) filterGreen = 255;
            else if (filterGreen < 0) filterGreen = 0;
            if (filterBlue > 255) filterBlue = 255;
            else if (filterBlue < 0) filterBlue = 0;
            Color filterColor = new Color(filterRed, filterGreen, filterBlue);
            target.set(col, row, filterColor);
        }
    return target;
}

显然,虽然它可以解决问题(或者当我运行它时它会出现),但这并不是很漂亮的代码。

查看上面提供的常见问题解答页面,其中一个建议是编写一个“辅助”方法内核来进行矩阵乘法。我已经开始尝试为这种方法编写代码,但被卡住了,感觉必须有一种更简单的方法来做到这一点。

以下是我到目前为止所拥有的:

private static Picture kernel(Picture picture, double[][] weights) {
    int vertDistance = weights.length / 2;
    int horizDistance = weights[0].length / 2;
    int width = picture.width();
    int height = picture.height();
    Picture target = new Picture(width, height);

    for (int col = 0; col < picture.height(); col++)
        for (int row = 0; row < picture.width(); row++) {
            int filterRed = 0;
            int filterGreen = 0;
            int filterBlue = 0;
            Color color = picture.get(col, row);
            Color kernelColor;
            for (int i = 0; i < weights.length; i++)
                for (int j = 0; j < weights[0].length; j++) {
                    kernelColor = picture.get(col - vertDistance, row - horizDistance);
                    filterRed += kernelColor.getRed();
                }
        } 
}

我觉得不应该有 4 个相互嵌套的 for 循环(IDE 甚至警告我这表明程序设计不佳)而且我觉得这已经足够复杂了,以至于我没有希望测试时几乎不可避免地会出现错误找到任何错误可能在哪里。

这门课程变得具有挑战性,这不一定是坏事,但似乎无法通过课程论坛获得帮助。我在这个项目的正确轨道上吗?

PS 作为一个考虑因素,这是一个“介绍”类型的课程,我相信我们的目的是编写仅限于新手级别的代码,即 for 循环、if 语句、基本对象(即颜色和图片)等。

标签: java

解决方案


我致力于浓缩你的sharpen方法。我创建了一个骨架Picture类,以便编译代码。

我将一些sharpen代码提取到一个辅助方法中,sumColorValue. 我重新排列了求和公式,以使代码读者更清楚正在发生的事情。int 后面的三个点告诉方法将输入的单个颜色值视为一个 int 数组。

我还使用了条件运算符 (?) 来缩小获取周围图片下标的过程。

尽量不要只复制代码段。看看你是否可以创建一个你多次调用的方法。

这是修改后的代码。

import java.awt.Color;

public class TestBed {

    public class Picture {

        private int width, height;

        public Picture(int width, int height) {
            this.width = width;
            this.height = height;
        }

        public Color get(int column, int row) {
            return null;
        }

        public void set(int column, int row, Color color) {

        }

        public int width() {
            return width;
        }

        public int height() {
            return height;
        }

    }

    public Picture sharpen(Picture picture) {
        int width = picture.width();
        int height = picture.height();
        Picture target = new Picture(width, height);

        for (int col = 0; col < width; col++)
            for (int row = 0; row < height; row++) {
                Color color = picture.get(col, row);

                int previousRow = (row == 0) ? 
                        height - 1 : row - 1;    
                int previousColumn = (col == 0) ?
                        width - 1 :col - 1;
                int nextColumn = (col == width - 1) ?
                        0 : col + 1;
                int nextRow = (row == height - 1) ?
                        0 : row + 1;

                Color color1 = picture.get(col, previousRow);
                Color color2 = picture.get(previousColumn, row);
                Color color3 = picture.get(nextColumn, row);
                Color color4 = picture.get(col, nextRow);

                int filterRed = sumColorValue(color.getRed(), 
                        color1.getRed(), color2.getRed(),
                        color3.getRed(), color4.getRed());
                int filterGreen = sumColorValue(color.getGreen(), 
                        color1.getGreen(), color2.getGreen(),
                        color3.getGreen(), color4.getGreen());
                int filterBlue = sumColorValue(color.getBlue(), 
                        color1.getBlue(), color2.getBlue(),
                        color3.getBlue(), color4.getBlue());

                Color filterColor = new Color(filterRed, 
                        filterGreen, filterBlue);

                target.set(col, row, filterColor);
            }

        return target;
    }

    private int sumColorValue(int... color) {
        int value = 5 * color[0] - color[1] - color[2] - 
                color[3] - color[4];

        if (value > 255)
            value = 255;
        else if (value < 0)
            value = 0;
        return value;
    }

}

推荐阅读