我一边学C一边独自听一堂课。在我学习编码和听讲座的时候,我听说写代码应该是简明的和可维护的。但我不知道自己是否做得很好,所以我觉得需要反馈。但是很难找到能给我们反馈的人,我不知道该去哪里问。
我是韩国人,我用的是翻译,因为我不擅长英语。如果上下文有一点奇怪,请理解
例如,如何使这段代码更简单、更直观?
输出
*
程序:
#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更好吗?
发布于 2019-12-10 04:03:42
对我来说,打印一条长度相当长的星星线的功能似乎是个好主意。
#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成熟。
发布于 2019-12-10 15:04:21
除了Ry-的注释之外,保持循环琐碎也是很好的做法。在这个上下文中微不足道意味着for(int i=0; i<n; i++)。这是for循环最纯粹和最易读的形式。
我们可以将复杂性移到for循环体中(我修改了Ry-发布的代码):
#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后面的字母,所以在嵌套循环时通常使用它。
发布于 2019-12-09 22:45:29
printf已经能够使用格式化程序%.*s打印各种长度的恒星。在这段代码中,我避免了多个嵌套循环,只需计算每一行需要多少颗星,并将该数字传递给printf。
我认为这段代码比嵌套的for-循环更短、更简单。
我加了一个“去”操作符只是为了好玩:
例:while (n --> 0),它被读为“N变为零”
#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;
}Success #stdin #stdout 0s 4460KB
*
**
***
****
*****
******
*******
********
*******
******
*****
****
***
**
*https://codereview.stackexchange.com/questions/233732
复制相似问题