首页 新闻 会员 周边

C语言,北理六边形改错题

0
悬赏园豆:50 [已解决问题] 解决于 2020-03-13 18:21

题目代码:

include<stdio.h>

int main( )
{ int i, j, n;
printf("\nPlease Enter n:");
scanf ("%d", &n);
for(i=1;i<=n;i++)
{ for(j=1;j<=2n-i;j++)
if(j==n-i+1 || j>n-i+1 && i==1)
printf("
");
else printf(" ");
}
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");
}
}

墨梅渐盛的主页 墨梅渐盛 | 初学一级 | 园豆:82
提问于:2020-03-13 16:07
< >
分享
最佳答案
0

修改后的代码

#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;
}

如果是学校的OJ自动判题, 而不是人工判题的话, 你需要提交这样的代码(即 去掉无关输出)

#include <stdio.h>

int main() {
    int i, j, n;
    scanf("%d", &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;
}
收获园豆:50
KimBing_Ng | 菜鸟二级 |园豆:352 | 2020-03-13 17:20

谢谢,请问你是如何构思这类题目的呢?
这是我自己改的,觉得与你的高下立判:

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<=2n+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");
}

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");
}

}

墨梅渐盛 | 园豆:82 (初学一级) | 2020-03-13 18:21

@墨梅渐盛: 只能说代码写多了就熟练了, 没有太多技巧. 如果你以后对算法竞赛有兴趣, 那才需要一定的做题技巧

对于这道题 你和我的区别也只在关于第一行的处理 你自己写了一个if (i == 1)

实际上, 在题目提供的代码中, 已经有了第一行的情况, 而我是顺着他提供的写, 你是自己重新写了一个第一行的情况 <br/>

提供的代码的思路也是很好理解的 i和j分别代表横纵坐标 对不同的位置有不同的填充字符而已

KimBing_Ng | 园豆:352 (菜鸟二级) | 2020-03-13 18:32

@KimBing_Ng: 👌

墨梅渐盛 | 园豆:82 (初学一级) | 2020-03-13 18:40

@KimBing_Ng: 你好,可以麻烦再问你一次关于昨天的题目吗?就是每行与每列之间循环的次数,我可以自己列出来,算出来,但是如何写出合适的for循环判断条件来将n,j,i连接起来呢?我试过待定系数法(ai+b=j)但是算出来的条件只符合n=5的情况,如何构思呢?这类图形打印的题目,应该是有什么普遍的规律的吧?

墨梅渐盛 | 园豆:82 (初学一级) | 2020-03-14 13:53

@墨梅渐盛: 你说只符合n=5的情况 怕是吧5这个数字戴进去待定系数法中解放城了吧 你应该把n代进去解方程 得到的i, j关系应该是关于n的函数

至于你说的普遍的规律

怕是没有, 但是可以给你说个通用的无脑做法 (少考虑很多东西)

  1. 计算出你的图形最大有多大, 比如5的多边形, 那他的大小可能是(9 * 13 ) 也就是 2n -1 , 3 n - 2,那就直接i,j暴力循环那么多次
    for (int i = 0; i < 2 * n - 1; ++i) {
        for(int j  = 0; i < 3 * n - 2; ++j) {
            if (shouldPrintStar(i, j))
                putchar('*');
            else 
                putchar(' ');
        }
        putchar('\n');
    }
  1. 第二步就来写shouldPrintStar()函数, 在函数里, 根据图形规律写出什么时候应该要画星星
    比如
int shouldPrintStar(int i, int j) {
    // 多边形第一行
    if (i == 0 && j >= n - 1 && j <= 2 * n - 2 )
        return 1;
    else if(.....)
    /* 其他情况  自己写上条件判断, 应该画星的return 1即可 */
    else return 0; // 其他的填充空格
}

如果有更多问题, 你可以私信我或者加我QQ, 我很乐意认识各地的大学生~

KimBing_Ng | 园豆:352 (菜鸟二级) | 2020-03-14 14:08

@KimBing_Ng: 谢谢,C语言的函数还没得学到,之前学过一点Java大致能懂意思,以后我试试,关于“你应该把n代进去解方程 得到的i, j关系应该是关于n的函数”这步操作不是很懂?

墨梅渐盛 | 园豆:82 (初学一级) | 2020-03-14 14:18
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册