阿九。 发表于 2021-4-14 09:57:04

C语言利用循环语句画图问题

利用循环语句,输出下图。
请指点!

yuxijian2020 发表于 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 = 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);
    }
    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;
}

yuxijian2020 发表于 2021-4-14 11:01:03

哦 我这个是只针对总高度为奇数,总高度为偶数的话差不太多
页: [1]
查看完整版本: C语言利用循环语句画图问题