一、 个人认为的重点
1.for循环中(<条件表达式>;<循环表达式>;<循环体语句>)的熟练运用。
2.循环结构的熟练嵌套以及每一个嵌套循环所代表的含义要极为清楚。
3.循环表达式的书写,尝试多样化的表达式。
二、解析代码
#include<stdio.h> int main() { int i,j,k,width; printf("亲输入最大宽度:\n"); scanf("%d",&width); if(width%2!=0) { for(i=1;i<=(width+1)/2;i++) { for(j=i;j<=(width-1)/2;j++) printf(" "); for(k=1;k<=2*i-1;k++) printf("*"); printf("\n"); } for(i=1;i<=(width-1)/2;i++) { for(j=1;j<=i;j++) printf(" "); for(k=1;k<=width-2*i;k++) printf("*"); printf("\n"); } } else printf("错误\n") ; }
解析:首先这个代码实现的图形是一个菱形,而实现这个图形的切入点就是“width”--它的最长宽度了。我们发现,以这一个最长宽度为界限,整个图形被分为两部分,即两个等腰三角形,而最长宽度必须要为单数,不然就实现不了顶部数量为一个*号的菱形。
所以,先用“if”条件语句判断是否width为单数再进行之后的循环,不是的话则输出“错误”。我们先对上面的三角新进行编写:在用“int”定义了i(行),j(“空格”),k(“*”)之后,先对“i”循环进行编写。我们发现最大宽度“width”所对应的等腰三角形的行数的关系是i=(width+1)/2,比如,输入的最大宽度“width”的值为13,那它所对应的行数就是7了,所以i要小于等于这个行数,也就是i<=(width+1)/2。之后在“i”循环的下面进行有关“j”和"k"的嵌套。
"j"是“空格”的输出。在第一行中,当输入的“width”是13时,每行要输出的空格数量分别是6、5、4、3、2、1、0,那么其对应的关系就应该是j=(width-1)/2,所以j<=(width-1)/2,j=i进行赋值,j++进行循环。注意:我们发现“(width-1)/2”是一个定值。要想让输出的空格数量逐一递减那么前面对“j”的赋值就应该是变量了,所以让"j=i",后面对“k”的赋值我们换成让k的关系式为变量,那么相应的“k”的赋值就应该是“k=1”了。
同样,“k”是“*”的输出。“k”的每行输出数量依次是1、3、5、7...,这里我们不写K和“width”的关系式,而改成与“i”形成的变量关系式。于是根据等差数列,有k=2*i-1,所以k<=2*i-1,k=1赋值,k++循环。到这里就完成了上部分的等腰三角形了:
下半部分的三角形在行数是比上半部分行数少一的,故:i<=(width-1)/2。每行要输出的空格分别是1、2、3....递增,由于“i”本身自增,所以j=1,j<=i,i++。每行要输出的“*”分别是以“-2”为公差的等差数列,首项是最大宽度下面的一行即:width-2,由等差公式an=a1+d(n-1)可得k<=width-2i。
原文地址:https://www.cnblogs.com/Artificial/p/10693164.html