【问题标题】:Printing triangle in C在 C 中打印三角形
【发布时间】:2017-03-25 05:55:35
【问题描述】:

我是 C 新手,我有这个程序,我试图根据它的高度打印一个三角形:

 /\
/__\

所以如果高度为2,那么'/'、'\'和'_'有2个。

所以我写了这些代码:

#include <stdio.h>
int main(void)
{
    int noOfRows; 
    printf("Enter height: ");
    scanf("%d", &noOfRows);

    int counter, rowNumber;
    for (rowNumber = 0 ; rowNumber < noOfRows; rowNumber++)
    {
        // For each row, insert numberOfRows - N spaces before printing
        for (counter = 0 ; counter < noOfRows- rowNumber ; counter++)
            printf(" ");

        // For each row, print N times the character
            printf("/");

        for (counter = 0; counter < noOfRows; counter++)
            printf("\\");

        printf(" ");

        printf("\n");
    }

    return 0;
}

但是当我输入 3 作为高度时,它会给我这样的输出。

  /\\\
 /\\\
/\\\

我想在每个新行出现时获得更多空间的“\”,但我不确定应该如何修改 for 循环以正确形成三角形。请让我知道我是否应该添加更多问题以使其更清楚。

我对代码进行了更改,目前有这个:

#include <stdio.h>
int main(void)
{
    int noOfRows; 
    printf("Enter height: ");
    scanf("%d", &noOfRows);

    int counter, rowNumber;
    for (rowNumber = 0 ; rowNumber < noOfRows; rowNumber++)
    {
        // For each row, insert numberOfRows - N spaces before printing
        for (counter = 0 ; counter < noOfRows- rowNumber ; counter++)
            printf(" ");

        // For each row, print N times the character
            printf("/");

        for (counter = 0 ; counter < rowNumber ; counter++)
            if(rowNumber >= 1)  
                for(int j=0; j<counter +1; j++)
                    printf(" ");

        if(rowNumber != 0)
            printf(" ");

            printf("\\");

        printf("\n");
    }

    return 0;
}

现在我当前的输出是这样的:

Height: 3
  /\
 /  \
/    \

Height: 5

    /\
   /  \
  /    \
 /       \
/           \

我在代码中做错了什么导致某些“\”走得更远?

【问题讨论】:

  • 这是你的大学作业吗?我建议你多一些耐心,尝试自己解决这个问题,如果你在没有任何人帮助的情况下解决它会给你带来更多的乐趣。否则肯定有人会用循环和打印语句来回答这个问题。
  • 为什么要循环打印\\ ?每行只有一个。您需要一个循环来打印/\\ 之间的空格,类似于您用来打印/ 之前的空格的循环。
  • 最后一行你需要打印_而不是空格。
  • @Barmar 谢谢你,我采纳了你的建议并编辑了代码,请参阅上面我现在发布的代码编辑版本。

标签: c triangle-count


【解决方案1】:

使用 if else 只能使用两个循环来打印此模式。在 if else 中,您可以对空格、反斜杠、正斜杠和下划线使用多个条件。

1 #include<stdio.h>
  2 
  3 int main()
  4 {
  5         int n;
  6         int i,j,k;
  7         printf("Enter hight of trangle\n");
  8         scanf("%d",&n);
  9         for(i=0;i<n;i++,printf("\n"))
 10         {
 11                 for(j=-n;j<=n;j++)
 12                 {
 13                         if(j<0) k=-j;
 14                         else    k=j;
 15 
 16                         if(j==0);
 17                         else if((j<0)&&(k==(i+1)))
 18                                 printf("/");
 19                         else if((j>0)&&(k==(i+1)))
 20                                 printf("\\");
 21                         else if((i+1)==n)
 22                                 printf("_");
 23                         else
 24                                 printf(" ");
 25                 }
 26         }
 27 }

【讨论】:

  • 谢谢,这组代码在获得单个三角形时起作用:)
【解决方案2】:

@Barmar 的想法是正确的,你不再需要 if(rowNumber != 0) printf(" ");

完整代码:

#include <stdio.h>
int main(void)
{
    int noOfRows; 
    printf("Enter height: ");
    scanf("%d", &noOfRows);
    int counter, rowNumber;
    for (rowNumber = 0 ; rowNumber < noOfRows; rowNumber++)    {

        for (counter = 0 ; counter < noOfRows- rowNumber ; counter++)
            printf(" ");        
            printf("/");
        for (counter = 0 ; counter < rowNumber ; counter++)
            if(rowNumber >= 1)  
                for (counter = 0; counter < rowNumber*2; counter++) {
        if (rowNumber == noOfRows-1) {
        printf("_");
        } else {
        printf(" ");
        }
        }
        printf("\\");
        printf("\n");
    }

}

【讨论】:

    【解决方案3】:

    您不需要两个嵌套循环来打印/\\ 之间的空格。它应该只打印rowNumber*2 空格。

    for (counter = 0; counter < rowNumber*2; counter++) {
        printf(" ");
    }
    

    您不需要测试if (rowNumber &gt;= 1),因为当它是0 时,循环会立即结束。

    但是,您确实需要检查最后一行,因为您应该打印 _ 而不是空格。所以应该是:

    for (counter = 0; counter < rowNumber*2; counter++) {
        if (rowNumber == noOfRows-1) {
            printf("_");
        } else {
            printf(" ");
        }
    }
    

    【讨论】:

    • 谢谢,我对代码进行了更改,现在我可以打印单个三角形了!!! :)
    【解决方案4】:

    或者,您可以将重复打印的字符抽象为:

    // print_char(n,c) prints c n-times.
    void print_char(int n, char c) {
      for (int i = 0; i < n; ++i) {
        printf("%c", c);
      }
    }
    

    这样您在构建三角形时只需跟踪一个 for 循环:

    void print_triangle(int height) {
      for (int i = 1; i <= height; ++i) {
        print_char(height-i, ' ');               // print leading empty spaces
        printf("/");                             // print forward slash
        if (i == height) {                       // print middle dashes/spaces
          print_char((height-1)*2, '_');         //             <--|      |
        } else {                                 //                       |
          print_char((i-1)*2, ' ');              //             <---------|
        }
        printf("\\\n");                          // print backslash
      }
    }
    

    例如,

    int main(void) {
      int height;
      printf("Enter height: ");
      if (scanf("%d", &height) != 1) {
        // handle error if scanf fails
      }
      print_triangle(height);
      return 0;
    }
    

    然后,

    $ Enter height: 1
    /\
    $ Enter height: 5
        /\
       /  \
      /    \
     /      \
    /________\
    

    【讨论】:

      猜你喜欢
      • 2020-10-03
      • 2020-10-06
      • 1970-01-01
      • 1970-01-01
      • 2021-12-19
      • 2014-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多