【C语言】字符画图形之代码高度复用

源码已在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)即为直线的条数,即调用widthline()函数

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(即一个顶点)
  2. 为保证顶点为1,底边长需为奇数,而矩形等没有要求,故在代码头部进行修正,保证整体代码的健壮性
  3. 三角形的高为底边长的一半(向上取整),所以需要调用(bottom+1)/2line(2*i+1,c)函数
  4. 另外需要针对每行进行若干空格,数目依次递减,即调用bottom/2-iline(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)棱形

分析可知,棱形由一个正三角和一个倒三角组成
故棱形实现方案可分为两个部分

  1. 画一个正三角,调用triangle(a,c)函数
  2. 画一个底边为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;
		
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值