循环后编程打印

问题描述 投票:5回答:2

我正在尝试制作六边形瓷砖。我有形状,但我在打印时做错了。

这是我的代码和我尝试的内容:

    #include <stdio.h>

  int main() {

    int i, x;

    for (i = 1; i <= 2; i++) {

      for (x = 1; x <= 2; x++) {
        printf("  %d,%d\t  \n", i, x);
        printf(" / \t \\\n");
        printf("| \t  |\n");
        printf("| \t  |\n");
        printf(" \\ \t /\n");
      }

      printf("\n\n");

    }
  }

我需要它们水平而不是垂直。

我知道我做错了什么,就是在六角形“m,n”下方打印六角形“m,n + 1”,而不是在右侧。 但我不知道如何解决它。谢谢!

固定!

更新:结果现在是

#include <stdio.h>
#define COLS 4
#define ROWS 3

void subrow(char* pcWhat, char* pcEndWhat)
{  int col;
   for (col = 0; col < COLS; col++) {
     printf("%s", pcWhat);
   }
   printf("%s\n", pcEndWhat);
}
void indexedSubrow(char* pcWhat, char* pcEndWhat, int row, int offset)
{  int col;
   for (col = 0; col < COLS; col++) {
         printf(pcWhat, row, col+offset);
       }

   printf("%s\n", pcEndWhat);
}

int main(void) {
    int i, x;


    subrow("  ___     ","");


    for (i = 0; i < ROWS; i++) {
           if(i==0){
               subrow(" /   \\    ","  ");
      indexedSubrow("/ %d,%d \\___"," ", i, 0);
             subrow("\\     /   ","\\");
      indexedSubrow(" \\___/ %d,%d"," \\", i, 1);  


      }

   //else if(i==ROWS-1){}


      else{
      subrow(" /   \\    "," /");
      indexedSubrow("/ %d,%d \\___","/", i, 0);
      subrow("\\     /   ","\\");
      indexedSubrow(" \\___/ %d,%d"," \\", i, 1);
           }
    }
    return 0;
}

我需要的更多解释和艺术:

The last subrow is:
\     /   \     /   \     /   \     /   \
 \___/ 2,1 \___/ 2,3 \___/ 2,5 \___/ 2,7 \

Which should be
\     /   \     /   \     /   \     /   \
 \___/ 2,1 \___/ 2,3 \___/ 2,5 \___/ 2,7 \
     \     /   \     /   \     /   \     /
      \___/     \___/     \___/     \___/

So the missing part is:
     \     /   \     /   \     /   \     /
      \___/     \___/     \___/     \___/

另外我很好奇如何添加数字(“假设所有六边形网格中的第二个数字为1”)示例:

现有艺术:

  ___       ___       ___       ___     
 /   \     /   \     /   \     /   \      
/ 0,0 \___/ 0,1 \___/ 0,2 \___/ 0,3 \___ 
\     /   \     /   \     /   \     /   \
 \___/ 0,1 \___/ 0,2 \___/ 0,3 \___/ 0,4 \
 /   \     /   \     /   \     /   \     /
/ 1,0 \___/ 1,1 \___/ 1,2 \___/ 1,3 \___/
\     /   \     /   \     /   \     /   \
 \___/ 1,1 \___/ 1,2 \___/ 1,3 \___/ 1,4 \
 /   \     /   \     /   \     /   \     /
/ 2,0 \___/ 2,1 \___/ 2,2 \___/ 2,3 \___/
\     /   \     /   \     /   \     /   \
 \___/ 2,1 \___/ 2,2 \___/ 2,3 \___/ 2,4 \

期待:(总体上作为最终结果)

  ___       ___       ___       ___     
 /   \     /   \     /   \     /   \      
/ 0,0 \___/ 0,2 \___/ 0,4 \___/ 0,6 \___ 
\  1  /   \  1  /   \  1  /   \  1  /   \
 \___/ 0,1 \___/ 0,3 \___/ 0,5 \___/ 0,7 \
 /   \  1  /   \  1  /   \  1  /   \  1  /
