微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

这不是制作意大利国旗 .ppm 文件的方法吗?

如何解决这不是制作意大利国旗 .ppm 文件的方法吗?

这是我创建意大利国旗 .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/3266(假设整数除法),而 266*3798,而不是您想要的 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_whitestart_red 的一些附加注释。在进行整数乘法和除法时,运算符应用程序的正确顺序很重要。 (2 * 800)/3 等于 533。这与 2 * (800/3) 不同,后者等于 532。所以第一个表达式更接近于 533.3333.... 的实际值。

技术上我们不需要括号因为运算符优先级,但它 为读者增加清晰度始终是一个好主意。

这种将事物分成大致相同大小的组的方法还有其他用途。然后我们通常无法改变我们拥有的“事物”的数量。

作为给读者的额外奖励问题:假设整数除法,800*(2/3) 的值是多少。提示:不是 533.3333....

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。