试图编写一个在C中输出棋盘的代码

时间:2018-02-18 23:10:26

标签: c for-loop printf

我试图编写一个代码,通过使用for循环输出带有星号的棋盘类型效果。我似乎无法让它工作。这是我的代码。任何帮助是极大的赞赏。

#include <stdio.h>

int main (void) 
{   
   int a;
   int b;

   for(a=1; a<=10; a+=2)
   { 
      printf("* * * * * * * * * *");
   }

   for (b=2; b<=10; b+=2)
   { 
    printf(" * * * * * * * * * ");
   }

   return 0; 
}

5 个答案:

答案 0 :(得分:3)

您需要交替每一行

#include <stdio.h>

int main (void) {   
    int a;

    for(a=1; a<=10; a+=2) { 
        printf("* * * * * * * * * *\n");
        printf(" * * * * * * * * * \n");
    }
    return 0;
}

答案 1 :(得分:2)

尝试使用单个循环并a % 2在两种类型的行之间切换:

#include <stdio.h>

int main (void) 
{   
  for (int a = 1; a <= 10; a += 1)
  { 
    if (a % 2 == 0)
      printf(" * * * * * * * * * \n");
    else
      printf("* * * * * * * * * *\n");
  }
  return 0;
}

答案 2 :(得分:2)

以下是我的解决方案,尽量保持简单

#include<stdio.h>

int main() {
    // We want 10 checkerboard lines, so we iterate from 0 through 9
    for(int a = 0; a < 10; ++a) {
        // We want to change the pattern any other line, an easy way to do this is to 
        // branch on whether the iterator index, a, is even (a%2 = 0), or odd (a%2 != 0).
        if(a%2){
            // If a is odd we print the shifted pattern, with a newline
            printf(" * * * * * * * * * \n");
        }else {
            // if a is even, we print the normal pattern
            printf("* * * * * * * * * *\n");
        }
    }
}

答案 3 :(得分:1)

你正在打印所有奇数行,然后是你的检查板的所有偶数行。而且你错过了回车。你可以尝试只用一个循环。

  #include <stdio.h>

  int main (void) 
  {   

     for(int a=1; a<=10; a+=2)

     {   
       printf("* * * * * * * * * *\n")
       printf(" * * * * * * * * * \n") 
     }

     return 0;

  }

答案 4 :(得分:0)

虽然打印固定尺寸的电路板没有任何问题,但为什么要限制自己输出 string-literal ?计算机是以灵活的方式解决问题。如果不想要9行的10/9星号,你想要将电路板的尺寸加倍?或者,再添加一列和两行?你会被困在改变你的字符串文字循环条件。

让计算机处理根据行数的简单输入确定要打印的内容?现在数字必须是一个奇数,所以如果输入偶数行,你可以决定加一或减一,但除此之外,写一个处理其余行的算法。这需要额外的努力,例如

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

#define ROWS 9
#define COLS ROWS

int main (int argc, char **argv) {

    int rows = argc > 1 ? atoi (argv[1]) : ROWS,
        cols = rows & 1 ? rows : (rows += 1);    /* must be odd */

    for (int i = 0; i < rows; i++) {    /* output rows */
        if ((i & 1) == 0)
            putchar ('*');
        for (int j = 0; j < cols; j++)  /* output cols */
            fputs (" *", stdout);
        putchar ('\n');
    }

    return 0;
}

注意:你应该使用strtol代替atoi并对输入进行错误检查,你应该检查给出的参数是否为非负数并且限制它可以说101或其他东西可能适合你的终端宽度/高度,但那些留给你。)

示例使用/输出

$ ./bin/checkers
* * * * * * * * * *
 * * * * * * * * *
* * * * * * * * * *
 * * * * * * * * *
* * * * * * * * * *
 * * * * * * * * *
* * * * * * * * * *
 * * * * * * * * *
* * * * * * * * * *

双尺寸板:

$ ./bin/checkers 19
* * * * * * * * * * * * * * * * * * * *
 * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * *
 * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * *
 * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * *
 * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * *
 * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * *
 * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * *
 * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * *
 * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * *
 * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * *

关键在于设计代码,使其尽可能健壮且灵活。当您能够以提供灵活解决方案的方式完成同样的事情时,不要限制您的代码。