循环应用之六边形

关键是循环判断条件的计算与星号输出的IF判断语句
六边形随着n的增加,左斜边与水平边也同样在增加,通过列出循环次数表就会发现
n与j的关系是n+1,j+2;
 
上部分:
循环判断条件:
n,i的变化与j都有关系,使用待定系数法:j(max)=an+bi+c得出结果:2*n+i-3
 
IF判断条件:同样列出空格与字符的变化表,每行都会在n-i+1处输出字符
第一行需要特殊处理,在大于等于n-i+1后也需要输出字符
末尾跳出循环,输出字符换行
 
下半部分:
循环判断条件:
n,i的变化与j都有关系,使用待定系数法:j(max)=an+bi+c得出结果:2*n+(n-i)-3
公式推导:因为i在增大,六边形在变窄,所以距离底边距离(n-i)对应上半部分的i
 
 
IF判断条件:同样列出空格与字符的变化表,每行都会在i+1处输出字符
第一行需要特殊处理,在大于等于i+1后也需要输出字符
末尾跳出循环,输出字符换行
原题:
 
 
 
 
 1 #include<stdio.h>
 2  int  main( )
 3  { int i, j, n;
 4    printf("\nPlease Enter n:");
 5    scanf ("%d", &n);
 6    for(i=1;i<=n;i++)                 
 7    {  for(j=1;j<=2*n-i;j++)
 8          if(j==n-i+1 || j>n-i+1 && i==1)
 9             printf("*");
10          else  printf(" "); 
11    }
12    for(i=1;i<n;i++)              
13    {  for(j=1;j<=3*(n-1)-i;j++)
14          if(j==i+1 || j>i+1 && i==n-1)
15             printf("*");
16          else  printf(" ");
17       printf("*\n");
18    }
19 }

 

 
 
 
 
 
原题的错误:上半部分问题,j列的限制条件错误,而且行之间没有换行
 
实现方法方法一:修改限制条件
#include<stdio.h>
int main() {
    int i, j, n;
    printf("\nPlease Enter n:");
    scanf("%d", &n);
    printf("\n");
    for (i = 1; i <= n; i++) {
        for (j = 1; j <= 2 * n + i - 3; j++)
            if (j == n - i + 1 || j > n - i + 1 && i == 1)
                printf("*");
            else
                printf("^");
        printf("*\n");
    }
    for(i=1;i<n;i++)
    {
        for(j=1;j<=3*(n-1)-i;j++)
        {
            if(j==i+1||j>i+1&&i==n-1)
            {
                printf("*");
            }else
            {
                printf("^");
            }
        }
        printf("*\n");

    }
    return 0;
}

 

方法二:将首行拆分出来单独输出计算,判断条件相差1,因为直接把*号直接输出换行没有再跳到循环外面换行。
#include<stdio.h>
int main() {
    int i, j, n;
    printf("\nPlease Enter n:");
    scanf ("%d", &n);
    for(i=1; i<=n; i++) {
        if(i==1) {
            for(j=1; j<=2*n+i-2; j++) {
                if(j==n-i+1 || j>n-i+1)
                    printf("*");
                else  printf("^");
            }
            printf("\n");
            continue;
        }
​
        for(j=1; j<=2*n+i-3; j++) {
            if(j==n-i+1)
                printf("*");
            else  printf("^");
        }
        if(i!=1) {
            printf("*");
        }
        printf("\n");
    }
 //下半部分与方法一一样
 

https://note.youdao.com/ynoteshare1/index.html?id=f051d49fcb7780aefbb7b7087e8c7e4f&type=note

posted @ 2020-03-20 14:12  墨梅渐盛  阅读(405)  评论(1)    收藏  举报