工程化思想体验

工程化思想体验

相信大多数人学习C语言的过程一定绕不开打印图形这个问题。

举个我个人的例子,我学习C语言的第一次作业就有这样的一个题:
在这里插入图片描述

对于这个东西,我相信大多数人第一次做都是下面这种做法:

#include <stdio.h>
int main()
{
    char c;
    scanf("%c",&c);
    printf("  %c  ",c);
    printf(" %c%c%c ",c,c,c);
    printf("%c%c%c%c%c",c,c,c,c,c);
    return 0;
}

哈哈,虽然可能机智点的会用循环来写,这里就不多叙述了。反正我第一次的解法就是这么简单粗暴,直接一行一行地把图形拼出来。

但是这样的“直接打印”并没有办法精确地控制我们的代码。比如说我现在改变注意了,需要打印一个底边长为7的等腰三角形。那我又得多拼几行,同理,如果是腰长为10,为100呢?那我估计得拼到明天早上去。

这里就要引入一个工程化思想的概念了。在工程项目的建设中,我们的代码需要尽可能做到模块化,使得我们之前封装好的函数可以再利用,利用后封装的函数又可以再次利用。举个例子:

void pn(char c)								//打印一个给定字符
{
	printf("%c",c);
}

void pc(int n,char c)						//打印一行数量为n的给定字符
{
	for(int i=0;i<n;i++) pn(c);
}

void ps(int n)								//打印一行数量为n的空格
{
	for(int i=0;i<n;i++) printf(" ");
}

像上边这三个简单的函数,都只是实现了一些简单的功能。但是当我们需要打印的三角形的时候,恰好可以再次利用这三个封装好的函数。

void p_isosceles_triangle(int a,char c)			//打印底边长为a(a为奇数)的等腰三角形
{
	int m=a/2+1;
	for(int i=m-1;i>=0;i--)
	{
		ps(i);
		pc(a-2*i,c);
		ps(i);
		printf("\n");
	}
}

这样就可以轻松地实现对三角形大小的控制,省时省力。

更重要的是,我们的错误会大大减少。因为我们在封装简单的函数时,犯的错误要少的多,哪怕出错了,也能很快地进行简单的调试。

那么我们在用这些模块化的函数实现新的功能时,就不必纠结于这种因为经常因为粗心造成的小错误,更多地是考虑怎么对这些小功能进行组合。

而一旦后续实现某个“大功能”的大模块出现了问题,我们也就不必要从头排除一遍错误(毕竟一般别的没出错的大模块已经帮我们验证过了小模块的对错),只需要关注实现这个出错的大模块的组合过程中哪里出了问题就好。

再回到之前的例子,我们也可以用这三个封装的简单函数打印矩形,回字形,菱形等等:

void p_rectangle(int m,int n,char c)				//打印长为m,宽为n的矩形
{
	for(int i=0;i<m;i++) 
	{
		pc(n,c);
		printf("\n");
	}
}

void p_hollow_rectangle(int m,int n,char c)			//打印长为m,宽为n的空心矩形
{
	for(int i=0;i<m;i++)
	{
		if(i==0||i==m-1)
		{
			pc(n,c);
			printf("\n");
		}
		else {
			pc(1,c);
			ps(n-2);
			(1,c);
			printf("\n");
		     }
	}
}
void p_hollow_rhombus(int a,char c)				//打印边长为a的空心菱形
{
	int mid=a*2-1;
	ps(a-1);
	pc(1,c);
	ps(a-1);
	printf("\n");
	for(int i=a-2;i>=0;i--) 
	{
		ps(i);
		pc(1,c);
		ps(mid-2*i-2);
		pc(1,c);
		ps(i);
		printf("\n");
	}
	for(int i=1;i<a-1;i++)
	{
		ps(i);
		pc(1,c);
		ps(mid-2*i-2);
		pc(1,c);
		ps(i);
		printf("\n");
	}
	ps(a-1);
	pc(1,c);
	ps(a-1);
	printf("\n");
}
void p_hui_rectangle(int a,int b,char c)			//打印长为a,宽为b的"回"字型矩形
{
	for(int i=0;i<a;i++)
	{
		if(i==0||i==a-1) 
		{
			pc(b,c);
			printf("\n");
		}
		else if(i==1||i==a-2)
		{
			pc(1,c);
			ps(1);
			pc(b-4,c);
			ps(1);
			pc(1,c);
			printf("\n");
		}
		else
		{
			pc(1,c);
			ps(1);
			pc(1,c);
			ps(b-6);
			pc(1,c);
			ps(1);
			pc(1,c);
			printf("\n");
		}
	}
}

同理,我们也可以利用这些打印三角形,矩形,菱形等功能去实现更大的功能等等,这样的工程思维量是不是就要小得多了呢?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值