c# 错误的输出,为什么它没有产生预期的输出,我如何修复这个错误?

pdtvr36n  于 2023-05-05  发布在  C#
关注(0)|答案(1)|浏览(228)

写一个程序,接受两个整数,让我们称之为hw,并绘制一个矩形,其规格如下:

  • 矩形的高度为h,宽度为w
  • 高度h表示矩形跨越的行数。
  • 宽度w表示每行可以包含的最大字符数。第一行和最后一行将分别有w个可见字符。
  • 中间的所有行都只有两个可见字符,一个在行的开头,另一个在行的结尾。
  • 可见字符是星号*或主题标签#
  • 每行中使用的可见字符必须在各行之间交替使用。第一行将使用星号,第二行将使用主题标签,第三行将使用星号,依此类推。
#include <stdio.h>

void draw_rectangle(int h, int w) {
    for (int i = 0; i < h; i++) {
        if (i == 0 || i == h - 1) {  // first and last rows
            for (int j = 0; j < w; j++) {
                printf("*");
            }
        } else {  // rows in between
            if (i % 2 == 0) {
                printf("#");
                for (int j = 0; j < w - 2; j++) {
                    printf(" ");
                }
                printf("#");
            } else {
                printf("*");
                for (int j = 0; j < w - 2; j++) {
                    printf(" ");
                }
                printf("*");
            }
        }
        printf("\n");
    }
}

int main() {
    draw_rectangle(5, 10);
    return 0;
}

预期输出:

Run1
5 10
**********
#      #
*      *
#      #
**********
Run2
7 4
****
#  #      
*  *
#  #
*  *
#  #
****
Run3
8 2
**
##
**
##
**
##
**
##
Run4
6 6
******
#   #
*   *
#   #
*   *
######

当前输出:

Run1
5 10
**********
*        *
#        #
*        *
**********
Run2
7 4
****
*  *
#  #
*  *
#  #
*  *
****
Run3
8 2
**
**
##
**
##
**
##
**
Run4
6 6
******
*    *
#    #
*    *
#    #
******
t9eec4r0

t9eec4r01#

发布的代码没有遵循问题的要求,所以它没有产生预期的输出:

void draw_rectangle(int h, int w) {
    for (int i = 0; i < h; i++) {
        if (i == 0 || i == h - 1) {  // first and last rows

        //         ^^^^^^^^^^^^^        ^^^^^^^^^^^^^^^^^^^

            for (int j = 0; j < w; j++) {
                printf("*");
            }  //      ^^^

        // "The visible characters used in each row must alternate between rows.
        //  The first row will use stars, the second row will use hashtags,
        //  the third row will use stars, and so on."

        // They don't say that the last row must be printed with '*'.

        } else {  // rows in between
            if (i % 2 == 0) {
            //  ^^^^^^^^^^
                printf("#");
            //         ^^^
                for (int j = 0; j < w - 2; j++) {
                    printf(" ");
                }
                printf("#");

            // The second row would the one with index i == 1, so that
            // i % 2 == 1, while the '#' will be printed for the third row.

            } else {
                // [...]
            }
        }
        printf("\n");
    }
}

请注意,打印预期图案的替代算法为

void draw_rectangle(int h, int w) {
    for (int i = 0; i < h; i++) {
        char fill = /* '*' if i % 2 == 0 or '#' otherwise */
        for (int j = 0; j < w; j++) {
            if ( /* (i,j) is on the edges of the rectangle */ )
                putchar(fill); 
            else     
                putchar(' ');
        }
        putchar('\n');
    }
}

相关问题