在用动态分配数组制作的板上用 SRAND 改变 6 个不同的随机数
Changing 6 different random numbers with SRAND in a board made with Dynamically Allocated Arrays
所以,我有一个代码可以创建一个 7x7 board 和 Dynamically Allocated Arrays 并且 board 内部充满了 "?" 我想做的是创建一个新函数,在函数内部,我使用 rand 命令 来获取这样的随机数,
int random() {
return ((rand() % 7) + 1);
}
因此,我在更改板上的 6 个随机数时遇到了问题,我的代码如下,
下面这个是我尝试获取数组随机数的那个,
printf("Enter number: ");
scanf("%d", &b);
char *rando = (char *)malloc(7 * 7 * sizeof(char));
for (i = 0; i < b; i++) {
rand1 = random();
rand2 = random();
*(rando + rand1 + rand2) = '*';
}
这一个是 我打印“?”的地方signs 以及我尝试更改 6 个不同 signs 的地方,它只打印出 "else" 部分,忽略了 "if" 出于某种原因
for (j = 0; j < 7; j++) {
if (*(board + i + j) == *(rando + i + j))
printf("| %c ", *(rando + i + j));
else
printf("| %c ", *(board + i + j));
}
我的整个代码是这样的,它有点长,但大部分都是为了一个漂亮的板子
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int random() {
return ((rand() % 7) + 1);
}
int main() {
int i, j, k, rand1, rand2, b;
srand(time(NULL));
printf("Enter number: ");
scanf("%d", &b);
char *rando = (char *)malloc(7 * 7 * sizeof(char));
for (i = 0; i < b; i++) {
rand1 = random();
rand2 = random();
*(rando + rand1 + rand2) = '*';
}
char *board = (char *)malloc(7 * 7 * sizeof(char));
for (i = 0; i < 7; i++) {
for (j = 0; j < 7; j++) {
*(board + i + j) = '?';
}
}
for (i = 1; i <= 7; i++) {
printf("%4d", i);
}
printf("\n ");
for (i = 0; i < 7; i++) {
printf("+---");
}
printf("+\n");
for (i = 0; i < 7; i++) {
printf("%d ",i);
for (j = 0; j < 7; j++) {
if (*(board + i + j) == *(rando + i + j))
printf("| %c ", *(rando + i + j));
else
printf("| %c ", *(board + i + j));
}
printf("|\n");
for (k = 0; k <= 7; k++)
if (k == 0)
printf(" ");
else
printf("+---");
printf("+\n");
}
}
我指出了我一直坚持的重要部分,但仍然不确定我的代码的其他部分是否存在问题,所以我在这里展示了它,以防万一.
您的代码中存在多个问题:
您将 7x7 矩阵分配为 49 个字符的单个数组。但是您没有使用正确的公式对该数组进行索引。位置 (i
,j
) 的元素被访问为 *(board + 7 * i + j)
,而不是 *(board + i + j)
.
声明 rando
和 board
指向二维矩阵并使用 []
语法会更简单:
char (*board)[7] = malloc(7 * sizeof(*board));
并使用 board[i][j]
.
此外,rando
数组是未初始化的,所以程序在第一次循环中读取未设置为'*'
的元素的内容时有未定义的行为.您必须使用 '?'
初始化此数组。您可以使用 memset()
.
函数 random()
returns 1
到 7
范围内的整数(含)。您应该改为计算 0
到 6
范围内的伪随机坐标。删除 +1
;
电路板打印循环中的测试没有用:如果位置 i
、j
的电路板元素与 rando
矩阵中的相同打印 rando
元素,否则打印板元素。这总是打印板元素。
这是修改后的版本:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
int random(void) {
return rand() % 7;
}
void init_board(char board[7][7]) {
// board can be initialized with 2 nested loops or
// a single call to
//memset(board, '?', 7 * 7);
for (int i = 0; i < 7; i++) {
for (int j = 0; j < 7; j++) {
board[i][j] = '?';
}
}
}
void print_board(char board[7][7]) {
for (int i = 0; i < 7; i++) {
printf("%4d", i + 1);
}
printf("\n ");
for (int i = 0; i < 7; i++) {
printf("+---");
}
printf("+\n");
for (int i = 0; i < 7; i++) {
printf("%d ", i + 1);
for (int j = 0; j < 7; j++) {
printf("| %c ", board[i][j]);
}
printf("|\n");
printf(" ");
for (int j = 0; j < 7; j++) {
printf("+---");
}
printf("+\n");
}
}
int main() {
int b;
srand(time(NULL));
printf("Enter number: ");
scanf("%d", &b);
char (*rando)[7] = malloc(7 * sizeof(*rando));
if (!rando)
return 1;
init_board(rando);
for (int i = 0; i < b; i++) {
int rand1 = random();
int rand2 = random();
rando[rand1][rand2] = '*';
}
char (*board)[7] = malloc(7 * sizeof(*board));
if (!board)
return 1;
init_board(board);
/* print the mines */
print_board(rando);
/* print the board */
print_board(board);
free(rando);
free(board);
return 0;
}
所以,我有一个代码可以创建一个 7x7 board 和 Dynamically Allocated Arrays 并且 board 内部充满了 "?" 我想做的是创建一个新函数,在函数内部,我使用 rand 命令 来获取这样的随机数,
int random() {
return ((rand() % 7) + 1);
}
因此,我在更改板上的 6 个随机数时遇到了问题,我的代码如下,
下面这个是我尝试获取数组随机数的那个,
printf("Enter number: ");
scanf("%d", &b);
char *rando = (char *)malloc(7 * 7 * sizeof(char));
for (i = 0; i < b; i++) {
rand1 = random();
rand2 = random();
*(rando + rand1 + rand2) = '*';
}
这一个是 我打印“?”的地方signs 以及我尝试更改 6 个不同 signs 的地方,它只打印出 "else" 部分,忽略了 "if" 出于某种原因
for (j = 0; j < 7; j++) {
if (*(board + i + j) == *(rando + i + j))
printf("| %c ", *(rando + i + j));
else
printf("| %c ", *(board + i + j));
}
我的整个代码是这样的,它有点长,但大部分都是为了一个漂亮的板子
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int random() {
return ((rand() % 7) + 1);
}
int main() {
int i, j, k, rand1, rand2, b;
srand(time(NULL));
printf("Enter number: ");
scanf("%d", &b);
char *rando = (char *)malloc(7 * 7 * sizeof(char));
for (i = 0; i < b; i++) {
rand1 = random();
rand2 = random();
*(rando + rand1 + rand2) = '*';
}
char *board = (char *)malloc(7 * 7 * sizeof(char));
for (i = 0; i < 7; i++) {
for (j = 0; j < 7; j++) {
*(board + i + j) = '?';
}
}
for (i = 1; i <= 7; i++) {
printf("%4d", i);
}
printf("\n ");
for (i = 0; i < 7; i++) {
printf("+---");
}
printf("+\n");
for (i = 0; i < 7; i++) {
printf("%d ",i);
for (j = 0; j < 7; j++) {
if (*(board + i + j) == *(rando + i + j))
printf("| %c ", *(rando + i + j));
else
printf("| %c ", *(board + i + j));
}
printf("|\n");
for (k = 0; k <= 7; k++)
if (k == 0)
printf(" ");
else
printf("+---");
printf("+\n");
}
}
我指出了我一直坚持的重要部分,但仍然不确定我的代码的其他部分是否存在问题,所以我在这里展示了它,以防万一.
您的代码中存在多个问题:
您将 7x7 矩阵分配为 49 个字符的单个数组。但是您没有使用正确的公式对该数组进行索引。位置 (
i
,j
) 的元素被访问为*(board + 7 * i + j)
,而不是*(board + i + j)
.声明
rando
和board
指向二维矩阵并使用[]
语法会更简单:char (*board)[7] = malloc(7 * sizeof(*board));
并使用
board[i][j]
.此外,
rando
数组是未初始化的,所以程序在第一次循环中读取未设置为'*'
的元素的内容时有未定义的行为.您必须使用'?'
初始化此数组。您可以使用memset()
.函数
random()
returns1
到7
范围内的整数(含)。您应该改为计算0
到6
范围内的伪随机坐标。删除+1
;电路板打印循环中的测试没有用:如果位置
i
、j
的电路板元素与rando
矩阵中的相同打印rando
元素,否则打印板元素。这总是打印板元素。
这是修改后的版本:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
int random(void) {
return rand() % 7;
}
void init_board(char board[7][7]) {
// board can be initialized with 2 nested loops or
// a single call to
//memset(board, '?', 7 * 7);
for (int i = 0; i < 7; i++) {
for (int j = 0; j < 7; j++) {
board[i][j] = '?';
}
}
}
void print_board(char board[7][7]) {
for (int i = 0; i < 7; i++) {
printf("%4d", i + 1);
}
printf("\n ");
for (int i = 0; i < 7; i++) {
printf("+---");
}
printf("+\n");
for (int i = 0; i < 7; i++) {
printf("%d ", i + 1);
for (int j = 0; j < 7; j++) {
printf("| %c ", board[i][j]);
}
printf("|\n");
printf(" ");
for (int j = 0; j < 7; j++) {
printf("+---");
}
printf("+\n");
}
}
int main() {
int b;
srand(time(NULL));
printf("Enter number: ");
scanf("%d", &b);
char (*rando)[7] = malloc(7 * sizeof(*rando));
if (!rando)
return 1;
init_board(rando);
for (int i = 0; i < b; i++) {
int rand1 = random();
int rand2 = random();
rando[rand1][rand2] = '*';
}
char (*board)[7] = malloc(7 * sizeof(*board));
if (!board)
return 1;
init_board(board);
/* print the mines */
print_board(rando);
/* print the board */
print_board(board);
free(rando);
free(board);
return 0;
}