【问题标题】:I don't have any compile errors but my code won't work. What's wrong?我没有任何编译错误,但我的代码不起作用。怎么了?
【发布时间】:2013-06-08 07:50:43
【问题描述】:

我正在做一个简单的程序,我接受电话号码的前四位数字,并且必须为其余数字生成所有可能性。最后 6 位加起来必须等于 33。如果第四位是奇数,则第五位必须是偶数,如果第四位是偶数,则第五位必须是奇数。

我已经确定它没有将数字相加,函数 plotNumbers() 中的 for 循环实际上并没有循环。我完全迷路了。有人有什么想法吗?

#include "stdafx.h"
#include <iostream>
#include <vector>

using namespace std;

void plotNumbers(vector<int> number1, int digit1, int digit2, int digit3, int digit4);
bool findTrueFalse(vector<int> vec);

int _tmain(int argc, _TCHAR* argv[])
{
int digit1, digit2, digit3, digit4;
vector<int> number;

cout << "Enter the first four digits:\n";
cin >> digit1;
cin >> digit2;
cin >> digit3;
cin >> digit4;

if (digit4 == 0 || digit4 == 2 || digit4 == 4 || digit4 == 6 || digit4 == 8)
{
    number.push_back(1);        
    plotNumbers(number, digit1, digit2, digit3, digit4);
}
else if (digit4 == 1 || digit4 == 3 || digit4 == 5 || digit4 == 7 || digit4 == 9)
{
    number.push_back(0);
    plotNumbers(number, digit1, digit2, digit3, digit4);
}
else
{
    cout << "\nYou entered an illegal value.  Good-bye.\n\n";
}

system("pause");
return 0;
}

void plotNumbers(vector<int> number1, int digit1, int digit2, int digit3, int digit4)
{

for ( ; number1[0] < 10; number1[0] += 2)
{
    number1.push_back(0);


    for ( ; number1[1] < 10; ++number1[1])
    {
        number1.push_back(0);


        for ( ; number1[2] < 10; ++number1[2])
        {
            number1.push_back(0);


            for ( ; number1[3] < 10; ++number1[3])
            {
                number1.push_back(0);


                for ( ; number1[4] < 10; ++number1[4])
                {
                    number1.push_back(0);


                    for ( ; number1[5] < 10; ++number1[5])
                    {

                        bool total33 = findTrueFalse(number1);

                        if (total33)
                        {
                            cout << "(" << digit1 << digit2 << digit3 << ") ";
                            cout << digit4 << number1[0] << number1[1] << " - ";
                            cout << number1[2] << number1[3] << number1[4] << number1[5] << endl;
                        }
                    }
                }
            }
        }
    }
}
}

bool findTrueFalse(vector<int> vec)
{
int total = 0;
vector<int>::iterator postIt;

for (postIt = vec.begin(); postIt != vec.end(); ++postIt)
{
    total += *postIt;
}

if (total == 33)
{
    return true;
}
else
{
    return false;
}

}

