循环结构课后反思

                                                               一、   个人认为的重点

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。

posted @ 2019-04-13 13:22  布达拉弓  阅读(249)  评论(0编辑  收藏  举报