/ 1,0 \___/ 1,2 \___/ 1,4 \___/ 1,6 \___/
\  1  /   \  1  /   \  1  /   \  1  /   \
 \___/ 1,1 \___/ 1,3 \___/ 1,5 \___/ 1,7 \
 /   \  1  /   \  1  /   \  1  /   \  1  /
/ 2,0 \___/ 2,2 \___/ 2,4 \___/ 2,6 \___/
\  1  /   \  1  /   \  1  /   \  1  /   \
 \___/ 2,1 \___/ 2,3 \___/ 2,5 \___/ 2,7 \
     \  1  /   \  1  /   \  1  /   \  1  /
      \___/     \___/     \___/     \___/

谢谢!

c
2个回答
6
投票

您想要分别创建两个(可能更多)六角形的行。 为此,您不能在一个十六进制形状的子行之后打印换行符。 而是打印所有(两个)十六进制形状的子行,使用适当的空格来对齐它们。为此,远离标签可能会有所帮助。 所以基本上你应该改变

  for (x = 1; x <= 2; x++) {
    printf("  %d,%d\t  \n", i, x);
    printf(" / \t \\\n");
    printf("| \t  |\n");
    printf("| \t  |\n");
    printf(" \\ \t /\n");
  }

    for (i = 1; i <= 2; i++) {

      for (x = 1; x <= 2; x++) {
        printf("  %d,%d  ", i, x);
      }
      printf("\n");
      for (x = 1; x <= 2; x++) {
        printf(" /   \\ ");
      }
      printf("\n");
      for (x = 1; x <= 2; x++) {
        printf("|     |");
      }
      printf("\n");
      for (x = 1; x <= 2; x++) {
        printf("|     |");
      }
      printf("\n");
      for (x = 1; x <= 2; x++) {
        printf(" \\   / ");
      }
      printf("\n");
    }

注1,我没有微调一行中六角形之间的空白。你必须自己做。所以下面的输出可能不会直接满足你,但应该看到核心问题已经解决。

注2,即使这样,你也会得到一个六角形的正方形网格。 如果您确实需要十六进制形状的十六进制网格,则必须在每隔一个十六进制行中更改|的位置。

输出:

  1,1    1,2
 /   \  /   \
|     ||     |
|     ||     |
 \   /  \   /
  2,1    2,2
 /   \  /   \
|     ||     |
|     ||     |
 \   /  \   /

根据Note2,我玩了四周,试图制作一个十六进制网格。我还尝试了你的像素图片的ascii艺术, 在第二个六角网格版本中, 根据Jonathan Lefflers的建议,将六角形转动90度。

#include <stdio.h>
#define COLS 4
#define ROWS 3

void subrow(char* pcWhat, char* pcEndWhat)
{  int col;
   for (col = 0; col < COLS; col++) {
     printf("%s", pcWhat);
   }
   printf("%s\n", pcEndWhat);
}
void indexedSubrow(char* pcWhat, char* pcEndWhat, int row, int offset)
{  int col;
   for (col = 0; col < COLS; col++) {
     printf(pcWhat, row, col*2+offset);
   }
   printf("%s\n", pcEndWhat);
}

