如何在三角形中排列星号

时间:2017-06-26 16:51:06

标签: c for-loop

我需要能够使用星号打印直角三角形,让用户输入n这样的行并仅使用for循环(这是大学练习)。

enter number of rows: 5.
*****
 ****
  ***
   **
    *

到目前为止,这是我能够做到的,并输出了这个

5 rows:
*
**
***
****
*****

代码:

int main(void)
{
    int n, i, j;

    printf("Ingrese la cantidad de filas:\n");
    scanf("%d", &n);

    for (i = 0; i < n; i++)
    {
        for (j = 0; j < i+1; j++)
        {
            printf("*");
        }
        printf("\n");
    }
    return 0;
}

5 个答案:

答案 0 :(得分:1)

应该这样做:

#include <stdio.h>
int main(void)
{
    int n, i, j;
    printf("Ingrese la cantidad de filas:\n");
    scanf("%d", &n);
    for (i = n; i > 0; i--){
        for (j = n - i; j > 0; j--){
            printf(" "); //print the blank spaces before the stars
        }
        for(j = i; j>0; j--){
            printf("*"); //print the stars
        }
        printf("\n"); //next line
    }
    return 0;
}

例如:输入= 5

输出:

*****
 ****
  ***
   **
    *

答案 1 :(得分:1)

如果您仔细研究printf()的(POSIX)规范并做一些准备工作,您会发现只需拨打一次printf()即可打印每一行。下面的代码不使用特定于POSIX的功能,但引用的文档是POSIX规范,它是标准C规范的超集。

#include <stdio.h>
#include <string.h>

int main(void)
{
    int n;
    printf("Enter number of stars: ");
    fflush(stdout);
    if (scanf("%d", &n) == 1 && n > 0 && n < 1000)
    {
        putchar('\n');
        char stars[n];
        char space[n];
        memset(stars, '*', n);
        memset(space, ' ', n);
        for (int i = 0; i < n; i++)
            printf("%.*s%.*s\n", i, space, n-i, stars);
    }
    return 0;
}

%.*s表示法从字符串前的int参数中读取printf(),并使用它来确定要打印的最大长度。代码使用两个VLA(可变长度数组)变量来保存星形和空格(我选择保留对称而不是通过注意代码可以使用比星星少一个空间来优化),这些变量用memset()设置。因为代码限制了使用的长度,所以数组不是字符串(没有空终止)并不重要。使用:

是可行的
int space[n+1];
memset(space, ' ', n);
space[n] = '\0';

(类似于stars)创建以null结尾的字符串,但在此上下文中并不重要。但是,知道自己在做什么至关重要;将它们制成字符串更安全。

putchar('\n');的调用可确保星号从新行开始,即使使用here string调用程序./program <<< '10'来提供输入,而不是每次都输入。< / p>

示例输出:

Enter number of stars: 10

**********
 *********
  ********
   *******
    ******
     *****
      ****
       ***
        **
         *

这是来自标准输入不是来自此字符串的运行。这是来自我使用过这里的字符串的运行:

Enter number of stars: 
**********
 *********
  ********
   *******
    ******
     *****
      ****
       ***
        **
         *

答案 2 :(得分:0)

使用"*"填充可变长度数组的答案的另一个变体是将单个VLA用作字符串,方法是将 nul-byte 添加为最后一个附加字符。结束。这将允许简单的指针算法在printf中使用简化的单个字段宽度说明符来处理空格和星星,例如

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main (int argc, char **argv) {

    int n = argc > 1 ? atoi (argv[1]) : 5;
    char stars[n+1];  /* declare stars to hold an additional character */

    memset (stars, '*', n);
    stars[n] = 0;     /* nul-terminate at index n */

    for (int i = 0; i < n; i++)
        printf ("%*s\n", n, stars + i);

    return 0;
}

(当然,您应该在代码中验证n > 0

上面的代码将要在右三角形中打印的星号数作为第一个参数,允许您指定要在命令行上打印的星数(如果没有参数,则使用默认值5给出)。

示例使用/输出

$ ./bin/triangle 10
**********
 *********
  ********
   *******
    ******
     *****
      ****
       ***
        **
         *

如果您的编译器不支持C99 VLA扩展,那么您可以动态分配,或坚持使用嵌套循环。

答案 3 :(得分:0)

使用printf()精度说明符的单个循环:

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int n, chk;
    chk = scanf("%d", &n);
    if ((chk != 1) || (n < 1) || (n > 32)) {
        fprintf(stderr, "Invalid n.\n");
        exit(EXIT_FAILURE);
    }
    for (int i = n; i > 0; i--) printf("%*.*s%*.*s\n", n - i, n - i, " ", i, i, "************************");
    return 0;
}

答案 4 :(得分:-1)

关闭,只需更改一个条件即可使用。

int main(void)
{
    int n, i, j;

    printf("Ingrese la cantidad de filas:\n");
    scanf("%d", &n);

    for (i = n; i >= 0; i--)
    {
        // i is the number of stars to print
        for (j = 0; j < i; j++)
        {
            printf("*");
        }
        printf("\n");
    }
    return 0;
}