作为C语言经典类型题,打印菱形是不少初学者很头疼的问题,但这题的本质其实就是找规律,结合图像会更容易理解。
本章可能会用到的知识:
1.找 * 与空格的规律(菱形上半部分)
(因为规律是一致的,所以在此仅展示四行参考)
观察这半个菱形我们不难发现,空格和 * 的比:
* 的个数 | 空格的个数 | |
---|---|---|
第一行 | 1 | 3 |
第二行 | 3 | 2 |
第三行 | 5 | 1 |
第四行 | 7 | 0 |
Ps:要特别注意一点就是空格仅需要计算最左边的,因为我们在打印的时候仅需要打印 * 之前的空格就好。
由此表格我们不难发觉:a.空格数 = 总行数 - 当前行数
b. * 数 = 当前行数二倍 - 1
如果我们假设菱形的总行数为 n ,当前行数为 i ,我们便可以把上面的公式抽象一下变成更适用于编译器的形式:a. ( n - i )( i>=1)
b. ( 2 * i - 1)( i >=1)
所以菱形的上半部分代码我们就可以这样写:
for (int i = 1; i <= n; i++) {
for (int j = 0; j < n - i; j++) {
printf(" ");
}
for (int j = 0; j < 2 * i - 1; j++) {
printf("*");
}
printf("\n");
}
2.找下半部分的规律
由于下半部分就是上半部分倒过来,所以图就不展示了,大家可以自行想象,我们直接上结论:
a.空格 = 行数
b.* 数 = 下半总行数 - 行数的二倍加1
抽象一下就是:* 数 = 2( n - 1 - i )+1
ps:由于下半部分缺少最中间的那行所以总行数要减一
so,下半部分代码就 very 简单了:
for (int i = 1; i <= n - 1; i++) {
for (int j = 0; j < i; j++) {
printf(" ");
}
for (int j = 0; j < 2 * (n - 1 - i) + 1; j++) {
printf("*");
}
printf("\n");
}
3.总结
完整代码只需要定义一下 n //上半部分行数
以下是完整代码:
#include<stdio.h>
int main() {
int n;
scanf(“%d”,&d);
for (int i = 1; i <= n; i++) {
for (int j = 0; j < n - i; j++) {
printf(" ");
}
for (int j = 0; j < 2 * i - 1; j++) {
printf("*");
}
printf("\n");
}
for (int i = 1; i <= n - 1; i++) {
for (int j = 0; j < i; j++) {
printf(" ");
}
for (int j = 0; j < 2 * (n - 1 - i) + 1; j++) {
printf("*");
}
printf("\n");
}
return 0;
}
🎈🎈完结撒花🎈🎈