PSET4 CS50 反映分配;代码未通过测试
PSET4 CS50 Reflect Assignment; Code is failing the tests
尽管我的照片没问题,但我找不到解决这两个错误的方法。如果有人能赐教,将不胜感激。
这是我得到的报告:
:( reflect correctly filters 1x2 image
expected "0 0 255\n255 0...", not "255 0 0\n0 0 2..."
:) reflect correctly filters 1x3 image
:) reflect correctly filters image that is its own mirror image
:) reflect correctly filters 3x3 image
:( reflect correctly filters 4x4 image
expected "100 110 120\n7...", not "100 110 120\n4..."
这是我的代码:
RGBTRIPLE tmp[width];
for (int i = 0; i < height; i++)
{
for (int j = 0; j <= width / 2; j++)
{
tmp[j] = image[i][j];
image[i][j] = image[i][width - 1 - j];
image[i][width - 1 - j] = tmp[j];
}
}
return;
解决办法;
for 循环中的条件需要稍作调整;
j < width / 2
了解原因;
对于 1x2 图像,一行有 2 个像素。宽度为 2。只需 1 次迭代就足够了。在旧场景中,第 1 次迭代在 j=0 时执行。但是随后也执行了第二次迭代,因为 j=1 仍在条件内(等于 width/2)。第二次迭代是不必要的。你只是反射了两次,导致图像没有变化。
对于 4x4 图片,类似的问题。当 j = 0 和 j = 1 时,您应该用 2 次迭代完成反射。但是,当 j = 2(j 仍然等于且小于 width/2)时,执行第 3 次迭代并用第 1 个像素替换第 3 个像素这是错误的。因为你已经换过一次了。
我遇到了同样的问题,原因如下。
我假设您显示的代码仅适用于图像的左侧(即将图像左侧复制到临时图像并将图像右侧复制到左侧)。这部分是正确的,除了 earik87 指出的 '<=' 与 '<' 问题。
您没有显示图像右侧的代码,它将临时图像的左侧复制到右侧。我使用了类似的 for 循环并假设您也这样做了。我将j的初始值设置为width / 2,问题如下:
通过使用 width / 2,您将一个 int 除以一个 int,结果将始终是一个 int。
例如,如果width=5,width/2将return2,表示图像右侧从第2列开始。但第2列是图像的中间线。我真正想做的是从第 3 列开始。所以我使用了
width / 2 + 1
但这给了我另一个问题,当宽度是偶数时,比如说 width = 4,我将从第 3 列开始,而我应该从第 2 列开始。
无论奇数还是偶数,为了使这项工作正常进行,我们可以使用 round() 和一个浮动分母:
round(width / 2.0)
width / 2.0 将 return 一个浮点数,而 round() 会将这个浮点数四舍五入到最接近的整数。
尽管我的照片没问题,但我找不到解决这两个错误的方法。如果有人能赐教,将不胜感激。
这是我得到的报告:
:( reflect correctly filters 1x2 image
expected "0 0 255\n255 0...", not "255 0 0\n0 0 2..."
:) reflect correctly filters 1x3 image
:) reflect correctly filters image that is its own mirror image
:) reflect correctly filters 3x3 image
:( reflect correctly filters 4x4 image
expected "100 110 120\n7...", not "100 110 120\n4..."
这是我的代码:
RGBTRIPLE tmp[width];
for (int i = 0; i < height; i++)
{
for (int j = 0; j <= width / 2; j++)
{
tmp[j] = image[i][j];
image[i][j] = image[i][width - 1 - j];
image[i][width - 1 - j] = tmp[j];
}
}
return;
解决办法;
for 循环中的条件需要稍作调整;
j < width / 2
了解原因;
对于 1x2 图像,一行有 2 个像素。宽度为 2。只需 1 次迭代就足够了。在旧场景中,第 1 次迭代在 j=0 时执行。但是随后也执行了第二次迭代,因为 j=1 仍在条件内(等于 width/2)。第二次迭代是不必要的。你只是反射了两次,导致图像没有变化。
对于 4x4 图片,类似的问题。当 j = 0 和 j = 1 时,您应该用 2 次迭代完成反射。但是,当 j = 2(j 仍然等于且小于 width/2)时,执行第 3 次迭代并用第 1 个像素替换第 3 个像素这是错误的。因为你已经换过一次了。
我遇到了同样的问题,原因如下。
我假设您显示的代码仅适用于图像的左侧(即将图像左侧复制到临时图像并将图像右侧复制到左侧)。这部分是正确的,除了 earik87 指出的 '<=' 与 '<' 问题。
您没有显示图像右侧的代码,它将临时图像的左侧复制到右侧。我使用了类似的 for 循环并假设您也这样做了。我将j的初始值设置为width / 2,问题如下:
通过使用 width / 2,您将一个 int 除以一个 int,结果将始终是一个 int。
例如,如果width=5,width/2将return2,表示图像右侧从第2列开始。但第2列是图像的中间线。我真正想做的是从第 3 列开始。所以我使用了
width / 2 + 1
但这给了我另一个问题,当宽度是偶数时,比如说 width = 4,我将从第 3 列开始,而我应该从第 2 列开始。
无论奇数还是偶数,为了使这项工作正常进行,我们可以使用 round() 和一个浮动分母:
round(width / 2.0)
width / 2.0 将 return 一个浮点数,而 round() 会将这个浮点数四舍五入到最接近的整数。