Как я могу сделать переменную, которая является результатом обновления уравнения в C ++? - PullRequest
0 голосов
/ 06 апреля 2020

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

switch(type) {
case 1:
    //if the user wants to input a number to the cell
    cout << "what number would you like to replace it with?\n";
    cin >> replacenum;
    spreadsheet[row][column] = replacenum;
    break;
case 2:
    //if the user wants to put an equation in a cell
    cout << "what operator would you like to use? (+,-,*,/,%)\n";
    cin >> operation;
    cout << "enter the row on the first cell\n";
    cin >> row1;
    cout << "enter the column on the first cell\n";
    cin >> column1;
    cout << "enter the row on the second cell\n";
    cin >> row2;
    cout << "enter the column on the second cell\n";
    cin >> column2;
    cout << "calculating...";
    row1--;
    column1--;
    row2--;
    column2--;
    if (operation == '+') {
        spreadsheet[row][column] = spreadsheet[row1][column1] + spreadsheet[row2][column2];
    } else if (operation == '-') {
        spreadsheet[row][column] = spreadsheet[row1][column1] - spreadsheet[row2][column2];
    } else if (operation == '*') {
        spreadsheet[row][column] = spreadsheet[row1][column1] * spreadsheet[row2][column2];
    } else if (operation == '/') {
        spreadsheet[row][column] = spreadsheet[row1][column1] / spreadsheet[row2][column2];
    }
}

Ответы [ 2 ]

0 голосов
/ 06 апреля 2020

Возможный способ - сохранить функцию вместо значения в вашей матрице, например:

std::array<std::array<std::function<Value(), MaxColumn>, MaxRow> spreadsheet;

switch(type) {
case 1:
    //if the user wants to input a number to the cell
    cout << "what number would you like to replace it with?\n";
    cin >> replacenum;
    spreadsheet[row][column] = [=]() { return replacenum; };
    break;
case 2:
    //if the user wants to put an equation in a cell
    cout << "what operator would you like to use? (+,-,*,/,%)\n";
    cin >> operation;
    cout << "enter the row on the first cell\n";
    cin >> row1;
    cout << "enter the column on the first cell\n";
    cin >> column1;
    cout << "enter the row on the second cell\n";
    cin >> row2;
    cout << "enter the column on the second cell\n";
    cin >> column2;
    cout << "calculating...";
    row1--;
    column1--;
    row2--;
    column2--;
    if (operation == '+') {
        spreadsheet[row][column] = [=, &spreadsheet](){ return spreadsheet[row1][column1]() + spreadsheet[row2][column2](); };
    } else if (operation == '-') {
        spreadsheet[row][column] = [=, &spreadsheet](){ return spreadsheet[row1][column1]() - spreadsheet[row2][column2](); };
    } else if (operation == '*') {
        spreadsheet[row][column] = [=, &spreadsheet](){ return spreadsheet[row1][column1]() * spreadsheet[row2][column2](); };
    } else if (operation == '/') {
        spreadsheet[row][column] = [=, &spreadsheet](){ return spreadsheet[row1][column1]() / spreadsheet[row2][column2](); };
    }
}

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

Осторожно, если вы создаете цикл, вы создаете бесконечный l oop для вычисления значения ячейки.

0 голосов
/ 06 апреля 2020

Это не указывается c для C ++, но вы должны иметь возможность построить граф зависимостей между ячейками. Затем вы можете выяснить, в каком порядке выполнять вычисления при изменении определенной ячейки.

Существуют сложные случаи, когда порядок имеет значение. Представьте, что у вас есть ячейки A, B, C, D, E, F ... Z, и каждая ячейка зависит от всех предыдущих (т. Е. W зависит на C, но H не зависит от J). Если вы измените значение A, вы должны убедиться, что все остальные ячейки вычисляются точно в порядке B->C->D->...->Z. Как правило, это может быть достигнуто путем топологической сортировки.

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