我正在编写一个执行以下操作的程序。我已经完成了我的代码,我认为这很好,但我正在尝试做以下我无法理解的事情。
1.将指向矩阵的指针传递给函数,并让该函数更改矩阵。主函数应该定义数组,初始化它,然后调用(a(个函数来操作它
2.使用字母"A"到"Z",然后使用字母"A"到"Z"。这意味着随机行走将达到52个位置。对于这个,我已经有了字母A到Z,但不知道如何有"A"到"Z"的
Write a program that generates a “random walk” across a 10 x 10 array. The array will contain character (all ‘.’ Initially). The program must randomly “walk” from element to element, always going up, down, left, or right by one element. Z, in the order visited. Here’s an example of the desired output:
A . . . . . . . . .
B C D . . . . . . .
. F E . . . . . . .
H G . . . . . . . .
I . . . . . . . . .
J . . . . . . . . .
K . . R S T U V Y .
L M P Q . . . W X .
. N O . . . . . . .
. . . . . . . . . .
#include<stdio.h>
#include<math.h>
#include <stdlib.h>
int main ()
{
void printarray(char array[12][12], int x, int y); /*Function prototype*/
int i = 0, roll = 0, row = 0, col = 0, rowcheck = 0, colcheck = 0; /*i = number of moves. roll = value generated by the random number generator. r = row location. col = column location. rowcheck and colcheck are the incremented and decremented values of row and col respectively, used to check whether a legal move can be performed*/
char position[12][12], chtr = 'A'; /*position[12][12] = Grid for the walking. chtr = the letters of the Alphabet.*/
for (row = 0; row < 12; row++) /*Fills the 12 x 12 array with the "." character*/
{
for (col = 0; col < 12; col++)
{
position[row][col] = '.';
}
}
srand(5000); /*Seeds the random number function*/
for (i = 0, row = 0, col = 0, rowcheck = 0, colcheck = 0; i < 25;)
{
rowcheck = row;
colcheck = col;
roll = rand() % 4;
switch (roll) /*Determines what direction to move starting from the top left corner of the grid (bird's eye view)*/
{
case 0: /*Move up*/
{
rowcheck--;
}
case 1: /*Move left*/
{
colcheck--;
}
case 2: /*Move down*/
{
rowcheck++;
}
case 3: /*Move right*/
{
colcheck++;
}
}
if ((rowcheck < 0 || rowcheck > 9) || (colcheck < 0 || colcheck > 9) || (position[rowcheck][colcheck] != '.'))
{
continue;
}
else
{
row = rowcheck;
col = colcheck;
position[row][col] = chtr;
chtr++;
printarray(position, row, col);
i++;
}
}
exit (0);
}
/*Function declaration*/
void printarray(char array[12][12], int x, int y){
printf("CURRENT POSITION %d %dn", x, y);
for (x = 0; x < 12; x++) /*Prints out the values of the array*/
{
for (y = 0; y < 12; y++)
{
printf("%c", array[x][y]);
}
printf("n");
}
printf("n");
}
好吧,您的问题是纯逻辑问题。您面临的主要问题是:
if ((rowcheck < 0 || rowcheck > 9) ||
(colcheck < 0 || colcheck > 9) ||
(position[rowcheck][colcheck] != '.'))
每当rowcheck
或colcheck
小于0
或大于11
时,这将调用未定义的行为。(无论值如何,都可以设置position[rowcheck][colcheck]
,这可以很容易地设置在position
的限制之外(
您的其余问题是在switch
语句本身中控制rowcheck
或colcheck
值的类似失败。在增加或减少值之前,您需要测试这些值——强制值保持在限制范围内,例如:
switch (roll) {
case 0: /*Move up */
if (rowcheck > 0)
rowcheck--;
break;
...
我不完全确定您试图实现什么,但以下将是对您的代码的清理,这似乎是您想要的(尽管我不确定它是否在您的整个预期范围内迭代或增量(。在编写代码时,您也不需要math.h
,并且我为memset
添加了string.h
,从而消除了'.'
初始化循环。
如果你使用srand (5000);
以外的东西,你也会得到更好的随机分布。一个简单的选择是包括time.h
并使用srand (time (NULL));
最后,在代码中避免使用幻数(例如12
和9
(。如果您需要常数#define
,请使用它们或使用enum
设置全局常数(如下所示(:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
enum { MAXC = 9, DIM = 12 };
void printarray (char array[DIM][DIM], int x, int y); /*Function prototype */
int main (void) {
int i = 0, roll = 0, row = 0, col = 0, rowcheck = 0, colcheck = 0;
char position[DIM][DIM], chtr = 'A';
/*Fills the DIM x DIM array with the '.' character */
memset (position, '.', sizeof position);
srand (time (NULL)); /* Seeds the random number function */
for (i = 0, row = 0, col = 0, rowcheck = 0, colcheck = 0; i < 25; i++) {
rowcheck = row;
colcheck = col;
roll = rand () % 4;
switch (roll) {
case 0: /*Move up */
if (rowcheck > 0)
rowcheck--;
break;
case 1: /*Move left */
if (colcheck > 0)
colcheck--;
break;
case 2: /*Move down */
if (rowcheck < DIM - 2)
rowcheck++;
break;
case 3: /*Move right */
if (colcheck < DIM - 2)
colcheck++;
break;
}
if (rowcheck > MAXC || colcheck > MAXC ||
position[rowcheck][colcheck] != '.')
continue;
row = rowcheck;
col = colcheck;
position[row][col] = chtr;
if (chtr < 'Y') /* allow lower and upper case */
chtr++;
else if (chtr == 'Z')
chtr = 'a';
else if (chtr > 'a' && chtr < 'z')
chtr++;
else
chtr = 'A';
printarray (position, row, col);
}
exit (0);
}
/*Function declaration */
void printarray (char array[DIM][DIM], int x, int y)
{
printf ("CURRENT POSITION %d %dn", x, y);
for (x = 0; x < DIM; x++) { /*Prints out the values of the array */
for (y = 0; y < DIM; y++) {
printf ("%c", array[x][y]);
}
printf ("n");
}
printf ("n");
}
仔细看一下,如果你有进一步的问题,或者你想为你打算做的事情添加更多的信息,请告诉我。