我需要从指定的位置在给定的范围内向二维数组中插入字符来“绘制”。
我把字母'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..............
......................
......................
2条答案
按热度按时间xhv8bpkk1#
在测试代码和进行调试时,争论的焦点在于,用于测试并在模式的左半部分绘制“x”的“for”循环实际上对模式右手侧的一个位置进行了测试和验收,并将.“”更改为“x”。
这是发生此问题的“for”循环。
当“ran”的值为“3”且“i”的值为1时,所得“x轴”位置为“9”,其位于图案的右手侧。
为了不因尝试重写循环而中断程序正在执行的操作,我重构了“for”循环中的测试,以确保测试仅适用于模式的左侧,如下所示。
对于重构后的代码块,终端的输出如下所示。
如前所述,可能还有其他方法可用于校正回路范围,但有时简单的测试修订是最佳解决方案。
给予这个重构的代码,看看它是否符合项目的精神。
gpfsuwkq2#
22
和14
)不是一个好主意。请改用#define
。draw_range()
函数传递参数比声明全局变量更好。那么请你试试: