【发布时间】:2021-12-15 20:31:07
【问题描述】:
我真的被困在这里我的代码工作正常,但它无法通过 CS50 检查。我知道我的代码不是那么漂亮,并且有很多 if 条件和重复,但它的工作原理如下所示。我是编程新手,如果有人对我有建议,我将不胜感激。
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 结果中的详细信息追踪了错误