Изменение 6 разных случайных чисел с помощью SRAND на доске, созданной с использованием динамически распределенных массивов - PullRequest
1 голос
/ 14 апреля 2020

Итак, у меня есть код, который создает 7x7 плату с динамически распределенными массивами , а внутри платы полно "?" и что я хочу создать новую функцию, и внутри функции я использовал rand command , чтобы получить случайные числа, подобные этой,

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) = '*';
    }

И это где Я напечатал "?" знаки , а также там, где я пытался изменить 6 различных знаков , и он выводит только "else" part, игнорируя "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");
    }
}

Я указал важный части , с которыми я застрял, но все еще не уверен, что есть проблема в других частях моего кода, поэтому я показал это здесь, на всякий случай .

1 Ответ

1 голос
/ 15 апреля 2020

В вашем коде есть несколько проблем:

  • Вы выделяете матрицу 7x7 как один массив из 49 символов. Тем не менее, вы не вносите в этот массив правильную формулу. Элемент в позиции (i, j) доступен как *(board + 7 * i + j), а не *(board + i + j).

    Было бы проще объявить rando и board, чтобы указать на 2D матрицу и используйте синтаксис []:

    char (*board)[7] = malloc(7 * sizeof(*board));
    

    и используйте board[i][j].

  • Кроме того, массив rando неинициализирован, поэтому программа не определена поведение при чтении содержимого элементов, которые не были установлены в '*' в первом l oop. Вы должны инициализировать этот массив с '?'. Вы можете сделать это с помощью memset().

  • функция random() возвращает целое число в диапазоне от 1 до 7 включительно. Вместо этого вы должны вычислить псевдослучайные координаты в диапазоне от 0 до 6. Удалите +1;

  • , тест на печатной плате l oop бесполезен: если элемент платы в положении 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...