int main(void) {
    int i, x;

    for (i = 1; i <= 2; i++) {

      for (x = 1; x <= 2; x++) {
        printf("  %d,%d  ", i, x);
      }
      printf("\n");
      for (x = 1; x <= 2; x++) {
        printf(" /   \\ ");
      }
      printf("\n");
      for (x = 1; x <= 2; x++) {
        printf("|     |");
      }
      printf("\n");
      for (x = 1; x <= 2; x++) {
        printf("|     |");
      }
      printf("\n");
      for (x = 1; x <= 2; x++) {
        printf(" \\   / ");
      }
      printf("\n");
    }
    printf("\n");
    printf("\n");
    printf("\n");

    for (i = 0; i < ROWS; i++) {
      subrow("   / \\  ","");
      subrow("  /   \\ ","");
      subrow(" /     \\","");
      subrow("|       ","|");
      subrow("|       ","|");
      subrow(" \\     /","");
      subrow("  \\   / ","");
      subrow("   \\ /  ","");
      subrow("    |   ","");
      subrow("    |   ","");
     }
      subrow("   / \\  ","");
      subrow("  /   \\ ","");
      subrow(" /     \\","");
      subrow("|       ","|");
      subrow("|       ","|");
      subrow(" \\     /","");
      subrow("  \\   / ","");
      subrow("   \\ /  ","");
      printf("\n");
      printf("\n");

    subrow("  ___     ","");
    for (i = 0; i < ROWS; i++) {
             subrow(" /   \\    "," /");
      indexedSubrow("/ %d,%d \\___","/", i, 0);
             subrow("\\     /   ","\\");
      indexedSubrow(" \\___/ %d,%d"," \\", i, 1);
    }
    return 0;
}

输出垂直十六进制:

   / \     / \     / \     / \
  /   \   /   \   /   \   /   \
 /     \ /     \ /     \ /     \
|       |       |       |       |
|       |       |       |       |
 \     / \     / \     / \     /
  \   /   \   /   \   /   \   /
   \ /     \ /     \ /     \ /
    |       |       |       |
    |       |       |       |
   / \     / \     / \     / \
  /   \   /   \   /   \   /   \
 /     \ /     \ /     \ /     \
|       |       |       |       |
|       |       |       |       |
 \     / \     / \     / \     /
  \   /   \   /   \   /   \   /
   \ /     \ /     \ /     \ /

输出水平十六进制:

  ___       ___       ___       ___
 /   \     /   \     /   \     /   \     /
/ 0,0 \___/ 0,2 \___/ 0,4 \___/ 0,6 \___/
\     /   \     /   \     /   \     /   \
 \___/ 0,1 \___/ 0,3 \___/ 0,5 \___/ 0,7 \
 /   \     /   \     /   \     /   \     /
/ 1,0 \___/ 1,2 \___/ 1,4 \___/ 1,6 \___/
\     /   \     /   \     /   \     /   \
 \___/ 1,1 \___/ 1,3 \___/ 1,5 \___/ 1,7 \
 /   \     /   \     /   \     /   \     /
/ 2,0 \___/ 2,2 \___/ 2,4 \___/ 2,6 \___/
\     /   \     /   \     /   \     /   \
 \___/ 2,1 \___/ 2,3 \___/ 2,5 \___/ 2,7 \

我相信你不会喜欢边缘上的部分和数字的位置, 但这是为了你自己调整你的口味。


0
投票

也许试试这个:

#include <stdio.h>

int main()
{

    int i, x;

    for (i = 1; i <= 2; i++) {

  for (x = 1; x <= 2; x++) {
    printf("    %d,%d    ", i, x);
  }
  printf("\n");
  for (x = 1; x <= 2; x++) {
    printf(" /      \\  ");
  }
  printf("\n");
  for (x = 1; x <= 2; x++) {
    printf("|        | ");
  }
  printf("\n");
  for (x = 1; x <= 2; x++) {
    printf("|        | ");
  }
  printf("\n");
  for (x = 1; x <= 2; x++) {
    printf(" \\      /  ");
  }
  printf("\n");

    }
}

结果将是:

    1,1        1,2    
 /      \   /      \  
|        | |        | 
|        | |        | 
 \      /   \      /  
    2,1        2,2    
 /      \   /      \  
|        | |        | 
|        | |        | 
 \      /   \      /  

我刚用C创建的简单程序:

   0,0      0,1      0,2
 /     \  /     \  /     \
|   3   ||       ||   1   |
 \     /  \     /  \     /
      1,0      1,1      1,2
    /     \  /     \  /     \
   |   1   ||   a   ||   2   |
    \     /  \     /  \     /
   2,0      2,1      2,2
 /     \  /     \  /     \
|   2   ||   1   ||       |
 \     /  \     /  \     /
© www.soinside.com 2019 - 2024. All rights reserved.