在另一个内画一个正方形

时间:2015-02-09 23:50:10

标签: c

我正在尝试创建一个程序打印下图

000000
011110
010010
011110
000000

我制作了这个小代码

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int i, j, side;

    printf("Enter side: ");
    scanf("%d", &side);

    for( j = 0; j < side; j++ )
    {
      for( i = 0; i < side; i++ )
         if((i*j == 0) || ((i*j)%side==0)) //as should be the condition here
            printf("0");
         else
            printf("1");
    printf("\n");
    }     
    return 0;       
}

不打印我想要的问题是在如果的条件下我不知道应该怎么做我不擅长数学。有人可以帮我解决这个小问题吗?

编辑

例如

条目:8

输出:

00000000
01111110
01000010
01000010
01000010
01111110
00000000

2 个答案:

答案 0 :(得分:3)

这应该适合你:

(这里我只是简单地搜索最小数量的:rows(side - 1)columns(side)rowCount(j)columnCount(i)然后i使用模运算符来得到01

#include <stdio.h>

int min(int x, int y) {
    return (x < y ?x:y);
}

int main() {    
    int i, j, side;

    printf("Enter side: ");
    scanf("%d", &side);

    for( j = 1; j < side; j++ ) {
        for( i = 1; i <= side; i++ )
            printf("%d", (min(i - 1, min(j - 1, min(side - j - 1, side - i)))) % 2);        
        printf("\n");
    }    
    return 0;    
}

输入:

6

输出:

000000
011110
010010
011110
000000

修改

如果您只想要1个1和1的方格,之后全部填充0&#39; s,那么这应该适合您:

(这里我只是简单地检查它是否是第二个方格,如果是,则打印1,否则打印0)

#include <stdio.h>

int min(int x, int y) {
    return (x < y ?x:y);
}

int main() {
    int i, j, side;

    printf("Enter side: ");
    scanf("%d", &side);

    for( j = 1; j < side; j++ ) {
        for( i = 1; i <= side; i++ )
            if(min(i - 1, min(j - 1, min(side - j - 1, side - i))) == 1)
                printf("1");
            else
                printf("0");
        printf("\n");
    }
    return 0;
}

输入:

6  // 8

输出:

000000  // 00000000
011110  // 01111110
010010  // 01000010
011110  // 01000010
000000  // 01000010
        // 01111110
        // 00000000

答案 1 :(得分:0)

确实是if试试这个

#include <stdio.h>
#include <stdlib.h>

static inline int isValid(int i, int j, int side)
{
    return (((i == 1) || (i == side - 2)) && ((j != 0) && (j != side - 1)));
}

int main(void)
{
    int i, j, side;

    printf("Enter side: ");
    scanf("%d", &side);

    for (j = 0 ; j < side ; j++)
    {
        for (i = 0 ; i < side ; i++)
        {
            if ((isValid(i, j, side) != 0) || (isValid(j, i, side) != 0))
                printf("1");
            else
                printf("0");
        }
        printf("\n");
    }
    return 0;
}

您只需要检查i == 1是否为i == side - 2,因为它是第二行/列,或j,因为这将是{{1}的相同的前一行/列},为了防止在角落上画十字,您需要检查i == 1然后j != 0以及i == side - 2然后j != side - 1

你当然可以这样做

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int i, j, side;

    printf("Enter side: ");
    scanf("%d", &side);

    /* print first row all 0's */
    for (j = 0 ; j < side ; j++)
        printf("0");
    printf("\n");

    for (j = 1 ; j < side - 1 ; j++)
    {
        /* print first column 0 always */
        printf("0");
        if ((j == 1) || (j == side - 2))
        {   /*                       ^ this is because the loops start at 0 */
            /* this is the second of side - 1 row */
            for (i = 1 ; i < side - 1 ; i++)
                printf("1");
        }
        else
        {
            /* if the column is the second or it's the (side - 1)th print 1, otherwise 0 */
            for (i = 1 ; i < side - 1 ; i++)
                printf(((i == 1) || (i == side - 2)) ? "1" : "0");
        }

        if (i == side - 2)
            printf("1");
        else
            printf("0");

        printf("\n");
    }

    /* print last row all 0's */
    for (j = 0 ; j < side ; j++)
        printf("0");
    printf("\n");
    return 0;
}