Я пытаюсь преобразовать 5 цифр почтового индекса в 27 цифр штрих-кода (состоит из 0 и 1) и наоборот. Первая и последняя цифры штрих-кода всегда равны 1. При их удалении оставляются 25 цифр. Разделить на 5 цифр каждая, слева направо цифры кодируют значения 7, 4, 2, 1, 0. Если умножить на соответствующее значение с цифрой и вычислить сумму, мы можем получить первое число почтового индекса. Например, 25 цифр штрих-кода: 10100 10100 01010 11000 01001, почтовый индекс будет 99504.
1 х 7 = 7
0 х 4 = 0
1 х 2 = 2
0 х 1 = 0
0 х 0 = 0
сумма = 9
// main.cpp
#include <iostream>
#include <iomanip>
#include "ZipCode.h"
using namespace std;
int main()
{
ZipCode zip1(99504);
ZipCode zip2(12345);
ZipCode zip3(67890);
ZipCode zip4("100101010011100001100110001");
ZipCode zip5("110100001011100001100010011");
ZipCode zip6("100011000110101000011100101");
cout << "Digits" << " " << "Bar Code" << endl;
cout << zip1.getZipCode() << setw(35) << zip1.getBarCode() << endl;
cout << zip2.getZipCode() << setw(35) << zip2.getBarCode() << endl;
cout << zip3.getZipCode() << setw(35) << zip3.getBarCode() << endl;
cout << endl;
cout << zip4.getZipCode() << setw(35) << zip4.getBarCode() << endl;
cout << zip5.getZipCode() << setw(35) << zip5.getBarCode() << endl;
cout << zip6.getZipCode() << setw(35) << zip6.getBarCode() << endl;
return 0;
}
Теперь вот мой вопрос: в getZipCode(int num){}
Как сравнить каждое целое значение и оценить как штрих-код? Например, в main()
это говорит ZipCode zip1(99504);
, Поскольку 99504 является целым числом, как я могу оценить 9 для штрих-кода, а затем оценить следующий и так далее?
Вы можете сделать следующее:
std::string to_bar_code(unsigned int zip_code)
{
const std::array<std::string, 10> digit {{
"11000", "00011", "00101", "00110", "01001",
"01010", "01100", "10001", "10010", "10100"}};
return "1"+ digit[(zip_code / 10000) % 10]
+ digit[(zip_code / 1000) % 10]
+ digit[(zip_code / 100) % 10]
+ digit[(zip_code / 10) % 10]
+ digit[zip_code % 10]
+ "1";
}
int to_zip_code(const std::string& bar_code)
{
const std::map<std::string, int> digits = {
{"11000", 0}, // special case
{"00011", 1},
{"00101", 2},
{"00110", 3},
{"01001", 4},
{"01010", 5},
{"01100", 6},
{"10001", 7},
{"10010", 8},
{"10100", 9}
};
const std::string bar_digits[5]{
{bar_code, 1, 5},
{bar_code, 6, 5},
{bar_code, 11, 5},
{bar_code, 16, 5},
{bar_code, 21, 5}
};
unsigned int res = 0;
for (const auto& d : bar_digits)
{
res *= 10;
res += digits.at(d);
}
return res;
}
Других решений пока нет …