循环应用之六边形
关键是循环判断条件的计算与星号输出的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

浙公网安备 33010602011771号