工程化思想体验
相信大多数人学习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");
}
}
}
同理,我们也可以利用这些打印三角形,矩形,菱形等功能去实现更大的功能等等,这样的工程思维量是不是就要小得多了呢?