【问题标题】:CS50 Filter : Edges my code works fine but can't pass cs50 checkCS50 过滤器:边缘我的代码工作正常,但无法通过 cs50 检查
【发布时间】:2021-12-15 20:31:07
【问题描述】:

我真的被困在这里我的代码工作正常,但它无法通过 CS50 检查。我知道我的代码不是那么漂亮,并且有很多 if 条件和重复,但它的工作原理如下所示。我是编程新手,如果有人对我有建议,我将不胜感激。

Here is the result of my code

And here is the results of check50

void edges(int height, int width, RGBTRIPLE image[height][width])
{
    RGBTRIPLE temp[height][width];
    
    for (int h = 0; h < height; h++)
    {
        for (int w = 0; w < width; w++)
        {
            temp[h][w] = image[h][w];
            if (h == 0 && w == 0) //check for position 
            {    
                int GxB = (image[h][w + 1].rgbtBlue * 2) + (image[h + 1][w + 1].rgbtBlue * 1);
                int GxG = (image[h][w + 1].rgbtGreen * 2) + (image[h + 1][w + 1].rgbtGreen * 1);
                int GxR = (image[h][w + 1].rgbtRed * 2) + (image[h + 1][w + 1].rgbtRed * 1);
                
                int GyB = (image[h + 1][w].rgbtBlue * 2) + (image[h + 1][w + 1].rgbtBlue * 1);
                int GyG = (image[h + 1][w].rgbtGreen * 2) + (image[h + 1][w + 1].rgbtGreen * 1);
                int GyR = (image[h + 1][w].rgbtRed * 2) + (image[h + 1][w + 1].rgbtRed * 1);
                
                int GxyB = round(sqrt(GxB*GxB + GyB*GyB)) > 255 ? 255 : round(sqrt(GxB*GxB + GyB*GyB)) < 0 ? 0 : round(sqrt(GxB*GxB + GyB*GyB));
                int GxyG = round(sqrt(GxG*GxG + GyG*GyG)) > 255 ? 255 : round(sqrt(GxG*GxG + GyG*GyG)) < 0 ? 0 : round(sqrt(GxG*GxG + GyG*GyG));
                int GxyR = round(sqrt(GxR*GxR + GyR*GyR)) > 255 ? 255 : round(sqrt(GxR*GxR + GyR*GyR)) < 0 ? 0 : round(sqrt(GxR*GxR + GyR*GyR));
                
                temp[h][w].rgbtBlue = GxyB;
                temp[h][w].rgbtGreen = GxyG;
                temp[h][w].rgbtRed = GxyR;
            }
                
            else if (h == 0 && w == width - 1) //check for position 
            {
                int GxB = (image[h][w - 1].rgbtBlue * -2) + (image[h + 1][w - 1].rgbtBlue * -1);
                int GxG = (image[h][w - 1].rgbtGreen * -2) + (image[h + 1][w - 1].rgbtGreen * -1);
                int GxR = (image[h][w - 1].rgbtRed * -2) + (image[h + 1][w - 1].rgbtRed * -1);
                
                int GyB = (image[h + 1][w - 1].rgbtBlue * 1) + (image[h + 1][w].rgbtBlue * 2);
                int GyG = (image[h + 1][w - 1].rgbtGreen * 1) + (image[h + 1][w].rgbtGreen * 2);
                int GyR = (image[h + 1][w - 1].rgbtRed * 1) + (image[h + 1][w].rgbtRed * 2);
                
                int GxyB = round(sqrt(GxB*GxB + GyB*GyB)) > 255 ? 255 : round(sqrt(GxB*GxB + GyB*GyB)) < 0 ? 0 : round(sqrt(GxB*GxB + GyB*GyB));
                int GxyG = round(sqrt(GxG*GxG + GyG*GyG)) > 255 ? 255 : round(sqrt(GxG*GxG + GyG*GyG)) < 0 ? 0 : round(sqrt(GxG*GxG + GyG*GyG));
                int GxyR = round(sqrt(GxR*GxR + GyR*GyR)) > 255 ? 255 : round(sqrt(GxR*GxR + GyR*GyR)) < 0 ? 0 : round(sqrt(GxR*GxR + GyR*GyR));
                
                temp[h][w].rgbtBlue = GxyB;
                temp[h][w].rgbtGreen = GxyG;
                temp[h][w].rgbtRed = GxyR;
            }
                
            else if (h == height - 1 && w == 0) //check for position 
            {
                int GxB = (image[h - 1][w + 1].rgbtBlue * 1) + (image[h][w + 1].rgbtBlue * 2);
                int GxG = (image[h - 1][w + 1].rgbtGreen * 1) + (image[h][w + 1].rgbtGreen * 2);
                int GxR = (image[h - 1][w + 1].rgbtRed * 1)  + (image[h][w + 1].rgbtRed * 2);
                
                int GyB = (image[h - 1][w].rgbtBlue * -2) + (image[h - 1][w + 1].rgbtBlue * -1);
                int GyG = (image[h - 1][w].rgbtGreen * -2) + (image[h - 1][w + 1].rgbtGreen * -1);
                int GyR = (image[h - 1][w].rgbtRed * -2) + (image[h - 1][w + 1].rgbtRed * -1);
                
                int GxyB = round(sqrt(GxB*GxB + GyB*GyB)) > 255 ? 255 : round(sqrt(GxB*GxB + GyB*GyB)) < 0 ? 0 : round(sqrt(GxB*GxB + GyB*GyB));
                int GxyG = round(sqrt(GxG*GxG + GyG*GyG)) > 255 ? 255 : round(sqrt(GxG*GxG + GyG*GyG)) < 0 ? 0 : round(sqrt(GxG*GxG + GyG*GyG));
                int GxyR = round(sqrt(GxR*GxR + GyR*GyR)) > 255 ? 255 : round(sqrt(GxR*GxR + GyR*GyR)) < 0 ? 0 : round(sqrt(GxR*GxR + GyR*GyR));
                
                temp[h][w].rgbtBlue = GxyB;
                temp[h][w].rgbtGreen = GxyG;
                temp[h][w].rgbtRed = GxyR;
            }
                
            else if (h == height - 1 && w == width - 1) //check for position 
            {
                int GxB = (image[h - 1][w - 1].rgbtBlue * -1) + (image[h][w - 1].rgbtBlue * -2);
                int GxG = (image[h - 1][w - 1].rgbtGreen * -1) + (image[h][w - 1].rgbtGreen * -2);
                int GxR = (image[h - 1][w - 1].rgbtRed * -1) + (image[h][w - 1].rgbtRed * -2);
                
                int GyB = (image[h - 1][w - 1].rgbtBlue * -1) + (image[h - 1][w].rgbtBlue * -2);
                int GyG = (image[h - 1][w - 1].rgbtGreen * -1) + (image[h - 1][w].rgbtGreen * -2);
                int GyR = (image[h - 1][w - 1].rgbtRed * -1) + (image[h - 1][w].rgbtRed * -2);
                
                int GxyB = round(sqrt(GxB*GxB + GyB*GyB)) > 255 ? 255 : round(sqrt(GxB*GxB + GyB*GyB)) < 0 ? 0 : round(sqrt(GxB*GxB + GyB*GyB));
                int GxyG = round(sqrt(GxG*GxG + GyG*GyG)) > 255 ? 255 : round(sqrt(GxG*GxG + GyG*GyG)) < 0 ? 0 : round(sqrt(GxG*GxG + GyG*GyG));
                int GxyR = round(sqrt(GxR*GxR + GyR*GyR)) > 255 ? 255 : round(sqrt(GxR*GxR + GyR*GyR)) < 0 ? 0 : round(sqrt(GxR*GxR + GyR*GyR));
                
                temp[h][w].rgbtBlue = GxyB;
                temp[h][w].rgbtGreen = GxyG;
                temp[h][w].rgbtRed = GxyR;
            }
                
            else if (h == 0) //check for position 
            {
                int GxB = (image[h][w - 1].rgbtBlue * -2) + (image[h][w + 1].rgbtBlue * 2) + (image[h + 1][w - 1].rgbtBlue * -1) + (image[h + 1][w + 1].rgbtRed * 1);
                int GxG = (image[h][w - 1].rgbtRed * -2) + (image[h][w + 1].rgbtRed * 2) + (image[h + 1][w - 1].rgbtRed * -1) + (image[h + 1][w + 1].rgbtRed * 1);
                int GxR = (image[h][w - 1].rgbtRed * -2) + (image[h][w + 1].rgbtRed * 2) + (image[h + 1][w - 1].rgbtRed * -1) + (image[h + 1][w + 1].rgbtRed * 1);
                
                int GyB = (image[h + 1][w - 1].rgbtRed * 1) + (image[h + 1][w].rgbtRed * 2) + (image[h + 1][w + 1].rgbtRed * 1);
                int GyG = (image[h + 1][w - 1].rgbtRed * 1) + (image[h + 1][w].rgbtRed * 2) + (image[h + 1][w + 1].rgbtRed * 1);
                int GyR = (image[h + 1][w - 1].rgbtRed * 1) + (image[h + 1][w].rgbtRed * 2) + (image[h + 1][w + 1].rgbtRed * 1);
                
                int GxyB = round(sqrt(GxB*GxB + GyB*GyB)) > 255 ? 255 : round(sqrt(GxB*GxB + GyB*GyB)) < 0 ? 0 : round(sqrt(GxB*GxB + GyB*GyB));
                int GxyG = round(sqrt(GxG*GxG + GyG*GyG)) > 255 ? 255 : round(sqrt(GxG*GxG + GyG*GyG)) < 0 ? 0 : round(sqrt(GxG*GxG + GyG*GyG));
                int GxyR = round(sqrt(GxR*GxR + GyR*GyR)) > 255 ? 255 : round(sqrt(GxR*GxR + GyR*GyR)) < 0 ? 0 : round(sqrt(GxR*GxR + GyR*GyR));
                
                temp[h][w].rgbtBlue = GxyB;
                temp[h][w].rgbtGreen = GxyG;
                temp[h][w].rgbtRed = GxyR;
            }
                
            else if (h == height - 1) //check for position 
            {
                int GxB = (image[h - 1][w - 1].rgbtBlue * -1) + (image[h - 1][w + 1].rgbtBlue * 1) + (image[h][w - 1].rgbtBlue * -2) + (image[h][w + 1].rgbtBlue * 2);
                int GxG = (image[h - 1][w - 1].rgbtGreen * -1) + (image[h - 1][w + 1].rgbtGreen * 1) + (image[h][w - 1].rgbtGreen * -2) + (image[h][w + 1].rgbtGreen * 2);
                int GxR = (image[h - 1][w - 1].rgbtRed * -1) + (image[h - 1][w + 1].rgbtRed * 1) + (image[h][w - 1].rgbtRed * -2) + (image[h][w + 1].rgbtRed * 2);
                
                int GyB = (image[h - 1][w - 1].rgbtBlue * -1) + (image[h - 1][w].rgbtBlue * -2) + (image[h - 1][w + 1].rgbtBlue * -1);
                int GyG = (image[h - 1][w - 1].rgbtGreen * -1) + (image[h - 1][w].rgbtGreen * -2) + (image[h - 1][w + 1].rgbtGreen * -1);
                int GyR = (image[h - 1][w - 1].rgbtRed * -1) + (image[h - 1][w].rgbtRed * -2) + (image[h - 1][w + 1].rgbtRed * -1);
                
                int GxyB = round(sqrt(GxB*GxB + GyB*GyB)) > 255 ? 255 : round(sqrt(GxB*GxB + GyB*GyB)) < 0 ? 0 : round(sqrt(GxB*GxB + GyB*GyB));
                int GxyG = round(sqrt(GxG*GxG + GyG*GyG)) > 255 ? 255 : round(sqrt(GxG*GxG + GyG*GyG)) < 0 ? 0 : round(sqrt(GxG*GxG + GyG*GyG));
                int GxyR = round(sqrt(GxR*GxR + GyR*GyR)) > 255 ? 255 : round(sqrt(GxR*GxR + GyR*GyR)) < 0 ? 0 : round(sqrt(GxR*GxR + GyR*GyR));
                
                temp[h][w].rgbtBlue = GxyB;
                temp[h][w].rgbtGreen = GxyG;
                temp[h][w].rgbtRed = GxyR;
            }
                
            else if (w == 0) //check for position 
            {
                int GxB = (image[h - 1][w + 1].rgbtBlue * 1) + (image[h][w + 1].rgbtBlue * 2) + (image[h + 1][w + 1].rgbtBlue * 1);
                int GxG = (image[h - 1][w + 1].rgbtGreen * 1) + (image[h][w + 1].rgbtGreen * 2) + (image[h + 1][w + 1].rgbtGreen * 1);
                int GxR = (image[h - 1][w + 1].rgbtRed * 1) + (image[h][w + 1].rgbtRed * 2) + (image[h + 1][w + 1].rgbtRed * 1);
                
                int GyB = (image[h - 1][w].rgbtBlue * -2) + (image[h - 1][w + 1].rgbtBlue * -1) + (image[h + 1][w].rgbtBlue * 2) + (image[h + 1][w + 1].rgbtBlue * 1);
                int GyG = (image[h - 1][w].rgbtGreen * -2) + (image[h - 1][w + 1].rgbtGreen * -1) + (image[h + 1][w].rgbtGreen * 2) + (image[h + 1][w + 1].rgbtGreen * 1);
                int GyR = (image[h - 1][w].rgbtRed * -2) + (image[h - 1][w + 1].rgbtRed * -1) + (image[h + 1][w].rgbtRed * 2) + (image[h + 1][w + 1].rgbtRed * 1);
                
                int GxyB = round(sqrt(GxB*GxB + GyB*GyB)) > 255 ? 255 : round(sqrt(GxB*GxB + GyB*GyB)) < 0 ? 0 : round(sqrt(GxB*GxB + GyB*GyB));
                int GxyG = round(sqrt(GxG*GxG + GyG*GyG)) > 255 ? 255 : round(sqrt(GxG*GxG + GyG*GyG)) < 0 ? 0 : round(sqrt(GxG*GxG + GyG*GyG));
                int GxyR = round(sqrt(GxR*GxR + GyR*GyR)) > 255 ? 255 : round(sqrt(GxR*GxR + GyR*GyR)) < 0 ? 0 : round(sqrt(GxR*GxR + GyR*GyR));
                
                temp[h][w].rgbtBlue = GxyB;
                temp[h][w].rgbtGreen = GxyG;
                temp[h][w].rgbtRed = GxyR;
            }
                
            else if (w == width - 1) //check for position 
            {
                int GxB = (image[h - 1][w - 1].rgbtBlue * -1) + (image[h][w - 1].rgbtBlue * -2) + (image[h + 1][w - 1].rgbtBlue * -1);
                int GxG = (image[h - 1][w - 1].rgbtGreen * -1) + (image[h][w - 1].rgbtGreen * -2) + (image[h + 1][w - 1].rgbtGreen * -1);
                int GxR = (image[h - 1][w - 1].rgbtRed * -1) + (image[h][w - 1].rgbtRed * -2) + (image[h + 1][w - 1].rgbtRed * -1);
                
                int GyB = (image[h - 1][w - 1].rgbtBlue * -1) + (image[h - 1][w].rgbtBlue * -2) + (image[h + 1][w - 1].rgbtBlue * 1) + (image[h + 1][w].rgbtBlue * 2);
                int GyG = (image[h - 1][w - 1].rgbtGreen * -1) + (image[h - 1][w].rgbtGreen * -2) + (image[h + 1][w - 1].rgbtGreen * 1) + (image[h + 1][w].rgbtGreen * 2);
                int GyR = (image[h - 1][w - 1].rgbtRed * -1) + (image[h - 1][w].rgbtRed * -2) + (image[h + 1][w - 1].rgbtRed * 1) + (image[h + 1][w].rgbtRed * 2);
                
                int GxyB = round(sqrt(GxB*GxB + GyB*GyB)) > 255 ? 255 : round(sqrt(GxB*GxB + GyB*GyB)) < 0 ? 0 : round(sqrt(GxB*GxB + GyB*GyB));
                int GxyG = round(sqrt(GxG*GxG + GyG*GyG)) > 255 ? 255 : round(sqrt(GxG*GxG + GyG*GyG)) < 0 ? 0 : round(sqrt(GxG*GxG + GyG*GyG));
                int GxyR = round(sqrt(GxR*GxR + GyR*GyR)) > 255 ? 255 : round(sqrt(GxR*GxR + GyR*GyR)) < 0 ? 0 : round(sqrt(GxR*GxR + GyR*GyR));
                
                temp[h][w].rgbtBlue = GxyB;
                temp[h][w].rgbtGreen = GxyG;
                temp[h][w].rgbtRed = GxyR;
            }
                    
            else 
            {
                int GxB = (image[h - 1][w - 1].rgbtBlue * -1) + (image[h - 1][w + 1].rgbtBlue * 1) + (image[h][w - 1].rgbtBlue * -2) + (image[h][w + 1].rgbtBlue * 2)
                + (image[h + 1][w - 1].rgbtBlue * -1) + (image[h + 1][w + 1].rgbtBlue * 1);
                
                int GxG = (image[h - 1][w - 1].rgbtGreen * -1) + (image[h - 1][w + 1].rgbtGreen * 1) + (image[h][w - 1].rgbtGreen * -2) + (image[h][w + 1].rgbtGreen * 2)
                + (image[h + 1][w - 1].rgbtGreen * -1) + (image[h + 1][w + 1].rgbtGreen * 1);
                
                int GxR = (image[h - 1][w - 1].rgbtRed * -1) + (image[h - 1][w + 1].rgbtRed * 1) + (image[h][w - 1].rgbtRed * -2) + (image[h][w + 1].rgbtRed * 2)
                + (image[h + 1][w - 1].rgbtRed * -1) + (image[h + 1][w + 1].rgbtRed * 1);
                
                int GyB = (image[h - 1][w - 1].rgbtBlue * -1) + (image[h - 1][w].rgbtBlue * -2) + (image[h - 1][w + 1].rgbtBlue * -1)
                + (image[h + 1][w - 1].rgbtBlue * 1) + (image[h + 1][w].rgbtBlue * 2) + (image[h + 1][w + 1].rgbtBlue * 1);
                
                int GyG = (image[h - 1][w - 1].rgbtGreen * -1) + (image[h - 1][w].rgbtGreen * -2) + (image[h - 1][w + 1].rgbtGreen * -1)
                + (image[h + 1][w - 1].rgbtGreen * 1) + (image[h + 1][w].rgbtGreen * 2) + (image[h + 1][w + 1].rgbtGreen * 1);
                
                int GyR = (image[h - 1][w - 1].rgbtRed * -1) + (image[h - 1][w].rgbtRed * -2) + (image[h - 1][w + 1].rgbtRed * -1)
                + (image[h + 1][w - 1].rgbtRed * 1) + (image[h + 1][w].rgbtRed * 2) + (image[h + 1][w + 1].rgbtRed * 1);
                
                int GxyB = round(sqrt(GxB*GxB + GyB*GyB)) > 255 ? 255 : round(sqrt(GxB*GxB + GyB*GyB)) < 0 ? 0 : round(sqrt(GxB*GxB + GyB*GyB));
                int GxyG = round(sqrt(GxG*GxG + GyG*GyG)) > 255 ? 255 : round(sqrt(GxG*GxG + GyG*GyG)) < 0 ? 0 : round(sqrt(GxG*GxG + GyG*GyG));
                int GxyR = round(sqrt(GxR*GxR + GyR*GyR)) > 255 ? 255 : round(sqrt(GxR*GxR + GyR*GyR)) < 0 ? 0 : round(sqrt(GxR*GxR + GyR*GyR));
                
                temp[h][w].rgbtBlue = GxyB;
                temp[h][w].rgbtGreen = GxyG;
                temp[h][w].rgbtRed = GxyR;
            }
        }
    }
    
    for (int h = 0; h < height; h++)
    {
        for (int w = 0; w < width; w++)
        {
            image[h][w] = temp[h][w];
        }
    }
    
    return;
}

【问题讨论】:

  • 欢迎来到 SO。 Check50 通常会为测试结果提供更多详细信息。您可以展开结果并查看有关使用的测试数据的一些信息。然后你可以使用相同的测试数据并检查你的程序做了什么。
  • TL;DR 将大小缩小到 3X3,并添加一些 printf()。
  • 感谢您提供帮助的 cmets 伙计们,我使用 check50 结果中的详细信息追踪了错误

标签: c cs50


【解决方案1】:

我只是有一个错字,我将 Blue Green 和 Red 的所有值都设置为 Red 值,一旦我将每种颜色更改为它的值,我的代码就通过了 check50。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-25
    • 1970-01-01
    • 2021-02-01
    • 2020-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-10
    相关资源
    最近更新 更多