Bootstrap

C题(一)正三角形的打印 + 杨辉三角

前言:这是一个刷题系列,如果有错误的地方,或者有更好的解法,欢迎uu们评论。

           C题系列 --- 不属于C初阶系列的范畴

 目录👉

一、正三角形的打印

1、分解目标1:先定义n = 4(从确定的层数n开始)

2、分解目标2:先打印“排头的空格”

3、 分解目标3:后打印“*”

4、分解目标4:将n改成任意输入

二、杨辉三角的实现

1、分解目标1:把数据输入到数组中

2、分解目标2:打印空格(//详见上文“正三角形的打印---空格的打印”。)

3、分解目标3:打印数组中的数据

4、分解目标4:改变层数,多次调试

一、正三角形的打印

效果展示:👉

6 //输入一个数 ---表示层数
     *
    * *
   * * *
  * * * *
 * * * * *
* * * * * *

思考:整个正三角形的打印貌似可以看作两个三角形的打印。一个是“空格”组成的直角三角形,一个是 * 组成的直角三角形。那为什么 * 变成了正三角形呢?————>被空格“挤”过去的,哈哈。 

  • 总目标:输入层数n,打印一个n层的正三角形
  • 分解目标1:先定义n = 4(从确定的层数n开始)

                         //    "   *"   
                         //    "  * *"  
                         //    " * * *" 
                         //   "* * * *"

  • 分解目标2:先打印“排头的空格”

                        //    "   " 👉(n - 1)个空格
                        //    "  "  👉(n - 2)个空格
                        //    " "   👉(n - 3)个空格
                        //    ""    👉(n - 4)个空格
                        // 注意规律:第i行有(n - i)个空格

  • 分解目标3:后打印“*”

                       //注意规律:第i行有i个*

  • 分解目标4:将n改成任意输入 

1、分解目标1:先定义n = 4(从确定的层数n开始)

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
int main()
{
	int n = 4;
	return 0;
}

 2、分解目标2:先打印“排头的空格”

                         //   "   " (n - 1)个空格
                        //    "  "  (n - 2)个空格
                        //    " "   (n - 3)个空格
                        //    ""      (n - 4)个空格

由于空格的打印有列的控制,还有行的打印(注意规律<如上>),所以空格的打印采用循环的嵌套。

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
int main()
{
	int n = 4;
	int i = 0;
	for (i = n; i > 0; i--)
	{
		int j = 0;
		for (j = i - 1; j > 0; j--)
		{
			printf(" ");
		}
		printf("*");//此处*为参照物,用于显示空格的存在
		printf("\n");
	}
	return 0;
}

运行结果:👉

   *
  *
 *
*

3、 分解目标3:后打印“*”

                     //注意规律:第i行有i个*

发现:

第一行----三个空格和一个*

第二行----两个空格和两个*

第三行----一个空格和三个*

······

第 k 行----(i - 1)个空格和k个*

所以,发现空格数与*数的和总是等于4,即层数n

所以,层数减空格数即为该行中*的个数👉  *的个数k = n - (i - 1)

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
int main()
{
	int n = 4;
	int i = 0;
	for (i = n; i > 0; i--)
	{
		int j = 0;
		for (j = i - 1; j > 0; j--)
		{
			printf(" ");
		}
		int k = 0; //k = n - (i - 1)---层数减空格数即为该行中*的个数
		for (k = n - (i - 1); k > 0; k--)
		{
			printf("* ");
		}
		printf("\n");
	}
	return 0;

运行结果👉

4
   *
  * *
 * * *
* * * *

4、分解目标4:将n改成任意输入 

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
int main()
{
	int n = 0;
	scanf("%d", &n);
	int i = 0;
	for (i = n; i > 0; i--)
	{
		int j = 0;
		for (j = i - 1; j > 0; j--)
		{
			printf(" ");
		}
		int k = 0;
		for (k = n - (i - 1); k > 0; k--)
		{
			printf("* ");
		}
		printf("\n");
	}
	return 0;
}

 👉正三角形最终成果展示:

6
     *
    * *
   * * *
  * * * *
 * * * * *
* * * * * *

二、杨辉三角的实现

  •  总目标:打印一个10层以内的任意层数的杨辉三角
  • 分解目标1:把数据输入到数组中(先控制层数为5 --- 小一点,便于发现错误)

         //由于数组的大小通常不能用变量表示(C99之后才可以),错误案例如下:

         

错误案例
int n = 0;
scanf("%d",&n);
int arr[n] = {0};

          //所以,我这边用的是define定义的标识符常量。

  • 分解目标2:打印空格

          //详见上文“正三角形的打印---空格的打印”。

  • 分解目标3:打印数组中的数据 

          //注意控制间距,提升观感。

  • 分解目标4:改变层数,多次调试

          //注意控制间距,提升观感。

成果预览:👉

                                1
                             1     1
                          1     2     1
                       1     3     3     1
                    1     4     6     4     1
                 1     5    10    10     5     1
              1     6    15    20    15     6     1
           1     7    21    35    35    21     7     1
        1     8    28    56    70    56    28     8     1
     1     9    36    84   126   126    84    36     9     1

1、分解目标1:把数据输入到数组中

tip:hang ---行 ;lie ---列

杨辉三角数学规律:

tip:设置的变量hang和lie应当从0开始,便于数组数据的遍历

蓝色箭头 --- 代表两数的和等于另一个数

    #define n 5
	int hang = 0;
	int lie = 0;
	int arr[n][n] = { 0 };
	for (hang = 0; hang < n; hang++)
	{
		for (lie = 0; lie <= hang; lie++)
		{
			if (lie == 0 || hang == lie)
			{
				arr[hang][lie] = 1;
			}
			else
				arr[hang][lie] = arr[hang - 1][lie - 1] + arr[hang - 1][lie];
		}
	}

2、分解目标2:打印空格(//详见上文“正三角形的打印---空格的打印”。)

//由于5层的杨辉三角的数据为都是个位数,所以每次循环选择打印一个空格(控制间距,提升观感)

	int i = 0;
	for (i = n; i > 0; i--)
	{
		int j = 0;
		for (j = i - 1; j > 0; j--)
		{
			printf(" ");
		}
        printf("\n");
    }

 3、分解目标3:打印数组中的数据 

 //由于5层的杨辉三角的数据为都是个位数,所以选择“ d”,即d的前面一个空格(控制间距,提升观感)

		hang = n - i;
		lie = 0;
		for (lie = 0; lie <= hang; lie++)
		{
			printf("% d", arr[hang][lie]);
		}

初步成果展示:👉

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
int main()
{
//输入
    #define n 5
	int hang = 0;
	int lie = 0;
	int arr[n][n] = { 0 };
	for (hang = 0; hang < n; hang++)
	{
		for (lie = 0; lie <= hang; lie++)
		{
			if (lie == 0 || hang == lie)
			{
				arr[hang][lie] = 1;
			}
			else
				arr[hang][lie] = arr[hang - 1][lie - 1] + arr[hang - 1][lie];
		}
	}
//输出(打印)
	int i = 0;
	for (i = n; i > 0; i--)
	{
		int j = 0;
		for (j = i - 1; j > 0; j--)
		{
			printf(" ");
		}
		hang = n - i;
		lie = 0;
		for (lie = 0; lie <= hang; lie++)
		{
			printf("% d", arr[hang][lie]);
		}
		printf("\n");
	}
	return 0;
}
     1
    1 1
   1 2 1
  1 3 3 1
 1 4 6 4 1

4、分解目标4:改变层数,多次调试

 如果只是把层数n改为10,会怎么样呢?如下:

          1
         1 1
        1 2 1
       1 3 3 1
      1 4 6 4 1
     1 5 10 10 5 1
    1 6 15 20 15 6 1
   1 7 21 35 35 21 7 1
  1 8 28 56 70 56 28 8 1
 1 9 36 84 126 126 84 36 9 1

歪歪扭扭的,不好看!!!

所以,我们应该去调整间距,最终成果展示:👉

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
int main()
{
//输入
    #define n 10
	int hang = 0;
	int lie = 0;
	int arr[n][n] = { 0 };
	for (hang = 0; hang < n; hang++)
	{
		for (lie = 0; lie <= hang; lie++)
		{
			if (lie == 0 || hang == lie)
			{
				arr[hang][lie] = 1;
			}
			else
				arr[hang][lie] = arr[hang - 1][lie - 1] + arr[hang - 1][lie];
		}
	}
//输出(打印)
	int i = 0;
	for (i = n; i > 0; i--)
	{
		int j = 0;
		for (j = i - 1; j > 0; j--)
		{
			printf("   ");     //控制空格
		}
		hang = n - i;
		lie = 0;
		for (lie = 0; lie <= hang; lie++)
		{
			printf("%6d", arr[hang][lie]);   //控制数据间距
		}
		printf("\n");
	}
	return 0;
}
                                1
                             1     1
                          1     2     1
                       1     3     3     1
                    1     4     6     4     1
                 1     5    10    10     5     1
              1     6    15    20    15     6     1
           1     7    21    35    35    21     7     1
        1     8    28    56    70    56    28     8     1
     1     9    36    84   126   126    84    36     9     1

 如果有错误的地方,或者有更好的解法,欢迎uu们评论

;