Как я могу удалить N строк и столбцов двумерного массива, выбранного пользователем в c

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

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 

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

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

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

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

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


person 8TrackRobot    schedule 26.05.2018    source источник
comment
Все ли матрицы 10x10? Создание матрицы меньшего размера с использованием этого определения кажется невозможным.   -  person cadaniluk    schedule 26.05.2018
comment
@cadaniluk Входная матрица может быть до 10x10, размеры определяются пользовательским вводом, файл .txt содержит список целых чисел 10x10. Поэтому, если пользователь вводит 7x4, я буду удалять строки и столбцы из матрицы 7x4 и отображать результирующую подматрицу.   -  person 8TrackRobot    schedule 26.05.2018
comment
Тогда почему бы просто не сделать, как сказано в описании функции, и создать новый struct matrix с новыми значениями nrows и ncols и соответственно сохранить оставшиеся значения? Попробуйте закодировать его, и если вы застряли, спросите об этом. Однако вложенные циклы, вероятно, будут работать.   -  person cadaniluk    schedule 26.05.2018


Ответы (2)


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

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

person Kolt Penny    schedule 26.05.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;
}
person Barmak Shemirani    schedule 27.05.2018
comment
Я должен был упомянуть, что я должен использовать функцию, как она объявлена, однако ваш ответ более чем полезен. У меня экзамен во вторник, после чего я вернусь к своей проблеме и опубликую свое решение или попрошу дополнительных разъяснений. Спасибо, что нашли время ответить на мой вопрос. - person 8TrackRobot; 27.05.2018