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. }
出乎意料的结果:
总结:对于我们想要创建或是打印的图形,需要好好观察,得出图形的特征,再用代码实现,而不是一上来就写代码。
好了,本篇文章就到这儿啦,谢谢你的阅读。
如有错误或意见,欢迎指出。