根据输入制作矩形

时间:2017-05-24 02:53:30

标签: c for-loop

输入

6 6 4

输出

######
#....#
#....#
#....#
#....#
######

输入

7 7 4

输出

#######
#.....#
#.....#
#.....#
#.....#
#.....#
#######

这是我到目前为止的代码。

 #include <stdio.h>

int main()
{
int width;
int breadth;

scanf("%d", &width);
scanf("%d", &breadth);
if (width == 1 && breadth == 1)
{printf ("#\n");}
else{
for(int i = 0; i<breadth; i++){
    for(int j = 0; j<width;j++)
    {
        {printf("#");}

    }
    printf("\n");}
}

return 0;}

有谁知道如何用“。”替换非边界区域?

ps:没有必要担心第三个输入,它不会影响矩形的形状,因为它只是用于下一个任务。

我猜我可能会改变我的for循环,但此时我的想法已经用尽了。

如果有人能帮我从上面输出相同的输出,我将不胜感激。

谢谢。

5 个答案:

答案 0 :(得分:2)

您希望用&#34;。&#34;替换非边界区域。为了达到这个目标,你需要一个满足你边界的条件。

#include <stdio.h>
int main()
{
int width;
int breadth;
scanf("%d", &width);
scanf("%d", &breadth);
if (width == 1 && breadth == 1)
{printf ("#\n");}
else{
for(int i = 0; i<breadth; i++){
for(int j = 0; j<width;j++)
{
if(i==0||j==0)    
   printf("#");
else if(i==(breadth-1)||j==(width-1))
   printf("#"); 
else
   printf(".");
}
printf("\n");}
}
return 0;
}

希望这有效。如果没有或有任何问题,请告诉我。

答案 1 :(得分:1)

你应该使用计数器。例如,一个计数器应该指向您要打印的行,另一个计数器指的是您要打印的列。

如果行计数器为0,则将所有行打印为&#39;#&#39;因为它将成为上边界线 (这会创建 - &gt; #######)

否则如果行计数器与形状的高度相同,那么它就是完成边界线 (#######)

否则,如果它> 0,则将第一个字符打印为&#39;#&#39;,然后打印&#39;。&#39;直到另一个计数器达到形状-1的宽度(例如在7 7中将是5(因为0也计数))然后另一个计数器达到#&#39;#&#39; (#.....#)

我认为,如果你需要进一步的帮助,这就足以让你自己完成它,只要问一下。

答案 2 :(得分:1)

这是工作代码。 你快到了。您需要条件语句来检查边界.. 请参阅检查边界的行

#include <stdio.h>

int main()
{
    int width;
    int breadth;

    scanf("%d %d", &width, &breadth);

    if (width == 1 && breadth == 1)
       printf ("#\n");
    else
    {
       for(int i = 0; i<breadth; i++)
       {
          for(int j = 0; j<width;j++)
              //Check for boundary.
              if( j == 0 || j == width - 1 || i == 0 || i == breadth - 1 )
                 printf("#");
              else 
                 printf(".");
          printf("\n");
       }
    }
   return 0;
}

答案 3 :(得分:1)

使用其他答案建议的条件是理想的方法,但如果不清楚,可以将打印分解为更小的循环

for (i=0; i<width; i++)          // prints the first line
    printf("#");                 //
printf("\n");                    // 

for (j=0; j<breadth-2; j++){     // prints middle breadth-2 lines
    printf("#");                 // prints the starting hash in middle lines
    for (i=0; i<width-2; i++)    // prints the '.'s  
        printf(".");
    printf("#\n");               // prints the last hash in middle lines 
}

for (i=0; i<width; i++)          // prints the last line  
    printf("#");                 // 
printf("\n");                    // 

虽然效率不高,但逻辑很容易理解。 如果需要进一步解释,请告诉我。

编辑:实际上在写完这个答案之后,我后来意识到这个代码实际上会比带分支的代码更快。由于我们自己拆分了迭代域,因此没有分支。这减少了分支预测失败的任何可能性,这在具有条件的解决方案中肯定会发生,因为条件对于小情况是正确的。当然,对于像6x6这样的小型迭代来说无关紧要,只是把想法放在那里。

答案 4 :(得分:1)

我已经通过gcc检查了它,它确实有效。请参阅代码中的注释:

   int main()
 {
   int width;
   int breadth;

   scanf("%d",&width);
   scanf("%d",&breadth);
   for(int i = 0; i < width; i++){
    for(int j = 0; j < breadth; j++ ){
       //first line and last line 
        if((i == 0)||i == (width - 1)){
        printf("#");
       //first column and last column
    }else if((j == 0)||(j == (breadth -1))){
        printf("#");
       //other case 
    }else{
        printf(".");
    }   
    }
    printf("\n");
 }
 return 0;
}