源码已在Github同步
一、代码描述
用字符分别画出:
1.矩形
2.空心矩形
3.实心等腰三角形
4.空心棱形
5.“回”字
其中,图形大小可任意指定,字符可任意指定,尽量模块化,可复用化,
二、效果展示
$ gcc draw.c
$ ./a.out
input a b c :
11 7 @
@@@@@@@@@@@
@@@@@@@@@@@
@@@@@@@@@@@
@@@@@@@@@@@
@@@@@@@@@@@
@@@@@@@@@@@
@@@@@@@@@@@
@@@@@@@@@@@
@ @
@ @
@ @
@ @
@ @
@@@@@@@@@@@
@
@@@
@@@@@
@@@@@@@
@@@@@@@@@
@@@@@@@@@@@
@
@ @
@ @
@ @
@ @
@ @
@ @
@ @
@ @
@ @
@
@@@@@@@@@@@
@ @
@ @
@ @@@@@ @
@ @ @ @
@ @ @ @
@ @ @ @
@ @@@@@ @
@ @
@ @
@@@@@@@@@@@
三、分析
1、高频代码封装
因为画图经常需要换行,所以此处对换行
操作进行封装
void n()
{
putchar('\n');
}
考虑到以上图形大多需要画直线,故将画直线
操作封装
void line(int count, char c)
{
while(count--){
putchar(c);
}
}
2、复用已封装代码实现新功能
1)矩形
通过分析可知,矩形
可分解成多条直线:
矩形的长(length)即为直线的长度
,即line(length,)
矩形的宽(width)即为直线的条数
,即调用width
次line()
函数
void rectangle(int length, int width,char c)
{
while(width--){
line(length,c);
n();
}
}
2)正方形
由“正方形是特殊的矩形”可知,正方形可调用矩形代码
实现
即正方形
== 长宽相等的矩形
void square(int length,char c)
{
rectangle(length,length,c);
}
3)三角形
经过简单计算及验证,在题设条件下:
- 三角形也可由长度递减的直线叠加而成,其中顶部直线长度为1(即一个顶点)
- 为保证顶点为1,底边长需为奇数,而矩形等没有要求,故在代码头部进行修正,保证整体代码的
健壮性
- 三角形的高为底边长的一半(向上取整),所以需要调用
(bottom+1)/2
次line(2*i+1,c)
函数 - 另外需要针对每行进行若干空格,数目依次递减,即调用
bottom/2-i
次line(1,' ')
函数
void triangle(int bottom,char c)
{
if(bottom%2==0)//对底边做一个修正,因为若底边长为偶数,则三角形不尖...
bottom+=1;
for(int i = 0;i < (bottom+1)/2; i++){//三角形高
for(int j = 0; j < bottom/2 - i; j++){//每行前的空格
line(1,' ');//空格
}
line(2*i+1,c);
n();
}
}
4)棱形
分析可知,棱形由一个正三角和一个倒三角组成
故棱形实现方案可分为两个部分
- 画一个正三角,调用
triangle(a,c)
函数 - 画一个底边为a-1的倒三角,即丢弃第一行。调用
solidInvertedTriangle(a,c)
函数
倒三角实现
void solidInvertedTriangle(int a,char c)
{
//a-=2
if(a % 2 == 0)
a+=1;
for(int i = 0; i < (a+1)/2; i++){
if(i == 0)#跳过第一行
continue;
for(int j = 0; j < i; j++)
line(1,' ');
line(a - 2*i,c);
n();
}
}
棱形代码实现
void solidLozenge(int a, char c)
{
triangle(a,c);
solidInvertedTriangle(a,c);
}
附、源码
初版代码,函待作以上更新
#include<stdio.h>
void n()
{
putchar('\n');
}
void line(int a, char c)
{
while(a--){
putchar(c);
}
}
void rectangle(int a, int b,char c)
{
while(b--){
line(a,c);
n();
}
}
void hollowRectangle(int a,int b ,int c)
{
line(a,c);
n();
for(int i = 0; i < b - 2; i++ ){
putchar(c);
for(int j = 0; j < a - 2; j++)
printf(" ");
putchar(c);
n();
}
line(a,c);
}
void triangle(int a,char c)
{
if(a%2==0)
a+=1;
for(int i = 0;i < (a+1)/2; i++){
for(int j = 0; j < a/2 - i; j++){
putchar(' ');
}
line(2*i+1,c);
n();
}
}
void lozenge(int a,char c)
{
if(a % 2 == 0)
a+=1;
for(int i = 0; i < (a+1)/2; i++){
for(int j = 0; j < a/2 -i; j++)
putchar(' ');
putchar(c);
for(int j = 0; j < 2*i-1;j++)
putchar(' ');
if(i != 0)
putchar(c);
n();
}
for(int i = 1; i < (a+1)/2; i++){
for(int j = 0; j < i; j++)
putchar(' ');
putchar(c);
for(int j = 0; j < a-2*i-2; j++)
putchar(' ');
if(i != (a+1)/2-1)
putchar(c);
n();
}
}
void hui(int a,char c)
{
line(a,c);
n();
for(int i = 0; i < a-2; i++){
putchar(c);
if(i<(a+1)/4-1 || i>a-(a+1)/4-2 ){
for(int j=0;j<a-2;j++)
putchar(' ');
}
else{
for(int j=0;j<(a+1)/4-1;j++)
putchar(' ');
if(i == (a+1)/4 -1 || i == a-(a+1)/4-2)
line(a-(a+1)/2,c);
else{
putchar(c);
for(int t = 0;t < a-(a+1)/2-2;t++)
putchar(' ');
putchar(c);
}
for(int j=0;j<(a+1)/4 -1;j++)
putchar(' ');
}
putchar(c);
n();
}
line(a,c);
n();
}
void square(int a,char c)
{
rectangle(a,a,c);
}
// 已丢弃的 实心倒三角方案
void solidInvertedTriangle(int a,char c)
{
//a-=2
if(a % 2 == 0)
a+=1;
for(int i = 0; i < (a+1)/2; i++){
if(i == 0)
continue;
for(int j = 0; j < i; j++)
putchar(' ');
line(a - 2*i,c);
n();
}
}
void solidLozenge(int a, char c)
{
triangle(a,c);
line(1,' ');
solidInvertedTriangle(a-1,c);
}
int main(void)
{
int a=12, b=4;
char c = '*';
puts("input a b :");
scanf("%d %d",&a,&b);
rectangle(a,b,c);n();
hollowRectangle(a,b,c);n();
triangle(a,c);
lozenge(a,c);
hui(a,c);
//solidLozenge(a,c);
//square(a,c);
//hollowTriangle(a,c);
return 0;
}