【问题讨论】:

    标签: c++ function vector add


    【解决方案1】:

    首先,尽量使用短代码,避免出现以下BUG:

    if (digit4 % 2 == 0)
    

    而不是

    if (digit4 == 0 || digit4 == 2 || digit4 == 4 || digit4 == 6 || digit4 == 8)
    

    其次,您只需要执行一次number1.pushback(0),但您需要执行多次。你知道当你运行number1.pushback(0) 时会发生什么吗?我猜不是:

    • 它在向量的末尾添加一个值为0 的新元素number1

    我建议下面的代码(你做缩进):

    #include "stdafx.h"
    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    void plotNumbers(vector<int> number1, int digit1, int digit2, int digit3, int digit4);
    bool findTrueFalse(vector<int> vec);
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    int digit1, digit2, digit3, digit4;
    vector<int> number;
    
    cout << "Enter the first four digits:\n";
    cin >> digit1;
    cin >> digit2;
    cin >> digit3;
    cin >> digit4;
    
    if (digit4 % 2 == 0)
    {
        number.push_back(1);        
        for (int i=0; i<5; i++)
            number.push_back(0);
        plotNumbers(number, digit1, digit2, digit3, digit4);
    }
    else if (digit4 % 2 == 1)
    {
        number.push_back(0);
        for (int i=0; i<5; i++)
            number.push_back(0);
        plotNumbers(number, digit1, digit2, digit3, digit4);
    }
    else
    {
        cout << "\nYou entered an illegal value.  Good-bye.\n\n";
    }
    
    system("pause");
    return 0;
    }
    
    void plotNumbers(vector<int> number1, int digit1, int digit2, int digit3, int digit4)
    {
    
    for ( ; number1[0] < 10; number1[0] += 2)
    {
        number1[1] = 0;
    
    
        for ( ; number1[1] < 10; ++number1[1])
        {
            number1[2] = 0;
    
    
            for ( ; number1[2] < 10; ++number1[2])
            {
                number1[3] = 0;
    
    
                for ( ; number1[3] < 10; ++number1[3])
                {
                    number1[4] = 0;
    
    
                    for ( ; number1[4] < 10; ++number1[4])
                    {
                        number1[5] = 0;
    
    
                        for ( ; number1[5] < 10; ++number1[5])
                        {
    
                            bool total33 = findTrueFalse(number1);
    
                            if (total33)
                            {
                                cout << "(" << digit1 << digit2 << digit3 << ") ";
                                cout << digit4 << number1[0] << number1[1] << " - ";
                                cout << number1[2] << number1[3] << number1[4] << number1[5] << endl;
                            }
                        }
                    }
                }
            }
        }
    }
    }
    
    bool findTrueFalse(vector<int> vec)
    {
    int total = 0;
    vector<int>::iterator postIt;
    
    for (postIt = vec.begin(); postIt != vec.end(); ++postIt)
    {
        total += *postIt;
    }
    
    if (total == 33)
    {
        return true;
    }
    else
    {
        return false;
    }
    
    }
    

    【讨论】:

    • 这很好用,但我不确定为什么。我完全了解 number.push_back(0) 代码,这就是我使用它的原因。但我在这里看到的唯一区别是您在 main() 中声明了整个向量并在 plotNumbers() 函数中初始化了它们。如果 plotNumbers() 在其参数中接受向量并且不需要将其发回,为什么在 main() 中声明它然后在 plotNumbers() 中初始化它会有所不同?我对编程还是有点陌生​​,想学习,所以你能告诉我的任何事情都会有所帮助。另外,感谢您的 if (digit4 % 2 == 0),非常有帮助。
    • 要了解我的代码和你的代码之间的区别,请在每次迭代时打印整个向量,看看会发生什么(调试)。此外,在代码的每次操作中,您正在向向量的“结束”添加一个 0 元素(索引 6、7、8,...),但您正在使用 0-5 的“前”元素!跨度>
    【解决方案2】:

    您如何准确检查它们是否在循环播放?因为在我的程序中它们是,但我认为您不了解它们实际上是如何工作的(无意冒犯)。

    考虑一下这个sn-p:

    int i = 0;
    int j = 0;
    
    for (; i < 10; i += 1) { //OUTER for
        cout << "i == " << i << endl;
    
        for (; i < 10; j += 1;) { //INNER for
            cout << "j == " << j << endl;
        }
    //THIS POINT
    }
    

    这个程序会进入 OUTER 循环,打印出“i == 0”,然后进入 INNER 循环打印 10 行带有“j == ...”的行。现在在此点 j == 10,因此当代码为“i”执行另一个循环并检查 INNER 的条件时,它看到 j == 10,因此 10 不低于 10,因此它跳过了 INNER。

    这正是您的程序中正在发生的事情。当您退出带有这样指定控制变量的 INNER 循环时,如果您想在下一轮 OUTER 循环中进入 INNER 循环,则必须记住将其值更改为通过条件的值。

    我已将您的代码更改为这样做,并且看起来效果很好。您需要做的就是在代码中的 INNER 循环之后添加 4 行代码,以将其控制变量归零。

    编辑: 另外,请考虑 Eabs 的回答,因为您的矢量维护很差。

    【讨论】:

      猜你喜欢
      • 2020-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-22
      • 1970-01-01
      • 2017-03-27
      相关资源
      最近更新 更多