其实像这种菱形代码、爱心代码、水仙花数代码等本质上是循环嵌套的灵活运用、是代码与数学的结合。本质上是将代码作为工具,来解决数学问题。所以只需分析问题、想出解决方法,至于复杂的计算,交给计算机就好了。
要想输出任意行的菱形,就得写个模板,可以先定义一个变量n来表示这个任意数
#include
int main()
{
int n;
return 0;
}
要写模板,得先找个例子,首先我们先分析这个行数为5的菱形。
这个菱形可以分为以上三个部分,只要分别打印出这三个部分的图案,那么这个菱形就成了!
第一部分要打印两行,也就是5/2行,即n/2行。
第一行要打印三个字符(两个空格),第二行要打印四个字符(一个空格),即 n-本行空格数
所以可以把控制行的for循环,以递减的形式写,即
#include
int main()
{
int n = 5;
for(int i = n/2;i>0;i--)
return 0;
}
这样,打印第一行时,i==2,打印第二行时,i==1,正好是本行的空格数。
然后要再嵌套一个循环来打印本行的字符(空格 和 *)
#include
int main()
{
int n = 5;
for(int i = n/2;i>0;i--){
for(int j = 0;j < n-i;j++)
}
return 0;
}
如何判断时打印空格还是星号*?
第一行要打印两个空格,第二行要打印一个空格,正好等于i,所以,j
正好用三目运算符来实现,代码如下
#include
int main()
{
int n = 5;
for(int i = n/2;i>0;i--){
for(int j = 0;j < n-i;j++)
printf(j < i?" ":"*");
printf("\n");//每行打印完后,换行
}
return 0;
}
运行结果,成功!!!
万事开头难,写完了第一部分,剩下的两个部分就简单多了
代码如下
#include
int main()
{
int n = 5;
//第一部分
for(int i = n/2;i>0;i--){
for(int j = 0;j < n-i;j++)
printf(j < i?" ":"*");
printf("\n");//每行打印完后,换行
}
//第二部分
for(int i = 0;i
第三部分的思路和第一部分相同,只是打印出一个倒三角
先写一个for循环控制行(i要代表空格数,所以循环要从1开始)
for(int i = 1;i<=n/2;i++)
然后再嵌套一个for循环,打印字符(空格 和 星号*),代码和第一部分是一样的
//第三部分
for(int i = 1;i<=n/2;i++){
for(int j = 0;j < n-i;j++)
printf(j < i?" ":"*");
printf("\n");//每行打印完后,换行
}
至此,我们的模板就完成了(n=5)
#include
int main()
{
int n = 5;
//第一部分
for (int i = n / 2; i > 0; i--) {
for (int j = 0; j < n - i; j++)
printf(j < i ? " " : "*");
printf("\n");//每行打印完后,换行
}
//第二部分
for (int i = 0; i < n; i++)
printf("*");
printf("\n");
//第三部分
for (int i = 1; i <= n / 2; i++) {
for (int j = 0; j < n - i; j++)
printf(j < i ? " " : "*");
printf("\n");//每行打印完后,换行
}
return 0;
}
下面我们只需加一点小小的修改,加上一个scanf函数(vs编译器中,用scanf_s),来接受用户输入的行数n。
#include
int main()
{
int n = 5;
printf("请输入菱形行高:");
scanf_s("%d", &n);
//第一部分
for (int i = n / 2; i > 0; i--) {
for (int j = 0; j < n - i; j++)
printf(j < i ? " " : "*");
printf("\n");//每行打印完后,换行
}
//第二部分
for (int i = 0; i < n; i++)
printf("*");
printf("\n");
//第三部分
for (int i = 1; i <= n / 2; i++) {
for (int j = 0; j < n - i; j++)
printf(j < i ? " " : "*");
printf("\n");//每行打印完后,换行
}
return 0;
}
运行结果