首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ASCII-艺术金字塔

ASCII-艺术金字塔
EN

Code Review用户
提问于 2019-12-09 22:36:09
回答 3查看 773关注 0票数 3

我一边学C一边独自听一堂课。在我学习编码和听讲座的时候,我听说写代码应该是简明的和可维护的。但我不知道自己是否做得很好,所以我觉得需要反馈。但是很难找到能给我们反馈的人,我不知道该去哪里问。

我是韩国人,我用的是翻译,因为我不擅长英语。如果上下文有一点奇怪,请理解

例如,如何使这段代码更简单、更直观?

输出

*

程序:

代码语言:javascript
运行
复制
#include<stdio.h>

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

    for (i = 1; i <= n; ++i)
    {
        for (j = 1; j <= i; ++j)
            putchar('*');

        putchar('\n');
    }

    for (i = n - 1; i >= 1; --i)
    {
        for (j = 1; j <= i; ++j)
            putchar('*');

        putchar('\n');
    }


    return 0;
}

如果是的话,写会更好吗?有一个变量名而不是n更好吗?

EN

回答 3

Code Review用户

发布于 2019-12-10 04:03:42

对我来说,打印一条长度相当长的星星线的功能似乎是个好主意。

代码语言:javascript
运行
复制
#include <stdio.h>

static void print_star_line(int count)
{
    int i;

    for (i = 1; i <= count; ++i)
        putchar('*');

    putchar('\n');
}

int main(void)
{
    int i;
    int n = 5;

    for (i = 1; i <= n; ++i)
        print_star_line(i);

    for (i = n - 1; i >= 1; --i)
        print_star_line(i);

    return 0;
}

请注意,在main中发生的事情一目了然,并且共享逻辑位于一个地方,因此可以单独检查它。另外,如果您想要更改行的打印方式,则只需进行一次更改。

除此之外,在C89中,这几乎是它得到的好!你的代码很干净。9~10成熟。

票数 5
EN

Code Review用户

发布于 2019-12-10 15:04:21

除了Ry-的注释之外,保持循环琐碎也是很好的做法。在这个上下文中微不足道意味着for(int i=0; i<n; i++)。这是for循环最纯粹和最易读的形式。

  • 只要有可能,总是从0迭代到n是实际的做法,因为数字以0开头,C中的数组使用零索引。
  • 对于循环或具有复杂条件/迭代表达式的循环,下行计数很难读取。
  • (高级)向上计数,简单循环比其他循环更有可能是数据缓存友好的.

我们可以将复杂性移到for循环体中(我修改了Ry-发布的代码):

代码语言:javascript
运行
复制
#include <stdio.h>

static void print_star_line (int count)
{
  for (int i=0; i<count; i++)
  {
    putchar('*');
  }
  putchar('\n');
}

int main (void)
{
  int n = 5;

  for(int i=0; i<n; i++)
  {
    print_star_line(i+1);
  }
  for(int i=0; i<n; i++)
  {
    print_star_line(n-i-2);
  }

  return 0;
}

现在,所有循环都是琐碎的,易于阅读,复杂性在于传递给函数的表达式。

请注意,这段代码还将int声明放在for循环中,这就是用标准C编写代码的方式。

如果你的学习来源是无可救药的过时,有人可能会教你使用30年,20年过时的"C90“标准,这是不允许的。如果是这样的话,你需要一个新的学习来源。

变量名n很好,但很模糊。在计算某事时使用n_N后缀是常见的样式。

类似地,i代表迭代器,是循环迭代器的行业标准名称。j没有任何意义,它只是字母i后面的字母,所以在嵌套循环时通常使用它。

票数 0
EN

Code Review用户

发布于 2019-12-09 22:45:29

printf已经能够使用格式化程序%.*s打印各种长度的恒星。在这段代码中,我避免了多个嵌套循环,只需计算每一行需要多少颗星,并将该数字传递给printf

我认为这段代码比嵌套的for-循环更短、更简单。

我加了一个“去”操作符只是为了好玩:

例:while (n --> 0),它被读为“N变为零”

代码语言:javascript
运行
复制
#include <stdio.h>

int main(void) {
    int n = 8;
    char stars[n];
    memset(stars, '*',n);

    int i = n;
    while(i --> 0)
        printf("%.*s\n", n-i, stars);

    while(n --> 0)
        printf("%.*s\n", n, stars);

    return 0;
}

输出

代码语言:javascript
运行
复制
Success #stdin #stdout 0s 4460KB
*
**
***
****
*****
******
*******
********
*******
******
*****
****
***
**
*
票数 -3
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/233732

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档