在c语言中会用for循环干很多很多事情,今天要分享大家的是通过for循环打印出两个靠在一起的三角形,那我为什么不说是菱形呢?嘿嘿,我在点题呀,还有就是著名的杨辉三角问题
杨辉三角,本质上是二项式(a+b)的n次方展开后各项的系数排成的三角形。其性质包括:每行的端点数为1, 一个数也为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://img-blog.csdnimg.cn/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循环可以打印好多好看的图案,除了上面的三角图案,希望大家多多支持,如果有不对的地方,请大佬多多指教,谢谢大家了