#c #filter #rounding #cs50 #grayscale
#c #Фильтр #округление #cs50 #оттенки серого
Вопрос:
Я работаю над фильтром cs50 pset4 (менее удобным) в оттенках серого, и мне приходится округлять числа, если они десятичные. Но по какой-то причине check50 выводит это:
:( grayscale correctly filters single pixel without whole number average
expected "28 28 28n", not "27 27 27n"
:( grayscale correctly filters more complex 3x3 image
expected "20 20 20n50 5...", not "20 20 20n50 5..."
:( grayscale correctly filters 4x4 image
expected "20 20 20n50 5...", not "20 20 20n50 5..."
Это просто грустные лица. Это мой код:
void grayscale(int height, int width, RGBTRIPLE image[height][width])
{
for(int j = 0; j < width; j )
for(int i = 0; i < height; i ) {
double av = (image[i][j].rgbtGreen image[i][j].rgbtRed image[i][j].rgbtBlue)/3;
int average = round(av);
image[i][j].rgbtGreen = average;
image[i][j].rgbtRed = average;
image[i][j].rgbtBlue = average;
}
}
Функция округления находится здесь:
int average = round(av);
Но, согласно check50, это не работает. Пожалуйста, помогите мне разобраться. Единственное подозрение, которое у меня есть, это то, что я новичок в c, поэтому у меня может быть проблема в моей функции. Я пытался погуглить это, но ничего не имеет смысла. У меня есть
#include<math.h>
часть в моем коде, прямо над частью, которую я вам показываю.
Спасибо, запутался в коде 🙂
Ответ №1:
Кажется, что результат разделения
(image[i][j].rgbtGreen image[i][j].rgbtRed image[i][j].rgbtBlue)/3
усекается, поскольку все члены являются целыми числами.
Попробуйте
(image[i][j].rgbtGreen image[i][j].rgbtRed image[i][j].rgbtBlue)/3.0
(Используйте 3.0
вместо 3
Ответ №2:
Вместо использования двойного типа данных используйте float
float av = (image[i][j].rgbtGreen image[i][j].rgbtRed image[i][j].rgbtBlue)/3.0
И используйте 3.0, потому что в некоторых случаях ваше значение может быть целым числом, поэтому оно не будет округляться до ближайшего целого числа