|
发表于 2021-4-14 10:59:21
|
显示全部楼层
本楼为最佳答案
本帖最后由 yuxijian2020 于 2021-4-14 11:40 编辑
- #include<stdio.h>
- #include<stdlib.h>
- #include <string.h>
- //通过字母数量,给数组赋值
- void FixArray(char* line, int len, int num)
- {
- //第一个字符总是‘A’
- char beginChar = 'A';
- //开始下标是 (总长度 - 字母数量)的一半 -- 保持所有字母居中
- int start = (len - num) / 2;
- //循环赋值
- for (int pos = start; pos < len - start; pos++)
- {
- line[pos] = beginChar;
- if (pos < len / 2) //如果当前位置小于数组数组长度的一半,则字母递增
- beginChar++;
- else //如果当前位置大于等于数组长度的一半,则以后的字母递减
- beginChar--;
- }
- }
- //打印字符数组
- void Show(char* arr, int width)
- {
- for (int w = 0; w < width; w++)
- {
- printf_s("%c", arr[w]);
- }
- printf_s("\n");
- }
- //输入菱形上半部分的高
- void Draw(int h)
- {
- //最大宽度
- int maxWidth = 2 * h - 1;
- int maxHeight = 2 * h - 1;
- //申请空间 -- 一次申请重复利用
- char* line = (char*)malloc(maxWidth * sizeof(char));
- if (!line)
- {
- printf_s("空间申请失败,绘制出错!\n");
- return;
- }
-
- for (int i = 0; i < maxHeight; i++)
- {
- //每次循环开始给数组所有元素初始化为 ' '(一个空格)
- memset(line, 0x20, maxWidth);
-
- if (i < maxHeight / 2) //如果 当前行数小于总行数的一半
- {
- //当前行要赋值的字母数量为 当前行数的2倍 + 1
- int num = 2 * i + 1;
- FixArray(line, maxWidth, num);
- }
- else
- {
- //当前行要赋值的字母数量为 (总行数 - 当前行(计算距离数组结束差几行) - 1(相当于转换为距离数组开始有几行))
- //maxHeight - i - 1 就相当于 计算镜像行的行数 然后再以上面的方法计算字母数量
- int num = 2 * (maxHeight - i - 1) + 1;
- FixArray(line, maxWidth, num);
- }
- Show(line, maxWidth);
- }
- free(line);
- }
- int main(void)
- {
- int h = 0;
- printf_s("请输入菱形上半部分的高度以确定整个菱形:");
- scanf_s("%d", &h);
- Draw(h);
- return 0;
- }
复制代码
|
|