2015-10-02 10 views
0

Я пытаюсь преобразовать 5 цифр zipcode в 27 цифр штрих-кода (с 0 и 1) и наоборот. Первая и последняя цифры штрих-кода всегда равны 1. Удалите их, оставляя 25 цифр. Разделить на 5 цифр каждый, слева направо цифры кодируют значения 7, 4, 2, 1, 0. Если умножить на соответствующее значение с цифрой и вычислить сумму, мы можем получить первое число zipcode. Так, например, 25 цифр штрих-кода являются 10100 10100 01010 11000 01001, то почтовый индекс будет 99504.C++ Сравнение целых чисел один за другим

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 для штрих-кода, а затем оценить следующий и т. Д.?

+2

Посмотрите на этот пост: [? МЕТОДИЧЕСКИЕ расколоть Int в его цифр] (http://stackoverflow.com/questions/4261589/howto-split-a-int-into-digit-цифры) –

+1

Подход с мертвой точки мозга должен был бы сбрасывать число и получать доступ к символам ... –

+1

Обратите внимание, что бит, который * кодирует * '0', на самом деле является [ бит четности] (https://en.wikipedia.org/wiki/Parity_bit). – Jarod42

ответ

0

Вы можете сделать следующее:

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; 
} 

Live Demo

Смежные вопросы