如何用C语言for循环控制输出字母组成的等腰三角形,如:输入D,输出: A ABA ABCBA ABCDCBA

如果是输入:D,输出:
D
CDC
BCDCB
ABCDCBA
又该怎么编写

#include <stdio.h>
#include <math.h>

int main() {
    char max = '\0';
    int i = 0, j = 0, m = 0;

    puts("请输入A~Z");
    scanf("%c", &max);
    if (max >= 'A' && max <= 'Z') {
        m = max - 'A';
        /*  è¾“å…¥A时 m = 0,输入B时 m = 1 â€¦â€¦  */
        puts("-------------------------------------------");
        for (i = 0; i <= m; i++) {
            for (j = 0; j < m - i; j++) {
                printf(" ");
            }
            for (j = 0; j <= i; j++) {
                printf("%c", 'A' + j);
            }
            for (j = i - 1; j >= 0; j--) {
                printf("%c", 'A' + j);
            }
            printf("\n");
        }
        puts("-------------------------------------------");
        for (i = 0; i <= m; i++) {
            for (j = 0; j <= m + i; j++) {
                if (j < m - i) {
                    printf(" ");
                } else {
                    printf("%c", (char)(max - fabs(m - j)));
                }
            }
            printf("\n");
        }
        puts("-------------------------------------------");
    } else {
        puts("输入内容有误");
    }
    return 0;
}

纯数学计算而已


-------------------------

哦,我这写的是你正文中的,标题那个等我写给你

追问

能不能给我讲讲解题思路,还有,能不能不用math.h,我们还没学到用math

追答

math.h 可以不用,主要用到的是绝对值计算。不用的话,可以用if来判断,你看懂下面思路的话,可以自己试着把第二部分的fabs改成if判断好了。
思路是这样的,两道题目是不同的
第一个题目分析一下,是有三个部分的,假设m已经输入,把它转换成以下数字:A:0 B:1 C:2 D:3 这样每个数字变成字母就是 'A' + 3 = 'D' 这样的关系,所以题目就变成了,输入一个m=3,输出
---0
--010
-01210
0123210
这样的结果
首先对每一行进行循环,就是 i 循环,每个循环分为3部分:
1) 输出 m - i 个空格;
2) 正向输出[0 .. i]的值,包括0和i(还记得刚才说的0是A吧)
3) 反向输出[i-1 .. 0]的值,包括i-1和0
然后一行输出完成了,printf("\n") 换行就行了

第二个题目和第一个题目看起来相似,其实是不同的,不同点在于:其实每一行都是同样的字母排列,都是0123210,只不过按照三角形的位置,有的点显示,有的点不显示。那么只需要先找到生成这个数列0123210的方法,然后再用条件控制他们是显示数字还是显示空格就行了
生成数列的方法很简单,设 j 是从0到2*m的自变量,数列值就是 v = m - | m - j |。这样当jm 的时候 v=2*m - j
控制是否输出的判断就更简单了,当 j m+i 时不显示,输出空格,否则就显示数列值

追问

思路很清晰啊,我去试着写写,再遇到问题还向你请教。
谢谢你码这么多字,这个问题只有你回答我,十分感谢。

温馨提示:答案为网友推荐,仅供参考