在c语言中会用for循环干很多很多事情,今天要分享大家的是通过for循环打印出两个靠在一起的三角形,那我为什么不说是菱形呢?嘿嘿,我在点题呀,还有就是著名的杨辉三角问题
杨辉三角
杨辉三角,本质上是二项式(a+b)的n次方展开后各项的系数排成的三角形。其性质包括:每行的端点数为1, 一个数也为1;每个数等于它左上方和上方的两数之和。
怎么用c语言实现杨辉三角呢???
图1
这个是最后要实现的效果。
如果我去掉打印中的空格的话,是下面的效果
图3
数字的位数可能不一样看不太清楚,如果每个数字都一样是怎么样的??
图4
从这里可以看出我们可以把数据放在一个二维数组里面。比如打印出图4那样
int main()
{
int arr[10][10] = { 0 };
int i = 0;
for (i = 0; i <10; i++) { int j=0; for (j = 0; j <=i; j++) //这里j<=i就是为了打印主对角线下方的数据 { printf("%d ", arr[i][j]); } printf("\n"); }
}
根据图3可知二维数组的第一列都是1,主对角线也都是1,代码实现如下
int main()
{
int arr[10][10] = { 0 };
int i = 0;
for (i = 0; i < 10; i++) { int j = 0; for (j = 0; j < 10; j++) { if(j == 0)//如果是第一列赋值为1 { arr[i][j] = 1; } if (i==j)//如果是主对角线赋值为1 { arr[i][j] = 1; } }
}
for (i = 0; i <10; i++)
{
int j=0;
for (j = 0; j <=i; j++) { printf("%d ", arr[i][j]); } printf("\n"); }
}
打印结果如下
但是这个图片和图三还有差异,对比发现,要实现杨辉三角的数据的话,
下面这个红圈的数据应该是上面红圈两个数据的和也就是arr[2][1]=arr[1][1]+arr[1][0];
arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1];`
int main() { int arr[10][10] = { 0 }; int i = 0; for (i = 0; i < 10; i++) { int j = 0; for (j = 0; j < 10; j++) { if(j == 0) { arr[i][j] = 1; } if (i==j) { arr[i][j] = 1; } if (i >= 1 && j >= 1) { arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1]; } } for (i = 0; i <10; i++) { int j=0; for (j = 0; j <=i; j++) { printf("%d ", arr[i][j]); } printf("\n"); } }
现在才得到了图三的结果,为了出现三角的形状,开始加空格,
在每一行打印前加空格,每行的空格数递减,我们可以通过循环实现
int main() { int arr[10][10] = { 0 }; int i = 0; for (i = 0; i < 10; i++) { int j = 0; for (j = 0; j <=i; j++) { if (j == 0) { arr[i][j] = 1; } if (i == j) { arr[i][j] = 1; } if (i >= 1 && j >= 1) { arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1]; } } } for (i = 0; i < 10; i++) { int j = 0; for (int k = 0; k < 10 - i; k++)//循环打印空格,空格数随着行数递减,i越大循环次数越小,打印空格越少,最后保证在最后一行i=9时,前面有一个空格,这里的循环判断可以写k < 10 - i { printf(" ");//两个空格 } for (j = 0; j <=i; j++) { printf("%3d", arr[i][j]); } printf("\n"); } }
printf(" ");//两个空格 ```c 在这里插入代码片
printf("%3d ", arr[i][j]);
这样打印的话会好看一点
# 打印菱形 ![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/41cfb3f89f6c4c389ffe4684d3c659fa.png#pic_center) 这个菱形的打印我们可以分为上半部分和下半部分,可以从键盘输入上面的三角为n行,而下面的三角则为n-1行,我们先实现上半部分 ```c int n = 0; scanf_s("%d", &n);//通过键盘输入n行 for (int i = 1; i <= n; i++)//循环遍历每一行 { int j = 0; for (j = 0; j < n - i; j++)//为了使上半部分最后一行刚好与左边界对齐,循环判断条件为j < n - i当i==n时刚好打印空格的循环不进行循环,从第一行往下每一行少打印一个空格 { printf(" "); } for (int k = 0; k < 2 * i - 1; k++)//打印*,观察规律打印*次数与行数有关,i为行数,*的数目为2*i-1 { printf("*"); } printf("\n");每一行结束打印换行 }
输入n=7,上半部分七行,
下面的n-1行用类似的方法
、`for (int i = 1; i <= n - 1; i++)//循环遍历下部分n-1行
{ int j = 0; for (j = 0; j < i; j++)//为了和上面对称,并且空格的数目递增,1, 2 ,3这样增加,可以把循环条件与i联系起来,i每次jia1,j就可以多循环1次,多打印一个空格,循环判断条件可以写成j < i { printf(" "); } for (int q = 0; q < 2 * (n - 1 - i) + 1; q++)//根据下面打印的结果,下面第一行打印的应该是11个*,n=7,n-1=6,打印的次数为2*(n-1)-1吗??因为打印的*的次数每一行时变化的,所以应该和i这个变化的行数结合起来,下面第一行i=1;这一行打印了2*(n-1-i)+1次, { printf("*"); } printf("\n"); }
整体代码
int main() { int n = 0; scanf_s("%d", &n); for (int i = 1; i <= n; i++) { int j = 0; for (j = 0; j < n - i; j++) { printf(" "); } for (int k = 0; k < 2 * i - 1; k++) { printf("*"); } printf("\n"); } for (int i = 1; i <= n - 1; i++) { int j = 0; for (j = 0; j < i; j++) { printf(" "); } for (int q = 0; q < 2 * (n - 1 - i) + 1; q++) { printf("*"); } printf("\n"); }}
通过for循环可以打印好多好看的图案,除了上面的三角图案,希望大家多多支持,如果有不对的地方,请大佬多多指教,谢谢大家了