通过PPM在C中创建一个标志

时间:2013-11-15 05:57:53

标签: c loops if-statement printf ppm

我试图通过PPM在C中设计丹麦国旗,但我似乎无法使我的功能工作,我想找到一种更有效的方法将所有地方循环在一起,而不是全部如果/ else if语句。

 for(i=0; i < height; i++){
  for(x=0; x < width; x++){
    if(x <= width *.3 && i <= height * .3)
   {
     printf("%i", Pixel(255,51,51));
   }
    else if(x<= width * .1 && i <= height *.1)
   {
     printf("%i",Pixel(0,0,0));
   }
    else if(x <= width * .405 && i <= height *.3)
   {
     printf("%i", Pixel(255,51,51));
   }
    else if(x <= width * .4 && i <= height)
   {
     printf("%i", Pixel(0,0,0));
   }
    else
   {
     printf("%i", Pixel(255,51,51));
   }
 }
}

这是我的身体,我不知道如何循环而不是创建大量的if / else语句,其中一半的时间可能不会工作....

void Pixel(int red, int green, int blue){
  printf("%i %i %i", red, green, blue);
}

由于某种原因,我的功能将编译...任何人都可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

了解如何使用逻辑运算符&&||

无需为“左红色,中间白色,右红色”添加单独的检查,您可以假设您正在绘制红色并仅检查中间部分。

因为你想在[x> 0.3&amp;&amp; x <= 0.4] [y&gt; 0.3&amp;&amp; y&lt; = 0.4],您可以将其连接到单个if检查中。黑色边框也是如此 - 它只需要一次检查。

if (x < width * .1 || y < height * .1 || x > width * .9 || y > height * .9)
  ..black..
else
  if ((x > width *.3 && x <= width * .4) || (y > height *.3 && y <= height * .4))
    ..white..
  else
    ..red..

另外:您的Pixel例程已经打印RGB值,因此调用它时无需再次尝试。现在发生的是

printf("%i", Pixel(255,51,51));

首先打印R,G,B值,然后尝试打印调用Pixel函数的“结果”。此操作失败,因为Pixel未返回值。 您的编译器应该已经警告过您,所以请检查您的编译设置。 (但请注意,在该函数中添加return x语句并没有多大帮助,因为它不会计算您感兴趣的任何内容。)

最后,我强烈建议使用y代替i来迭代一个明确的Y值。我注意到我在解释中“本能地”使用了它。

修复了一些较小的问题后(​​例如,Pixel输出三个数字,用空格分隔,但如果你第二次调用它,第一个新数字将坚持前一个)我得到了这个:

flag of Denmark

采用PPM格式,我可以在Photoshop中正确打开(然后转换为PNG,因为SO不喜欢PPM图像)。