You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何补全C语言交替字符菱形图案代码,实现指定规则输出?

C语言交替字符菱形图案的补全方案及思路建议

问题描述

编写C语言程序,根据用户输入的边长(取值1-20,以@符号数量统计)打印交替字符菱形图案,字符按@、.、o的序列循环交替。目前代码仅能生成菱形左半部分,需补全右侧,并掌握此类编程问题的解决思路。

需求示例

Length 1 @:

@

Length 2 @'s:

 @
@.@
 @

Length 5 @'s:

    @
   @.@
  @.o.@
 @.o.o.@
@.o.@.o.@
 @.o.o.@
  @.o.@
   @.@
    @

Length 6 @'s:

     @
    @.@
   @.o.@
  @.o.o.@
 @.o.@.o.@
@.o.@.@.o.@
 @.o.@.o.@
  @.o.o.@
   @.o.@
    @.@
     @

现有代码

#include <stdio.h>

int main(){

  int length;
  int counter;

  printf("¿Length of the rhombus?: ");
  scanf("%d", &length);

  if(length > 20 || length < 1){
    printf("The length must be at least 1 and maximum 20.");
    return 1;
  }

  else if(length == 1){
    printf("@");
    return 0;
  }

  else{

    /*-- Create as many lines as "length" value --*/
    for(int i = 1; i <= length; i++){

      /* Upper left triangle */
      /* -------------------------------------------------------- */
      /* Create enough blank spaces before the character sequence */
      for(int j = 1; j <= length-i; j++){
        printf(" ");
      }

      /* Create the sequence "@.o.@" */
      counter = 0;
      for(int j = 1; j <= i; j++){

        if(counter % 4 == 0){
          printf("@");
          }

        else if(counter % 4 == 1){
          printf(".");
          }

        else if(counter % 4 == 2){
          printf("o");
          }

        else{
          printf(".");
          }

        counter++;
      }

      /* -------------------------------------------------------- */

      /* Upper right triangle*/
      /* -------------------------------------------------------- */

        //I don't know what to do here

      /* -------------------------------------------------------- */

    printf("\n");
    }

  }
}

当前输出与期望输出

输入length=10时的当前输出

@
        @.
       @.o
      @.o.
     @.o.@
    @.o.@.
   @.o.@.o
  @.o.@.o.
 @.o.@.o.@
@.o.@.o.@.

期望输出

@
        @.@
       @.o.@
      @.o.o.@
     @.o.@.o.@
    @.o.@.@.o.@
   @.o.@.o.@.o.@
  @.o.@.o.o.@.o.@
 @.o.@.o.@.o.@.o.@
@.o.@.o.@.@.o.@.o.@

解决方案

补全右侧字符逻辑

观察图案规律可知:每一行的右侧字符是左半字符(除第一个字符外)的逆序,字符仍遵循@.o.的循环规则。在现有代码的Upper right triangle区域添加如下代码:

/* Upper right triangle*/
/* -------------------------------------------------------- */
// 打印右侧的i-1个字符,从counter=i-2开始倒序
if(i > 1){
    counter = i - 2;
    for(int j = 1; j <= i-1; j++){
        if(counter % 4 == 0){
            printf("@");
        }
        else if(counter % 4 == 1){
            printf(".");
        }
        else if(counter % 4 == 2){
            printf("o");
        }
        else{
            printf(".");
        }
        counter--;
    }
}
/* -------------------------------------------------------- */

添加下半部分菱形打印

现有代码仅实现了上半部分,需添加下半部分的循环(从length-1到1),逻辑与上半部分完全一致:

