【问题标题】:C++ Vector subtractionC++ 向量减法
【发布时间】:2021-04-09 17:44:57
【问题描述】:

我一直在尝试让我的矢量计算器减去。对于存储相同数量数字的向量,它做得很好,例如:(+) 503 - (-) 305。在这种情况下,它会给我一个很好的结果。

但是当我尝试减去不同大小的向量时,问题就出现了。我试图通过制作不同的过滤器来解决这个问题,以使程序按照我的意愿行事。但是现在,它所做的不是减去它所做的就是加。

这是我的设置:

const int MAX = 102;

typedef int vector[MAX];

A(0):将一个向量的所有值都设为0。例如:

使用前:

[0][3][5][0][5]

其中第一个 0 表示它是一个正数,如果它是 [1] 则表示它的负数,那 [3] 表示向量中存储了 3 个数字。

使用A0后:

[0][1][0][0][0][0][0]...[0]

ES_MAJOR_VECTOR 检查向量 Z > X。在这种情况下返回 true,否则返回 false。

SUMA_VEC 基本上将 Z 加到 X 上,然后将值赋给 W。

void RESTA_VEC(vector Z, vector X, vector W) {

    int ZigualX(0), Xmes1(0), Xactual(0), ZmajorX(0), XmajorZ(0), contador(0);
    vector copia_Z, copia_X;

    A0(copia_Z);
    A0(copia_X);

    for (int k = 0; k < MAX; k++)
    {
        copia_Z[k] = Z[k];
        copia_X[k] = X[k];
    }

    if (Z[0] == X[0])
    {
        if (Z[0] == 0)
        {
            for (int y = MAX; y >= 2; y--)
            {
                if (Z[y] < X[y])
                {//RESTA
                    Z[y] = Z[y] + 10;
                    W[y] = Z[y] - X[y];
                    X[y + 1] = X[y + 1] + 1;
                }

                if (Z[y] > X[y])
                {
                    W[y] = Z[y] - X[y];
                }

                if (Z[y] == X[y])
                {
                    W[y] = 0;
                }
            }
        }

        if (Z[0] == 1)
        {
            SUMA_VEC(Z, X, W);
        }
    }
    
    if (Z[0] != X[0])
    {
        if (ES_MAJOR_VECTOR(Z, X) == true)
        {
            for (int y = MAX; y >= 2; y--)
            {
                if (Z[y] < X[y])
                {
                    Z[y] = Z[y] + 10;
                    W[y] = Z[y] - X[y];
                    X[y + 1] = X[y + 1] + 1;
                }

                if (Z[y] > X[y])
                {
                    W[y] = Z[y] - X[y];
                }

                if (Z[y] == X[y])
                {
                    W[y] = 0;
                }
            }
        }
        else
        {
            for (int y = MAX; y >= 2; y--)
            {
                if (X[y] < Z[y])
                {
                    X[y] = X[y] + 10;
                    W[y] = X[y] - Z[y];
                    Z[y + 1] = Z[y + 1] + 1;
                }

                if (X[y] > Z[y])
                {
                    W[y] = X[y] - Z[y];
                }

                if (X[y] == Z[y])
                {
                    W[y] = 0;
                }
            }
        }
    }

    for (int h = 0; h < MAX; h++)
    {
        Z[h] = copia_Z[h];
        X[h] = copia_X[h];
    }
}

我该如何解决这个问题?我认为我需要检查:如果它们是正数或负数,如果它们都是正数,我必须执行减法,如果它们是负数,我必须将 Z 添加到 X 并将其分配给 W。

如果向量不同(意味着一个是正的,另一个是负的)我必须检查哪个更大,做减法,然后根据前面使用的两个向量中的较大向量分配 0 或 1。

例如:

+5050
-305

W[0] = +

-5050
+305

W[0] = -

【问题讨论】:

  • 四个案例都失败了吗?即(+X) - (+Z)(+X) - (-Z)(-X) - (+Z)(-X) - (-Z)?
  • @NickReed 我已经修复了其中的一些,现在 (+X) - (+Z), (-X) - (-Z) 如果两个向量具有相同的大小,则可以完美工作。否则,它会给我错误的值。
  • @NickReed (+X) - (-Z) 返回随机值,就好像它从未被赋予过值一样。并且 (-X) - (+Z) 添加它们。例如:(-505) - (+305) = 800
  • 备注:在实际的 C++ 代码中,您应该使用 std::array 而不是 C 样式的数组。 // 如果不需要像这样表示内部数据结构,用十的补码表示值会更容易。
  • 否则你还是可以自己做典型的rubber-duck debugging...

标签: c++ for-loop vector subtraction


【解决方案1】:

在得到一位非常友善的用户的帮助后,我可以得出以下结论:

void RESTA_ABS(vector Z, vector X, vector W) {

    int error(0);

    A0(W);
        
    if (ES_MAJOR_VECTOR(Z,X))
    {
        for (int i = MAX-1; i >= 2; i--)
        {
            if (Z[i] < X[i]) {

                Z[i] = Z[i] + 10;
                W[i] = Z[i] - X[i];
                X[i - 1] = X[i - 1] + 1;
            }           
            else
            {
                W[i] = Z[i] - X[i];
            }
        }
    }
    else
    {
        cout << "ERROR - VECTOR 2 > VECTOR 1" << endl;
    }
}

这个模块不介意向量是正的还是负的。它只是做减法。

所以,为了解决这个问题,我使用了另一个模块:

void RESTA_VEC(向量 Z,向量 X,向量 W){

if (X[0] == 0)
{
    X[0] = 1;
}
else
{
    X[0] = 0;
}

RESTA_ABS(Z, X, W);

if (ES_MAJOR_VECTOR(Z, X) == true)
    {
        W[0] = Z[0];
    }
    else
    {
        W[0] = X[0];
    }

}

这改变了第二个向量的数字符号,如果为正则为负,如果为负则为正。 (这由第一个向量位置上的 0 或 1 决定)。

最后,它所做的是检查更大向量的符号并将其分配给输出向量 W。

剩下的唯一部分是检查两个向量中哪个更大,因为在我测试它时,在某些情况下,它会给我一个错误的答案。

例如:

[+][9][1][2][3][4][5][6][7][8][9]
[+][9][1][1][2][3][4][5][6][7][8]

愿意:

[+][8][1][1][1][1][1][1][1][1]

但它不会进行操作,因为它认为第二个向量更大。

翻译:Z是否大于X?

bool ES_MAJOR_VECTOR_SIGNE(vector Z, vector X) {

    int END(0), UP(2);

    return false;

    if (Z[1] > X[1])
    {
        return true;
    }
    else
    {
        while (END != 1)
        {
            if (Z[UP] > X[UP])
            {
                return true;
                END = 1;
            }

            UP++;
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-24
    • 1970-01-01
    • 2017-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多