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

