思路
先试着打印一个长宽相等的星形矩形:
两个for
循环,内层for
循环输出SIZE个字符(即SIZE列),
输出完成SIZE个字符后跳出内层循环,执行printf("\n");
换行,
然后外层for
循环控制行数加一,进行下一行的输出,
直到输出SIZESIZE大小的矩形。
宏定义 #define SIZE 5
用于方便后期更改尺寸。(程序中遇到 SIZE
的地方都会用其后面的数值代替,本例为5
)。
#include <stdio.h>
#define SIZE 5 //更改尺寸
int main(void)
{
for (int j = 1; j <= SIZE; j++)//j控制行
{
for (int i = 1; i <= SIZE; i++)//i控制列
{
printf("*");
}
printf("\n");//打印完一行后换行
}
return 0;
}
要想输出任意的字符,定义一个char
类型的变量即可。
那菱形咋办?
就是在一个区间输出字符,另一个区间输出空格即可:
int start = SIZE / 2 + 1;
int end = SIZE / 2 + 1;
下半部分?
定义一个bool
类型的变量reserve
用于判断是在上半部分还是下半部分,初始值为false
,
bool reserve = false;
如果上半部分输出完毕则将reserve
的值设置为true
,
咋判断是否进入下半部分?当区间右端点到达尺寸值时:
if(end == SIZE)
reserve = true;
*如果在上半部分:
start
的值要递减
才能输出为斜边,同理end
要递增
。
而在下半部分:
start
的值要递增
才能输出为斜边,同理end
要递减
。*
if(end == SIZE)
reserve = true;
if(reserve)
{
start++;
end--;
}
else
{
start--;
end++;
}
理解了上面的东东就可以开写了:
最终源码
#include <stdio.h>
#include <stdbool.h>
#define SIZE 7 //更改对角线尺寸
int main(void)
{
char ch;
int start = SIZE / 2 + 1;
int end = SIZE / 2 + 1;
bool reserve = false;
scanf("%c", &ch);
for (int j = 1; j <= SIZE; j++)
{
for (int i = 1; i <= SIZE; i++)
{
if (i >= start && i <= end)
printf("%c", ch);
else
printf(" ");
}
printf("\n");
if(end == SIZE)
reserve = true;
if(reserve)
{
start++;
end--;
}
else
{
start--;
end++;
}
}
return 0;
}