C将字符插入到2D数组中,距离定义的位置一定距离

but5z9lq  于 2023-03-17  发布在  其他
关注(0)|答案(2)|浏览(89)

我需要从指定的位置在给定的范围内向二维数组中插入字符来“绘制”。
我把字母'A'放在矩阵中,位置是7,7,我想从字母'A'画出'x',四个左,四个右,然后向上一步一行,x就在A的上面,三个左,三个右,再向上一步,两个左,两个右,再画一遍,同样向下。
听起来很简单,但是我做不到,我需要一些帮助。看起来我在第一个循环中做错了什么。

#include <stdio.h>
#include <string.h>

char matrix[14][22];
int i,j,ran;
int range = 4;
int posx = 7;
int posy = 7;

void draw_range(void){
    for (ran=range;ran>=0;ran--){
        /* drawing range to the right side */
        /* up */
        for(i=0;i<=ran;i++) {
            if (matrix[posy-i][posx+range-ran] == '.'){
                matrix[posy-i][posx+range-ran] = 'x';
            }
            /* down */
            if (matrix[posy-i+ran][posx-ran+range] == '.'){
                matrix[posy-i+ran][posx-ran+range] = 'x';
            }
        }
    }
    /* drawing range to the left side */
    for (ran=0;ran<range;ran++){
        /* down */
        for(i=range;i>0;i--){
                if (matrix[posy+ran][posx-i+ran] == '.'){
                    matrix[posy+ran][posx-i+ran] = 'x';
                }
                /* up */
                if (matrix[posy-ran][posx-i+ran] == '.'){
                    matrix[posy-ran][posx-i+ran] = 'x';
                }
            }
        }
}

int main (int argc, char *argv[]){
    // fill array with spaces
    for (i=0;i<14;i++) {
        for (j=0;j<22;j++) {
            matrix[i][j] = '.';
        }
    }

    // put symbol to arrat
    matrix[posy][posx] = 'A';

    draw_range();

    // print array
    for (i=0;i<14;i++) {
        for (j=0;j<22;j++) {
            printf("%c",matrix[i][j]);
        }
        printf("\n");
    }
}

编译方式:gcc main.c -o main .
预期输出:

......................
......................
......................
.......x..............
......xxx.............
.....xxxxx............
....xxxxxxx...........
...xxxxAxxxx..........
....xxxxxxx...........
.....xxxxx............
......xxx.............
.......x..............
......................
......................

我的代码的输出:

......................
......................
......................
.......x..............
......xxxx............
.....xxxxx............
....xxxxxxx...........
...xxxxAxxxx..........
....xxxxxxx...........
.....xxxxx............
......xxxx............
.......x..............
......................
......................
xhv8bpkk

xhv8bpkk1#

在测试代码和进行调试时,争论的焦点在于,用于测试并在模式的左半部分绘制“x”的“for”循环实际上对模式右手侧的一个位置进行了测试和验收,并将.“”更改为“x”。
这是发生此问题的“for”循环。

/* drawing range to the left side */
for (ran=0;ran<range;ran++){
    /* down */
    for(i=range;i>0;i--){
            if (matrix[posy+ran][posx-i+ran] == '.'){
                matrix[posy+ran][posx-i+ran] = 'x';
            }
            /* up */
            if (matrix[posy-ran][posx-i+ran] == '.'){
                matrix[posy-ran][posx-i+ran] = 'x';
            }
        }
    }

当“ran”的值为“3”且“i”的值为1时,所得“x轴”位置为“9”,其位于图案的右手侧。
为了不因尝试重写循环而中断程序正在执行的操作,我重构了“for”循环中的测试,以确保测试仅适用于模式的左侧,如下所示。

/* drawing range to the left side */
for (ran=0; ran<range; ran++)
{
    /* down */
    for(i=range; i>0; i--)
    {
        if (matrix[posy+ran][posx-i+ran] == '.' && (ran - i < 0))
        {
            matrix[posy+ran][posx-i+ran] = 'x';
        }
        /* up */
        if (matrix[posy-ran][posx-i+ran] == '.' && (ran - i < 0))
        {
            matrix[posy-ran][posx-i+ran] = 'x';
        }
    }
}

对于重构后的代码块,终端的输出如下所示。

@Vera:~/C_Programs/Console/Diamond/bin/Release$ ./Diamond 
......................
......................
......................
.......x..............
......xxx.............
.....xxxxx............
....xxxxxxx...........
...xxxxAxxxx..........
....xxxxxxx...........
.....xxxxx............
......xxx.............
.......x..............
......................
......................

如前所述,可能还有其他方法可用于校正回路范围,但有时简单的测试修订是最佳解决方案。
给予这个重构的代码,看看它是否符合项目的精神。

gpfsuwkq

gpfsuwkq2#

  • 您可以简化要用“x”填充的位置的计算。
  • 在代码中嵌入幻数(如2214)不是一个好主意。请改用#define
  • draw_range()函数传递参数比声明全局变量更好。

那么请你试试:

#include <stdio.h>
#include <string.h>

#define WIDTH 22
#define HEIGHT 14
#define POSX 8
#define POSY 7
#define RANGE 4

void draw_range(char matrix[HEIGHT][WIDTH], int range, int posx, int posy) {
    int i, j, ofst;
    for (i = posy - range; i <= posy + range; i++) {
        ofst = (i - posy) > 0 ? (i - posy) : (posy - i);
        for (j = posx - range + ofst; j <= posx + range - ofst; j++) {
            if (matrix[i][j] == '.') {
                matrix[i][j] = 'x';
            }
        }
    }
}

int main () {
    int i, j;
    char matrix[HEIGHT][WIDTH];

    // fill array with spaces
    for (i = 0; i < HEIGHT;i++) {
        for (j = 0; j < WIDTH; j++) {
            matrix[i][j] = '.';
        }
    }

    // put symbol to arrat
    matrix[POSY][POSX] = 'A';

    draw_range(matrix, RANGE, POSX, POSY);

    // print array
    for (i = 0; i < HEIGHT; i++) {
        for (j = 0; j < WIDTH; j++) {
            printf("%c", matrix[i][j]);
        }
        printf("\n");
    }
}

相关问题