Как я могу удалить N количество строк и столбцов 2d массива, выбранного пользователем в c - PullRequest
0 голосов
/ 26 мая 2018

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

struct matrix
{
    char name;
    int mValues[10][10[;
    int nrows;
    int ncols;
};
/** Function Prototypes**/

// Lets user name, choose dimensions and populates matrix from a 10x10 .txt file
void matrixInput(struct matrix *matA); 

// Asks the user to choose how many rows to delete and select which rows 
// Asks the user to choose how many columns to delete and select which columns.
// The result should be a sub matrix of the input matrix stored in a new struct matrix
void subMatrix(struct matrix m1, struct matrix *m2);

// What the Input/Output should look like

How many rows do you want to delete? : 2

Please enter, one per row, the number(s) of the 2 rows you want to delete : 2
Please enter, one per row, the number(s) of the 2 rows you want to delete : 1

How many columns do you want to delete? : 3

Please enter, one per column, the number(s) of the 3 columns you want to delete : 4
Please enter, one per column, the number(s) of the 3 columns you want to delete : 2
Please enter, one per column, the number(s) of the 3 columns you want to delete : 5

// Displays sub matrix 

Это последняя функция, у меня возникли проблемыс.

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

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

Кто-нибудь может указать мне правильное направление?

Примечание, любые советы о том, как улучшить качество моего вопроса, приветствуются.

Ответы [ 2 ]

0 голосов
/ 27 мая 2018

Вы не можете легко сохранить информацию об удалении в матрице, поскольку matrix->values[0][0] может ссылаться на строку или столбец.Вместо этого проще объявить целые числа.

Функция void subMatrix(struct matrix m1,...) технически исправна, если вы не хотите изменять m1, но это делает дополнительную копию m1, которая неэффективна.Вместо этого лучше использовать void subMatrix(const struct matrix *source,...).

Вы также можете использовать динамическое размещение вместо фиксированного массива value[10][10].Пример:

struct matrix {
    int **data;
    int rows;
    int cols;
};

void create(struct matrix *m, int rows, int cols)
{
    m->rows = rows;
    m->cols = cols;
    m->data = malloc(rows * sizeof(int*));
    for(int r = 0; r < rows; r++)
        m->data[r] = malloc(sizeof(int) * cols);
}

void destroy(struct matrix *m)
{
    for(int i = 0; i < m->rows; i++)
        free(m->data[i]);
    free(m->data);
}

void print(const struct matrix *m)
{
    for(int r = 0; r < m->rows; r++)
    {
        for(int c = 0; c < m->cols; c++)
            printf("%4d", m->data[r][c]);
        printf("\n");
    }
    printf("\n");
}

void change(struct matrix *new, struct matrix *m, int *delete_rows, int *delete_cols)
{
    int rows = 0;
    for(int row = 0; row < m->rows; row++)
        if(!delete_rows[row])
            rows++;
    int cols = 0;
    for(int col = 0; col< m->cols; col++)
        if(!delete_cols[col])
            cols++;
    create(new, rows, cols);

    int next_row = 0;
    for(int row = 0; row < m->rows; row++)
    {
        if(delete_rows[row]) continue;
        int next_col = 0;
        for(int col = 0; col < m->cols; col++)
        {
            if(delete_cols[col]) continue;
            new->data[next_row][next_col] = m->data[row][col];
            next_col++;
        }
        next_row++;
    }
}

int main(void)
{
    struct matrix m;
    create(&m, 10, 10);
    for(int r = 0; r < m.rows; r++)
        for(int c = 0; c < m.rows; c++)
            m.data[r][c] = r * 100 + c;
    print(&m);

    //get delete information
    int delete_rows[10] = { 0 };
    int delete_cols[10] = { 0 };
    delete_rows[0] = 1;//delete row 0
    delete_cols[7] = 1;//delete col 7

    struct matrix new;
    change(&new, &m, delete_rows, delete_cols);
    print(&new);
    destroy(&m);
    destroy(&new);
    return 0;
}
0 голосов
/ 26 мая 2018

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

Но то, что вы действительно хотите сделать, - это создать новую матрицу внутри функции копирования и вернуть ее.Если они создаются динамически, вы можете игнорировать назначение столбцов или строк, которые вы пытаетесь скопировать таким же образом (вложенные циклы), и точно подогнать его под нужный вам размер.

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