工程师思维的笔记
从一个问题说起:使用c语言在屏幕上画出指定的图形,如三角形,矩形,菱形等图形
如果我们一开始去做的话,会先想如何画一个矩形,根据过往的经验,会准备用双层for循环,然后很轻易的画出一个矩形,
void rect(int a,int b,char c)
{
for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
printf("*");
}
printf("\n");
}
}
但是当画三角形的时候就会出现问题,因为每一行要画出来的字符数量是不定的,这需要做很多的判断,若是面向过程的方法,则需要一层一层的判断画的字符的数量,我们的大脑承受不了那么多条件的转变和判断,就会出现把问题搞得一团糟,这时工程师思维就可以很轻易的解决这些问题
- 把问题细化,人的大脑一次最多只能存储7个变量的转换和条件的判断,若是把问题细化到非常小的一部分,我们就可以很轻易的解决,首先,若要画一个图形,可以先定义一个函数,它能够画出指定的字符:
#include<stdio.h>
void printChar(char c)
{
printf("%c",c);
}
- 一个图形是由多个字符组成的,则可以定义一个函数连续的画出指定的字符
void printChar(char c);
//连续打印一行字符
void printLine(int n,char c)
{
for(int i=0;i<n;i++)
{
printChar(c);
}
}
- 这时候我们已经可以画出矩形了,对比最开始用的双重循环,此方法条理清晰,逻辑明了,易于理解
//打印一个矩形
void rect(int a,int b,char c)
{
for(int i=0;i<a;i++){
printLine(b,c);
printf("\n");
}
}
- 接下来是三角形的问题,三角形要画的字符的位置是不一样的,有的要从一开始就画,有的要在某一个位置才开始画,这时又可以定义一个函数用于在指定的索引处开始画字符 而画多少个则由上一个函数printLine来实现
//在指定索引处连续打印指定数目的字符
void indexPrint(int a,int index,int n,char c)
{
for(int i=0;i<a;i++){
if(i==index){
printLine(n,c);//从指定的索引楚开始打印字符
break;
}
printChar(' ');//其他位置打印空白字符
}
}
- 这时,已经可以解决一开始的所有问题,画一个三角形
//打印等腰三角形
void isoscelesTriangle(int a,int b,char c,int flag)
{
/*用一个标志位flag来判断是要画正等腰还是倒等腰三角形
* 1为正,0为倒
* a表示要画的行数,b表示画的列数
* */
if(flag==1){
for(int i=0;i<a;i++){
if(i>b/2){
break;
}
indexPrint(b,b/2-i,2*i+1,c);
printf("\n");
}
}
if(flag==0){
int count=b/2;
for(int i=0;i<a;i++){
if(i>count){
break;
}
indexPrint(count*2,i,b,c);
b-=2;
printf("\n");
}
}
}
画一个菱形
//打印菱形
void diamond(int a,int b,char c)
{
//只需要打印两次等腰三角,一次正等腰,一次倒等腰
isoscelesTriangle(a,b,c,1);
isoscelesTriangle(a,b,c,0);
}
空心矩形
//打印空心矩形
void hollowRect(int a,int b, char c)
{
for(int i=0;i<a;i++){
if(i==0||i==a-1){
printLine(b,c);
printf("\n");
continue;
}
printChar(c);
for(int j=0;j<b-2;j++){
printChar(' ');
}
printChar(c);
printf("\n");
}
}