/*-- 打印菱形下半部分 --*/
    for(int i = length-1; i >= 1; i--){

      /* 左侧空格 */
      for(int j = 1; j <= length-i; j++){
        printf(" ");
      }

      /* 左半部分字符 */
      counter = 0;
      for(int j = 1; j <= i; j++){
        if(counter % 4 == 0){
          printf("@");
        }
        else if(counter % 4 == 1){
          printf(".");
        }
        else if(counter % 4 == 2){
          printf("o");
        }
        else{
          printf(".");
        }
        counter++;
      }

      /* 右半部分字符 */
      if(i > 1){
          counter = i - 2;
          for(int j = 1; j <= i-1; j++){
              if(counter % 4 == 0){
                  printf("@");
              }
              else if(counter % 4 == 1){
                  printf(".");
              }
              else if(counter % 4 == 2){
                  printf("o");
              }
              else{
                  printf(".");
              }
              counter--;
          }
      }

      printf("\n");
    }

完整代码

#include <stdio.h>

int main(){

  int length;
  int counter;

  printf("¿Length of the rhombus?: ");
  scanf("%d", &length);

  if(length > 20 || length < 1){
    printf("The length must be at least 1 and maximum 20.");
    return 1;
  }

  else if(length == 1){
    printf("@");
    return 0;
  }

  else{

    /*-- 打印菱形上半部分 --*/
    for(int i = 1; i <= length; i++){

      /* 左侧空格 */
      for(int j = 1; j <= length-i; j++){
        printf(" ");
      }

      /* 左半部分字符 */
      counter = 0;
      for(int j = 1; j <= i; j++){
        if(counter % 4 == 0){
          printf("@");
        }
        else if(counter % 4 == 1){
          printf(".");
        }
        else if(counter % 4 == 2){
          printf("o");
        }
        else{
          printf(".");
        }
        counter++;
      }

      /* 右半部分字符 */
      if(i > 1){
          counter = i - 2;
          for(int j = 1; j <= i-1; j++){
              if(counter % 4 == 0){
                  printf("@");
              }
              else if(counter % 4 == 1){
                  printf(".");
              }
              else if(counter % 4 == 2){
                  printf("o");
              }
              else{
                  printf(".");
              }
              counter--;
          }
      }

      printf("\n");
    }

    /*-- 打印菱形下半部分 --*/
    for(int i = length-1; i >= 1; i--){

      /* 左侧空格 */
      for(int j = 1; j <= length-i; j++){
        printf(" ");
      }

      /* 左半部分字符 */
      counter = 0;
      for(int j = 1; j <= i; j++){
        if(counter % 4 == 0){
          printf("@");
        }
        else if(counter % 4 == 1){
          printf(".");
        }
        else if(counter % 4 == 2){
          printf("o");
        }
        else{
          printf(".");
        }
        counter++;
      }

      /* 右半部分字符 */
      if(i > 1){
          counter = i - 2;
          for(int j = 1; j <= i-1; j++){
              if(counter % 4 == 0){
                  printf("@");
              }
              else if(counter % 4 == 1){
                  printf(".");
              }
              else if(counter % 4 == 2){
                  printf("o");
              }
              else{
                  printf(".");
              }
              counter--;
          }
      }

      printf("\n");
    }

  }
  return 0;
}

编程思路建议

  1. 拆解问题:将复杂的菱形图案拆分为上半部分、下半部分,每一行再拆分为左侧空格、左半字符、右半字符三个独立模块,逐个实现后再整合。
  2. 归纳规律:仔细观察图案的对称性、字符循环规则,比如本例中右侧字符是左半字符的逆序(除首字符),字符按@.o.循环,找到规律后代码逻辑会清晰很多。
  3. 先局部后整体:先实现单行的正确打印,再扩展到所有行;先完成上半部分,再复制逻辑修改为下半部分,避免一次性处理所有逻辑导致混乱。
  4. 调试技巧:从小测试用例(如length=2、3)开始调试,对比实际输出与期望输出的差异,必要时打印中间变量(如counter的值)定位问题;也可以将重复的字符打印逻辑封装为函数,减少冗余代码,降低出错概率。

内容的提问来源于stack exchange,提问作者Kai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 16:52:03