2015-02-09 64 views
0

我试图创建一个程序打印如下图绘制内的另一个

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

如果它应该画正方形,为什么你的例子输出显示矩形? – interjay 2015-02-10 00:01:17

+0

如果你需要的数字恰好是这个例子中的数字,那么你不需要制定一个算法来决定是打印1还是0,你需要的是将数值存储在数组中,如果你需要一个通用的算法** Rizier123 **的解决方案可能会或可能不适合你。 – 2015-02-10 00:06:23

+1

你需要解释程序应该做什么。目前还不清楚其他尺寸的产品应该如何。目前还不清楚为什么产量不是正方形。 – interjay 2015-02-10 00:10:34

回答

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的和后无不洋溢着0的,那么这应该为你工作:

(这里我只是简单的检查一下是否是第二个方块,如果是打印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 
+0

为什么downvote?请解释 – Rizier123 2015-02-10 00:00:44

+0

因为它是错误的(它可能会显示更大尺寸的奇怪形状),并且因为它没有解释。为他们解决某人的功课毫无意义。真正的问题是为什么有人提出了一个甚至不正确的代码块答案。 – interjay 2015-02-10 00:01:59

+0

@interjay忽略了一些东西,现在它应该是正确的,也试图解释我在这里做什么 – Rizier123 2015-02-10 00:06:40

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相同,为了防止在角上画一个十字,您需要检查如果i == 1j != 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; 
} 
+0

这似乎不正确,即使是你应该解释它。这些乘法和模数是完全不必要的,似乎只不过是混淆而已,因为它们可以用简单的比较来代替(例如'(1 + i)%side == 0' - >'i == side-1') 。 – interjay 2015-02-09 23:58:40

+0

@iharob:不会打印中心的两个零点 – CooperJames 2015-02-09 23:59:30

+0

他们不是,想到这一点完全有效,当然它们并不是真的需要,但是因为无法知道OP究竟在尝试什么那么,这回答了OP的问题。 – 2015-02-09 23:59:42

相关问题