C语言实例:创建各类三角形图案(杨辉三角,弗洛伊德三角形....)

简介: C语言实例:创建各类三角形图案(杨辉三角,弗洛伊德三角形....)

1.正/倒直角三角形

       这种三角形的实现很简单,这里就不作过多的赘述了,直接看代码吧

红框里的代码很重要,没有这句话,三角形就打印不出来,打印的只是许多连起来的‘*’。

2.金字塔

       我们先来看看金字塔的组成

可以看见金字塔由空格和星号组成。再仔细观察,不难发现空格的和星号的排列方式存在着规律。

第一行有1个星号,5个空格;第二行有3个星号,4个空格;第三行有5个星号,3个空格;

以此类推,那么第五行就有(2*5-1)个星号,0个空格。那么这个规律就可以通过循环实现

下面来看代码:

1. 
2. int main()
3. {
4.  int i = 0, j = 0, row = 0,space=0;
5.  printf("请输入行数:>");
6.  scanf("%d", &row);
7.  for (i = 0; i < row; i++)
8.  {
9. //打印空格
10.     for (space = 1; space < row - i; space++)
11.     {
12.       printf("  "); //注意空格的大小应与下方打印*所占的大小一致,否则打印出来的金字塔不好看
13.     }
14. //打印星号
15.     for (j = 1; j <= (2*(i+1) - 1); j++)
16.     {
17.       printf(" *");
18.     }
19.     printf("\n");  //换行很重要
20.   }
21.   return 0;
22. }

打印出来的效果:

3.杨辉三角

先来看看杨辉三角的特征:

每行的开始和末尾都是1,每个数等于它上方两数之和。每行数字左右对称,由1开始逐渐变大,第n行的数字有n项。有了这些特征,我们就能够写出代码:

1. int main()
2. {
3. int rows, coef = 1, space, i, j;
4. 
5.     printf("行数: ");
6.     scanf("%d", &rows);
7. 
8. for (i = 0; i < rows; i++)
9.     {
10. //打印空格
11. for (space = 1; space <= rows - i; space++)
12.             printf("  ");
13. 
14. for (j = 0; j <= i; j++)
15.         {
16. if (j == 0 || i == 0)
17.                 coef = 1;
18. else
19.                 coef = coef * (i - j + 1) / j; //计算每行除1以外的数
20. 
21.             printf("%4d", coef);
22.         }
23.         printf("\n");
24.     }
25. 
26. return 0;
27. }

看上去计算coef那以行的代码不好理解,没关系我们可以采用另一种方法。我们曾经在高中数学肯定了解过杨辉三角,知道它每一行的数其实是它当前的行数-1的组合数,这样一来就简单许多了,我们只需要写一个计算组合数的函数,然后调用它就行了 。

对组合数不理解的可以参考这篇文章:https://zhidao.baidu.com/question/1179242945073797019.html

下面是计算组合数的函数:

1. int Gulid(int n, int m)
2. {
3.  int i = 0, ret1 = 1, ret2 = 1,tmp=0;
4.  for (i = n;tmp<m; i--)
5.  {
6.    ret1 = ret1 * i;
7.    tmp++;
8.  }
9.  for (i = 1; i <= m; i++)
10.   {
11.     ret2 = ret2 * i;
12.   }
13.   return ret1 / ret2;
14. }

我们把代码改成这样:

1. int main()
2. {
3.  int i = 0, j = 0, space = 0, row = 0;
4.  printf("请输入行数:>");
5.  scanf("%d", &row);
6.  for (i = 0; i < row; i++)
7.  {
8.    for (space = 1; space <= row - i; space++)
9.      printf("  ");
10.     for (j = 0; j <= i; j++)
11.     {
12.       printf("%4d", Gulid(i, j));
13.     }
14.     printf("\n");
15.   }
16.   return 0;
17. }

这相比上面的就容易理解了许多

4.弗洛伊德三角形

       弗洛伊德三角形就是每行有行数个数字,且打印的数字是递增的,如下图:

可以发现结尾的数字是从1到行数的和,1行就以1结尾,2行就是3,3行就是6......10行就是55;

我们可以写个函数来实现这个功能:

1. int Sum(int n)
2. {
3.  int i = 0, sum = 0;   //这里的sum=0很重要,否则算出来的答案就是错误的
4.  for (i = 1; i <= n; i++)
5.  {
6.    sum = sum + i;
7.  }
8.  return sum;
9. }

主函数:

1. int main()
2. {
3.  int i = 0, j = 1,row=0,n=1,tmp=0,count=1;
4.  printf("请输入行数:>");
5.  scanf("%d", &row);
6.  int sum = Sum(row);    //计算结尾的数字
7.  for (i = 1; i <= sum; i++)
8.  {
9. 
10.     count = 1;    //每次循环好一遍后,使count=1,否则会出现下图所示的结果
11.     for (; count<= n; j++)
12.     {
13.       printf("%d   ", j);
14.       count++;
15.     }
16.     i = j;    //让i=j,否则会得不到想要的结果,反而会得到一个出乎意料的结果
17.     printf("\n");
18.     n++;   //记录行的变化
19.   }
20.   return 0;
21. 
22. }

出乎意料的结果:

总结:对于我们想要创建或是打印的图形,需要好好观察,得出图形的特征,再用代码实现,而不是一上来就写代码。

       好了,本篇文章就到这儿啦,谢谢你的阅读。

       如有错误或意见,欢迎指出。


目录
相关文章
|
1月前
|
Ubuntu 编译器 Linux
C语言中经典的结构体和联合体共用实例
C语言中经典的结构体和联合体共用实例
29 0
|
29天前
|
存储 数据处理 C语言
C语言高级应用探讨与实例
C语言高级应用探讨与实例
24 1
|
4天前
|
C语言
【C语言刷题每日一题#牛客网BC68】——X形图案
【C语言刷题每日一题#牛客网BC68】——X形图案
|
4天前
|
C语言
【C语言刷题每日一题#牛客网BC69】——空心正方形图案
【C语言刷题每日一题#牛客网BC69】——空心正方形图案
|
7天前
|
C语言
C语言---正方形图案--循环
C语言---正方形图案--循环
|
7天前
|
C语言
C语言---计算三角形的周长和面积--海伦公式
C语言---计算三角形的周长和面积--海伦公式
11 0
|
7天前
|
C语言
C语言-----打印用“*”组成的X形图案,输出一个数表示行数
C语言-----打印用“*”组成的X形图案,输出一个数表示行数
|
7天前
|
C语言
C语言---三角形判断
C语言---三角形判断
|
1月前
|
C语言
C语言循环结构程序设计详解及代码实例
C语言循环结构程序设计详解及代码实例
25 0
|
1月前
|
存储 C语言 索引
C语言一维数组与二维数组详解及代码实例
C语言一维数组与二维数组详解及代码实例
28 0