如何解决这不是制作意大利国旗 .ppm 文件的方法吗?
#include <stdio.h>
int main() {
int width = 800,height = 600,i,j;
printf("P6\n");
printf("%d %d\n",width,height);
printf("255\n");
for (i = 0; i < height; i++) {
for (j = 0; j < width/3; j++) {
printf("%c%c%c",146,70);
}
for (j = 0; j < width/3; j++) {
printf("%c%c%c",255,255);
}
for (j = 0; j < width/3; j++) {
printf("%c%c%c",206,43,55);
}
}
return 0;
}
解决方法
您的问题是您的 width = 800
不能被 3 整除。因此您没有用外循环的一次迭代来填充整行。
for (j = 0; j < width/3; j++)
此行在 j
大于宽度的三分之一时停止。让我们考虑一个带有 width=4
的简单示例。 width/3
介于 1 和 2 之间。因此,您将一个像素着色为绿色,一个像素为白色,一个像素为红色。第四个呢?必须在下一次迭代中填充。
例如设置您的 width = 900
,您应该会得到预期的输出。
@lucidbrot 给出的答案是正确的,但我想详细说明一下。
800/3
是 266
(假设整数除法),而 266*3
是 798
,而不是您想要的 800
的宽度。当然,您可以选择可被 3
整除的宽度来解决@lucidbrot 建议的问题。
有时您无法自由更改宽度,但幸运的是还有另一种解决方案。不要将颜色分成相等的部分。最简单的方法是计算每个色带开始的位置,相对于扫描线的开始,然后在下一个开始时停止使用一种颜色进行着色:
#include <stdio.h>
int main() {
int width = 800,height = 600;
printf("P6\n");
printf("%d %d\n",width,height);
printf("255\n");
int start_green = 0;
int start_white = (1*width)/3;
int start_red = (2*width)/3
for (int i = 0; i < height; i++) {
/* Green Band */
for (int j = start_green; j < start_white; j++) {
printf("%c%c%c",146,70);
}
/* White Band */
for (int j = start_white; j < start_red; j++) {
printf("%c%c%c",255,255);
}
/* Red Band */
for (int j = start_red; j < width; j++) {
printf("%c%c%c",206,43,55);
}
}
return 0;
}
对start_white
和start_red
的一些附加注释。在进行整数乘法和除法时,运算符应用程序的正确顺序很重要。 (2 * 800)/3
等于 533
。这与 2 * (800/3)
不同,后者等于 532
。所以第一个表达式更接近于 533.3333....
的实际值。
技术上我们不需要括号因为运算符优先级,但它 为读者增加清晰度始终是一个好主意。
这种将事物分成大致相同大小的组的方法还有其他用途。然后我们通常无法改变我们拥有的“事物”的数量。
作为给读者的额外奖励问题:假设整数除法,800*(2/3)
的值是多少。提示:不是 533.3333....
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。