将数字转换为POSTNET代码

时间:2013-07-15 00:52:44

标签: c++ zipcode

我正在编写一个程序,该程序应该采用邮政编码(由int表示)并将其解析为其POSTNET等价物(由C ++ std::string表示)和副反之亦然。将POSTNET代码转换为邮政编码的算法运行良好,但将邮政编码转换为POSTNET的算法无法正常工作。我已将问题的原因隔离为getSequence()函数;那里有什么问题吗?

这是我的代码:

string ZipCode::getBarCode()
{
    string zipCode = itoa(this->zipCode, new char[5], 10);
    string sequences[5];
    for(int i = 0; i < 5; ++i)
        sequences[i] = getSequence(zipCode[i] - '0');
    string toReturn = "1";
    for(string &sequence : sequences)
        toReturn += sequence;
    return toReturn + "1";
}

string ZipCode::getSequence(int digit)
{
    if(digit == 0)
        return "11000";
    string toReturn = "00000";
    int values[4] = {7, 4, 2, 1};
    for(int i = 0; i < 4; ++i)
        if(digit < values[i])
        {
            toReturn = toReturn.replace(i, 1, "1");
            digit -= values[i];
        }
    if(containsOnlyOne1(toReturn))
        toReturn = toReturn.replace(4, 1, "1");
    return toReturn;
}

bool ZipCode::containsOnlyOne1(std::string str)
{
    int instancesOfOne = 0;
    for(int i = 0; i < str.length(); ++i)
        if(str[i] == '1')
            instancesOfOne++;
    return instancesOfOne == 1;
}

此外,以下是一些测试用例:

ZIP Code        Expected Output                    Actual Output
24060           100101010011100001100110001        111110111101100011110110001
92064           110100001011100001100010011        100000111101100011110111101
11518           100011000110101000011100101        111110111101111011110000001

不确定这是否有帮助,但我是第一次学习C ++的Java程序员。

2 个答案:

答案 0 :(得分:1)

为了便于阅读,最好只对POSTNET strings for the digits 0 through 9(可能在ZipCode类中的静态变量中)进行硬编码,然后只对邮政编码中的五位数进行查找。一个最小的例子是:

#include <array>
#include <iostream>
#include <string>

std::string zip_to_postnet(const std::string& zip)
{
    std::array<std::string,10> lookup{"11000", "00011", "00101", "00110",
                                      "01001", "01010", "01100", "10001",
                                      "10010", "10100"};

    std::string result = "1";

    for (unsigned int i = 0; i < 5; ++i)
    {
        int digit = zip[i] - '0';
        result += lookup[digit];
    }

    return result + "1";
}

int main()
{
    std::cout << zip_to_postnet("24060") << std::endl;
    std::cout << zip_to_postnet("92064") << std::endl;
    std::cout << zip_to_postnet("11518") << std::endl;

    return 0;
}

demo通过您的三个测试用例。 (这使用C ++ 11的std::array,但您可以使用普通数组。)如果您打算保留原始算法,请说明。

编辑:PS,因为我看到你正在使用C ++ 11,只是一个简单的说明,如果试图转换一个整数,最好使用std::to_string而不是itoa之类的东西(例如一个邮政编码)到字符串。 (参见问题代码的第3行。)

答案 1 :(得分:1)

我认为你的问题在这里:

if(digit < values[i])

应该是>=而不是<

最大提示是接下来的内容 - 您从values[i]中减去digit,如果<条件为真,则会导致负数。这看起来并不像你想要的那样。