目录
前言
在牛客网刷题时碰到的一道题,基础语法篇中的BC8 牛牛的字符菱形,我相信在其它地方也有类似的题目,看到网上的代码基本上是:将其拆分成每一行的前面空格输出,后面字符输出,最后的空格不需要管。我在想能否将每一行看成一个数组,正好前后对称,利用指针去改变,因此写下这篇文章。
一、题目介绍
1.1 问题描述
牛牛尝试用键盘读入一个字符,然后在屏幕上显示一个用这个字符填充的对角线长5个字符,倾斜放置的菱形。(我在这将其改为任意输入一个字符,然后有n(奇数)行,使得适用性范围扩大)
1.2 输入描述
输入一个char类型字符(增加额外条件:输入任意的n,其中1<n<100,且n为奇数)。
1.3 输出描述
输出一个用这个字符填充的对角线长5(n)个字符,倾斜放置的菱形。
1.4 示例
输入:
# (修改为: # 5)
输出:
# (输出不变)
###
#####
###
#
二、基本思路
将菱形拆分为上下两个部分,上面为正三角形,下面为倒三角形,最中间的一行属于上半部分。
核心部分:将每一行看作一个拥有n个字符元素的数组,然后利用指针前后修改数组的元素,使其变为‘ ’(空格字符),利用for循环,将每一行的每一个元素打印出来。
三、 代码实现
3.1 基本框架
int main()
{
//菱形的字符输入
char ch = 0;
scanf("%c", &ch);
//菱形的行数输入
int n = 5; //题目给的5,这里如果想修改可以利用scanf输入
scanf("%d", &n);
int i = 0;
//上半部分,包括最中间一行
for(i = 0; i < n/2+1; i ++)
{
print(n,i,ch); //利用print(自己写的,不是printf)函数打印每一行
printf("\n"); //打印完一行就换行
}
//下半部分
for(i = 0; i < n / 2; i ++)
{
print(n,n / 2 - 1 - i,ch); //原理同上面的
if ( i != n / 2 -1) //这里是为了最后一行不换行
{
printf("\n");
}
}
return 0;
}
3.2 print函数的实现
void print(int n, int i, char ch) //这里的参数很重要,n表示一行有多少个元素,i让
//我们修改字符为空格的个数,ch为图形的字符
{
char arr[100] = { 0 }; //创建一个数组去存放每一行的元素,这里的个数给大
//点方便后于行数的更改
int j = 0;
for (j = 0; j < n; j++) //这里需要多少个就将多少个元素修改为字符ch
{
arr[j] = ch; //相当于手动 部分初始化数组 为包含ch的字符数组
}
//观察图形可知每行都是对称的,那就利用指针找出首和尾的地址,让它们向中间变化
char* left = arr;
char* right = arr + n - 1;
//修改数组元素
for (j = 0; j < n / 2 - i; j++)
{
*(left + j) = *(right - j) = ' ';
}
//打印数组(打印的范围小于数组的范围(n),无需全部打印(100))
for (j = 0; j < n; j++)
{
printf("%c", arr[j]);
}
}
四、 效果展示
vscode中
输入 # 和 9 的结果
输入 * 和 11 的结果
五、 完整代码
#include <stdio.h>
void print(int n, int i, char ch)
{
int j = 0;
char arr[100] = { 0 };
for (j = 0; j < n; j++)
{
arr[j] = ch; //初始化数组
}
char* left = arr;
char* right = arr + n - 1;
for (j = 0; j < n / 2 - i; j++)
{
*(left + j) = *(right - j) = ' ';
}
for (j = 0; j < n; j++)
{
printf("%c", arr[j]);
}
}
int main()
{
char ch = 0;
scanf("%c", &ch);
int n = 5;
scanf("%d", &n);
int i = 0;
//上半部分
for(i = 0; i < n/2+1; i ++)
{
print(n,i,ch);
printf("\n");
}
//下半部分
for(i = 0; i < n / 2; i ++)
{
print(n,n / 2 - 1 - i,ch);
if (i != n/2 -1)
{
printf("\n");
}
}
return 0;
}