Преобразование цифры в ее код POSTNET

Я пишу программу, которая должна принимать почтовый индекс (представленный 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

Не уверен, поможет ли это, но я программист на Java, впервые изучающий C ++.

2

Решение

Я думаю, что ваша проблема здесь:

if(digit < values[i])

Которые должны быть >= не <,

Самый большой намек на то, что будет дальше — вы вычитаете values[i] от digit, что приведет к отрицательному числу, если < условие верно. Это совсем не похоже на то, что вы хотите.

1

Другие решения

Ради удобочитаемости, может быть лучше просто жестко закодировать POSTNET строки для цифр от 0 до 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;
}

демонстрация проходит три теста (Это использует C ++ 11 std::array, но вы можете использовать обычный массив.) Если вы хотите сохранить свой оригинальный алгоритм, скажите, пожалуйста.

РЕДАКТИРОВАТЬ: PS, так как я вижу, что вы используете C ++ 11, просто быстрое замечание, что предпочтительнее использовать что-то вроде std::to_string вместо itoa если вы пытаетесь преобразовать целое число (например, почтовый индекс) в строку. (См. Строку 3 кода вашего вопроса.)

1

По вопросам рекламы [email protected]