Добавление двух строк и сохранение суммы в последнем ряду - PullRequest
0 голосов
/ 25 октября 2019

Таким образом, сам вопрос: «Разработайте функцию, которая добавляет элементы строк lin1 и lin2 матрицы, помещая результат в lin3». Я предполагаю, что мы должны добавить содержимое lin1 с lin2 и сохранить результат в lin3. Например, в данной матрице, если я положил lin1 = 0, lin2 = 1 и lin3 = 2, он должен сделать 1 + 4 = 5 (в первой итерации i). Если я положу lin1 = 2, lin2 = 1 иlin3 = 0, он должен делать 7 + 4 = 11

Это то, что я придумал. Я думаю, что это близко к решению ... Он печатает «57», который, кажется, является суммой строк первых 2 столбцов. MAXCOLS100 - это макрос, которому я присвоил значение 3.

void sum_lines_matrixesNx100(int mNx100[][MAXCOLS100], int lin1, int lin2, int lin3, int columns){
    int i;
    for(i=0; i<columns; i++){
        mNx100[lin3][i] = mNx100[lin1][i] + mNx100[lin2][i];
    }
    printf("\n");
}
int main()
{
    int mNx100[][MAXCOLS100] = {{1,2,3},{4,5,6},{7,8,9}};
    sum_lines_matrixesNx100(mNx100,0,1,2, 3);
    printf("%d", mNx100[2][MAXCOLS100]);
    return 0;
}

1 Ответ

1 голос
/ 25 октября 2019

Ваше добавление в порядке, ваша printf ... печать (скорее всего, один за другим вашего 3-го ряда матрицы, вызывающего Не определеноПоведение ), см .: Стандарт C11 - 6.3.2.1 Другие операнды - L-значения, массивы и указатели функций (p3) для преобразования массив / указатель .

Предполагается, что у вас есть:

#define MAXCOLS100 100

где-нибудь. Вы пытаетесь напечатать элемент в mNx100[2][MAXCOLS100], который является одним после конца 3-го ряда вашей матрицы. (технически в самом 2D-массиве, но не разрешено обращаться таким образом)

Ваши допустимые индексы столбцов для 3-й строки начинаются с 0 -> MAXCOLS100-1. Адрес mNx100[2][MAXCOLS100] действителен для адресации конца 3-й строки, но не является правильным индексом для извлечения данных. (При доступе mNx100[2] преобразуется в указатель на первый элемент в одномерном массиве int с MAXCOLS100 элементами)

Вам нужно напечатать первые 3 элемента из первых 3-rows (остаток будет инициализирован нулем в силу вашей инициализации)

Простая матричная печать в вашем случае может быть:

void prnmtrx (int (*m)[MAXCOLS100], size_t rows, size_t cols)
{
    size_t i, j;

    for (i = 0; i < rows; i++) {
        for (j = 0; j < cols; j++)
            printf (j ? " %2d" : "%2d", m[i][j]);
        putchar ('\n');
    }
}

Где она вызывается с помощью:

    prnmtrx (mNx100, 3, 3);

Полный пример:

#include <stdio.h>

#define MAXCOLS100 100

void sumrows (int mNx100[][MAXCOLS100], int lin1, int lin2, int lin3, int columns)
{
    int i;

    for (i = 0; i < columns; i++) {
        mNx100[lin3][i] = mNx100[lin1][i] + mNx100[lin2][i];
    }
}

void prnmtrx (int (*m)[MAXCOLS100], size_t rows, size_t cols)
{
    size_t i, j;

    for (i = 0; i < rows; i++) {
        for (j = 0; j < cols; j++)
            printf (j ? " %2d" : "%2d", m[i][j]);
        putchar ('\n');
    }
}

int main()
{
    int mNx100[][MAXCOLS100] = {{1,2,3},{4,5,6},{7,8,9}};

    sumrows (mNx100, 0, 1, 2, 3);

    prnmtrx (mNx100, 3, 3);

    return 0;
}

Пример использования / Вывод

$ ./bin/mtrxaddrows
 1  2  3
 4  5  6
 5  7  9

Просмотрите все и дайте мне знать, если у вас естьдополнительные вопросы.

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