金字塔废话:我如何用代数方式排除 i=0 而不是使用 if 条件语句?

Pyramid Nonsense: How can I algebraically exclude i=0 instead of with an if conditional statement?

我制作了这个:

---------------------
*-------------------*
**-----------------**
***---------------***
****-------------****
*****-----------*****
******---------******
*******-------*******
********-----********
*********---*********
**********-**********
*********---*********
********-----********
*******-------*******
******---------******
*****-----------*****
****-------------****
***---------------***
**-----------------**
*-------------------*

但我对第一行不满意。我想排除它,所以我制作了一个新的排除 i=0 的方法,并在 for 循环周围使用 if-conditional 包装器。我想知道是否有人知道更清洁的解决方案。 (仅供参考,这是一个测试问题,我的解决方案非常草率。我正在为此练习更清洁的方法(愚蠢的金字塔编程)。

代码

看看评论// I want to exclude i=0 by using algebra in the for loop。有人有想法吗?

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

int main(void) {
  
  /* Pyramid Size */
  int n = 10;
  
  /* Take care of the top */
  for (int i=0;i<n;i++) {
    for (int j=0;j<i;j++)
      printf("*");
    if (i != 0) { // I want to exclude i=0 by using algebra in the for loop
      for (int j=0;j<=n*2-i*2;j++) {
        printf("-");
      }
    }
    for (int j=0;j<i;j++)
      printf("*");
    printf("\n");
  }
  
  /* Take care of the bottom */
  for (int i=n;i>0;i--) {
    for (int j=0;j<i;j++)
      printf("*");
    for (int j=0;j<=n*2-i*2;j++) {
      printf("-");
    }
    for (int j=0;j<i;j++)
      printf("*");
    printf("\n");
  }
}

你能从 1 开始 i 吗?

/* Take care of the top */
for (int i=1;i<n;i++) {

只需从 1 而不是 0 开始循环。或者,在 j.

的循环中将 < 替换为 <=

另请注意,在中间,您的星星并未完全相遇,它们之间仍有间隙。这是有意为之的行为吗?

我猜你想知道为什么这个"trick"只需要在开头,而你的现代艺术画的底部没有空行。这种 "miracles" 称为差一错误。您应该仔细检查您的代码是否存在边界情况,看它是否按设计执行。