本帖最后由 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;
}
|