Случайная матрица символов только с помощью указателей - PullRequest
0 голосов
/ 14 апреля 2019

Я создал метод случайной символьной матрицы без использования указателей.

Теперь мне нужно изменить мой код для этой случайной функции , чтобы он использовал только указатели - без использования индексов [][]. Мне нужно создать 2 матрицы символов: одну большую (20х3) и одну маленькую (4х4).

Я пытался это сделать ... но я не использовал указатели. 2 матрицы должны быть напечатаны через main.

#include <time.h>
#include <stdlib.h>
#include <stdio.h>

#define SIZE 4
#define ROWS 3
#define COLS 20

void matRandomChar(char mat[][COLS], int rows);
void smallMatRandomChar(char smallMat[][SIZE],int size);
void inputMatrix(char **mat,int rows,int cols);

void matRandomChar(char mat[][COLS], int rows)
{
    int i,j;
    for (i=0; i<rows; i++){
        for (j=0; j<COLS; j++)
            mat[i][j] = 'A'+rand()%('Z'-'A'+1);
    }
}

void smallMatRandomChar(char smallMat[][SIZE],int size)
{
    int i,j;
    for (i=0; i<size; i++){
        for (j=0; j<SIZE; j++)
            smallMat[i][j] = 'A'+rand()%('Z'-'A'+1);
    }
}

int main()
{
    char smallMat[SIZE][SIZE];
    char mat[ROWS][COLS];

    srand((unsigned int)time(NULL));
    matRandomChar(mat,ROWS);
    printf("Big matrix:\n");
    printMat(mat,ROWS);

    smallMatRandomChar(smallMat,SIZE);
    printf("Small matrix:\n");
    printSmallMat(smallMat,SIZE);
}

Я использую Eclipse в Linux.

1 Ответ

0 голосов
/ 14 апреля 2019

Хотя самое простое изменение состоит в том, чтобы изменить нотацию с matrix[i][j] на *(*(matrix + i) + j), вы можете сделать более упорядоченный код с гораздо меньшим количеством функций, отметив, что все элементы массива являются смежными, поэтому вы можете просто выполнять итерации по элементы массива с указателем и без добавления смещения.

Это приводит к такому коду:

#include <time.h>
#include <stdlib.h>
#include <stdio.h>

#define SIZE 4
#define ROWS 3
#define COLS 20

void matRandomChar(char *mat, int rows, int cols);
void printMat(const char *tag, char *base, int rows, int cols);

void matRandomChar(char *mat, int rows, int cols)
{
    char *end = mat + rows * cols;
    while (mat < end)
        *mat++ = 'A' + rand() % ('Z' - 'A' + 1);
}

void printMat(const char *tag, char *base, int rows, int cols)
{
    int i;
    printf("%s (%dx%d):\n", tag, rows, cols);
    for (i = 0; i < rows; i++)
    {
        int j;
        for (j = 0; j < cols; j++)
            printf(" %c", *base++);
        putchar('\n');
    }
}

int main(void)
{
    char smallMat[SIZE][SIZE];
    char mat[ROWS][COLS];

    srand((unsigned int)time(NULL));

    matRandomChar(&mat[0][0], ROWS, COLS);
    printMat("Big matrix", &mat[0][0], ROWS, COLS);

    matRandomChar(&smallMat[0][0], SIZE, SIZE);
    printMat("Small matrix", &smallMat[0][0], SIZE, SIZE);

    return 0;
}

В обеих вспомогательных функциях код просто просматривает данные массива по одному символу за раз.

Пример вывода:

Big matrix (3x20):
 P L J T B F Y L W K C P Q X B P K V D V
 K B Q P V X S B K O X C Z S U K T G F I
 E X O X H C W B K W V E F U L S O F Q G
Small matrix (4x4):
 U C R P
 A R F U
 N K Q L
 Y W R M

Этот код будет работать с компиляторами, которые принимают только C90, а также с теми, которые принимают C99 или более позднюю версию.

Я бы, вероятно, использовал нотацию массива переменной длины (VLA), чтобы избежать дублирования кода, но тогда было бы разумно использовать индексы, а не указатели. Тем не менее, тот же общий метод может быть применен - ​​хотя использование подписок гораздо более разумно. Следующий код может быть скомпилирован с -DNO_PRINTING_SUBSCRIPTS или без него - выходные данные имеют ту же организацию (но нотация - A или - B сообщает вам, какой код печати использовался).

#include <time.h>
#include <stdlib.h>
#include <stdio.h>

#define SIZE 4
#define ROWS 3
#define COLS 20

void matRandomChar(int rows, int cols, char mat[rows][cols]);
void printMat(const char *tag, int rows, int cols, char mat[rows][cols]);

void matRandomChar(int rows, int cols, char mat[rows][cols])
{
    char *ptr = &mat[0][0];
    char *end = &mat[0][0] + rows * cols;
    while (ptr < end)
        *ptr++ = 'A' + rand() % ('Z' - 'A' + 1);
}

#ifdef NO_PRINTING_SUBSCRIPTS

void printMat(const char *tag, int rows, int cols, char mat[rows][cols])
{
    printf("%s (%dx%d) - A:\n", tag, rows, cols);
    char *ptr = &mat[0][0];
    for (int i = 0; i < rows; i++)
    {
        for (int j = 0; j < cols; j++)
            printf(" %c", *ptr++);
        putchar('\n');
    }
}

#else

void printMat(const char *tag, int rows, int cols, char mat[rows][cols])
{
    printf("%s (%dx%d) - B:\n", tag, rows, cols);
    for (int i = 0; i < rows; i++)
    {
        for (int j = 0; j < cols; j++)
            printf(" %c", mat[i][j]);
        putchar('\n');
    }
}

#endif /* NO_PRINTING_SUBSCRIPTS */

int main(void)
{
    char smallMat[SIZE][SIZE];
    char mat[ROWS][COLS];

    srand((unsigned int)time(NULL));

    matRandomChar(ROWS, COLS, mat);
    printMat("Big matrix", ROWS, COLS, mat);

    matRandomChar(SIZE, SIZE, smallMat);
    printMat("Small matrix", SIZE, SIZE, smallMat);

    return 0;
}

Скомпилировано с -DNO_PRINTING_SUBSCRIPTS

Big matrix (3x20) - A:
 R K Y W Y J U T C O F N Z V H Q X T P W
 Q Z R T B A O A W J O D I K F I C A R E
 V X X C R P C V H E S K G C M T Y B Z D
Small matrix (4x4) - A:
 V R E M
 P T D G
 U C Q F
 D Q B F

Составлено с -UNO_PRINTING_SUBSCRIPTS

Big matrix (3x20) - B:
 L C K V S P C T L V B P G U I O Q L E B
 N S C Y B I L Y G S F Z C H L Z M G A E
 B P A I H E M X H V C M B Z U Y S D W A
Small matrix (4x4) - B:
 O N U T
 H X X P
 P L M L
 K R S F
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...